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
|