1; RUN: llc -mattr=+bulk-memory,+atomics -filetype=obj %s -o %t.o
2
3target triple = "wasm32-unknown-unknown"
4
5@no_tls = global i32 0, align 4
6@tls1 = thread_local(localexec) global i32 1, align 4
7@tls2 = thread_local(localexec) global i32 1, align 4
8
9define i32* @tls1_addr() {
10  ret i32* @tls1
11}
12
13define i32* @tls2_addr() {
14  ret i32* @tls2
15}
16
17define i32 @tls_align() {
18  %1 = call i32 @llvm.wasm.tls.align.i32()
19  ret i32 %1
20}
21
22declare i32 @llvm.wasm.tls.align.i32()
23
24; RUN: wasm-ld -no-gc-sections --shared-memory --max-memory=131072 --no-entry -o %t.wasm %t.o
25; RUN: obj2yaml %t.wasm | FileCheck %s
26
27; RUN: wasm-ld -no-gc-sections --shared-memory --max-memory=131072 --no-merge-data-segments --no-entry -o %t.wasm %t.o
28; RUN: obj2yaml %t.wasm | FileCheck %s
29
30; CHECK:      - Type:            GLOBAL
31; CHECK-NEXT:   Globals:
32; CHECK-NEXT:     - Index:           0
33; CHECK-NEXT:       Type:            I32
34; CHECK-NEXT:       Mutable:         true
35; CHECK-NEXT:       InitExpr:
36; CHECK-NEXT:         Opcode:          I32_CONST
37; CHECK-NEXT:         Value:           66576
38
39; __tls_base
40; CHECK-NEXT:     - Index:           1
41; CHECK-NEXT:       Type:            I32
42; CHECK-NEXT:       Mutable:         true
43; CHECK-NEXT:       InitExpr:
44; CHECK-NEXT:         Opcode:          I32_CONST
45; CHECK-NEXT:         Value:           0
46
47; __tls_size
48; CHECK-NEXT:     - Index:           2
49; CHECK-NEXT:       Type:            I32
50; CHECK-NEXT:       Mutable:         false
51; CHECK-NEXT:       InitExpr:
52; CHECK-NEXT:         Opcode:          I32_CONST
53; CHECK-NEXT:         Value:           8
54
55; __tls_align
56; CHECK-NEXT:     - Index:           3
57; CHECK-NEXT:       Type:            I32
58; CHECK-NEXT:       Mutable:         false
59; CHECK-NEXT:       InitExpr:
60; CHECK-NEXT:         Opcode:          I32_CONST
61; CHECK-NEXT:         Value:           4
62
63
64; CHECK:      - Type:            CODE
65; CHECK-NEXT:   Functions:
66; Skip __wasm_call_ctors and __wasm_init_memory
67; CHECK:          - Index:           2
68; CHECK-NEXT:       Locals:          []
69; CHECK-NEXT:       Body:            20002401200041004108FC0800000B
70
71; Expected body of __wasm_init_tls:
72;   local.get 0
73;   global.set  1
74;   local.get 0
75;   i32.const 0
76;   i32.const 8
77;   memory.init 1, 0
78;   end
79
80; CHECK-NEXT:     - Index:           3
81; CHECK-NEXT:       Locals:          []
82; CHECK-NEXT:       Body:            2381808080004180808080006A0B
83
84; Expected body of tls1_addr:
85;   global.get 1
86;   i32.const 0
87;   i32.add
88;   end
89
90; CHECK-NEXT:     - Index:           4
91; CHECK-NEXT:       Locals:          []
92; CHECK-NEXT:       Body:            2381808080004184808080006A0B
93
94; Expected body of tls1_addr:
95;   global.get 1
96;   i32.const 4
97;   i32.add
98;   end
99
100; CHECK-NEXT:     - Index:           5
101; CHECK-NEXT:       Locals:          []
102; CHECK-NEXT:       Body:            2383808080000B
103
104; Expected body of tls1_addr:
105;   global.get 3
106;   end
107