Author: Mingming Liu
Date: 2026-01-07T09:13:12-08:00
New Revision: 8a3039f977428f461e2cb45c4a34b9eb07588685

URL: 
https://github.com/llvm/llvm-project/commit/8a3039f977428f461e2cb45c4a34b9eb07588685
DIFF: 
https://github.com/llvm/llvm-project/commit/8a3039f977428f461e2cb45c4a34b9eb07588685.diff

LOG: [Clang] Add clang driver option -fpartition-static-data-sections  (#124991)

Added: 
    clang/test/Driver/fpartition-static-data-sections.c

Modified: 
    clang/include/clang/Basic/CodeGenOptions.def
    clang/include/clang/Options/Options.td
    clang/lib/CodeGen/BackendUtil.cpp
    clang/lib/Driver/ToolChains/Clang.cpp
    clang/lib/Driver/ToolChains/CommonArgs.cpp

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Basic/CodeGenOptions.def 
b/clang/include/clang/Basic/CodeGenOptions.def
index 3784844ef1028..a6b1acdcf5ea9 100644
--- a/clang/include/clang/Basic/CodeGenOptions.def
+++ b/clang/include/clang/Basic/CodeGenOptions.def
@@ -195,6 +195,7 @@ CODEGENOPT(DisableBlockSignatureString, 1, 0, Benign) ///< 
Set when -fdisable-bl
 CODEGENOPT(HIPSaveKernelArgName, 1, 0, Benign) ///< Set when 
-fhip-kernel-arg-name is enabled.
 CODEGENOPT(UniqueInternalLinkageNames, 1, 0, Benign) ///< Internal Linkage 
symbols get unique names.
 CODEGENOPT(SplitMachineFunctions, 1, 0, Benign) ///< Split machine functions 
using profile information.
+CODEGENOPT(PartitionStaticDataSections, 1, 0, Benign) /// < Partition static 
data sections using profile information.
 CODEGENOPT(PPCUseFullRegisterNames, 1, 0, Benign) ///< Print full register 
names in assembly
 CODEGENOPT(X86RelaxRelocations, 1, 1, Benign) ///< 
-Wa,-mrelax-relocations={yes,no}
 CODEGENOPT(X86Sse2Avx        , 1, 0, Benign)   ///< -Wa,-msse2avx

diff  --git a/clang/include/clang/Options/Options.td 
b/clang/include/clang/Options/Options.td
index dd039fd474263..f336542992993 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -4672,6 +4672,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 e4b64a0c2ff48..c5ea8c9e8c3de 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -439,6 +439,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 9ead69bd2fe48..699fc31f23946 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -6196,6 +6196,22 @@ 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);
+        CmdArgs.push_back("-mllvm");
+        CmdArgs.push_back("-memprof-annotate-static-data-prefix");
+      } 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 b005604821e27..10a1a412eea08 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1241,6 +1241,15 @@ 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..b200d673bb7fa
--- /dev/null
+++ b/clang/test/Driver/fpartition-static-data-sections.c
@@ -0,0 +1,16 @@
+// 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"
+// OPT: "-mllvm" "-memprof-annotate-static-data-prefix"
+
+// ERR: error: unsupported option '-fpartition-static-data-sections' for target
+
+// LTO: "-plugin-opt=-partition-static-data-sections"


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to