1 ; RUN: llc -relocation-model=pic -mattr=+mutable-globals -filetype=obj %s -o %t.o
2 ; RUN: wasm-ld --no-gc-sections --experimental-pic -pie -o %t.wasm %t.o
3 ; RUN: obj2yaml %t.wasm | FileCheck %s
4 ; RUN: llvm-objdump --disassemble-symbols=__wasm_call_ctors,__wasm_apply_data_relocs --no-show-raw-insn --no-leading-addr %t.wasm | FileCheck %s --check-prefixes DISASSEM
6 target triple = "wasm32-unknown-emscripten"
8 @data = global i32 2, align 4
9 @data_external = external global i32
10 @indirect_func = local_unnamed_addr global i32 ()* @foo, align 4
12 @data_addr = local_unnamed_addr global i32* @data, align 4
13 @data_addr_external = local_unnamed_addr global i32* @data_external, align 4
15 define hidden i32 @foo() {
17 ; To ensure we use __stack_pointer
19 %0 = load i32, i32* @data, align 4
20 %1 = load i32 ()*, i32 ()** @indirect_func, align 4
25 define default i32** @get_data_address() {
27 ret i32** @data_addr_external
30 define void @_start() {
31 call void @external_func()
35 declare void @external_func()
38 ; CHECK-NEXT: - Type: CUSTOM
39 ; CHECK-NEXT: Name: dylink.0
40 ; CHECK-NEXT: MemorySize: 16
41 ; CHECK-NEXT: MemoryAlignment: 2
42 ; CHECK-NEXT: TableSize: 1
43 ; CHECK-NEXT: TableAlignment: 0
44 ; CHECK-NEXT: Needed: []
46 ; CHECK: - Type: IMPORT
47 ; CHECK-NEXT: Imports:
48 ; CHECK-NEXT: - Module: env
49 ; CHECK-NEXT: Field: __indirect_function_table
50 ; CHECK-NEXT: Kind: TABLE
52 ; CHECK-NEXT: Index: 0
53 ; CHECK-NEXT: ElemType: FUNCREF
55 ; CHECK-NEXT: Minimum: 0x1
56 ; CHECK-NEXT: - Module: env
57 ; CHECK-NEXT: Field: __stack_pointer
58 ; CHECK-NEXT: Kind: GLOBAL
59 ; CHECK-NEXT: GlobalType: I32
60 ; CHECK-NEXT: GlobalMutable: true
61 ; CHECK-NEXT: - Module: env
62 ; CHECK-NEXT: Field: __memory_base
63 ; CHECK-NEXT: Kind: GLOBAL
64 ; CHECK-NEXT: GlobalType: I32
65 ; CHECK-NEXT: GlobalMutable: false
66 ; CHECK-NEXT: - Module: env
67 ; CHECK-NEXT: Field: __table_base
68 ; CHECK-NEXT: Kind: GLOBAL
69 ; CHECK-NEXT: GlobalType: I32
70 ; CHECK-NEXT: GlobalMutable: false
72 ; CHECK: - Type: START
73 ; CHECK-NEXT: StartFunction: 3
75 ; CHECK: - Type: CUSTOM
76 ; CHECK-NEXT: Name: name
77 ; CHECK-NEXT: FunctionNames:
78 ; CHECK-NEXT: - Index: 0
79 ; CHECK-NEXT: Name: external_func
80 ; CHECK-NEXT: - Index: 1
81 ; CHECK-NEXT: Name: __wasm_call_ctors
82 ; CHECK-NEXT: - Index: 2
83 ; CHECK-NEXT: Name: __wasm_apply_data_relocs
84 ; CHECK-NEXT: - Index: 3
85 ; CHECK-NEXT: Name: __wasm_apply_global_relocs
86 ; CHECK-NEXT: - Index: 4
87 ; CHECK-NEXT: Name: foo
88 ; CHECK-NEXT: - Index: 5
89 ; CHECK-NEXT: Name: get_data_address
90 ; CHECK-NEXT: - Index: 6
91 ; CHECK-NEXT: Name: _start
92 ; CHECK-NEXT: GlobalNames:
94 ; DISASSEM-LABEL: <__wasm_call_ctors>:
98 ; DISASSEM-LABEL: <__wasm_apply_data_relocs>:
101 ; Run the same test with extended-const support. When this is available
102 ; we don't need __wasm_apply_global_relocs and instead rely on the add
103 ; instruction in the InitExpr. We also, therefore, do not need these globals
106 ; RUN: llc -relocation-model=pic -mattr=+extended-const,+mutable-globals,+atomics,+bulk-memory -filetype=obj %s -o %t.extended.o
107 ; RUN: wasm-ld --no-gc-sections --allow-undefined --experimental-pic -pie -o %t.extended.wasm %t.extended.o
108 ; RUN: obj2yaml %t.extended.wasm | FileCheck %s --check-prefix=EXTENDED-CONST
110 ; EXTENDED-CONST-NOT: __wasm_apply_global_relocs
112 ; EXTENDED-CONST: - Type: GLOBAL
113 ; EXTENDED-CONST-NEXT: Globals:
114 ; EXTENDED-CONST-NEXT: - Index: 4
115 ; EXTENDED-CONST-NEXT: Type: I32
116 ; EXTENDED-CONST-NEXT: Mutable: false
117 ; EXTENDED-CONST-NEXT: InitExpr:
118 ; EXTENDED-CONST-NEXT: Opcode: GLOBAL_GET
119 ; EXTENDED-CONST-NEXT: Index: 1
120 ; EXTENDED-CONST-NEXT: - Index: 5
121 ; EXTENDED-CONST-NEXT: Type: I32
122 ; EXTENDED-CONST-NEXT: Mutable: false
123 ; EXTENDED-CONST-NEXT: InitExpr:
124 ; EXTENDED-CONST-NEXT: Extended: true
125 ; EXTENDED-CONST-NEXT: Body: 230141046A0B
126 ; EXTENDED-CONST-NEXT: - Index: 6
127 ; EXTENDED-CONST-NEXT: Type: I32
128 ; EXTENDED-CONST-NEXT: Mutable: false
129 ; EXTENDED-CONST-NEXT: InitExpr:
130 ; EXTENDED-CONST-NEXT: Extended: true
131 ; This instruction sequence decodes to:
132 ; (global.get[0x23] 0x1 i32.const[0x41] 0x0C i32.add[0x6A] end[0x0b])
133 ; EXTENDED-CONST-NEXT: Body: 2301410C6A0B
135 ; EXTENDED-CONST-NOT: - Type: START
137 ; EXTENDED-CONST: FunctionNames:
138 ; EXTENDED-CONST-NEXT: - Index: 0
139 ; EXTENDED-CONST-NEXT: Name: external_func
140 ; EXTENDED-CONST-NEXT: - Index: 1
141 ; EXTENDED-CONST-NEXT: Name: __wasm_call_ctors
142 ; EXTENDED-CONST-NEXT: - Index: 2
143 ; EXTENDED-CONST-NEXT: Name: __wasm_apply_data_relocs
145 ; Run the same test with threading support. In this mode
146 ; we expect __wasm_init_memory and __wasm_apply_data_relocs
147 ; to be generated along with __wasm_start as the start
150 ; RUN: llc -relocation-model=pic -mattr=+mutable-globals,+atomics,+bulk-memory -filetype=obj %s -o %t.shmem.o
151 ; RUN: wasm-ld --no-gc-sections --shared-memory --allow-undefined --experimental-pic -pie -o %t.shmem.wasm %t.shmem.o
152 ; RUN: obj2yaml %t.shmem.wasm | FileCheck %s --check-prefix=SHMEM
153 ; RUN: llvm-objdump --disassemble-symbols=__wasm_start --no-show-raw-insn --no-leading-addr %t.shmem.wasm | FileCheck %s --check-prefix DISASSEM-SHMEM
155 ; SHMEM: - Type: START
156 ; SHMEM-NEXT: StartFunction: 6
158 ; DISASSEM-SHMEM-LABEL: <__wasm_start>:
159 ; DISASSEM-SHMEM-EMPTY:
160 ; DISASSEM-SHMEM-NEXT: call 5
161 ; DISASSEM-SHMEM-NEXT: call 4
162 ; DISASSEM-SHMEM-NEXT: end
164 ; SHMEM: FunctionNames:
165 ; SHMEM-NEXT: - Index: 0
166 ; SHMEM-NEXT: Name: external_func
167 ; SHMEM-NEXT: - Index: 1
168 ; SHMEM-NEXT: Name: __wasm_call_ctors
169 ; SHMEM-NEXT: - Index: 2
170 ; SHMEM-NEXT: Name: __wasm_init_tls
171 ; SHMEM-NEXT: - Index: 3
172 ; SHMEM-NEXT: Name: __wasm_apply_data_relocs
173 ; SHMEM-NEXT: - Index: 4
174 ; SHMEM-NEXT: Name: __wasm_init_memory
175 ; SHMEM-NEXT: - Index: 5
176 ; SHMEM-NEXT: Name: __wasm_apply_global_relocs
177 ; SHMEM-NEXT: - Index: 6
178 ; SHMEM-NEXT: Name: __wasm_start
179 ; SHMEM-NEXT: - Index: 7
180 ; SHMEM-NEXT: Name: foo
181 ; SHMEM-NEXT: - Index: 8
182 ; SHMEM-NEXT: Name: get_data_address
183 ; SHMEM-NEXT: - Index: 9
184 ; SHMEM-NEXT: Name: _start