diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index d4f7315bf8cbeb6a8092015481997d3f208695d5..0c56b0c382d19bcaeca827981757381703e15809 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1208,6 +1208,8 @@ def e : JoinedOrSeparate<["-"], "e">, Flags<[LinkerInput]>, Group; def fmax_tokens_EQ : Joined<["-"], "fmax-tokens=">, Group, Flags<[CC1Option]>, HelpText<"Max total number of preprocessed tokens for -Wmax-tokens.">, MarshallingInfoInt>; +def mno_large_global_group_reloc: Flag<["-"], "mno-large-global-group-reloc">, Group, + HelpText<"Disable group relocation type for global value and symbol when code model is large">; def fPIC : Flag<["-"], "fPIC">, Group; def fno_PIC : Flag<["-"], "fno-PIC">, Group; def fPIE : Flag<["-"], "fPIE">, Group; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 0921e6071d2681be97a6132fe9e09edf8c6e4b5a..81f815276ea218a4f9662d1feda3ade40b48a94d 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4976,6 +4976,14 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, if (Args.getLastArg(options::OPT_save_temps_EQ)) Args.AddLastArg(CmdArgs, options::OPT_save_temps_EQ); +#ifndef BUILD_FOR_OPENEULER + if (Args.getLastArg(options::OPT_mno_large_global_group_reloc)) +#endif + { + CmdArgs.push_back("-mllvm"); + CmdArgs.push_back("-mno-large-global-group-reloc"); + } + auto *MemProfArg = Args.getLastArg(options::OPT_fmemory_profile, options::OPT_fmemory_profile_EQ, options::OPT_fno_memory_profile); diff --git a/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp b/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp index f1ba1aa7ba89687356897bcfa7de5b6f06edb494..62d31f113fc4815d2618bf24a8cf0340de6e9ecb 100644 --- a/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp +++ b/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp @@ -65,6 +65,10 @@ namespace { #include "AArch64GenGlobalISel.inc" #undef GET_GLOBALISEL_PREDICATE_BITSET +static cl::opt DisableLargeGlobalGroupReloc( + "mno-large-global-group-reloc", + cl::desc("Disable group relocation type for global value and symbol when code model is large"), + cl::init(false)); class AArch64InstructionSelector : public InstructionSelector { public: @@ -2810,7 +2814,7 @@ bool AArch64InstructionSelector::select(MachineInstr &I) { if (OpFlags & AArch64II::MO_GOT) { I.setDesc(TII.get(AArch64::LOADgot)); I.getOperand(1).setTargetFlags(OpFlags); - } else if (TM.getCodeModel() == CodeModel::Large) { + } else if (TM.getCodeModel() == CodeModel::Large && !DisableLargeGlobalGroupReloc) { // Materialize the global using movz/movk instructions. materializeLargeCMVal(I, GV, OpFlags); I.eraseFromParent(); diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/select-blockaddress.mir b/llvm/test/CodeGen/AArch64/GlobalISel/select-blockaddress.mir index ee54f388683696d54c81afbba8ba6ef290028dd3..69fd44591dd88efbf66745d2aded0e6310e74115 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/select-blockaddress.mir +++ b/llvm/test/CodeGen/AArch64/GlobalISel/select-blockaddress.mir @@ -1,6 +1,7 @@ # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py # RUN: llc -mtriple=aarch64-unknown-unknown -o - -verify-machineinstrs -run-pass=instruction-select %s | FileCheck %s # RUN: llc -mtriple=aarch64-unknown-unknown -o - -verify-machineinstrs -run-pass=instruction-select -code-model=large %s | FileCheck %s --check-prefix=LARGE +# RUN: llc -mtriple=aarch64-unknown-unknown -o - -verify-machineinstrs -run-pass=instruction-select -code-model=large -mno-large-global-group-reloc %s | FileCheck %s --check-prefix=NO-LARGE-GLOBAL-GROUP-RELOC --- | ; ModuleID = 'blockaddress.ll' source_filename = "blockaddress.ll" @@ -51,6 +52,17 @@ body: | ; LARGE-NEXT: BR [[MOVKXi2]] ; LARGE-NEXT: {{ $}} ; LARGE-NEXT: bb.1.block (ir-block-address-taken %ir-block.block): + ; NO-LARGE-GLOBAL-GROUP-RELOC-LABEL: name: test_blockaddress + ; NO-LARGE-GLOBAL-GROUP-RELOC: bb.0 (%ir-block.0): + ; NO-LARGE-GLOBAL-GROUP-RELOC-NEXT: [[MOVZXi:%[0-9]+]]:gpr64 = MOVZXi target-flags(aarch64-g0, aarch64-nc) blockaddress(@test_blockaddress, %ir-block.block), 0 + ; NO-LARGE-GLOBAL-GROUP-RELOC-NEXT: [[MOVKXi:%[0-9]+]]:gpr64 = MOVKXi [[MOVZXi]], target-flags(aarch64-g1, aarch64-nc) blockaddress(@test_blockaddress, %ir-block.block), 16 + ; NO-LARGE-GLOBAL-GROUP-RELOC-NEXT: [[MOVKXi1:%[0-9]+]]:gpr64 = MOVKXi [[MOVKXi]], target-flags(aarch64-g2, aarch64-nc) blockaddress(@test_blockaddress, %ir-block.block), 32 + ; NO-LARGE-GLOBAL-GROUP-RELOC-NEXT: [[MOVKXi2:%[0-9]+]]:gpr64 = MOVKXi [[MOVKXi1]], target-flags(aarch64-g3) blockaddress(@test_blockaddress, %ir-block.block), 48 + ; NO-LARGE-GLOBAL-GROUP-RELOC-NEXT: [[MOVaddr:%[0-9]+]]:gpr64common = MOVaddr target-flags(aarch64-page) @addr, target-flags(aarch64-pageoff, aarch64-nc) @addr + ; NO-LARGE-GLOBAL-GROUP-RELOC-NEXT: STRXui [[MOVKXi2]], [[MOVaddr]], 0 :: (store (p0) into @addr) + ; NO-LARGE-GLOBAL-GROUP-RELOC-NEXT: BR [[MOVKXi2]] + ; NO-LARGE-GLOBAL-GROUP-RELOC-NEXT: {{ $}} + ; NO-LARGE-GLOBAL-GROUP-RELOC-NEXT: bb.1.block (ir-block-address-taken %ir-block.block): bb.1 (%ir-block.0): %0:gpr(p0) = G_BLOCK_ADDR blockaddress(@test_blockaddress, %ir-block.block) %1:gpr(p0) = G_GLOBAL_VALUE @addr