Author: Fangrui Song
Date: 2024-08-22T09:20:53-07:00
New Revision: eb549da9e5c1e626edb14ba9ce43e46ad3d088af

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

LOG: [Driver] Add -Wa, options -mmapsyms={default,implicit}

-Wa,-mmapsyms=implicit enables the alternative mapping symbol scheme
discussed at #99718.

While not conforming to the current aaelf64 ABI, the option is
invaluable for those with full control over their toolchain, no reliance
on weird relocatable files, and a strong focus on minimizing both
relocatable and executable sizes.

The option is discouraged when portability of the relocatable objects is
a concern.
https://maskray.me/blog/2024-07-21-mapping-symbols-rethinking-for-efficiency
elaborates the risk.

Pull Request: https://github.com/llvm/llvm-project/pull/104542

Added: 
    clang/test/Driver/mmapsyms.c
    clang/test/Misc/cc1as-mmapsyms.c

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

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Basic/CodeGenOptions.def 
b/clang/include/clang/Basic/CodeGenOptions.def
index ecea476abe3232..b600198998d85b 100644
--- a/clang/include/clang/Basic/CodeGenOptions.def
+++ b/clang/include/clang/Basic/CodeGenOptions.def
@@ -37,6 +37,7 @@ VALUE_CODEGENOPT(Name, Bits, Default)
 
 CODEGENOPT(DisableIntegratedAS, 1, 0) ///< -no-integrated-as
 CODEGENOPT(Crel, 1, 0) ///< -Wa,--crel
+CODEGENOPT(ImplicitMapSyms, 1, 0) ///< -Wa,-mmapsyms=implicit
 CODEGENOPT(AsmVerbose        , 1, 0) ///< -dA, -fverbose-asm.
 CODEGENOPT(PreserveAsmComments, 1, 1) ///< -dA, -fno-preserve-as-comments.
 CODEGENOPT(AssumeSaneOperatorNew , 1, 1) ///< implicit __attribute__((malloc)) 
operator new

diff  --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 5d8791727d2109..7a3c699a6a8e88 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -7142,6 +7142,12 @@ def massembler_fatal_warnings : Flag<["-"], 
"massembler-fatal-warnings">,
 def crel : Flag<["--"], "crel">,
   HelpText<"Enable CREL relocation format (ELF only)">,
   MarshallingInfoFlag<CodeGenOpts<"Crel">>;
+def mmapsyms_implicit : Flag<["-"], "mmapsyms=implicit">,
+  HelpText<"Allow mapping symbol at section beginning to be implicit, "
+    "lowering number of mapping symbols at the expense of some "
+    "portability. Recommended for projects that can build all their "
+    "object files using this option">,
+  MarshallingInfoFlag<CodeGenOpts<"ImplicitMapSyms">>;
 def mrelax_relocations_no : Flag<["-"], "mrelax-relocations=no">,
     HelpText<"Disable x86 relax relocations">,
     MarshallingInfoNegativeFlag<CodeGenOpts<"X86RelaxRelocations">>;

