diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1564,6 +1564,8 @@ HelpText<"Discard value names in LLVM IR">, Flags<[NoXarchOption]>; def fno_discard_value_names : Flag<["-"], "fno-discard-value-names">, Group, HelpText<"Do not discard value names in LLVM IR">, Flags<[NoXarchOption]>; +def fno_disable_free : Flag<["-"], "fno-disable-free">, Group, + HelpText<"cancel disable-free in cc1">, Flags<[NoXarchOption]>; defm dollars_in_identifiers : BoolFOption<"dollars-in-identifiers", LangOpts<"DollarIdents">, Default, PosFlag, NegFlag, diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4981,7 +4981,7 @@ // We normally speed up the clang process a bit by skipping destructors at // exit, but when we're generating diagnostics we can rely on some of the // cleanup. - if (!C.isForDiagnostics()) + if (!Args.hasArg(options::OPT_fno_disable_free) && !C.isForDiagnostics()) CmdArgs.push_back("-disable-free"); CmdArgs.push_back("-clear-ast-before-backend"); diff --git a/clang/test/Driver/clang_f_opts.c b/clang/test/Driver/clang_f_opts.c --- a/clang/test/Driver/clang_f_opts.c +++ b/clang/test/Driver/clang_f_opts.c @@ -616,3 +616,8 @@ // CHECK-INT-OBJEMITTER-NOT: unsupported option '-fintegrated-objemitter' for target // RUN: %clang -### -fno-integrated-objemitter -target x86_64 %s 2>&1 | FileCheck -check-prefix=CHECK-NOINT-OBJEMITTER %s // CHECK-NOINT-OBJEMITTER: unsupported option '-fno-integrated-objemitter' for target + +// RUN: %clang -### -S %s 2>&1 | FileCheck -check-prefix=CHECK-DISABLE-FREE %s +// RUN: %clang -### -S -fno-disable-free %s 2>&1 | FileCheck -check-prefix=CHECK-NO-DISABLE-FREE %s +// CHECK-DISABLE-FREE: "-disable-free" +// CHECK-NO-DISABLE-FREE-NOT: "-disable-free"