Author: Fangrui Song Date: 2020-12-09T16:57:36-08:00 New Revision: f9c0d1b0562c4789638a91ce97f1c2d99608005b
URL: https://github.com/llvm/llvm-project/commit/f9c0d1b0562c4789638a91ce97f1c2d99608005b DIFF: https://github.com/llvm/llvm-project/commit/f9c0d1b0562c4789638a91ce97f1c2d99608005b.diff LOG: [Driver] Add -f[no-]legacy-pass-manager to supersede -f[no-]experimental-new-pass-manager The new PM is considered stable and many downstream groups have adopted it (some have adopted it for more than two years). Add -f[no-]legacy-pass-manager to reflect the fact that it is no longer experimental and the legacy pass manager is something we strive to retire. In the future, when the legacy PM eventually goes away, -fno-experimental-new-pass-manager and -flegacy-pass-manager will be removed. This patch also changes -f[no-]legacy-pass-manager to pass `-plugin-opt={new,legacy}-pass-manager` to the linker (supported by both ld.lld and LLVMgold.so) when -flto/-flto=thin is specified Reviewed By: aeubanks, rsmith Differential Revision: https://reviews.llvm.org/D92915 Added: clang/test/Driver/flegacy-pass-manager.c Modified: clang/include/clang/Basic/CodeGenOptions.def clang/include/clang/Driver/Options.td clang/lib/CodeGen/BackendUtil.cpp clang/lib/Driver/ToolChains/Clang.cpp clang/lib/Driver/ToolChains/CommonArgs.cpp clang/lib/Frontend/CompilerInvocation.cpp clang/test/Driver/clang_f_opts.c Removed: clang/test/Driver/gold-lto-new-pass-man.c ################################################################################ diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def index 9c3b4f8289f9..50a778e2a328 100644 --- a/clang/include/clang/Basic/CodeGenOptions.def +++ b/clang/include/clang/Basic/CodeGenOptions.def @@ -61,8 +61,7 @@ CODEGENOPT(DisableLifetimeMarkers, 1, 0) ///< Don't emit any lifetime markers 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 index 896ccbe3b275..fae9c1d532db 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1351,9 +1351,13 @@ def fglobal_isel : Flag<["-"], "fglobal-isel">, Group<f_clang_Group>, HelpText<"Enables the global instruction selector">; def fexperimental_isel : Flag<["-"], "fexperimental-isel">, Group<f_clang_Group>, Alias<fglobal_isel>; -defm experimental_new_pass_manager : BooleanMarshalledFFlag<"experimental-new-pass-manager", "CodeGenOpts.ExperimentalNewPassManager", - "static_cast<unsigned>(LLVM_ENABLE_NEW_PASS_MANAGER)", "Enables an experimental new pass manager in LLVM.", - "Disables an experimental new pass manager in LLVM.">, Group<f_clang_Group>, Flags<[CC1Option]>; +defm legacy_pass_manager : BooleanMarshalledFFlag<"legacy-pass-manager", "CodeGenOpts.LegacyPassManager", + "static_cast<unsigned>(LLVM_ENABLE_NEW_PASS_MANAGER)", "Use the legacy pass manager in LLVM", + "Use the new pass manager in LLVM">, Group<f_clang_Group>, Flags<[CC1Option]>; +def fexperimental_new_pass_manager : Flag<["-"], "fexperimental-new-pass-manager">, + Group<f_clang_Group>, Flags<[CC1Option]>, Alias<fno_legacy_pass_manager>; +def fno_experimental_new_pass_manager : Flag<["-"], "fno-experimental-new-pass-manager">, + Group<f_clang_Group>, Flags<[CC1Option]>, Alias<flegacy_pass_manager>; def fexperimental_strict_floating_point : Flag<["-"], "fexperimental-strict-floating-point">, Group<f_clang_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 index c5a8a3df2166..bde4c25c7bc2 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -1482,7 +1482,7 @@ static void runThinLTOBackend( } 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 @@ void clang::EmitBackendOutput(DiagnosticsEngine &Diags, 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 index b092252791ff..953b832fd767 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -5848,8 +5848,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, 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 index 790be654c084..72bedc16846d 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -595,11 +595,13 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args, 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 index 6d4e677f0269..be5a64464bf1 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -1006,10 +1006,10 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, 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 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, // -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 index 123ad7e2aa99..c011f2e6bad6 100644 --- 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 index 000000000000..8ce2647ebc1d --- /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 index c2add0c73a12..000000000000 --- 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" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits