forked from OSchip/llvm-project
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:
parent
a9f6a52925
commit
3704eba1d1
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue