llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-codegen

Author: Farid Zakaria (fzakaria)

<details>
<summary>Changes</summary>

Wire the LLVM MCTargetOptions::LargeEHEncoding option through clang's driver as 
-mlarge-eh-encoding / -mno-large-eh-encoding.

This adds:
- CodeGenOpts.LargeEHEncoding in CodeGenOptions.def
- -mlarge-eh-encoding / -mno-large-eh-encoding in Options.td
- Wiring in BackendUtil.cpp (cc1 codegen path)
- Wiring in cc1as_main.cpp (integrated assembler path)
- Driver forwarding in Clang.cpp" --pager no

---
Full diff: https://github.com/llvm/llvm-project/pull/187583.diff


7 Files Affected:

- (modified) clang/include/clang/Basic/CodeGenOptions.def (+1) 
- (modified) clang/include/clang/Options/Options.td (+7) 
- (modified) clang/lib/CodeGen/BackendUtil.cpp (+1) 
- (modified) clang/lib/Driver/ToolChains/Clang.cpp (+7) 
- (modified) clang/lib/Driver/ToolChains/CommonArgs.cpp (+7) 
- (added) clang/test/Driver/mlarge-eh-encoding.c (+14) 
- (modified) clang/tools/driver/cc1as_main.cpp (+5) 


``````````diff
diff --git a/clang/include/clang/Basic/CodeGenOptions.def 
b/clang/include/clang/Basic/CodeGenOptions.def
index d883552ea2198..08a88f95c0fc3 100644
--- a/clang/include/clang/Basic/CodeGenOptions.def
+++ b/clang/include/clang/Basic/CodeGenOptions.def
@@ -250,6 +250,7 @@ VALUE_CODEGENOPT(MCDCMaxTVs, 32, 0x7FFFFFFE, Benign) ///< 
MC/DC Maximum test vec
   /// If -fpcc-struct-return or -freg-struct-return is specified.
 ENUM_CODEGENOPT(StructReturnConvention, StructReturnConventionKind, 2, 
SRCK_Default, Benign)
 
+CODEGENOPT(LargeEHEncoding   , 1, 0, Benign) ///< Use 8-byte pointer size for 
x86_64 EH encodings.
 CODEGENOPT(RelaxAll          , 1, 0, Benign) ///< Relax all machine code 
instructions.
 CODEGENOPT(RelaxedAliasing   , 1, 0, Benign) ///< Set when 
-fno-strict-aliasing is enabled.
 CODEGENOPT(PointerTBAA       , 1, 1, Benign) ///< Whether or not to use 
distinct TBAA tags for pointers.
diff --git a/clang/include/clang/Options/Options.td 
b/clang/include/clang/Options/Options.td
index 8b0c701521728..5d6c1b7de11e0 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -5959,6 +5959,13 @@ def mred_zone : Flag<["-"], "mred-zone">, Group<m_Group>;
 def mtls_direct_seg_refs : Flag<["-"], "mtls-direct-seg-refs">, Group<m_Group>,
   HelpText<"Enable direct TLS access through segment registers (default)">;
 def mregparm_EQ : Joined<["-"], "mregparm=">, Group<m_Group>;
+def mlarge_eh_encoding : Flag<["-"], "mlarge-eh-encoding">, Group<m_Group>,
+  Visibility<[ClangOption, CC1Option, CC1AsOption]>,
+  HelpText<"Force 8-byte pointer size for all x86_64 ELF EH encodings">,
+  MarshallingInfoFlag<CodeGenOpts<"LargeEHEncoding">>;
+def mno_large_eh_encoding : Flag<["-"], "mno-large-eh-encoding">, 
Group<m_Group>,
+  Visibility<[ClangOption, CC1Option, CC1AsOption]>,
+  HelpText<"Do not force 8-byte pointer size for all x86_64 ELF EH encodings 
(default)">;
 def mrelax_all : Flag<["-"], "mrelax-all">, Group<m_Group>,
   Visibility<[ClangOption, CC1Option, CC1AsOption]>,
   HelpText<"(integrated-as) Relax all machine instructions">,
