[clang] [Clang] Reuse the function getOptimizationLevel in tools::addLTOOptions. (PR #169762)
Jim Lin via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 3 00:05:39 PST 2025
https://github.com/tclin914 updated https://github.com/llvm/llvm-project/pull/169762
>From c15ccbb6f797c24d9a3b28f5e0d8d9ca93a76668 Mon Sep 17 00:00:00 2001
From: Jim Lin <jim at andestech.com>
Date: Fri, 21 Nov 2025 15:35:24 +0800
Subject: [PATCH 1/5] [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 | 57 +++++++++++++++++++
clang/lib/Driver/ToolChains/CommonArgs.cpp | 27 +++------
clang/lib/Frontend/CompilerInvocation.cpp | 55 ------------------
5 files changed, 71 insertions(+), 80 deletions(-)
diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h
index 76a6c5a128efb..ab7c8d83adcaa 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"
@@ -916,6 +917,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 4977ddb307d21..57de5a4699975 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 8644a271a04b5..78a03057447fc 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -7420,3 +7420,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 d3539a594df11..c07cdc82eec82 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 d2a5ed6262de1..ba3276447eaac 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -2669,61 +2669,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.
///
>From 0fc8606c9555cab027b13907737c72006ab04524 Mon Sep 17 00:00:00 2001
From: Jim Lin <jim at andestech.com>
Date: Tue, 2 Dec 2025 13:03:01 +0800
Subject: [PATCH 2/5] Move getOptimizationLevel/getOptimizationLevelSize to
`clang::driver` namespace
---
clang/include/clang/Driver/Driver.h | 3 +--
clang/lib/Driver/Driver.cpp | 6 +++---
2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h
index ab7c8d83adcaa..d33db3d8c8b4a 100644
--- a/clang/include/clang/Driver/Driver.h
+++ b/clang/include/clang/Driver/Driver.h
@@ -916,13 +916,12 @@ void applyOverrideOptions(SmallVectorImpl<const char *> &Args,
llvm::StringSet<> &SavedStrings, StringRef EnvVar,
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 driver
} // end namespace clang
#endif
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 78a03057447fc..01d4d698ff195 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -7421,8 +7421,8 @@ void driver::applyOverrideOptions(SmallVectorImpl<const char *> &Args,
}
}
-unsigned clang::getOptimizationLevel(const ArgList &Args, InputKind IK,
- DiagnosticsEngine &Diags) {
+unsigned clang::driver::getOptimizationLevel(const ArgList &Args, InputKind IK,
+ DiagnosticsEngine &Diags) {
unsigned DefaultOpt = 0;
if ((IK.getLanguage() == Language::OpenCL ||
IK.getLanguage() == Language::OpenCLCXX) &&
@@ -7462,7 +7462,7 @@ unsigned clang::getOptimizationLevel(const ArgList &Args, InputKind IK,
return DefaultOpt;
}
-unsigned clang::getOptimizationLevelSize(const ArgList &Args) {
+unsigned clang::driver::getOptimizationLevelSize(const ArgList &Args) {
if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
if (A->getOption().matches(options::OPT_O)) {
switch (A->getValue()[0]) {
>From e4d5f5769a003fd3c86009414932130b375cc3bb Mon Sep 17 00:00:00 2001
From: Jim Lin <jim at andestech.com>
Date: Wed, 3 Dec 2025 15:58:23 +0800
Subject: [PATCH 3/5] Revert "Move
getOptimizationLevel/getOptimizationLevelSize to `clang::driver` namespace"
This reverts commit 0fc8606c9555cab027b13907737c72006ab04524.
---
clang/include/clang/Driver/Driver.h | 3 ++-
clang/lib/Driver/Driver.cpp | 6 +++---
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h
index d33db3d8c8b4a..ab7c8d83adcaa 100644
--- a/clang/include/clang/Driver/Driver.h
+++ b/clang/include/clang/Driver/Driver.h
@@ -916,12 +916,13 @@ void applyOverrideOptions(SmallVectorImpl<const char *> &Args,
llvm::StringSet<> &SavedStrings, StringRef EnvVar,
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 driver
} // end namespace clang
#endif
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 01d4d698ff195..78a03057447fc 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -7421,8 +7421,8 @@ void driver::applyOverrideOptions(SmallVectorImpl<const char *> &Args,
}
}
-unsigned clang::driver::getOptimizationLevel(const ArgList &Args, InputKind IK,
- DiagnosticsEngine &Diags) {
+unsigned clang::getOptimizationLevel(const ArgList &Args, InputKind IK,
+ DiagnosticsEngine &Diags) {
unsigned DefaultOpt = 0;
if ((IK.getLanguage() == Language::OpenCL ||
IK.getLanguage() == Language::OpenCLCXX) &&
@@ -7462,7 +7462,7 @@ unsigned clang::driver::getOptimizationLevel(const ArgList &Args, InputKind IK,
return DefaultOpt;
}
-unsigned clang::driver::getOptimizationLevelSize(const ArgList &Args) {
+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]) {
>From 7b39053535ef7bd0ff129ce9a7f879fd41fd836e Mon Sep 17 00:00:00 2001
From: Jim Lin <jim at andestech.com>
Date: Wed, 3 Dec 2025 15:58:31 +0800
Subject: [PATCH 4/5] Revert "[Clang] Reuse the function getOptimizationLevel
in tools::addLTOOptions."
This reverts commit c15ccbb6f797c24d9a3b28f5e0d8d9ca93a76668.
---
clang/include/clang/Driver/Driver.h | 7 ---
.../clang/Frontend/CompilerInvocation.h | 5 ++
clang/lib/Driver/Driver.cpp | 57 -------------------
clang/lib/Driver/ToolChains/CommonArgs.cpp | 27 ++++++---
clang/lib/Frontend/CompilerInvocation.cpp | 55 ++++++++++++++++++
5 files changed, 80 insertions(+), 71 deletions(-)
diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h
index ab7c8d83adcaa..76a6c5a128efb 100644
--- a/clang/include/clang/Driver/Driver.h
+++ b/clang/include/clang/Driver/Driver.h
@@ -19,7 +19,6 @@
#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"
@@ -917,12 +916,6 @@ 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 57de5a4699975..4977ddb307d21 100644
--- a/clang/include/clang/Frontend/CompilerInvocation.h
+++ b/clang/include/clang/Frontend/CompilerInvocation.h
@@ -67,6 +67,11 @@ 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 78a03057447fc..8644a271a04b5 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -7420,60 +7420,3 @@ 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 c07cdc82eec82..d3539a594df11 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1095,14 +1095,27 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args,
CmdArgs.push_back(
Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash + "mcpu=" + CPU));
- 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)
+ 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()) {
CmdArgs.push_back(
- Args.MakeArgString(Twine("--lto-CGO") + Twine(OptimizationLevel)));
+ Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash + "O" + OOpt));
+ if (IsAMDGCN)
+ CmdArgs.push_back(Args.MakeArgString(Twine("--lto-CGO") + OOpt));
+ }
}
if (Args.hasArg(options::OPT_gsplit_dwarf)) {
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index ba3276447eaac..d2a5ed6262de1 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -2669,6 +2669,61 @@ 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.
///
>From 19303c001c7806fc6490bb7459869a7098b735e3 Mon Sep 17 00:00:00 2001
From: Jim Lin <jim at andestech.com>
Date: Wed, 3 Dec 2025 10:10:56 +0800
Subject: [PATCH 5/5] Don't move the functions to Driver
After https://github.com/llvm/llvm-project/pull/169599, the dependency
of clangDriver and clangFrontend is removed.
---
.../clang/Frontend/CompilerInvocation.h | 4 +--
clang/lib/Driver/ToolChains/CommonArgs.cpp | 28 ++++++-------------
clang/lib/Frontend/CompilerInvocation.cpp | 4 +--
3 files changed, 12 insertions(+), 24 deletions(-)
diff --git a/clang/include/clang/Frontend/CompilerInvocation.h b/clang/include/clang/Frontend/CompilerInvocation.h
index 4977ddb307d21..903583e3fe79c 100644
--- a/clang/include/clang/Frontend/CompilerInvocation.h
+++ b/clang/include/clang/Frontend/CompilerInvocation.h
@@ -67,10 +67,10 @@ bool ParseDiagnosticArgs(DiagnosticOptions &Opts, llvm::opt::ArgList &Args,
DiagnosticsEngine *Diags = nullptr,
bool DefaultDiagColor = true);
-unsigned getOptimizationLevel(llvm::opt::ArgList &Args, InputKind IK,
+unsigned getOptimizationLevel(const llvm::opt::ArgList &Args, InputKind IK,
DiagnosticsEngine &Diags);
-unsigned getOptimizationLevelSize(llvm::opt::ArgList &Args);
+unsigned getOptimizationLevelSize(const 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
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index d3539a594df11..882283a99d4f1 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -35,6 +35,7 @@
#include "clang/Driver/ToolChain.h"
#include "clang/Driver/Util.h"
#include "clang/Driver/XRayArgs.h"
+#include "clang/Frontend/CompilerInvocation.h"
#include "clang/Options/Options.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallSet.h"
@@ -1095,27 +1096,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 d2a5ed6262de1..b42c263abd2c7 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -2669,7 +2669,7 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,
return Diags->getNumErrors() == NumErrorsBefore;
}
-unsigned clang::getOptimizationLevel(ArgList &Args, InputKind IK,
+unsigned clang::getOptimizationLevel(const ArgList &Args, InputKind IK,
DiagnosticsEngine &Diags) {
unsigned DefaultOpt = 0;
if ((IK.getLanguage() == Language::OpenCL ||
@@ -2708,7 +2708,7 @@ unsigned clang::getOptimizationLevel(ArgList &Args, InputKind IK,
return DefaultOpt;
}
-unsigned clang::getOptimizationLevelSize(ArgList &Args) {
+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]) {
More information about the cfe-commits
mailing list