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