diff options
| author | Chih-Hung Hsieh <chh@google.com> | 2016-01-13 23:56:37 +0000 |
|---|---|---|
| committer | Chih-Hung Hsieh <chh@google.com> | 2016-01-13 23:56:37 +0000 |
| commit | 578864007baa81366d2a98a307e016b78bed82af (patch) | |
| tree | 1fd31bd59f979f919b502fbc50eb271b8e580c4f /llvm/test/CodeGen/ARM | |
| parent | 02fe4b93341845695296883496f50aa5946c9b7e (diff) | |
| download | bcm5719-llvm-578864007baa81366d2a98a307e016b78bed82af.tar.gz bcm5719-llvm-578864007baa81366d2a98a307e016b78bed82af.zip | |
[TLS] New lower emutls pass, fix linkage bugs.
Previous implementation in http://reviews.llvm.org/D10522
created external references to __emutls_v.* variables.
Such references are inaccurate and cannot be handled by
all linkers, e.g. Android dynamic and gold linkers for aarch64.
Now a new LowerEmuTLS pass to go through all global variables,
and add emutls_v.* and emutls_t.* variables.
These __emutls* variables have the same linkage and
visibility as the associated user defined TLS variable.
Also removed old code that dump __emutls* variables in AsmPrinter.cpp,
and updated TLS unit tests.
Differential Revision: http://reviews.llvm.org/D15300
llvm-svn: 257718
Diffstat (limited to 'llvm/test/CodeGen/ARM')
| -rw-r--r-- | llvm/test/CodeGen/ARM/emutls.ll | 44 | ||||
| -rw-r--r-- | llvm/test/CodeGen/ARM/emutls_generic.ll | 14 |
2 files changed, 37 insertions, 21 deletions
diff --git a/llvm/test/CodeGen/ARM/emutls.ll b/llvm/test/CodeGen/ARM/emutls.ll index 7ba50dd249b..40f75b88756 100644 --- a/llvm/test/CodeGen/ARM/emutls.ll +++ b/llvm/test/CodeGen/ARM/emutls.ll @@ -13,6 +13,7 @@ define i32 @my_get_xyz() { ; ARM32: ldr r0, [pc, r0] ; ARM32-NEXT: bl my_emutls_get_address(PLT) ; ARM32-NEXT: ldr r0, [r0] +; ARM32: .long my_emutls_v_xyz(GOT_PREL) entry: %call = call i8* @my_emutls_get_address(i8* bitcast (i8** @my_emutls_v_xyz to i8*)) @@ -35,6 +36,7 @@ define i32 @f1() { ; ARM32: ldr r0, [pc, r0] ; ARM32-NEXT: bl __emutls_get_address(PLT) ; ARM32-NEXT: ldr r0, [r0] +; ARM32: .long __emutls_v.i1(GOT_PREL) entry: %tmp1 = load i32, i32* @i1 @@ -47,6 +49,7 @@ define i32* @f2() { ; ARM32: ldr r0, [pc, r0] ; ARM32-NEXT: bl __emutls_get_address(PLT) ; ARM32-NEXT: pop +; ARM32: .long __emutls_v.i1(GOT_PREL) entry: ret i32* @i1 @@ -58,6 +61,7 @@ define i32 @f3() nounwind { ; ARM32: ldr r0, [pc, r0] ; ARM32-NEXT: bl __emutls_get_address(PLT) ; ARM32-NEXT: ldr r0, [r0] +; ARM32: .long __emutls_v.i2(GOT_PREL) entry: %tmp1 = load i32, i32* @i2 @@ -70,6 +74,7 @@ define i32* @f4() { ; ARM32: ldr r0, [pc, r0] ; ARM32-NEXT: bl __emutls_get_address(PLT) ; ARM32-NEXT: pop +; ARM32: .long __emutls_v.i2(GOT_PREL) entry: ret i32* @i2 @@ -78,9 +83,10 @@ entry: define i32 @f5() nounwind { ; ARM32-LABEL: f5: ; ARM32: ldr r0, -; ARM32: ldr r0, [pc, r0] +; ARM32: add r0, pc, r0 ; ARM32-NEXT: bl __emutls_get_address(PLT) ; ARM32-NEXT: ldr r0, [r0] +; ARM32: .long __emutls_v.i3- entry: %tmp1 = load i32, i32* @i3 @@ -90,9 +96,10 @@ entry: define i32* @f6() { ; ARM32-LABEL: f6: ; ARM32: ldr r0, -; ARM32: ldr r0, [pc, r0] +; ARM32: add r0, pc, r0 ; ARM32-NEXT: bl __emutls_get_address(PLT) ; ARM32-NEXT: pop +; ARM32: .long __emutls_v.i3- entry: ret i32* @i3 @@ -101,9 +108,10 @@ entry: define i32 @f7() { ; ARM32-LABEL: f7: ; ARM32: ldr r0, -; ARM32: ldr r0, [pc, r0] +; ARM32: add r0, pc, r0 ; ARM32-NEXT: bl __emutls_get_address(PLT) ; ARM32-NEXT: ldr r0, [r0] +; ARM32: .long __emutls_v.i4-(.LPC entry: %tmp1 = load i32, i32* @i4 @@ -113,9 +121,10 @@ entry: define i32* @f8() { ; ARM32-LABEL: f8: ; ARM32: ldr r0, -; ARM32: ldr r0, [pc, r0] +; ARM32: add r0, pc, r0 ; ARM32-NEXT: bl __emutls_get_address(PLT) ; ARM32-NEXT: pop +; ARM32: .long __emutls_v.i4-(.LPC entry: ret i32* @i4 @@ -124,7 +133,7 @@ entry: define i32 @f9() { ; ARM32-LABEL: f9: ; ARM32: ldr r0, -; ARM32: ldr r0, [pc, r0] +; ARM32: add r0, pc, r0 ; ARM32-NEXT: bl __emutls_get_address(PLT) ; ARM32-NEXT: ldr r0, [r0] @@ -136,7 +145,7 @@ entry: define i32* @f10() { ; ARM32-LABEL: f10: ; ARM32: ldr r0, -; ARM32: ldr r0, [pc, r0] +; ARM32: add r0, pc, r0 ; ARM32-NEXT: bl __emutls_get_address(PLT) ; ARM32-NEXT: pop @@ -198,46 +207,50 @@ entry: ;;;;;;;;;;;;;; 32-bit __emutls_v. and __emutls_t. -; ARM32 .section .data.rel.local, +; ARM32: .data{{$}} +; ARM32: .globl __emutls_v.i1 ; ARM32-LABEL: __emutls_v.i1: ; ARM32-NEXT: .long 4 ; ARM32-NEXT: .long 4 ; ARM32-NEXT: .long 0 ; ARM32-NEXT: .long __emutls_t.i1 -; ARM32 .section .rodata, +; ARM32: .section .rodata, ; ARM32-LABEL: __emutls_t.i1: ; ARM32-NEXT: .long 15 ; ARM32-NOT: __emutls_v.i2 -; ARM32 .section .data.rel.local, +; ARM32: .data{{$}} +; ARM32-NOT: .globl ; ARM32-LABEL: __emutls_v.i3: ; ARM32-NEXT: .long 4 ; ARM32-NEXT: .long 4 ; ARM32-NEXT: .long 0 ; ARM32-NEXT: .long __emutls_t.i3 -; ARM32 .section .rodata, +; ARM32: .section .rodata, ; ARM32-LABEL: __emutls_t.i3: ; ARM32-NEXT: .long 15 -; ARM32 .section .data.rel.local, +; ARM32: .data{{$}} +; ARM32: .globl __emutls_v.i4 ; ARM32-LABEL: __emutls_v.i4: ; ARM32-NEXT: .long 4 ; ARM32-NEXT: .long 4 ; ARM32-NEXT: .long 0 ; ARM32-NEXT: .long __emutls_t.i4 -; ARM32 .section .rodata, +; ARM32: .section .rodata, ; ARM32-LABEL: __emutls_t.i4: ; ARM32-NEXT: .long 15 ; ARM32-NOT: __emutls_v.i5: -; ARM32 .hidden __emutls_v.i5 +; ARM32: .hidden __emutls_v.i5 ; ARM32-NOT: __emutls_v.i5: -; ARM32 .section .data.rel.local, +; ARM32: .data{{$}} +; ARM32: .globl __emutls_v.s1 ; ARM32-LABEL: __emutls_v.s1: ; ARM32-NEXT: .long 2 ; ARM32-NEXT: .long 2 @@ -248,7 +261,8 @@ entry: ; ARM32-LABEL: __emutls_t.s1: ; ARM32-NEXT: .short 15 -; ARM32 .section .data.rel.local, +; ARM32: .data{{$}} +; ARM32: .globl __emutls_v.b1 ; ARM32-LABEL: __emutls_v.b1: ; ARM32-NEXT: .long 1 ; ARM32-NEXT: .long 1 diff --git a/llvm/test/CodeGen/ARM/emutls_generic.ll b/llvm/test/CodeGen/ARM/emutls_generic.ll index 0fada88fb5d..872dd83f299 100644 --- a/llvm/test/CodeGen/ARM/emutls_generic.ll +++ b/llvm/test/CodeGen/ARM/emutls_generic.ll @@ -35,11 +35,12 @@ entry: ; ARM_32: bl __emutls_get_address ; ARM_32: .long __emutls_v.external_y ; ARM_32-LABEL: get_internal_y: -; ARM_32: bl __emutls_get_address -; ARM_32: .long __emutls_v.internal_y -; ARM_32-NOT: __emutls_t.external_x -; ARM_32-NOT: __emutls_v.external_x: -; ARM_32: .data +; ARM_32: bl __emutls_get_address +; ARM_32: .long __emutls_v.internal_y +; ARM_32-NOT: __emutls_t.external_x +; ARM_32-NOT: __emutls_v.external_x: +; ARM_32: .data{{$}} +; ARM_32: .globl __emutls_v.external_y ; ARM_32: .align 2 ; ARM_32-LABEL: __emutls_v.external_y: ; ARM_32-NEXT: .long 1 @@ -49,7 +50,8 @@ entry: ; ARM_32: .section .rodata, ; ARM_32-LABEL: __emutls_t.external_y: ; ARM_32-NEXT: .byte 7 -; ARM_32: .data +; ARM_32: .data{{$}} +; ARM_32-NOT: .globl ; ARM_32: .align 2 ; ARM_32-LABEL: __emutls_v.internal_y: ; ARM_32-NEXT: .long 8 |

