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
