https://github.com/tclin914 created https://github.com/llvm/llvm-project/pull/169762
I also move the functions getOptimizationLevel/getOptimizationLevelSize to Driver.cpp. That we can more easily use those functions. Don't need to add clangFrontend to LINK_LIBS additionally. >From 7d0cfecfd087826dcecbd35e81a0714a9441797e Mon Sep 17 00:00:00 2001 From: Jim Lin <[email protected]> Date: Fri, 21 Nov 2025 15:35:24 +0800 Subject: [PATCH] [Clang] Reuse the function getOptimizationLevel in tools::addLTOOptions. I also move the functions getOptimizationLevel/getOptimizationLevelSize to Driver.cpp. That we can more easily use those functions. Don't need to add clangFrontend to LINK_LIBS additionally. --- clang/include/clang/Driver/Driver.h | 7 +++ .../clang/Frontend/CompilerInvocation.h | 5 -- clang/lib/Driver/Driver.cpp | 58 +++++++++++++++++++ clang/lib/Driver/ToolChains/CommonArgs.cpp | 27 +++------ clang/lib/Frontend/CompilerInvocation.cpp | 55 ------------------ 5 files changed, 72 insertions(+), 80 deletions(-) diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index aa86bffb802a4..33509bb5bbbfc 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -19,6 +19,7 @@ #include "clang/Driver/ToolChain.h" #include "clang/Driver/Types.h" #include "clang/Driver/Util.h" +#include "clang/Frontend/FrontendOptions.h" #include "clang/Options/Options.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/STLFunctionalExtras.h" @@ -921,6 +922,12 @@ void applyOverrideOptions(SmallVectorImpl<const char *> &Args, raw_ostream *OS = nullptr); } // end namespace driver + +unsigned getOptimizationLevel(const llvm::opt::ArgList &Args, InputKind IK, + DiagnosticsEngine &Diags); + +unsigned getOptimizationLevelSize(const llvm::opt::ArgList &Args); + } // end namespace clang #endif diff --git a/clang/include/clang/Frontend/CompilerInvocation.h b/clang/include/clang/Frontend/CompilerInvocation.h index b19a6e1a8acc3..51787d914e1ec 100644 --- a/clang/include/clang/Frontend/CompilerInvocation.h +++ b/clang/include/clang/Frontend/CompilerInvocation.h @@ -67,11 +67,6 @@ bool ParseDiagnosticArgs(DiagnosticOptions &Opts, llvm::opt::ArgList &Args, DiagnosticsEngine *Diags = nullptr, bool DefaultDiagColor = true); -unsigned getOptimizationLevel(llvm::opt::ArgList &Args, InputKind IK, - DiagnosticsEngine &Diags); - -unsigned getOptimizationLevelSize(llvm::opt::ArgList &Args); - /// The base class of CompilerInvocation. It keeps individual option objects /// behind reference-counted pointers, which is useful for clients that want to /// keep select option objects alive (even after CompilerInvocation gets diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index de8d4601210ae..a75dbc2991e36 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -66,6 +66,7 @@ #include "clang/Driver/ToolChain.h" #include "clang/Driver/Types.h" #include "clang/Lex/DependencyDirectivesScanner.h" +#include "clang/Options/OptionUtils.h" #include "clang/Options/Options.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/STLExtras.h" @@ -7415,3 +7416,60 @@ void driver::applyOverrideOptions(SmallVectorImpl<const char *> &Args, ++S; } } + +unsigned clang::getOptimizationLevel(const ArgList &Args, InputKind IK, + DiagnosticsEngine &Diags) { + unsigned DefaultOpt = 0; + if ((IK.getLanguage() == Language::OpenCL || + IK.getLanguage() == Language::OpenCLCXX) && + !Args.hasArg(clang::options::OPT_cl_opt_disable)) + DefaultOpt = 2; + + if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { + if (A->getOption().matches(options::OPT_O0)) + return 0; + + if (A->getOption().matches(options::OPT_Ofast)) + return 3; + + assert(A->getOption().matches(options::OPT_O)); + + StringRef S(A->getValue()); + if (S == "s" || S == "z") + return 2; + + if (S == "g") + return 1; + + DefaultOpt = + getLastArgIntValue(Args, clang::options::OPT_O, DefaultOpt, Diags); + } + + unsigned MaxOptLevel = 3; + if (DefaultOpt > MaxOptLevel) { + // If the optimization level is not supported, fall back on the default + // optimization + Diags.Report(diag::warn_drv_optimization_value) + << Args.getLastArg(clang::options::OPT_O)->getAsString(Args) << "-O" + << MaxOptLevel; + DefaultOpt = MaxOptLevel; + } + + return DefaultOpt; +} + +unsigned clang::getOptimizationLevelSize(const ArgList &Args) { + if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { + if (A->getOption().matches(options::OPT_O)) { + switch (A->getValue()[0]) { + default: + return 0; + case 's': + return 1; + case 'z': + return 2; + } + } + } + return 0; +} diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 4c036f0f8dee3..ceb03742b5f64 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -1095,27 +1095,14 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args, CmdArgs.push_back( Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash + "mcpu=" + CPU)); - if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { - // The optimization level matches - // CompilerInvocation.cpp:getOptimizationLevel(). - StringRef OOpt; - if (A->getOption().matches(options::OPT_O4) || - A->getOption().matches(options::OPT_Ofast)) - OOpt = "3"; - else if (A->getOption().matches(options::OPT_O)) { - OOpt = A->getValue(); - if (OOpt == "g") - OOpt = "1"; - else if (OOpt == "s" || OOpt == "z") - OOpt = "2"; - } else if (A->getOption().matches(options::OPT_O0)) - OOpt = "0"; - if (!OOpt.empty()) { + if (Args.getLastArg(options::OPT_O_Group)) { + unsigned OptimizationLevel = + getOptimizationLevel(Args, InputKind(), D.getDiags()); + CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash + + "O" + Twine(OptimizationLevel))); + if (IsAMDGCN) CmdArgs.push_back( - Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash + "O" + OOpt)); - if (IsAMDGCN) - CmdArgs.push_back(Args.MakeArgString(Twine("--lto-CGO") + OOpt)); - } + Args.MakeArgString(Twine("--lto-CGO") + Twine(OptimizationLevel))); } if (Args.hasArg(options::OPT_gsplit_dwarf)) { diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 2e027934a8db6..fb39b7cdeac43 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -2672,61 +2672,6 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args, return Diags->getNumErrors() == NumErrorsBefore; } -unsigned clang::getOptimizationLevel(ArgList &Args, InputKind IK, - DiagnosticsEngine &Diags) { - unsigned DefaultOpt = 0; - if ((IK.getLanguage() == Language::OpenCL || - IK.getLanguage() == Language::OpenCLCXX) && - !Args.hasArg(OPT_cl_opt_disable)) - DefaultOpt = 2; - - if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { - if (A->getOption().matches(options::OPT_O0)) - return 0; - - if (A->getOption().matches(options::OPT_Ofast)) - return 3; - - assert(A->getOption().matches(options::OPT_O)); - - StringRef S(A->getValue()); - if (S == "s" || S == "z") - return 2; - - if (S == "g") - return 1; - - DefaultOpt = getLastArgIntValue(Args, OPT_O, DefaultOpt, Diags); - } - - unsigned MaxOptLevel = 3; - if (DefaultOpt > MaxOptLevel) { - // If the optimization level is not supported, fall back on the default - // optimization - Diags.Report(diag::warn_drv_optimization_value) - << Args.getLastArg(OPT_O)->getAsString(Args) << "-O" << MaxOptLevel; - DefaultOpt = MaxOptLevel; - } - - return DefaultOpt; -} - -unsigned clang::getOptimizationLevelSize(ArgList &Args) { - if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { - if (A->getOption().matches(options::OPT_O)) { - switch (A->getValue()[0]) { - default: - return 0; - case 's': - return 1; - case 'z': - return 2; - } - } - } - return 0; -} - /// Parse the argument to the -ftest-module-file-extension /// command-line argument. /// _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
