1 ; RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/hello.s -o %t.hello.o
2 ; RUN: llc -filetype=obj %s -o %t.o
3 ; RUN: wasm-ld -r -o %t2.o %t.hello.o %t.o
4 ; RUN: obj2yaml %t2.o | FileCheck %s
6 ; Verify the resulting object can be used as linker input
7 ; RUN: wasm-ld --allow-undefined -o %t.wasm %t2.o --export-table
9 target triple = "wasm32-unknown-unknown"
11 ; Function Attrs: nounwind
12 define hidden i32 @my_func() local_unnamed_addr {
14 %call = tail call i32 @foo_import()
15 %call2 = tail call i32 @bar_import()
19 declare i32 @foo_import() local_unnamed_addr
20 declare extern_weak i32 @bar_import() local_unnamed_addr
21 @data_import = external global i64
23 @func_addr1 = hidden global ptr @my_func, align 4
24 @func_addr2 = hidden global ptr @foo_import, align 4
25 @func_addr3 = hidden global ptr @bar_import, align 4
26 @data_addr1 = hidden global ptr @data_import, align 8
28 $func_comdat = comdat any
29 @data_comdat = weak_odr constant [3 x i8] c"abc", comdat($func_comdat)
30 define linkonce_odr i32 @func_comdat() comdat {
32 ret i32 ptrtoint (ptr @data_comdat to i32)
35 ; Test that __attribute__(used) (i.e NO_STRIP) is preserved in the relocated symbol table
36 @llvm.used = appending global [1 x ptr] [ptr @my_func], section "llvm.metadata"
38 define void @_start() {
44 ; CHECK-NEXT: FileHeader:
45 ; CHECK-NEXT: Version: 0x1
46 ; CHECK-NEXT: Sections:
47 ; CHECK-NEXT: - Type: TYPE
48 ; CHECK-NEXT: Signatures:
49 ; CHECK-NEXT: - Index: 0
50 ; CHECK-NEXT: ParamTypes:
52 ; CHECK-NEXT: ReturnTypes: []
53 ; CHECK-NEXT: - Index: 1
54 ; CHECK-NEXT: ParamTypes:
55 ; CHECK-NEXT: ReturnTypes:
57 ; CHECK-NEXT: - Index: 2
58 ; CHECK-NEXT: ParamTypes:
59 ; CHECK-NEXT: ReturnTypes: []
60 ; CHECK-NEXT: - Type: IMPORT
61 ; CHECK-NEXT: Imports:
62 ; CHECK-NEXT: - Module: env
63 ; CHECK-NEXT: Field: __indirect_function_table
64 ; CHECK-NEXT: Kind: TABLE
66 ; CHECK-NEXT: Index: 0
67 ; CHECK-NEXT: ElemType: FUNCREF
69 ; CHECK-NEXT: Minimum: 0x4
70 ; CHECK-NEXT: - Module: env
71 ; CHECK-NEXT: Field: puts
72 ; CHECK-NEXT: Kind: FUNCTION
73 ; CHECK-NEXT: SigIndex: 0
74 ; CHECK-NEXT: - Module: env
75 ; CHECK-NEXT: Field: foo_import
76 ; CHECK-NEXT: Kind: FUNCTION
77 ; CHECK-NEXT: SigIndex: 1
78 ; CHECK-NEXT: - Module: env
79 ; CHECK-NEXT: Field: bar_import
80 ; CHECK-NEXT: Kind: FUNCTION
81 ; CHECK-NEXT: SigIndex: 1
82 ; CHECK-NEXT: - Type: FUNCTION
83 ; CHECK-NEXT: FunctionTypes: [ 2, 1, 1, 2 ]
84 ; CHECK-NEXT: - Type: MEMORY
85 ; CHECK-NEXT: Memories:
86 ; CHECK-NEXT: - Minimum: 0x1
87 ; CHECK-NEXT: - Type: ELEM
88 ; CHECK-NEXT: Segments:
89 ; CHECK-NEXT: - Offset:
90 ; CHECK-NEXT: Opcode: I32_CONST
91 ; CHECK-NEXT: Value: 1
92 ; CHECK-NEXT: Functions: [ 4, 1, 2 ]
93 ; SHARED-NEXT: - Type: DATACOUNT
94 ; SHARED-NEXT: Count: 6
95 ; CHECK-NEXT: - Type: CODE
96 ; CHECK-NEXT: Relocations:
97 ; CHECK-NEXT: - Type: R_WASM_MEMORY_ADDR_SLEB
98 ; CHECK-NEXT: Index: 1
99 ; CHECK-NEXT: Offset: 0x4
100 ; CHECK-NEXT: - Type: R_WASM_FUNCTION_INDEX_LEB
101 ; CHECK-NEXT: Index: 2
102 ; CHECK-NEXT: Offset: 0xA
103 ; CHECK-NEXT: - Type: R_WASM_FUNCTION_INDEX_LEB
104 ; CHECK-NEXT: Index: 4
105 ; CHECK-NEXT: Offset: 0x13
106 ; CHECK-NEXT: - Type: R_WASM_FUNCTION_INDEX_LEB
107 ; CHECK-NEXT: Index: 5
108 ; CHECK-NEXT: Offset: 0x1A
109 ; CHECK-NEXT: - Type: R_WASM_MEMORY_ADDR_SLEB
110 ; CHECK-NEXT: Index: 7
111 ; CHECK-NEXT: Offset: 0x26
112 ; CHECK-NEXT: Functions:
113 ; CHECK-NEXT: - Index: 3
114 ; CHECK-NEXT: Locals:
115 ; CHECK-NEXT: Body: 4180808080001080808080000B
116 ; CHECK-NEXT: - Index: 4
117 ; CHECK-NEXT: Locals:
118 ; CHECK-NEXT: Body: 1081808080001A1082808080001A41010B
119 ; CHECK-NEXT: - Index: 5
120 ; CHECK-NEXT: Locals:
121 ; CHECK-NEXT: Body: 4187808080000B
122 ; NORMAL-NEXT: - Type: DATA
123 ; NORMAL-NEXT: Relocations:
124 ; NORMAL-NEXT: - Type: R_WASM_TABLE_INDEX_I32
125 ; NORMAL-NEXT: Index: 3
126 ; NORMAL-NEXT: Offset: 0x1A
127 ; NORMAL-NEXT: - Type: R_WASM_TABLE_INDEX_I32
128 ; NORMAL-NEXT: Index: 4
129 ; NORMAL-NEXT: Offset: 0x23
130 ; NORMAL-NEXT: - Type: R_WASM_TABLE_INDEX_I32
131 ; NORMAL-NEXT: Index: 5
132 ; NORMAL-NEXT: Offset: 0x2C
133 ; NORMAL-NEXT: - Type: R_WASM_MEMORY_ADDR_I32
134 ; NORMAL-NEXT: Index: 12
135 ; NORMAL-NEXT: Offset: 0x35
136 ; NORMAL-NEXT: Segments:
137 ; NORMAL-NEXT: - SectionOffset: 6
138 ; NORMAL-NEXT: InitFlags: 0
139 ; NORMAL-NEXT: Offset:
140 ; NORMAL-NEXT: Opcode: I32_CONST
141 ; NORMAL-NEXT: Value: 0
142 ; NORMAL-NEXT: Content: 68656C6C6F0A00
143 ; NORMAL-NEXT: - SectionOffset: 18
144 ; NORMAL-NEXT: InitFlags: 0
145 ; NORMAL-NEXT: Offset:
146 ; NORMAL-NEXT: Opcode: I32_CONST
147 ; NORMAL-NEXT: Value: 7
148 ; NORMAL-NEXT: Content: '616263'
149 ; NORMAL-NEXT: - SectionOffset: 26
150 ; NORMAL-NEXT: InitFlags: 0
151 ; NORMAL-NEXT: Offset:
152 ; NORMAL-NEXT: Opcode: I32_CONST
153 ; NORMAL-NEXT: Value: 12
154 ; NORMAL-NEXT: Content: '01000000'
155 ; NORMAL-NEXT: - SectionOffset: 35
156 ; NORMAL-NEXT: InitFlags: 0
157 ; NORMAL-NEXT: Offset:
158 ; NORMAL-NEXT: Opcode: I32_CONST
159 ; NORMAL-NEXT: Value: 16
160 ; NORMAL-NEXT: Content: '02000000'
161 ; NORMAL-NEXT: - SectionOffset: 44
162 ; NORMAL-NEXT: InitFlags: 0
163 ; NORMAL-NEXT: Offset:
164 ; NORMAL-NEXT: Opcode: I32_CONST
165 ; NORMAL-NEXT: Value: 20
166 ; NORMAL-NEXT: Content: '03000000'
167 ; NORMAL-NEXT: - SectionOffset: 53
168 ; NORMAL-NEXT: InitFlags: 0
169 ; NORMAL-NEXT: Offset:
170 ; NORMAL-NEXT: Opcode: I32_CONST
171 ; NORMAL-NEXT: Value: 24
172 ; NORMAL-NEXT: Content: '00000000'
173 ; NORMAL-NEXT: - Type: CUSTOM
174 ; NORMAL-NEXT: Name: linking
175 ; NORMAL-NEXT: Version: 2
176 ; NORMAL-NEXT: SymbolTable:
177 ; NORMAL-NEXT: - Index: 0
178 ; NORMAL-NEXT: Kind: FUNCTION
179 ; NORMAL-NEXT: Name: hello
180 ; NORMAL-NEXT: Flags: [ VISIBILITY_HIDDEN ]
181 ; NORMAL-NEXT: Function: 3
182 ; NORMAL-NEXT: - Index: 1
183 ; NORMAL-NEXT: Kind: DATA
184 ; NORMAL-NEXT: Name: hello_str
185 ; NORMAL-NEXT: Flags: [ ]
186 ; NORMAL-NEXT: Segment: 0
187 ; NORMAL-NEXT: Size: 7
188 ; NORMAL-NEXT: - Index: 2
189 ; NORMAL-NEXT: Kind: FUNCTION
190 ; NORMAL-NEXT: Name: puts
191 ; NORMAL-NEXT: Flags: [ UNDEFINED ]
192 ; NORMAL-NEXT: Function: 0
193 ; NORMAL-NEXT: - Index: 3
194 ; NORMAL-NEXT: Kind: FUNCTION
195 ; NORMAL-NEXT: Name: my_func
196 ; NORMAL-NEXT: Flags: [ VISIBILITY_HIDDEN, NO_STRIP ]
197 ; NORMAL-NEXT: Function: 4
198 ; NORMAL-NEXT: - Index: 4
199 ; NORMAL-NEXT: Kind: FUNCTION
200 ; NORMAL-NEXT: Name: foo_import
201 ; NORMAL-NEXT: Flags: [ UNDEFINED ]
202 ; NORMAL-NEXT: Function: 1
203 ; NORMAL-NEXT: - Index: 5
204 ; NORMAL-NEXT: Kind: FUNCTION
205 ; NORMAL-NEXT: Name: bar_import
206 ; NORMAL-NEXT: Flags: [ BINDING_WEAK, UNDEFINED ]
207 ; NORMAL-NEXT: Function: 2
208 ; NORMAL-NEXT: - Index: 6
209 ; NORMAL-NEXT: Kind: FUNCTION
210 ; NORMAL-NEXT: Name: func_comdat
211 ; NORMAL-NEXT: Flags: [ BINDING_WEAK ]
212 ; NORMAL-NEXT: Function: 5
213 ; NORMAL-NEXT: - Index: 7
214 ; NORMAL-NEXT: Kind: DATA
215 ; NORMAL-NEXT: Name: data_comdat
216 ; NORMAL-NEXT: Flags: [ BINDING_WEAK ]
217 ; NORMAL-NEXT: Segment: 1
218 ; NORMAL-NEXT: Size: 3
219 ; NORMAL-NEXT: - Index: 8
220 ; NORMAL-NEXT: Kind: DATA
221 ; NORMAL-NEXT: Name: func_addr1
222 ; NORMAL-NEXT: Flags: [ VISIBILITY_HIDDEN ]
223 ; NORMAL-NEXT: Segment: 2
224 ; NORMAL-NEXT: Size: 4
225 ; NORMAL-NEXT: - Index: 9
226 ; NORMAL-NEXT: Kind: DATA
227 ; NORMAL-NEXT: Name: func_addr2
228 ; NORMAL-NEXT: Flags: [ VISIBILITY_HIDDEN ]
229 ; NORMAL-NEXT: Segment: 3
230 ; NORMAL-NEXT: Size: 4
231 ; NORMAL-NEXT: - Index: 10
232 ; NORMAL-NEXT: Kind: DATA
233 ; NORMAL-NEXT: Name: func_addr3
234 ; NORMAL-NEXT: Flags: [ VISIBILITY_HIDDEN ]
235 ; NORMAL-NEXT: Segment: 4
236 ; NORMAL-NEXT: Size: 4
237 ; NORMAL-NEXT: - Index: 11
238 ; NORMAL-NEXT: Kind: DATA
239 ; NORMAL-NEXT: Name: data_addr1
240 ; NORMAL-NEXT: Flags: [ VISIBILITY_HIDDEN ]
241 ; NORMAL-NEXT: Segment: 5
242 ; NORMAL-NEXT: Size: 4
243 ; NORMAL-NEXT: - Index: 12
244 ; NORMAL-NEXT: Kind: DATA
245 ; NORMAL-NEXT: Name: data_import
246 ; NORMAL-NEXT: Flags: [ UNDEFINED ]
247 ; NORMAL-NEXT: SegmentInfo:
248 ; NORMAL-NEXT: - Index: 0
249 ; NORMAL-NEXT: Name: .rodata.hello_str
250 ; NORMAL-NEXT: Alignment: 0
251 ; NORMAL-NEXT: Flags: [ ]
252 ; NORMAL-NEXT: - Index: 1
253 ; NORMAL-NEXT: Name: .rodata.data_comdat
254 ; NORMAL-NEXT: Alignment: 0
255 ; NORMAL-NEXT: Flags: [ ]
256 ; NORMAL-NEXT: - Index: 2
257 ; NORMAL-NEXT: Name: .data.func_addr1
258 ; NORMAL-NEXT: Alignment: 2
259 ; NORMAL-NEXT: Flags: [ ]
260 ; NORMAL-NEXT: - Index: 3
261 ; NORMAL-NEXT: Name: .data.func_addr2
262 ; NORMAL-NEXT: Alignment: 2
263 ; NORMAL-NEXT: Flags: [ ]
264 ; NORMAL-NEXT: - Index: 4
265 ; NORMAL-NEXT: Name: .data.func_addr3
266 ; NORMAL-NEXT: Alignment: 2
267 ; NORMAL-NEXT: Flags: [ ]
268 ; NORMAL-NEXT: - Index: 5
269 ; NORMAL-NEXT: Name: .data.data_addr1
270 ; NORMAL-NEXT: Alignment: 3
271 ; NORMAL-NEXT: Flags: [ ]
272 ; NORMAL-NEXT: Comdats:
273 ; NORMAL-NEXT: - Name: func_comdat
274 ; NORMAL-NEXT: Entries:
275 ; NORMAL-NEXT: - Kind: FUNCTION
276 ; NORMAL-NEXT: Index: 5
277 ; NORMAL-NEXT: - Kind: DATA
278 ; NORMAL-NEXT: Index: 1
279 ; NORMAL-NEXT: - Type: CUSTOM
280 ; NORMAL-NEXT: Name: name
281 ; NORMAL-NEXT: FunctionNames:
282 ; NORMAL-NEXT: - Index: 0
283 ; NORMAL-NEXT: Name: puts
284 ; NORMAL-NEXT: - Index: 1
285 ; NORMAL-NEXT: Name: foo_import
286 ; NORMAL-NEXT: - Index: 2
287 ; NORMAL-NEXT: Name: bar_import
288 ; NORMAL-NEXT: - Index: 3
289 ; NORMAL-NEXT: Name: hello
290 ; NORMAL-NEXT: - Index: 4
291 ; NORMAL-NEXT: Name: my_func
292 ; NORMAL-NEXT: - Index: 5
293 ; NORMAL-NEXT: Name: func_comdat