diff  --git a/clang/lib/CodeGen/BackendUtil.cpp 
b/clang/lib/CodeGen/BackendUtil.cpp
index 34c08818dbb9ad..fdd89edd72e109 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -471,6 +471,7 @@ static bool initTargetOptions(DiagnosticsEngine &Diags,
   Options.MCOptions.Dwarf64 = CodeGenOpts.Dwarf64;
   Options.MCOptions.PreserveAsmComments = CodeGenOpts.PreserveAsmComments;
   Options.MCOptions.Crel = CodeGenOpts.Crel;
+  Options.MCOptions.ImplicitMapSyms = CodeGenOpts.ImplicitMapSyms;
   Options.MCOptions.X86RelaxRelocations = CodeGenOpts.X86RelaxRelocations;
   Options.MCOptions.CompressDebugSections =
       CodeGenOpts.getCompressDebugSections();

diff  --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 53fdc29948508e..9f1d57f43b6565 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -2554,6 +2554,7 @@ static void CollectArgsForIntegratedAssembler(Compilation 
&C,
   const llvm::Triple &Triple = C.getDefaultToolChain().getTriple();
   bool IsELF = Triple.isOSBinFormatELF();
   bool Crel = false, ExperimentalCrel = false;
+  bool ImplicitMapSyms = false;
   bool UseRelaxRelocations = C.getDefaultToolChain().useRelaxRelocations();
   bool UseNoExecStack = false;
   bool Msa = false;
@@ -2642,6 +2643,15 @@ static void 
CollectArgsForIntegratedAssembler(Compilation &C,
           // recognize but skip over here.
           continue;
         break;
+      case llvm::Triple::aarch64:
+      case llvm::Triple::aarch64_be:
+      case llvm::Triple::aarch64_32:
+        if (Equal.first == "-mmapsyms") {
+          ImplicitMapSyms = Equal.second == "implicit";
+          checkArg(IsELF, {"default", "implicit"});
+          continue;
+        }
+        break;
       case llvm::Triple::mips:
       case llvm::Triple::mipsel:
       case llvm::Triple::mips64:
@@ -2786,6 +2796,8 @@ static void CollectArgsForIntegratedAssembler(Compilation 
&C,
           << "-Wa,--crel" << D.getTargetTriple();
     }
   }
+  if (ImplicitMapSyms)
+    CmdArgs.push_back("-mmapsyms=implicit");
   if (Msa)
     CmdArgs.push_back("-mmsa");
   if (!UseRelaxRelocations)

diff  --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 320d2901da06ed..0738ed18f54078 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1143,10 +1143,27 @@ void tools::addLTOOptions(const ToolChain &ToolChain, 
const ArgList &Args,
   addMachineOutlinerArgs(D, Args, CmdArgs, ToolChain.getEffectiveTriple(),
                          /*IsLTO=*/true, PluginOptPrefix);
 
+  bool IsELF = Triple.isOSBinFormatELF();
   bool Crel = false;
+  bool ImplicitMapSyms = false;
   for (const Arg *A : Args.filtered(options::OPT_Wa_COMMA)) {
     for (StringRef V : A->getValues()) {
-      if (V == "--crel")
+      auto Equal = V.split('=');
+      auto checkArg = [&](bool ValidTarget,
+                          std::initializer_list<const char *> Set) {
+        if (!ValidTarget) {
+          D.Diag(diag::err_drv_unsupported_opt_for_target)
+              << (Twine("-Wa,") + Equal.first + "=").str()
+              << Triple.getTriple();
+        } else if (!llvm::is_contained(Set, Equal.second)) {
+          D.Diag(diag::err_drv_unsupported_option_argument)
+              << (Twine("-Wa,") + Equal.first + "=").str() << Equal.second;
+        }
+      };
+      if (Equal.first == "-mmapsyms") {
+        ImplicitMapSyms = Equal.second == "implicit";
+        checkArg(IsELF && Triple.isAArch64(), {"default", "implicit"});
+      } else if (V == "--crel")
         Crel = true;
       else if (V == "--no-crel")
         Crel = false;
@@ -1156,13 +1173,16 @@ void tools::addLTOOptions(const ToolChain &ToolChain, 
const ArgList &Args,
     }
   }
   if (Crel) {
-    if (Triple.isOSBinFormatELF() && !Triple.isMIPS()) {
+    if (IsELF && !Triple.isMIPS()) {
       CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + "-crel"));
     } else {
       D.Diag(diag::err_drv_unsupported_opt_for_target)
           << "-Wa,--crel" << D.getTargetTriple();
     }
   }
+  if (ImplicitMapSyms)
+    CmdArgs.push_back(
+        Args.MakeArgString(Twine(PluginOptPrefix) + "-implicit-mapsyms"));
 }
 
 void tools::addOpenMPRuntimeLibraryPath(const ToolChain &TC,

diff  --git a/clang/test/Driver/mmapsyms.c b/clang/test/Driver/mmapsyms.c
new file mode 100644
index 00000000000000..3535af3cf1cdda
--- /dev/null
+++ b/clang/test/Driver/mmapsyms.c
@@ -0,0 +1,28 @@
+/// Alternative mapping symbol scheme for AArch64.
+// RUN: %clang -### -c --target=aarch64 -Wa,-mmapsyms=implicit %s -Werror 2>&1 
| FileCheck %s
+// RUN: %clang -### -c --target=aarch64_be -Wa,-mmapsyms=implicit %s -Werror 
2>&1 | FileCheck %s
+// RUN: %clang -### -c --target=aarch64 
-Wa,-mmapsyms=implicit,-mmapsyms=default %s -Werror 2>&1 | FileCheck %s 
--check-prefix=NO
+// RUN: not %clang -### -c --target=arm64-apple-darwin -Wa,-mmapsyms=implicit 
%s 2>&1 | FileCheck %s --check-prefix=ERR
+// RUN: not %clang -### -c --target=x86_64 -Wa,-mmapsyms=implicit %s 2>&1 | 
FileCheck %s --check-prefix=ERR2
+
+// RUN: %clang -### -c --target=aarch64 -Werror -Wa,-mmapsyms=implicit -x 
assembler %s -Werror 2>&1 | FileCheck %s --check-prefix=ASM
+// RUN: not %clang -### -c --target=x86_64 -Wa,-mmapsyms=implicit -x assembler 
%s 2>&1 | FileCheck %s --check-prefix=ERR2
+
+// CHECK:  "-cc1" {{.*}}"-mmapsyms=implicit"
+// NO:     "-cc1"
+// NO-NOT: "-mmapsyms=implicit"
+// ASM:    "-cc1as" {{.*}}"-mmapsyms=implicit"
+// ERR: error: unsupported option '-Wa,-mmapsyms=' for target 
'arm64-apple-darwin'
+// ERR2: error: unsupported argument '-mmapsyms=implicit' to option '-Wa,'
+
+/// Check LTO.
+// RUN: %clang -### --target=aarch64-linux -Werror -flto 
-Wa,-mmapsyms=implicit %s 2>&1 | FileCheck %s --check-prefix=LTO
+// RUN: %clang -### --target=aarch64-linux -Werror -flto 
-Wa,-mmapsyms=implicit -Wa,-mmapsyms=default %s 2>&1 | FileCheck %s 
--check-prefix=LTO-NO
+
+// LTO: "-plugin-opt=-implicit-mapsyms"
+// LTO-NO-NOT: "-plugin-opt=-implicit-mapsyms"
+
+// RUN: touch %t.o
+// RUN: not %clang -### --target=x86_64-unknown-linux -flto 
-Wa,-mmapsyms=implicit %t.o 2>&1 | FileCheck %s --check-prefix=LTO-ERR
+
+// LTO-ERR: error: unsupported option '-Wa,-mmapsyms=' for target 
'x86_64-unknown-linux'

diff  --git a/clang/test/Misc/cc1as-mmapsyms.c 
b/clang/test/Misc/cc1as-mmapsyms.c
new file mode 100644
index 00000000000000..550281903c216e
--- /dev/null
+++ b/clang/test/Misc/cc1as-mmapsyms.c
@@ -0,0 +1,9 @@
+// REQUIRES: aarch64-registered-target
+// RUN: %clang -cc1as -triple aarch64 %s -filetype obj -mmapsyms=implicit -o 
%t.o
+// RUN: llvm-readelf -s %t.o | FileCheck %s
+
+// CHECK: Symbol table '.symtab' contains 1 entries:
+nop
+
+.data
+.quad 0

diff  --git a/clang/tools/driver/cc1as_main.cpp 
b/clang/tools/driver/cc1as_main.cpp
index 070cf8b44e8eb6..7fe97cc6e6ace1 100644
--- a/clang/tools/driver/cc1as_main.cpp
+++ b/clang/tools/driver/cc1as_main.cpp
@@ -164,6 +164,8 @@ struct AssemblerInvocation {
 
   LLVM_PREFERRED_TYPE(bool)
   unsigned Crel : 1;
+  LLVM_PREFERRED_TYPE(bool)
+  unsigned ImplicitMapsyms : 1;
 
   LLVM_PREFERRED_TYPE(bool)
   unsigned X86RelaxRelocations : 1;
@@ -211,6 +213,7 @@ struct AssemblerInvocation {
     EmitDwarfUnwind = EmitDwarfUnwindType::Default;
     EmitCompactUnwindNonCanonical = false;
     Crel = false;
+    ImplicitMapsyms = 0;
     X86RelaxRelocations = 0;
     X86Sse2Avx = 0;
   }
@@ -382,6 +385,7 @@ bool 
AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
   Opts.EmitCompactUnwindNonCanonical =
       Args.hasArg(OPT_femit_compact_unwind_non_canonical);
   Opts.Crel = Args.hasArg(OPT_crel);
+  Opts.ImplicitMapsyms = Args.hasArg(OPT_mmapsyms_implicit);
   Opts.X86RelaxRelocations = !Args.hasArg(OPT_mrelax_relocations_no);
   Opts.X86Sse2Avx = Args.hasArg(OPT_msse2avx);
 
@@ -442,6 +446,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,
   MCOptions.EmitCompactUnwindNonCanonical = Opts.EmitCompactUnwindNonCanonical;
   MCOptions.MCSaveTempLabels = Opts.SaveTemporaryLabels;
   MCOptions.Crel = Opts.Crel;
+  MCOptions.ImplicitMapSyms = Opts.ImplicitMapsyms;
   MCOptions.X86RelaxRelocations = Opts.X86RelaxRelocations;
   MCOptions.X86Sse2Avx = Opts.X86Sse2Avx;
   MCOptions.CompressDebugSections = Opts.CompressDebugSections;


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to