[clang] [clang] Add -mlarge-eh-encoding driver flag (PR #187583)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 19 13:53:35 PDT 2026
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
More information about the cfe-commits
mailing list