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 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
|
# REQUIRES: x86_64-linux
# RUN: rm -rf %t && mkdir -p %t
# RUN: split-file %s %t
# RUN: llvm-mc -triple=x86_64-unknown-linux -filetype=obj -o %t/test_runner.o %t/test_runner.s
# RUN: llvm-mc -triple=x86_64-unknown-linux -filetype=obj -o %t/external_tls.o %t/external_tls.s
# RUN: llvm-rtdyld -triple=x86_64-unknown-linux -execute %t/test_runner.o %t/external_tls.o
#--- test_runner.s
_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:
# External TLS variable, Local Exec TLS Model (small code model)
mov %fs:external_tls_var@tpoff, %eax
cmp $0x56, %eax
je 1f
mov $12, %eax
jmp 2f
1:
# External TLS variable, Global Dynamic TLS Model (small code model)
.byte 0x66
leaq external_tls_var@tlsgd(%rip), %rdi
.byte 0x66, 0x66, 0x48
call __tls_get_addr@plt
mov (%rax), %eax
cmp $0x56, %eax
je 1f
mov $13, %eax
jmp 2f
1:
# Return 0 if all tests are successful
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
#--- external_tls.s
.section .tdata, "awT", @progbits
.global external_tls_var
.type external_tls_var, @object
.size external_tls_var, 4
.align 4
external_tls_var:
.long 0x56
|