1# REQUIRES: x86_64-linux 2# RUN: rm -rf %t && mkdir -p %t 3# RUN: llvm-mc -triple=x86_64-unknown-linux -filetype=obj -o %t/tls.o %s 4# RUN: llvm-rtdyld -triple=x86_64-unknown-linux -execute %t/tls.o 5 6 7_main: 8 9 push %rbx 10 # load the address of the GOT in rbx for the large code model tests 11 lea _GLOBAL_OFFSET_TABLE_(%rip), %rbx 12 13# Test Local Exec TLS Model 14 mov %fs:tls_foo@tpoff, %eax 15 cmp $0x12, %eax 16 je 1f 17 mov $1, %eax 18 jmp 2f 191: 20 21 mov %fs:tls_bar@tpoff, %eax 22 cmp $0x34, %eax 23 je 1f 24 mov $2, %eax 25 jmp 2f 261: 27 28# Test Initial Exec TLS Model 29 mov tls_foo@gottpoff(%rip), %rax 30 mov %fs:(%rax), %eax 31 cmp $0x12, %eax 32 je 1f 33 mov $3, %eax 34 jmp 2f 351: 36 37 mov tls_bar@gottpoff(%rip), %rax 38 mov %fs:(%rax), %eax 39 cmp $0x34, %eax 40 je 1f 41 mov $4, %eax 42 jmp 2f 431: 44 45# Test Local Dynamic TLS Model (small code model) 46 lea tls_foo@tlsld(%rip), %rdi 47 call __tls_get_addr@plt 48 mov tls_foo@dtpoff(%rax), %eax 49 cmp $0x12, %eax 50 je 1f 51 mov $5, %eax 52 jmp 2f 531: 54 55 lea tls_bar@tlsld(%rip), %rdi 56 call __tls_get_addr@plt 57 mov tls_bar@dtpoff(%rax), %eax 58 cmp $0x34, %eax 59 je 1f 60 mov $6, %eax 61 jmp 2f 621: 63 64# Test Local Dynamic TLS Model (large code model) 65 lea tls_foo@tlsld(%rip), %rdi 66 movabs $__tls_get_addr@pltoff, %rax 67 add %rbx, %rax 68 call *%rax 69 mov tls_foo@dtpoff(%rax), %eax 70 cmp $0x12, %eax 71 je 1f 72 mov $7, %eax 73 jmp 2f 741: 75 76 lea tls_bar@tlsld(%rip), %rdi 77 movabs $__tls_get_addr@pltoff, %rax 78 add %rbx, %rax 79 call *%rax 80 mov tls_bar@dtpoff(%rax), %eax 81 cmp $0x34, %eax 82 je 1f 83 mov $8, %eax 84 jmp 2f 851: 86 87# Test Global Dynamic TLS Model (small code model) 88 .byte 0x66 89 leaq tls_foo@tlsgd(%rip), %rdi 90 .byte 0x66, 0x66, 0x48 91 call __tls_get_addr@plt 92 mov (%rax), %eax 93 cmp $0x12, %eax 94 je 1f 95 mov $9, %eax 96 jmp 2f 971: 98 99 .byte 0x66 100 leaq tls_bar@tlsgd(%rip), %rdi 101 .byte 0x66, 0x66, 0x48 102 call __tls_get_addr@plt 103 mov (%rax), %eax 104 cmp $0x34, %eax 105 je 1f 106 mov $10, %eax 107 jmp 2f 1081: 109 110# Test Global Dynamic TLS Model (large code model) 111 lea tls_foo@tlsgd(%rip), %rdi 112 movabs $__tls_get_addr@pltoff, %rax 113 add %rbx, %rax 114 call *%rax 115 mov (%rax), %eax 116 cmp $0x12, %eax 117 je 1f 118 mov $11, %eax 119 jmp 2f 1201: 121 122 lea tls_bar@tlsgd(%rip), %rdi 123 movabs $__tls_get_addr@pltoff, %rax 124 add %rbx, %rax 125 call *%rax 126 mov (%rax), %eax 127 cmp $0x34, %eax 128 je 1f 129 mov $12, %eax 130 jmp 2f 1311: 132 133 xor %eax, %eax 134 1352: 136 pop %rbx 137 ret 138 139 140 .section .tdata, "awT", @progbits 141 142 .global tls_foo 143 .type tls_foo, @object 144 .size tls_foo, 4 145 .align 4 146tls_foo: 147 .long 0x12 148 149 .global tls_bar 150 .type tls_bar, @object 151 .size tls_bar, 4 152 .align 4 153tls_bar: 154 .long 0x34 155