diff --git a/clang/lib/CodeGen/BackendUtil.cpp 
b/clang/lib/CodeGen/BackendUtil.cpp
index 5b8b4083c2ac0..425cff3798975 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -506,6 +506,7 @@ static bool initTargetOptions(const CompilerInstance &CI,
   Options.MCOptions.RelocSectionSym = CodeGenOpts.getRelocSectionSym();
   Options.MCOptions.ImplicitMapSyms = CodeGenOpts.ImplicitMapSyms;
   Options.MCOptions.X86RelaxRelocations = CodeGenOpts.X86RelaxRelocations;
+  Options.MCOptions.LargeEHEncoding = CodeGenOpts.LargeEHEncoding;
   Options.MCOptions.CompressDebugSections =
       CodeGenOpts.getCompressDebugSections();
   if (CodeGenOpts.OutputAsmVariant != 3) // 3 (default): not specified
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 6416baf9126ff..017723b922cb2 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -2409,6 +2409,9 @@ static void CollectArgsForIntegratedAssembler(Compilation 
&C,
   Args.addOptInFlag(CmdArgs, options::OPT_mrelax_all,
                     options::OPT_mno_relax_all);
 
+  Args.addOptInFlag(CmdArgs, options::OPT_mlarge_eh_encoding,
+                    options::OPT_mno_large_eh_encoding);
+
   // Only default to -mincremental-linker-compatible if we think we are
   // targeting the MSVC linker.
   bool DefaultIncrementalLinkerCompatible =
@@ -5137,6 +5140,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction 
&JA,
     if (TC.useIntegratedAs()) {
       Args.ClaimAllArgs(options::OPT_mrelax_all);
       Args.ClaimAllArgs(options::OPT_mno_relax_all);
+      Args.ClaimAllArgs(options::OPT_mlarge_eh_encoding);
+      Args.ClaimAllArgs(options::OPT_mno_large_eh_encoding);
       Args.ClaimAllArgs(options::OPT_mincremental_linker_compatible);
       Args.ClaimAllArgs(options::OPT_mno_incremental_linker_compatible);
       switch (C.getDefaultToolChain().getArch()) {
@@ -5384,6 +5389,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction 
&JA,
         options::OPT_fno_dwarf_directory_asm,
         options::OPT_mrelax_all,
         options::OPT_mno_relax_all,
+        options::OPT_mlarge_eh_encoding,
+        options::OPT_mno_large_eh_encoding,
         options::OPT_ftrap_function_EQ,
         options::OPT_ffixed_r9,
         options::OPT_mfix_cortex_a53_835769,
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 9a17fa2546e68..30a9a538e94da 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1243,6 +1243,13 @@ void tools::addLTOOptions(const ToolChain &ToolChain, 
const ArgList &Args,
     }
   }
 
+  // Forward -mlarge-eh-encoding to the LTO plugin so LLD uses sdata8 EH
+  // encodings during LTO code generation.
+  if (Args.hasFlag(options::OPT_mlarge_eh_encoding,
+                   options::OPT_mno_large_eh_encoding, false))
+    CmdArgs.push_back(
+        Args.MakeArgString(Twine(PluginOptPrefix) + "-large-eh-encoding"));
+
   // Pass an option to enable split machine functions.
   if (auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
                                 options::OPT_fno_split_machine_functions)) {
diff --git a/clang/test/Driver/mlarge-eh-encoding.c 
b/clang/test/Driver/mlarge-eh-encoding.c
new file mode 100644
index 0000000000000..b0fe6ef6bcb54
--- /dev/null
+++ b/clang/test/Driver/mlarge-eh-encoding.c
@@ -0,0 +1,14 @@
+// Test -mlarge-eh-encoding flag forwarding to cc1 and LTO plugin-opt.
+
+// RUN: %clang -### --target=x86_64-unknown-linux -mlarge-eh-encoding %s 2>&1 
| FileCheck %s --check-prefixes=CC1,LTO-NEG
+// RUN: %clang -### --target=x86_64-unknown-linux -mlarge-eh-encoding 
-mno-large-eh-encoding %s 2>&1 | FileCheck %s --check-prefix=CC1-NEG
+
+// CC1:         "-mlarge-eh-encoding"
+// CC1-NEG-NOT: "-mlarge-eh-encoding"
+
+// RUN: %clang -### --target=x86_64-unknown-linux -flto -mlarge-eh-encoding %s 
2>&1 | FileCheck %s --check-prefix=LTO
+// RUN: %clang -### --target=x86_64-unknown-linux -flto=thin 
-mlarge-eh-encoding %s 2>&1 | FileCheck %s --check-prefix=LTO
+// RUN: %clang -### --target=x86_64-unknown-linux -flto -mlarge-eh-encoding 
-mno-large-eh-encoding %s 2>&1 | FileCheck %s --check-prefix=LTO-NEG
+
+// LTO:         "-plugin-opt=-large-eh-encoding"
+// LTO-NEG-NOT: "-plugin-opt=-large-eh-encoding"
diff --git a/clang/tools/driver/cc1as_main.cpp 
b/clang/tools/driver/cc1as_main.cpp
index c6cdd46a41f37..2834b88eab136 100644
--- a/clang/tools/driver/cc1as_main.cpp
+++ b/clang/tools/driver/cc1as_main.cpp
@@ -176,6 +176,8 @@ struct AssemblerInvocation {
   unsigned X86RelaxRelocations : 1;
   LLVM_PREFERRED_TYPE(bool)
   unsigned X86Sse2Avx : 1;
+  LLVM_PREFERRED_TYPE(bool)
+  unsigned LargeEHEncoding : 1;
 
   RelocSectionSymType RelocSectionSym = RelocSectionSymType::All;
 
@@ -226,6 +228,7 @@ struct AssemblerInvocation {
     ImplicitMapsyms = 0;
     X86RelaxRelocations = 0;
     X86Sse2Avx = 0;
+    LargeEHEncoding = 0;
   }
 
   static bool CreateFromArgs(AssemblerInvocation &Res,
@@ -405,6 +408,7 @@ bool 
AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
   Opts.ImplicitMapsyms = Args.hasArg(OPT_mmapsyms_implicit);
   Opts.X86RelaxRelocations = !Args.hasArg(OPT_mrelax_relocations_no);
   Opts.X86Sse2Avx = Args.hasArg(OPT_msse2avx);
+  Opts.LargeEHEncoding = Args.hasArg(OPT_mlarge_eh_encoding);
 
   Opts.AsSecureLogFile = Args.getLastArgValue(OPT_as_secure_log_file);
 
@@ -473,6 +477,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,
   MCOptions.ImplicitMapSyms = Opts.ImplicitMapsyms;
   MCOptions.X86RelaxRelocations = Opts.X86RelaxRelocations;
   MCOptions.X86Sse2Avx = Opts.X86Sse2Avx;
+  MCOptions.LargeEHEncoding = Opts.LargeEHEncoding;
   MCOptions.CompressDebugSections = Opts.CompressDebugSections;
   MCOptions.AsSecureLogFile = Opts.AsSecureLogFile;
 

``````````

</details>


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

Reply via email to