1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
; RUN: llc -mtriple=x86_64-linux-gnu -relocation-model=pic -enable-tlsdesc %s -o - | FileCheck %s --check-prefixes=GD
; RUN: llc -mtriple=x86_64-linux-gnu -relocation-model=pic -enable-tlsdesc -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefixes=GD-RELOC %s
@general_dynamic_var = external thread_local global i32
define i32 @test_generaldynamic() {
%val = load i32, ptr @general_dynamic_var
ret i32 %val
; GD: test_generaldynamic:
; GD: leaq general_dynamic_var@tlsdesc(%rip), [[REG:%.*]]
; GD-NEXT: callq *general_dynamic_var@tlscall([[REG]])
; GD-NEXT: movl %fs:([[REG]]),
; GD-RELOC: R_X86_64_GOTPC32_TLSDESC general_dynamic_var
; GD-RELOC: R_X86_64_TLSDESC_CALL general_dynamic_var
}
define ptr @test_generaldynamic_addr() {
ret ptr @general_dynamic_var
; GD: test_generaldynamic_addr:
; GD: leaq general_dynamic_var@tlsdesc(%rip), [[REG:%.*]]
; GD-NEXT: callq *general_dynamic_var@tlscall([[REG]])
; GD-NEXT: addq %fs:0, %rax
; GD-RELOC: R_X86_64_GOTPC32_TLSDESC general_dynamic_var
; GD-RELOC: R_X86_64_TLSDESC_CALL general_dynamic_var
}
@local_dynamic_var = external thread_local(localdynamic) global i32
define i32 @test_localdynamic() {
%val = load i32, ptr @local_dynamic_var
ret i32 %val
; GD: test_localdynamic:
; GD: leaq _TLS_MODULE_BASE_@tlsdesc(%rip), [[REG:%.*]]
; GD-NEXT: callq *_TLS_MODULE_BASE_@tlscall([[REG]])
; GD-NEXT: movl %fs:local_dynamic_var@DTPOFF(%rax), %eax
; GD-RELOC: R_X86_64_GOTPC32_TLSDESC _TLS_MODULE_BASE_
; GD-RELOC: R_X86_64_TLSDESC_CALL _TLS_MODULE_BASE_
; GD-RELOC: R_X86_64_DTPOFF32 local_dynamic_var
}
define ptr @test_localdynamic_addr() {
ret ptr @local_dynamic_var
; GD: test_localdynamic_addr:
; GD: leaq _TLS_MODULE_BASE_@tlsdesc(%rip), [[REG:%.*]]
; GD-NEXT: callq *_TLS_MODULE_BASE_@tlscall([[REG]])
; GD-NEXT: movq %fs:0, %rcx
; GD-NEXT: leaq local_dynamic_var@DTPOFF(%rcx,[[REG]])
; GD-RELOC: R_X86_64_GOTPC32_TLSDESC _TLS_MODULE_BASE_
; GD-RELOC: R_X86_64_TLSDESC_CALL _TLS_MODULE_BASE_
; GD-RELOC: R_X86_64_DTPOFF32 local_dynamic_var
}
@local_dynamic_var2 = external thread_local(localdynamic) global i32
define i32 @test_localdynamic_deduplicate() {
%val = load i32, ptr @local_dynamic_var
%val2 = load i32, ptr @local_dynamic_var2
%sum = add i32 %val, %val2
ret i32 %sum
; GD: test_localdynamic_deduplicate:
; GD: leaq _TLS_MODULE_BASE_@tlsdesc(%rip), [[REG:%.*]]
; GD-NEXT: callq *_TLS_MODULE_BASE_@tlscall([[REG]])
; GD-NEXT: movl %fs:local_dynamic_var@DTPOFF(%rax)
; GD-NEXT: addl %fs:local_dynamic_var2@DTPOFF(%rax)
; GD-RELOC: R_X86_64_GOTPC32_TLSDESC _TLS_MODULE_BASE_
; GD-RELOC: R_X86_64_TLSDESC_CALL _TLS_MODULE_BASE_
; GD-RELOC: R_X86_64_DTPOFF32 local_dynamic_var2
}
|