-
Notifications
You must be signed in to change notification settings - Fork 14.9k
[Clang] Add clang driver option -fpartition-static-data-sections #124991
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
b005fbe
to
6893fcc
Compare
6893fcc
to
b5d07b4
Compare
@llvm/pr-subscribers-clang-codegen @llvm/pr-subscribers-clang Author: Mingming Liu (mingmingl-llvm) ChangesFull diff: https://github.com/llvm/llvm-project/pull/124991.diff 7 Files Affected:
diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def
index 259972bdf8f00..86246eb373630 100644
--- a/clang/include/clang/Basic/CodeGenOptions.def
+++ b/clang/include/clang/Basic/CodeGenOptions.def
@@ -199,6 +199,8 @@ CODEGENOPT(DisableBlockSignatureString, 1, 0) ///< Set when -fdisable-block-sign
CODEGENOPT(HIPSaveKernelArgName, 1, 0) ///< Set when -fhip-kernel-arg-name is enabled.
CODEGENOPT(UniqueInternalLinkageNames, 1, 0) ///< Internal Linkage symbols get unique names.
CODEGENOPT(SplitMachineFunctions, 1, 0) ///< Split machine functions using profile information.
+CODEGENOPT(PartitionStaticDataSections, 1,
+ 0) /// < Partition static data sections using profile information.
CODEGENOPT(PPCUseFullRegisterNames, 1, 0) ///< Print full register names in assembly
CODEGENOPT(X86RelaxRelocations, 1, 1) ///< -Wa,-mrelax-relocations={yes,no}
CODEGENOPT(X86Sse2Avx , 1, 0) ///< -Wa,-msse2avx
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index ba5600e1912a6..a7a3f58f60c6c 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -4385,6 +4385,12 @@ defm split_machine_functions: BoolFOption<"split-machine-functions",
NegFlag<SetFalse, [], [ClangOption], "Disable">,
BothFlags<[], [ClangOption], " late function splitting using profile information (x86 and aarch64 ELF)">>;
+defm partition_static_data_sections: BoolFOption<"partition-static-data-sections",
+ CodeGenOpts<"PartitionStaticDataSections">, DefaultFalse,
+ PosFlag<SetTrue, [], [ClangOption, CC1Option], "Enable">,
+ NegFlag<SetFalse, [], [ClangOption], "Disable">,
+ BothFlags<[], [ClangOption], " partition static data sections using profile information (x86 and aarch64 ELF)">>;
+
defm strict_return : BoolFOption<"strict-return",
CodeGenOpts<"StrictReturn">, DefaultTrue,
NegFlag<SetFalse, [], [ClangOption, CC1Option],
diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp
index 3e65eeb3755d2..9c29e02017227 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -442,6 +442,8 @@ static bool initTargetOptions(const CompilerInstance &CI,
}
Options.EnableMachineFunctionSplitter = CodeGenOpts.SplitMachineFunctions;
+ Options.EnableStaticDataPartitioning =
+ CodeGenOpts.PartitionStaticDataSections;
Options.FunctionSections = CodeGenOpts.FunctionSections;
Options.DataSections = CodeGenOpts.DataSections;
Options.IgnoreXCOFFVisibility = LangOpts.IgnoreXCOFFVisibility;
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 70e5e9847dff6..ff0e467e67dde 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -6401,6 +6401,20 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
}
}
+ if (Arg *A =
+ Args.getLastArg(options::OPT_fpartition_static_data_sections,
+ options::OPT_fno_partition_static_data_sections)) {
+ if (!A->getOption().matches(
+ options::OPT_fno_partition_static_data_sections)) {
+ // This codegen pass is only available on x86 and AArch64 ELF targets.
+ if ((Triple.isX86() || Triple.isAArch64()) && Triple.isOSBinFormatELF())
+ A->render(Args, CmdArgs);
+ else
+ D.Diag(diag::err_drv_unsupported_opt_for_target)
+ << A->getAsString(Args) << TripleStr;
+ }
+ }
+
Args.AddLastArg(CmdArgs, options::OPT_finstrument_functions,
options::OPT_finstrument_functions_after_inlining,
options::OPT_finstrument_function_entry_bare);
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 2c4b082bcce4a..40878e9778499 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1087,6 +1087,14 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args,
"-split-machine-functions"));
}
+ if (auto *A =
+ Args.getLastArg(options::OPT_fpartition_static_data_sections,
+ options::OPT_fno_partition_static_data_sections)) {
+ if (A->getOption().matches(options::OPT_fpartition_static_data_sections))
+ CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
+ "-partition-static-data-sections"));
+ }
+
if (Arg *A = getLastProfileSampleUseArg(Args)) {
StringRef FName = A->getValue();
if (!llvm::sys::fs::exists(FName))
diff --git a/clang/test/Driver/fpartition-static-data-sections.c b/clang/test/Driver/fpartition-static-data-sections.c
new file mode 100644
index 0000000000000..8f158b81373de
--- /dev/null
+++ b/clang/test/Driver/fpartition-static-data-sections.c
@@ -0,0 +1,15 @@
+// RUN: %clang -### --target=x86_64 -fpartition-static-data-sections %s 2>&1 | FileCheck %s --check-prefixes=OPT
+// RUN: %clang -### --target=aarch64 -fpartition-static-data-sections %s 2>&1 | FileCheck %s --check-prefixes=OPT
+
+// RUN: not %clang -### --target=arm -fpartition-static-data-sections %s 2>&1 | FileCheck %s --check-prefixes=ERR
+
+// RUN: %clang -### --target=x86_64 -fpartition-static-data-sections -fno-partition-static-data-sections %s 2>&1 | FileCheck %s --implicit-check-not="-fpartition-static-data-sections"
+
+// RUN: %clang -### --target=x86_64-linux -flto -fpartition-static-data-sections %s 2>&1 | FileCheck %s --check-prefix=LTO
+// RUN: %clang -### --target=x86_64-linux -flto -fpartition-static-data-sections -fno-partition-static-data-sections %s 2>&1 | FileCheck %s --implicit-check-not="-plugin-opt=-fpartition-static-data-sections"
+
+// OPT: "-fpartition-static-data-sections"
+
+// ERR: error: unsupported option '-fpartition-static-data-sections' for target
+
+// LTO: "-plugin-opt=-partition-static-data-sections"
diff --git a/clang/test/Driver/test.c b/clang/test/Driver/test.c
new file mode 100644
index 0000000000000..8f158b81373de
--- /dev/null
+++ b/clang/test/Driver/test.c
@@ -0,0 +1,15 @@
+// RUN: %clang -### --target=x86_64 -fpartition-static-data-sections %s 2>&1 | FileCheck %s --check-prefixes=OPT
+// RUN: %clang -### --target=aarch64 -fpartition-static-data-sections %s 2>&1 | FileCheck %s --check-prefixes=OPT
+
+// RUN: not %clang -### --target=arm -fpartition-static-data-sections %s 2>&1 | FileCheck %s --check-prefixes=ERR
+
+// RUN: %clang -### --target=x86_64 -fpartition-static-data-sections -fno-partition-static-data-sections %s 2>&1 | FileCheck %s --implicit-check-not="-fpartition-static-data-sections"
+
+// RUN: %clang -### --target=x86_64-linux -flto -fpartition-static-data-sections %s 2>&1 | FileCheck %s --check-prefix=LTO
+// RUN: %clang -### --target=x86_64-linux -flto -fpartition-static-data-sections -fno-partition-static-data-sections %s 2>&1 | FileCheck %s --implicit-check-not="-plugin-opt=-fpartition-static-data-sections"
+
+// OPT: "-fpartition-static-data-sections"
+
+// ERR: error: unsupported option '-fpartition-static-data-sections' for target
+
+// LTO: "-plugin-opt=-partition-static-data-sections"
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you update the clang command line reference documentation too?
options::OPT_fno_partition_static_data_sections)) { | ||
if (!A->getOption().matches( | ||
options::OPT_fno_partition_static_data_sections)) { | ||
// This codegen pass is only available on x86 and AArch64 ELF targets. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If someone interested in using this on other backends comes across this comment, where should they look to understand what needs to be done?
No description provided.