1 | // RUN: %clang -c -o %t %s |
2 | // RUN: %llvm_jitlink %t |
3 | // |
4 | // Test that basic ELF TLS work by adding together TLSs with values |
5 | // 0, 1, and -1, and returning the result (0 for success). This setup |
6 | // tests both zero-initialized (.tbss) and non-zero-initialized |
7 | // (.tdata) sections. |
8 | |
9 | .text |
10 | .file "tlstest.cpp" |
11 | .globl main # -- Begin function main |
12 | .p2align 4, 0x90 |
13 | .type main,@function |
14 | main: # @main |
15 | # %bb.0: # %entry |
16 | pushq %rbp |
17 | movq %rsp, %rbp |
18 | subq $32, %rsp |
19 | movl $0, -4(%rbp) |
20 | movl %edi, -8(%rbp) |
21 | movq %rsi, -16(%rbp) |
22 | data16 |
23 | leaq x@TLSGD(%rip), %rdi |
24 | data16 |
25 | data16 |
26 | rex64 |
27 | callq __tls_get_addr@PLT |
28 | movl (%rax), %eax |
29 | movl %eax, -24(%rbp) # 4-byte Spill |
30 | data16 |
31 | leaq y@TLSGD(%rip), %rdi |
32 | data16 |
33 | data16 |
34 | rex64 |
35 | callq __tls_get_addr@PLT |
36 | movq %rax, %rcx |
37 | movl -24(%rbp), %eax # 4-byte Reload |
38 | movl (%rcx), %ecx |
39 | addl %ecx, %eax |
40 | movl %eax, -20(%rbp) # 4-byte Spill |
41 | data16 |
42 | leaq z@TLSGD(%rip), %rdi |
43 | data16 |
44 | data16 |
45 | rex64 |
46 | callq __tls_get_addr@PLT |
47 | movq %rax, %rcx |
48 | movl -20(%rbp), %eax # 4-byte Reload |
49 | movl (%rcx), %ecx |
50 | addl %ecx, %eax |
51 | addq $32, %rsp |
52 | popq %rbp |
53 | retq |
54 | .Lfunc_end0: |
55 | .size main, .Lfunc_end0-main |
56 | # -- End function |
57 | .type x,@object # @x |
58 | .section .tbss,"awT" ,@nobits |
59 | .globl x |
60 | .p2align 2 |
61 | x: |
62 | .long 0 # 0x0 |
63 | .size x, 4 |
64 | |
65 | .type y,@object # @y |
66 | .section .tdata,"awT" ,@progbits |
67 | .globl y |
68 | .p2align 2 |
69 | y: |
70 | .long 1 # 0x1 |
71 | .size y, 4 |
72 | |
73 | .type z,@object # @z |
74 | .globl z |
75 | .p2align 2 |
76 | z: |
77 | .long 4294967295 # 0xffffffff |
78 | .size z, 4 |
79 | |
80 | .section ".note.GNU-stack" ,"" ,@progbits |
81 | .addrsig |
82 | |