[clang] [Clang] Reuse the function getOptimizationLevel in tools::addLTOOptions. (PR #169762)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 26 21:49:27 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Jim Lin (tclin914)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/169762.diff
5 Files Affected:
- (modified) clang/include/clang/Driver/Driver.h (+7)
- (modified) clang/include/clang/Frontend/CompilerInvocation.h (-5)
- (modified) clang/lib/Driver/Driver.cpp (+58)
- (modified) clang/lib/Driver/ToolChains/CommonArgs.cpp (+7-20)
- (modified) clang/lib/Frontend/CompilerInvocation.cpp (-55)
``````````diff
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.
///
``````````
</details>
https://github.com/llvm/llvm-project/pull/169762
More information about the cfe-commits
mailing list