| // RUN: %clang -c -o %t %s |
| // RUN: %llvm_jitlink %t |
| // |
| // Test that basic ELF TLS work by adding together TLSs with values |
| // 0, 1, and -1, and returning the result (0 for success). This setup |
| // tests both zero-initialized (.tbss) and non-zero-initialized |
| // (.tdata) sections. |
| |
| .text |
| .file "tlstest.cpp" |
| .globl main # -- Begin function main |
| .p2align 4, 0x90 |
| .type main,@function |
| main: # @main |
| # %bb.0: # %entry |
| pushq %rbp |
| movq %rsp, %rbp |
| subq $32, %rsp |
| movl $0, -4(%rbp) |
| movl %edi, -8(%rbp) |
| movq %rsi, -16(%rbp) |
| data16 |
| leaq x@TLSGD(%rip), %rdi |
| data16 |
| data16 |
| rex64 |
| callq __tls_get_addr@PLT |
| movl (%rax), %eax |
| movl %eax, -24(%rbp) # 4-byte Spill |
| data16 |
| leaq y@TLSGD(%rip), %rdi |
| data16 |
| data16 |
| rex64 |
| callq __tls_get_addr@PLT |
| movq %rax, %rcx |
| movl -24(%rbp), %eax # 4-byte Reload |
| movl (%rcx), %ecx |
| addl %ecx, %eax |
| movl %eax, -20(%rbp) # 4-byte Spill |
| data16 |
| leaq z@TLSGD(%rip), %rdi |
| data16 |
| data16 |
| rex64 |
| callq __tls_get_addr@PLT |
| movq %rax, %rcx |
| movl -20(%rbp), %eax # 4-byte Reload |
| movl (%rcx), %ecx |
| addl %ecx, %eax |
| addq $32, %rsp |
| popq %rbp |
| retq |
| .Lfunc_end0: |
| .size main, .Lfunc_end0-main |
| # -- End function |
| .type x,@object # @x |
| .section .tbss,"awT",@nobits |
| .globl x |
| .p2align 2 |
| x: |
| .long 0 # 0x0 |
| .size x, 4 |
| |
| .type y,@object # @y |
| .section .tdata,"awT",@progbits |
| .globl y |
| .p2align 2 |
| y: |
| .long 1 # 0x1 |
| .size y, 4 |
| |
| .type z,@object # @z |
| .globl z |
| .p2align 2 |
| z: |
| .long 4294967295 # 0xffffffff |
| .size z, 4 |
| |
| .section ".note.GNU-stack","",@progbits |
| .addrsig |