File: TLS.s

package info (click to toggle)
llvm-toolchain-14 1%3A14.0.6-12
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,496,180 kB
  • sloc: cpp: 5,593,972; ansic: 986,872; asm: 585,869; python: 184,223; objc: 72,530; lisp: 31,119; f90: 27,793; javascript: 9,780; pascal: 9,762; sh: 9,482; perl: 7,468; ml: 5,432; awk: 3,523; makefile: 2,538; xml: 953; cs: 573; fortran: 567
file content (154 lines) | stat: -rw-r--r-- 2,495 bytes parent folder | download | duplicates (6)
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# REQUIRES: x86_64-linux
# RUN: rm -rf %t && mkdir -p %t
# RUN: llvm-mc -triple=x86_64-unknown-linux -filetype=obj -o %t/tls.o %s
# RUN: llvm-rtdyld -triple=x86_64-unknown-linux -execute %t/tls.o


_main:

	push %rbx
	# load the address of the GOT in rbx for the large code model tests
	lea _GLOBAL_OFFSET_TABLE_(%rip), %rbx

# Test Local Exec TLS Model
	mov %fs:tls_foo@tpoff, %eax
	cmp $0x12, %eax
	je 1f
	mov $1, %eax
	jmp 2f
1:

	mov %fs:tls_bar@tpoff, %eax
	cmp $0x34, %eax
	je 1f
	mov $2, %eax
	jmp 2f
1:

# Test Initial Exec TLS Model
	mov tls_foo@gottpoff(%rip), %rax
	mov %fs:(%rax), %eax
	cmp $0x12, %eax
	je 1f
	mov $3, %eax
	jmp 2f
1:

	mov tls_bar@gottpoff(%rip), %rax
	mov %fs:(%rax), %eax
	cmp $0x34, %eax
	je 1f
	mov $4, %eax
	jmp 2f
1:

# Test Local Dynamic TLS Model (small code model)
	lea tls_foo@tlsld(%rip), %rdi
	call __tls_get_addr@plt
	mov tls_foo@dtpoff(%rax), %eax
	cmp $0x12, %eax
	je 1f
	mov $5, %eax
	jmp 2f
1:

	lea tls_bar@tlsld(%rip), %rdi
	call __tls_get_addr@plt
	mov tls_bar@dtpoff(%rax), %eax
	cmp $0x34, %eax
	je 1f
	mov $6, %eax
	jmp 2f
1:

# Test Local Dynamic TLS Model (large code model)
	lea tls_foo@tlsld(%rip), %rdi
	movabs $__tls_get_addr@pltoff, %rax
	add %rbx, %rax
	call *%rax
	mov tls_foo@dtpoff(%rax), %eax
	cmp $0x12, %eax
	je 1f
	mov $7, %eax
	jmp 2f
1:

	lea tls_bar@tlsld(%rip), %rdi
	movabs $__tls_get_addr@pltoff, %rax
	add %rbx, %rax
	call *%rax
	mov tls_bar@dtpoff(%rax), %eax
	cmp $0x34, %eax
	je 1f
	mov $8, %eax
	jmp 2f
1:

# Test Global Dynamic TLS Model (small code model)
	.byte 0x66
	leaq tls_foo@tlsgd(%rip), %rdi
	.byte 0x66, 0x66, 0x48
	call __tls_get_addr@plt
	mov (%rax), %eax
	cmp $0x12, %eax
	je 1f
	mov $9, %eax
	jmp 2f
1:

	.byte 0x66
	leaq tls_bar@tlsgd(%rip), %rdi
	.byte 0x66, 0x66, 0x48
	call __tls_get_addr@plt
	mov (%rax), %eax
	cmp $0x34, %eax
	je 1f
	mov $10, %eax
	jmp 2f
1:

# Test Global Dynamic TLS Model (large code model)
	lea tls_foo@tlsgd(%rip), %rdi
	movabs $__tls_get_addr@pltoff, %rax
	add %rbx, %rax
	call *%rax
	mov (%rax), %eax
	cmp $0x12, %eax
	je 1f
	mov $11, %eax
	jmp 2f
1:

	lea tls_bar@tlsgd(%rip), %rdi
	movabs $__tls_get_addr@pltoff, %rax
	add %rbx, %rax
	call *%rax
	mov (%rax), %eax
	cmp $0x34, %eax
	je 1f
	mov $12, %eax
	jmp 2f
1:

	xor %eax, %eax

2:
	pop %rbx
	ret


	.section .tdata, "awT", @progbits

	.global tls_foo
	.type tls_foo, @object
	.size tls_foo, 4
	.align 4
tls_foo:
	.long 0x12

	.global tls_bar
	.type tls_bar, @object
	.size tls_bar, 4
	.align 4
tls_bar:
	.long 0x34