diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def --- a/clang/include/clang/Basic/CodeGenOptions.def +++ b/clang/include/clang/Basic/CodeGenOptions.def @@ -61,8 +61,7 @@ CODEGENOPT(DisableO0ImplyOptNone , 1, 0) ///< Don't annonate function with optnone at O0 CODEGENOPT(ExperimentalStrictFloatingPoint, 1, 0) ///< Enables the new, experimental ///< strict floating point. -CODEGENOPT(ExperimentalNewPassManager, 1, 0) ///< Enables the new, experimental - ///< pass manager. +CODEGENOPT(LegacyPassManager, 1, 0) ///< Use the legacy pass manager. CODEGENOPT(DebugPassManager, 1, 0) ///< Prints debug information for the new ///< pass manager. CODEGENOPT(DisableRedZone , 1, 0) ///< Set when -mno-red-zone is enabled. 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 @@ -1351,9 +1351,13 @@ HelpText<"Enables the global instruction selector">; def fexperimental_isel : Flag<["-"], "fexperimental-isel">, Group, Alias; -defm experimental_new_pass_manager : BooleanMarshalledFFlag<"experimental-new-pass-manager", "CodeGenOpts.ExperimentalNewPassManager", - "static_cast(LLVM_ENABLE_NEW_PASS_MANAGER)", "Enables an experimental new pass manager in LLVM.", - "Disables an experimental new pass manager in LLVM.">, Group, Flags<[CC1Option]>; +defm legacy_pass_manager : BooleanMarshalledFFlag<"legacy-pass-manager", "CodeGenOpts.LegacyPassManager", + "static_cast(LLVM_ENABLE_NEW_PASS_MANAGER)", "Use the legacy pass manager in LLVM", + "Use the new pass manager in LLVM">, Group, Flags<[CC1Option]>; +def fexperimental_new_pass_manager : Flag<["-"], "fexperimental-new-pass-manager">, + Group, Flags<[CC1Option]>, Alias; +def fno_experimental_new_pass_manager : Flag<["-"], "fno-experimental-new-pass-manager">, + Group, Flags<[CC1Option]>, Alias; def fexperimental_strict_floating_point : Flag<["-"], "fexperimental-strict-floating-point">, Group, Flags<[CC1Option]>, HelpText<"Enables experimental strict floating point in LLVM.">, diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -1482,7 +1482,7 @@ } Conf.ProfileRemapping = std::move(ProfileRemapping); - Conf.UseNewPM = CGOpts.ExperimentalNewPassManager; + Conf.UseNewPM = !CGOpts.LegacyPassManager; Conf.DebugPassManager = CGOpts.DebugPassManager; Conf.RemarksWithHotness = CGOpts.DiagnosticsWithHotness; Conf.RemarksFilename = CGOpts.OptRecordFile; @@ -1572,7 +1572,7 @@ EmitAssemblyHelper AsmHelper(Diags, HeaderOpts, CGOpts, TOpts, LOpts, M); - if (CGOpts.ExperimentalNewPassManager) + if (!CGOpts.LegacyPassManager) AsmHelper.EmitAssemblyWithNewPassManager(Action, std::move(OS)); else AsmHelper.EmitAssembly(Action, std::move(OS)); 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 @@ -5848,8 +5848,8 @@ false)) CmdArgs.push_back("-fmodules-debuginfo"); - Args.AddLastArg(CmdArgs, options::OPT_fexperimental_new_pass_manager, - options::OPT_fno_experimental_new_pass_manager); + Args.AddLastArg(CmdArgs, options::OPT_flegacy_pass_manager, + options::OPT_fno_legacy_pass_manager); ObjCRuntime Runtime = AddObjCRuntimeArgs(Args, Inputs, CmdArgs, rewriteKind); RenderObjCOptions(TC, D, RawTriple, Args, Runtime, rewriteKind != RK_None, diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -595,11 +595,13 @@ Path)); } - // Need this flag to turn on new pass manager via Gold plugin. - if (Args.hasFlag(options::OPT_fexperimental_new_pass_manager, - options::OPT_fno_experimental_new_pass_manager, - /* Default */ LLVM_ENABLE_NEW_PASS_MANAGER)) { - CmdArgs.push_back("-plugin-opt=new-pass-manager"); + // Pass an option to enable/disable the new pass manager. + if (auto *A = Args.getLastArg(options::OPT_flegacy_pass_manager, + options::OPT_fno_legacy_pass_manager)) { + if (A->getOption().matches(options::OPT_flegacy_pass_manager)) + CmdArgs.push_back("-plugin-opt=legacy-pass-manager"); + else + CmdArgs.push_back("-plugin-opt=new-pass-manager"); } // Setup statistics file output. diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -1006,10 +1006,10 @@ setPGOUseInstrumentor(Opts, Opts.ProfileInstrumentUsePath); Opts.ProfileRemappingFile = std::string(Args.getLastArgValue(OPT_fprofile_remapping_file_EQ)); - if (!Opts.ProfileRemappingFile.empty() && !Opts.ExperimentalNewPassManager) { + if (!Opts.ProfileRemappingFile.empty() && Opts.LegacyPassManager) { Diags.Report(diag::err_drv_argument_only_allowed_with) - << Args.getLastArg(OPT_fprofile_remapping_file_EQ)->getAsString(Args) - << "-fexperimental-new-pass-manager"; + << Args.getLastArg(OPT_fprofile_remapping_file_EQ)->getAsString(Args) + << "-fno-legacy-pass-manager"; } Opts.CoverageMapping = @@ -1051,9 +1051,9 @@ // -ftime-report= is only for new pass manager. if (A->getOption().getID() == OPT_ftime_report_EQ) { - if (!Opts.ExperimentalNewPassManager) + if (Opts.LegacyPassManager) Diags.Report(diag::err_drv_argument_only_allowed_with) - << A->getAsString(Args) << "-fexperimental-new-pass-manager"; + << A->getAsString(Args) << "-fno-legacy-pass-manager"; StringRef Val = A->getValue(); if (Val == "per-pass") 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 @@ -466,14 +466,6 @@ // CHECK-WCHAR2-NOT: -fwchar-type=int // DELIMITERS: {{^ *"}} -// RUN: %clang -### -fno-experimental-new-pass-manager -fexperimental-new-pass-manager %s 2>&1 | FileCheck --check-prefix=CHECK-PM --check-prefix=CHECK-NEW-PM %s -// RUN: %clang -### -fexperimental-new-pass-manager -fno-experimental-new-pass-manager %s 2>&1 | FileCheck --check-prefix=CHECK-PM --check-prefix=CHECK-NO-NEW-PM %s -// CHECK-PM-NOT: argument unused -// CHECK-NEW-PM: -fexperimental-new-pass-manager -// CHECK-NEW-PM-NOT: -fno-experimental-new-pass-manager -// CHECK-NO-NEW-PM: -fno-experimental-new-pass-manager -// CHECK-NO-NEW-PM-NOT: -fexperimental-new-pass-manager - // RUN: %clang -### -S -fstrict-return %s 2>&1 | FileCheck -check-prefix=CHECK-STRICT-RETURN %s // RUN: %clang -### -S -fno-strict-return %s 2>&1 | FileCheck -check-prefix=CHECK-NO-STRICT-RETURN %s // CHECK-STRICT-RETURN-NOT: "-fno-strict-return" diff --git a/clang/test/Driver/flegacy-pass-manager.c b/clang/test/Driver/flegacy-pass-manager.c new file mode 100644 --- /dev/null +++ b/clang/test/Driver/flegacy-pass-manager.c @@ -0,0 +1,30 @@ +// RUN: %clang -### -c -flegacy-pass-manager -fno-legacy-pass-manager %s 2>&1 | FileCheck --check-prefixes=NOWARN,NEW %s +// RUN: %clang -### -c -fno-legacy-pass-manager -flegacy-pass-manager %s 2>&1 | FileCheck --check-prefixes=NOWARN,LEGACY %s + +/// -f[no-]experimental-new-pass-manager are legacy aliases when the new PM was still experimental. +// RUN: %clang -### -c -fno-experimental-new-pass-manager -fexperimental-new-pass-manager %s 2>&1 | FileCheck --check-prefixes=NOWARN,NEW %s +// RUN: %clang -### -c -fexperimental-new-pass-manager -fno-experimental-new-pass-manager %s 2>&1 | FileCheck --check-prefixes=NOWARN,LEGACY %s + +// NOWARN-NOT: warning: argument unused + +// NEW: -fno-legacy-pass-manager +// NEW-NOT: -flegacy-pass-manager + +// LEGACY: -flegacy-pass-manager +// LEGACY-NOT: -fno-legacy-pass-manager + +/// For full/Thin LTO, -fno-legacy-pass-manager passes -plugin-opt=new-pass-manager to the linker (which may not be LLD). +// RUN: %clang -### -target x86_64-linux -flto -fno-legacy-pass-manager %s 2>&1 | FileCheck --check-prefix=LTO_NEW %s +// RUN: %clang -### -target x86_64-linux -flto=thin -fexperimental-new-pass-manager %s 2>&1 | FileCheck --check-prefix=LTO_NEW %s + +// LTO_NEW: "-plugin-opt=new-pass-manager" + +// RUN: %clang -### -target x86_64-linux -flto -flegacy-pass-manager %s 2>&1 | FileCheck --check-prefix=LTO_LEGACY %s +// RUN: %clang -### -target x86_64-linux -flto=thin -fno-experimental-new-pass-manager %s 2>&1 | FileCheck --check-prefix=LTO_LEGACY %s + +// LTO_LEGACY: "-plugin-opt=legacy-pass-manager" + +// RUN: %clang -### -target x86_64-linux -flto %s 2>&1 | FileCheck --check-prefix=DEFAULT %s +// +// DEFAULT-NOT: "-plugin-opt=new-pass-manager" +// DEFAULT-NOT: "-plugin-opt=legacy-pass-manager" diff --git a/clang/test/Driver/gold-lto-new-pass-man.c b/clang/test/Driver/gold-lto-new-pass-man.c deleted file mode 100644 --- a/clang/test/Driver/gold-lto-new-pass-man.c +++ /dev/null @@ -1,7 +0,0 @@ -// RUN: touch %t.o -// -// RUN: %clang -target ppc64le-unknown-linux -### %t.o -flto 2>&1 \ -// RUN: -Wl,-plugin-opt=foo -O3 \ -// RUN: -fexperimental-new-pass-manager \ -// RUN: | FileCheck %s -// CHECK: "-plugin-opt=new-pass-manager"