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

Mingming Liu via cfe-commits cfe-commits at lists.llvm.org
Wed Jan 29 13:42:47 PST 2025


https://github.com/mingmingl-llvm created https://github.com/llvm/llvm-project/pull/124991

None

>From 755b5d07f8fb792793036179df72eec6bda19260 Mon Sep 17 00:00:00 2001
From: mingmingl <mingmingl at google.com>
Date: Wed, 29 Jan 2025 13:17:11 -0800
Subject: [PATCH 1/2] [Clang]Add -fpartition-static-data-section

---
 clang/include/clang/Basic/CodeGenOptions.def       |  2 ++
 clang/include/clang/Driver/Options.td              |  6 ++++++
 clang/lib/CodeGen/BackendUtil.cpp                  |  2 ++
 clang/lib/Driver/ToolChains/Clang.cpp              | 14 ++++++++++++++
 clang/lib/Driver/ToolChains/CommonArgs.cpp         |  8 ++++++++
 .../test/Driver/fpartition-static-data-sections.c  | 13 +++++++++++++
 clang/test/Driver/test.c                           | 13 +++++++++++++
 7 files changed, 58 insertions(+)
 create mode 100644 clang/test/Driver/fpartition-static-data-sections.c
 create mode 100644 clang/test/Driver/test.c

diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def
index 259972bdf8f001..86246eb3736301 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 ba5600e1912a63..c7c01fd54290ba 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 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 3e65eeb3755d2f..9c29e020172274 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 70e5e9847dff6f..e67df32180ea9b 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.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 2c4b082bcce4a6..40878e9778499e 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 00000000000000..271b22a55c188d
--- /dev/null
+++ b/clang/test/Driver/fpartition-static-data-sections.c
@@ -0,0 +1,13 @@
+// RUN: %clang -### --target=x86_64 -fpartition-static-data-sections %s 2>&1 | FileCheck %s --check-prefixes=OPT
+// RUN: not %clang -### --target=aarch64 -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 00000000000000..271b22a55c188d
--- /dev/null
+++ b/clang/test/Driver/test.c
@@ -0,0 +1,13 @@
+// RUN: %clang -### --target=x86_64 -fpartition-static-data-sections %s 2>&1 | FileCheck %s --check-prefixes=OPT
+// RUN: not %clang -### --target=aarch64 -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"

>From b005fbe1364b9cde0b62cf73e4c5a01d3e191a0d Mon Sep 17 00:00:00 2001
From: mingmingl <mingmingl at google.com>
Date: Wed, 29 Jan 2025 13:39:52 -0800
Subject: [PATCH 2/2] support aarch64

---
 clang/lib/Driver/ToolChains/Clang.cpp               | 2 +-
 clang/test/Driver/fpartition-static-data-sections.c | 4 +++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index e67df32180ea9b..ff0e467e67dde4 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -6407,7 +6407,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
     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.isOSBinFormatELF())
+      if ((Triple.isX86() || Triple.isAArch64()) && Triple.isOSBinFormatELF())
         A->render(Args, CmdArgs);
       else
         D.Diag(diag::err_drv_unsupported_opt_for_target)
diff --git a/clang/test/Driver/fpartition-static-data-sections.c b/clang/test/Driver/fpartition-static-data-sections.c
index 271b22a55c188d..8f52a1f151f571 100644
--- a/clang/test/Driver/fpartition-static-data-sections.c
+++ b/clang/test/Driver/fpartition-static-data-sections.c
@@ -1,5 +1,7 @@
 // RUN: %clang -### --target=x86_64 -fpartition-static-data-sections %s 2>&1 | FileCheck %s --check-prefixes=OPT
-// RUN: not %clang -### --target=aarch64 -fpartition-static-data-sections %s 2>&1 | FileCheck %s --check-prefixes=ERR
+// 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=OPT
 
 // 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"
 



More information about the cfe-commits mailing list