D36604: PR34148: Do not assume we can use a copy relocation for an `external_weak` global

An `external_weak` global may be intended to resolve as a null pointer if it's
not defined, so it doesn't make sense to use a copy relocation for it.

Differential Revision: https://reviews.llvm.org/D36604

llvm-svn: 310773
This commit is contained in:
Richard Smith 2017-08-11 23:52:28 +00:00
parent a9f6a52925
commit 3704eba1d1
2 changed files with 17 additions and 2 deletions

View File

@ -154,8 +154,9 @@ bool TargetMachine::shouldAssumeDSOLocal(const Module &M,
return true;
bool IsTLS = GV && GV->isThreadLocal();
bool IsAccessViaCopyRelocs =
Options.MCOptions.MCPIECopyRelocations && GV && isa<GlobalVariable>(GV);
bool IsAccessViaCopyRelocs = Options.MCOptions.MCPIECopyRelocations && GV &&
isa<GlobalVariable>(GV) &&
!GV->hasExternalWeakLinkage();
Triple::ArchType Arch = TT.getArch();
bool IsPPC =
Arch == Triple::ppc || Arch == Triple::ppc64 || Arch == Triple::ppc64le;

View File

@ -63,6 +63,20 @@ entry:
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
}
; External Linkage, only declaration, store a value.
define i32 @my_access_global_store_d() #0 {