[llvm] r267229 - Differential Revision: http://reviews.llvm.org/D19040
Sriraman Tallam via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 22 14:41:58 PDT 2016
Author: tmsriram
Date: Fri Apr 22 16:41:58 2016
New Revision: 267229
URL: http://llvm.org/viewvc/llvm-project?rev=267229&view=rev
Log:
Differential Revision: http://reviews.llvm.org/D19040
Added:
llvm/trunk/test/CodeGen/X86/global-access-pie.ll
Modified:
llvm/trunk/lib/Target/X86/X86Subtarget.cpp
llvm/trunk/lib/Target/X86/X86Subtarget.h
llvm/trunk/test/CodeGen/X86/emutls-pie.ll
Modified: llvm/trunk/lib/Target/X86/X86Subtarget.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.cpp?rev=267229&r1=267228&r2=267229&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86Subtarget.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86Subtarget.cpp Fri Apr 22 16:41:58 2016
@@ -83,8 +83,12 @@ ClassifyGlobalReference(const GlobalValu
} else if (!isTargetWin64()) {
assert(isTargetELF() && "Unknown rip-relative target");
- // Extra load is needed for all externally visible globals.
- if (!GV->hasLocalLinkage() && GV->hasDefaultVisibility())
+ // Extra load is needed for all externally visible globals except with
+ // PIE as the definition of the global in an executable is not
+ // overridden.
+
+ if (!GV->hasLocalLinkage() && GV->hasDefaultVisibility() &&
+ !isGlobalDefinedInPIE(GV, TM))
return X86II::MO_GOTPCREL;
}
@@ -92,8 +96,11 @@ ClassifyGlobalReference(const GlobalValu
}
if (isPICStyleGOT()) { // 32-bit ELF targets.
- // Extra load is needed for all externally visible.
- if (GV->hasLocalLinkage() || GV->hasHiddenVisibility())
+ // Extra load is needed for all externally visible globals except with
+ // PIE as the definition of the global in an executable is not overridden.
+
+ if (GV->hasLocalLinkage() || GV->hasHiddenVisibility() ||
+ isGlobalDefinedInPIE(GV, TM))
return X86II::MO_GOTOFF;
return X86II::MO_GOT;
}
Modified: llvm/trunk/lib/Target/X86/X86Subtarget.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.h?rev=267229&r1=267228&r2=267229&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86Subtarget.h (original)
+++ llvm/trunk/lib/Target/X86/X86Subtarget.h Fri Apr 22 16:41:58 2016
@@ -548,6 +548,14 @@ public:
}
}
+ /// Determine if this global is defined in a Position Independent
+ /// Executable (PIE) where its definition cannot be interposed.
+ bool isGlobalDefinedInPIE(const GlobalValue *GV,
+ const TargetMachine &TM) const {
+ return TM.Options.PositionIndependentExecutable &&
+ !GV->isDeclarationForLinker();
+ }
+
/// ClassifyGlobalReference - Classify a global variable reference for the
/// current subtarget according to how we should reference it in a non-pcrel
/// context.
Modified: llvm/trunk/test/CodeGen/X86/emutls-pie.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/emutls-pie.ll?rev=267229&r1=267228&r2=267229&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/emutls-pie.ll (original)
+++ llvm/trunk/test/CodeGen/X86/emutls-pie.ll Fri Apr 22 16:41:58 2016
@@ -39,7 +39,7 @@ entry:
define i32 @f1() {
; X32-LABEL: f1:
-; X32: movl __emutls_v.i at GOT(%ebx), %eax
+; X32: leal __emutls_v.i at GOTOFF(%ebx), %eax
; X32-NEXT: movl %eax, (%esp)
; X32-NEXT: calll __emutls_get_address at PLT
; X32-NEXT: movl (%eax), %eax
@@ -47,7 +47,7 @@ define i32 @f1() {
; X32-NEXT: popl %ebx
; X32-NEXT: retl
; X64-LABEL: f1:
-; X64: movq __emutls_v.i at GOTPCREL(%rip), %rdi
+; X64: leaq __emutls_v.i(%rip), %rdi
; X64-NEXT: callq __emutls_get_address at PLT
; X64-NEXT: movl (%rax), %eax
; X64-NEXT: popq %rcx
@@ -60,11 +60,11 @@ entry:
define i32* @f2() {
; X32-LABEL: f2:
-; X32: movl __emutls_v.i at GOT(%ebx), %eax
+; X32: leal __emutls_v.i at GOTOFF(%ebx), %eax
; X32-NEXT: movl %eax, (%esp)
; X32-NEXT: calll __emutls_get_address at PLT
; X64-LABEL: f2:
-; X64: movq __emutls_v.i at GOTPCREL(%rip), %rdi
+; X64: leaq __emutls_v.i(%rip), %rdi
; X64-NEXT: callq __emutls_get_address at PLT
entry:
Added: llvm/trunk/test/CodeGen/X86/global-access-pie.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/global-access-pie.ll?rev=267229&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/global-access-pie.ll (added)
+++ llvm/trunk/test/CodeGen/X86/global-access-pie.ll Fri Apr 22 16:41:58 2016
@@ -0,0 +1,119 @@
+; RUN: llc < %s -march=x86-64 -mcpu=generic -mtriple=x86_64-linux-gnu -relocation-model=pic -enable-pie \
+; RUN: | FileCheck -check-prefix=X64 %s
+; RUN: llc < %s -emulated-tls -march=x86 -mcpu=generic -mtriple=i386-linux-gnu -relocation-model=pic -enable-pie \
+; RUN: | FileCheck -check-prefix=X32 %s
+
+; External Linkage
+ at 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 at 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
+ at 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 at 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
+ at 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 at 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.
+ at 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 at GOT(%eax), %eax
+; X32-NEXT: movl (%eax), %eax
+; X64-LABEL: my_access_global_load_d:
+; X64: movq d at GOTPCREL(%rip), %rax
+; X64-NEXT: movl (%rax), %eax
+
+entry:
+ %0 = load i32, i32* @d, align 4
+ ret i32 %0
+}
+
+; 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 d at GOT(%eax), %eax
+; X32-NEXT: movl $2, (%eax)
+; X64-LABEL: my_access_global_store_d:
+; X64: movq d at GOTPCREL(%rip), %rax
+; X64-NEXT: movl $2, (%rax)
+
+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 at GOT(%ebx), %eax
+; X64-LABEL: my_access_fp_foo:
+; X64: movq foo at 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 at 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
+}
More information about the llvm-commits
mailing list