191 lines · plain
1# REQUIRES: x86_64-linux2# RUN: rm -rf %t && mkdir -p %t3# RUN: split-file %s %t4# RUN: llvm-mc -triple=x86_64-unknown-linux -filetype=obj -o %t/test_runner.o %t/test_runner.s5# RUN: llvm-mc -triple=x86_64-unknown-linux -filetype=obj -o %t/external_tls.o %t/external_tls.s6# RUN: llvm-rtdyld -triple=x86_64-unknown-linux -execute %t/test_runner.o %t/external_tls.o7 8#--- test_runner.s9 10_main:11 12 push %rbx13 # load the address of the GOT in rbx for the large code model tests14 lea _GLOBAL_OFFSET_TABLE_(%rip), %rbx15 16# Test Local Exec TLS Model17 mov %fs:tls_foo@tpoff, %eax18 cmp $0x12, %eax19 je 1f20 mov $1, %eax21 jmp 2f221:23 24 mov %fs:tls_bar@tpoff, %eax25 cmp $0x34, %eax26 je 1f27 mov $2, %eax28 jmp 2f291:30 31# Test Initial Exec TLS Model32 mov tls_foo@gottpoff(%rip), %rax33 mov %fs:(%rax), %eax34 cmp $0x12, %eax35 je 1f36 mov $3, %eax37 jmp 2f381:39 40 mov tls_bar@gottpoff(%rip), %rax41 mov %fs:(%rax), %eax42 cmp $0x34, %eax43 je 1f44 mov $4, %eax45 jmp 2f461:47 48# Test Local Dynamic TLS Model (small code model)49 lea tls_foo@tlsld(%rip), %rdi50 call __tls_get_addr@plt51 mov tls_foo@dtpoff(%rax), %eax52 cmp $0x12, %eax53 je 1f54 mov $5, %eax55 jmp 2f561:57 58 lea tls_bar@tlsld(%rip), %rdi59 call __tls_get_addr@plt60 mov tls_bar@dtpoff(%rax), %eax61 cmp $0x34, %eax62 je 1f63 mov $6, %eax64 jmp 2f651:66 67# Test Local Dynamic TLS Model (large code model)68 lea tls_foo@tlsld(%rip), %rdi69 movabs $__tls_get_addr@pltoff, %rax70 add %rbx, %rax71 call *%rax72 mov tls_foo@dtpoff(%rax), %eax73 cmp $0x12, %eax74 je 1f75 mov $7, %eax76 jmp 2f771:78 79 lea tls_bar@tlsld(%rip), %rdi80 movabs $__tls_get_addr@pltoff, %rax81 add %rbx, %rax82 call *%rax83 mov tls_bar@dtpoff(%rax), %eax84 cmp $0x34, %eax85 je 1f86 mov $8, %eax87 jmp 2f881:89 90# Test Global Dynamic TLS Model (small code model)91 .byte 0x6692 leaq tls_foo@tlsgd(%rip), %rdi93 .byte 0x66, 0x66, 0x4894 call __tls_get_addr@plt95 mov (%rax), %eax96 cmp $0x12, %eax97 je 1f98 mov $9, %eax99 jmp 2f1001:101 102 .byte 0x66103 leaq tls_bar@tlsgd(%rip), %rdi104 .byte 0x66, 0x66, 0x48105 call __tls_get_addr@plt106 mov (%rax), %eax107 cmp $0x34, %eax108 je 1f109 mov $10, %eax110 jmp 2f1111:112 113# Test Global Dynamic TLS Model (large code model)114 lea tls_foo@tlsgd(%rip), %rdi115 movabs $__tls_get_addr@pltoff, %rax116 add %rbx, %rax117 call *%rax118 mov (%rax), %eax119 cmp $0x12, %eax120 je 1f121 mov $11, %eax122 jmp 2f1231:124 125 lea tls_bar@tlsgd(%rip), %rdi126 movabs $__tls_get_addr@pltoff, %rax127 add %rbx, %rax128 call *%rax129 mov (%rax), %eax130 cmp $0x34, %eax131 je 1f132 mov $12, %eax133 jmp 2f1341:135 136# External TLS variable, Local Exec TLS Model (small code model)137 mov %fs:external_tls_var@tpoff, %eax138 cmp $0x56, %eax139 je 1f140 mov $12, %eax141 jmp 2f1421:143 144# External TLS variable, Global Dynamic TLS Model (small code model)145 .byte 0x66146 leaq external_tls_var@tlsgd(%rip), %rdi147 .byte 0x66, 0x66, 0x48148 call __tls_get_addr@plt149 mov (%rax), %eax150 cmp $0x56, %eax151 je 1f152 mov $13, %eax153 jmp 2f1541:155 156 157# Return 0 if all tests are successful158 xor %eax, %eax159 1602:161 pop %rbx162 ret163 164 165 .section .tdata, "awT", @progbits166 167 .global tls_foo168 .type tls_foo, @object169 .size tls_foo, 4170 .align 4171tls_foo:172 .long 0x12173 174 .global tls_bar175 .type tls_bar, @object176 .size tls_bar, 4177 .align 4178tls_bar:179 .long 0x34180 181#--- external_tls.s182 183 .section .tdata, "awT", @progbits184 185 .global external_tls_var186 .type external_tls_var, @object187 .size external_tls_var, 4188 .align 4189external_tls_var:190 .long 0x56191