Author: Fangrui Song Date: 2020-01-01T00:50:18-08:00 New Revision: d2bb8c16e711602481c8b33d0e2ccc9994eb6641
URL: https://github.com/llvm/llvm-project/commit/d2bb8c16e711602481c8b33d0e2ccc9994eb6641 DIFF: https://github.com/llvm/llvm-project/commit/d2bb8c16e711602481c8b33d0e2ccc9994eb6641.diff LOG: [MC][TargetMachine] Delete MCTargetOptions::MCPIECopyRelocations clang/lib/CodeGen/CodeGenModule performs the -mpie-copy-relocations check and sets dso_local on applicable global variables. We don't need to duplicate the work in TargetMachine shouldAssumeDSOLocal. Verified that -mpie-copy-relocations can still emit PC relative relocations for external variable accesses. clang -target x86_64 -fpie -mpie-copy-relocations -c => R_X86_64_PC32 clang -target aarch64 -fpie -mpie-copy-relocations -c => R_AARCH64_ADR_PREL_PG_HI21+R_AARCH64_LDST64_ABS_LO12_NC Added: Modified: clang/lib/CodeGen/BackendUtil.cpp llvm/include/llvm/MC/MCTargetOptions.h llvm/include/llvm/MC/MCTargetOptionsCommandFlags.inc llvm/lib/MC/MCTargetOptions.cpp llvm/lib/Target/TargetMachine.cpp Removed: llvm/test/CodeGen/X86/global-access-pie-copyrelocs.ll ################################################################################ diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index 9b1e91788346..645ef0165a53 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -485,7 +485,6 @@ static void initTargetOptions(llvm::TargetOptions &Options, Options.MCOptions.MCNoExecStack = CodeGenOpts.NoExecStack; Options.MCOptions.MCIncrementalLinkerCompatible = CodeGenOpts.IncrementalLinkerCompatible; - Options.MCOptions.MCPIECopyRelocations = CodeGenOpts.PIECopyRelocations; Options.MCOptions.MCFatalWarnings = CodeGenOpts.FatalWarnings; Options.MCOptions.MCNoWarn = CodeGenOpts.NoWarn; Options.MCOptions.AsmVerbose = CodeGenOpts.AsmVerbose; diff --git a/llvm/include/llvm/MC/MCTargetOptions.h b/llvm/include/llvm/MC/MCTargetOptions.h index f184620ff047..51a5fc9aa26a 100644 --- a/llvm/include/llvm/MC/MCTargetOptions.h +++ b/llvm/include/llvm/MC/MCTargetOptions.h @@ -46,7 +46,6 @@ class MCTargetOptions { bool MCSaveTempLabels : 1; bool MCUseDwarfDirectory : 1; bool MCIncrementalLinkerCompatible : 1; - bool MCPIECopyRelocations : 1; bool ShowMCEncoding : 1; bool ShowMCInst : 1; bool AsmVerbose : 1; diff --git a/llvm/include/llvm/MC/MCTargetOptionsCommandFlags.inc b/llvm/include/llvm/MC/MCTargetOptionsCommandFlags.inc index 9f1177f470b9..93e21b626eac 100644 --- a/llvm/include/llvm/MC/MCTargetOptionsCommandFlags.inc +++ b/llvm/include/llvm/MC/MCTargetOptionsCommandFlags.inc @@ -28,8 +28,6 @@ static cl::opt<bool> IncrementalLinkerCompatible( "When used with filetype=obj, " "emit an object file which can be used with an incremental linker")); -static cl::opt<bool> PIECopyRelocations("pie-copy-relocations", cl::desc("PIE Copy Relocations")); - static cl::opt<int> DwarfVersion("dwarf-version", cl::desc("Dwarf version"), cl::init(0)); @@ -55,7 +53,6 @@ static MCTargetOptions InitMCTargetOptionsFromFlags() { MCTargetOptions Options; Options.MCRelaxAll = RelaxAll; Options.MCIncrementalLinkerCompatible = IncrementalLinkerCompatible; - Options.MCPIECopyRelocations = PIECopyRelocations; Options.DwarfVersion = DwarfVersion; Options.ShowMCInst = ShowMCInst; Options.ABIName = ABIName; diff --git a/llvm/lib/MC/MCTargetOptions.cpp b/llvm/lib/MC/MCTargetOptions.cpp index 96bb094134fe..5848e3ecadbe 100644 --- a/llvm/lib/MC/MCTargetOptions.cpp +++ b/llvm/lib/MC/MCTargetOptions.cpp @@ -15,8 +15,8 @@ MCTargetOptions::MCTargetOptions() : MCRelaxAll(false), MCNoExecStack(false), MCFatalWarnings(false), MCNoWarn(false), MCNoDeprecatedWarn(false), MCSaveTempLabels(false), MCUseDwarfDirectory(false), MCIncrementalLinkerCompatible(false), - MCPIECopyRelocations(false), ShowMCEncoding(false), ShowMCInst(false), - AsmVerbose(false), PreserveAsmComments(true) {} + ShowMCEncoding(false), ShowMCInst(false), AsmVerbose(false), + PreserveAsmComments(true) {} StringRef MCTargetOptions::getABIName() const { return ABIName; diff --git a/llvm/lib/Target/TargetMachine.cpp b/llvm/lib/Target/TargetMachine.cpp index 519918405066..97a1eb2f190a 100644 --- a/llvm/lib/Target/TargetMachine.cpp +++ b/llvm/lib/Target/TargetMachine.cpp @@ -184,15 +184,14 @@ bool TargetMachine::shouldAssumeDSOLocal(const Module &M, const Function *F = dyn_cast_or_null<Function>(GV); if (F && F->hasFnAttribute(Attribute::NonLazyBind)) return false; - - bool IsTLS = GV && GV->isThreadLocal(); - bool IsAccessViaCopyRelocs = - GV && Options.MCOptions.MCPIECopyRelocations && isa<GlobalVariable>(GV); Triple::ArchType Arch = TT.getArch(); - bool IsPPC = - Arch == Triple::ppc || Arch == Triple::ppc64 || Arch == Triple::ppc64le; - // Check if we can use copy relocations. PowerPC has no copy relocations. - if (!IsTLS && !IsPPC && (RM == Reloc::Static || IsAccessViaCopyRelocs)) + + // PowerPC prefers avoiding copy relocations. + if (Arch == Triple::ppc || TT.isPPC64()) + return false; + + // Check if we can use copy relocations. + if (!(GV && GV->isThreadLocal()) && RM == Reloc::Static) return true; } diff --git a/llvm/test/CodeGen/X86/global-access-pie-copyrelocs.ll b/llvm/test/CodeGen/X86/global-access-pie-copyrelocs.ll deleted file mode 100644 index 3cd75c791a64..000000000000 --- a/llvm/test/CodeGen/X86/global-access-pie-copyrelocs.ll +++ /dev/null @@ -1,151 +0,0 @@ -; RUN: llc < %s -emulated-tls -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic -pie-copy-relocations \ -; RUN: | FileCheck -check-prefix=X64 %s -; RUN: llc < %s -emulated-tls -mcpu=generic -mtriple=i386-linux-gnu -relocation-model=pic -pie-copy-relocations \ -; RUN: | FileCheck -check-prefix=X32 %s - -; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic -pie-copy-relocations \ -; RUN: | FileCheck -check-prefix=X64 %s -; RUN: llc < %s -mcpu=generic -mtriple=i386-linux-gnu -relocation-model=pic -pie-copy-relocations \ -; RUN: | FileCheck -check-prefix=X32 %s - -; External Linkage -@a = global i32 0, align 4 - -define i32 @my_access_global_a() #0 { -; X32-LABEL: my_access_global_a: -; X32: addl $_GLOBAL_OFFSET_TABLE_{{.*}}, %eax -; X32-NEXT: movl a@GOTOFF(%eax), %eax -; X64-LABEL: my_access_global_a: -; X64: movl a(%rip), %eax - -entry: - %0 = load i32, i32* @a, align 4 - ret i32 %0 -} - -; WeakAny Linkage -@b = weak global i32 0, align 4 - -define i32 @my_access_global_b() #0 { -; X32-LABEL: my_access_global_b: -; X32: addl $_GLOBAL_OFFSET_TABLE_{{.*}}, %eax -; X32-NEXT: movl b@GOTOFF(%eax), %eax -; X64-LABEL: my_access_global_b: -; X64: movl b(%rip), %eax - -entry: - %0 = load i32, i32* @b, align 4 - ret i32 %0 -} - -; Internal Linkage -@c = internal global i32 0, align 4 - -define i32 @my_access_global_c() #0 { -; X32-LABEL: my_access_global_c: -; X32: addl $_GLOBAL_OFFSET_TABLE_{{.*}}, %eax -; X32-NEXT: movl c@GOTOFF(%eax), %eax -; X64-LABEL: my_access_global_c: -; X64: movl c(%rip), %eax - -entry: - %0 = load i32, i32* @c, align 4 - ret i32 %0 -} - -; External Linkage, only declaration. -@d = external global i32, align 4 - -define i32 @my_access_global_load_d() #0 { -; X32-LABEL: my_access_global_load_d: -; X32: addl $_GLOBAL_OFFSET_TABLE_{{.*}}, %eax -; X32-NEXT: movl d@GOTOFF(%eax), %eax -; X64-LABEL: my_access_global_load_d: -; X64: movl d(%rip), %eax - -entry: - %0 = load i32, i32* @d, align 4 - ret i32 %0 -} - -; ExternalWeak Linkage -@e = extern_weak global i32, align 4 - -define i32* @my_access_global_d() #0 { -; X32-LABEL: my_access_global_d: -; X32: addl $_GLOBAL_OFFSET_TABLE_{{.*}}, %eax -; X32: movl e@GOT(%eax), %eax -; X64-LABEL: my_access_global_d: -; X64: movq e@GOTPCREL(%rip), %rax - -entry: - ret i32* @e -} - -; ExternalWeak hidden Linkage -@he = extern_weak hidden global i32, align 4 - -define i32* @my_access_global_he() #0 { -; X32-LABEL: my_access_global_he: -; X32: addl $_GLOBAL_OFFSET_TABLE_{{.*}}, %eax -; X32: movl he@GOT(%eax), %eax -; X64-LABEL: my_access_global_he: -; X64: movq he@GOTPCREL(%rip), %rax - ret i32* @he -} - - -; External Linkage, only declaration, store a value. - -define i32 @my_access_global_store_d() #0 { -; X32-LABEL: my_access_global_store_d: -; X32: addl $_GLOBAL_OFFSET_TABLE_{{.*}}, %eax -; X32-NEXT: movl $2, d@GOTOFF(%eax) -; X64-LABEL: my_access_global_store_d: -; X64: movl $2, d(%rip) - -entry: - store i32 2, i32* @d, align 4 - ret i32 0 -} - -; External Linkage, function pointer access. -declare i32 @access_fp(i32 ()*) -declare i32 @foo() - -define i32 @my_access_fp_foo() #0 { -; X32-LABEL: my_access_fp_foo: -; X32: addl $_GLOBAL_OFFSET_TABLE_{{.*}}, %ebx -; X32-NEXT: movl foo@GOT(%ebx), %eax -; X64-LABEL: my_access_fp_foo: -; X64: movq foo@GOTPCREL(%rip), %rdi - -entry: - %call = call i32 @access_fp(i32 ()* @foo) - ret i32 %call -} - -; LinkOnceODR Linkage, function pointer access. - -$bar = comdat any - -define linkonce_odr i32 @bar() comdat { -entry: - ret i32 0 -} - -define i32 @my_access_fp_bar() #0 { -; X32-LABEL: my_access_fp_bar: -; X32: addl $_GLOBAL_OFFSET_TABLE_{{.*}}, %ebx -; X32-NEXT: leal bar@GOTOFF(%ebx), %eax -; X64-LABEL: my_access_fp_bar: -; X64: leaq bar(%rip), %rdi - -entry: - %call = call i32 @access_fp(i32 ()* @bar) - ret i32 %call -} - -!llvm.module.flags = !{!0, !1} -!0 = !{i32 1, !"PIC Level", i32 1} -!1 = !{i32 1, !"PIE Level", i32 1} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits