xref: /llvm-project/llvm/test/MC/WebAssembly/weak-alias.s (revision 9647a6f719ee4b1c23eea7aef368c1dcd5317949)
1# RUN: llvm-mc -triple=wasm32-unknown-unknown -filetype=obj < %s | obj2yaml | FileCheck --check-prefix=CHECK %s
2# RUN: llvm-mc -triple=wasm32-unknown-unknown -mattr=+reference-types -filetype=obj < %s | obj2yaml | FileCheck --check-prefix=REF %s
3
4# 'foo_alias()' is weak alias of function 'foo()'
5# 'bar_alias' is weak alias of global variable 'bar'
6# Generates two exports of the same function, one of them weak
7
8.functype foo_alias () -> (i32)
9
10foo:
11  .hidden foo
12  .globl  foo
13  .functype foo () -> (i32)
14  i32.const 0
15  end_function
16
17call_direct:
18  .hidden call_direct
19  .globl call_direct
20  .functype call_direct () -> (i32)
21  call foo
22  end_function
23
24call_alias:
25  .hidden call_alias
26  .globl call_alias
27  .functype call_alias () -> (i32)
28  call foo_alias
29  end_function
30
31call_direct_ptr:
32  .hidden call_direct_ptr
33  .globl call_direct_ptr
34  .functype call_direct_ptr () -> (i32)
35  i32.const 0
36  i32.load direct_address
37  call_indirect () -> (i32)
38  end_function
39
40call_alias_ptr:
41  .hidden call_alias_ptr
42  .globl call_alias_ptr
43  .functype call_alias_ptr () -> (i32)
44  i32.const 0
45  i32.load alias_address
46  call_indirect () -> (i32)
47  end_function
48
49.section .data.bar,"",@
50bar:
51  .int32   7
52  .size    bar, 4
53  .globl   bar
54  .p2align 3
55
56.section .data.direct_address,"",@
57direct_address:
58  .int32 foo
59  .size  direct_address, 4
60  .globl direct_address
61  .p2align 3
62
63.section .data.alias_address,"",@
64alias_address:
65  .int32 foo_alias
66  .size  alias_address, 4
67  .globl alias_address
68  .p2align 3
69
70# Define Aliases
71.set foo_alias, foo
72  .weak   foo_alias
73  .type   foo_alias,@function
74  .hidden foo_alias
75
76.set bar_alias, bar
77  .weak   bar_alias
78  .hidden bar_alias
79
80# CHECK:        - Type:            TYPE
81# CHECK-NEXT:     Signatures:
82# CHECK-NEXT:       - Index:           0
83# CHECK-NEXT:         ParamTypes:      []
84# CHECK-NEXT:         ReturnTypes:
85# CHECK-NEXT:           - I32
86# CHECK-NEXT:   - Type:            IMPORT
87# CHECK-NEXT:     Imports:
88# CHECK-NEXT:       - Module:          env
89# CHECK-NEXT:         Field:           __linear_memory
90# CHECK-NEXT:         Kind:            MEMORY
91# CHECK-NEXT:         Memory:
92# CHECK-NEXT:           Minimum:         0x1
93# CHECK-NEXT:       - Module:          env
94# CHECK-NEXT:         Field:           __indirect_function_table
95# CHECK-NEXT:         Kind:            TABLE
96# CHECK-NEXT:         Table:
97# CHECK-NEXT:           Index:           0
98# CHECK-NEXT:           ElemType:        FUNCREF
99# CHECK-NEXT:           Limits:
100# CHECK-NEXT:             Minimum:         0x1
101# CHECK-NEXT:   - Type:            FUNCTION
102# CHECK-NEXT:     FunctionTypes:   [ 0, 0, 0, 0, 0 ]
103# CHECK-NEXT:   - Type:            ELEM
104# CHECK-NEXT:     Segments:
105# CHECK-NEXT:       - Offset:
106# CHECK-NEXT:           Opcode:          I32_CONST
107# CHECK-NEXT:           Value:           1
108# CHECK-NEXT:         Functions:       [ 0 ]
109# CHECK-NEXT:   - Type:            DATACOUNT
110# CHECK-NEXT:     Count:           3
111# CHECK-NEXT:   - Type:            CODE
112# CHECK-NEXT:     Relocations:
113# CHECK-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
114# CHECK-NEXT:         Index:           0
115# CHECK-NEXT:         Offset:          0x9
116# CHECK-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
117# CHECK-NEXT:         Index:           3
118# CHECK-NEXT:         Offset:          0x12
119# CHECK-NEXT:       - Type:            R_WASM_MEMORY_ADDR_LEB
120# CHECK-NEXT:         Index:           5
121# CHECK-NEXT:         Offset:          0x1E
122# CHECK-NEXT:       - Type:            R_WASM_TYPE_INDEX_LEB
123# CHECK-NEXT:         Index:           0
124# CHECK-NEXT:         Offset:          0x24
125# CHECK-NEXT:       - Type:            R_WASM_MEMORY_ADDR_LEB
126# CHECK-NEXT:         Index:           7
127# CHECK-NEXT:         Offset:          0x31
128# CHECK-NEXT:       - Type:            R_WASM_TYPE_INDEX_LEB
129# CHECK-NEXT:         Index:           0
130# CHECK-NEXT:         Offset:          0x37
131# CHECK-NEXT:     Functions:
132# CHECK-NEXT:       - Index:           0
133# CHECK-NEXT:         Locals:          []
134# CHECK-NEXT:         Body:            41000B
135# CHECK-NEXT:       - Index:           1
136# CHECK-NEXT:         Locals:          []
137# CHECK-NEXT:         Body:            1080808080000B
138# CHECK-NEXT:       - Index:           2
139# CHECK-NEXT:         Locals:          []
140# CHECK-NEXT:         Body:            1080808080000B
141# CHECK-NEXT:       - Index:           3
142# CHECK-NEXT:         Locals:          []
143# CHECK-NEXT:         Body:            410028028880808000118080808000000B
144# CHECK-NEXT:       - Index:           4
145# CHECK-NEXT:         Locals:          []
146# CHECK-NEXT:         Body:            410028029080808000118080808000000B
147# CHECK-NEXT:   - Type:            DATA
148# CHECK-NEXT:     Relocations:
149# CHECK-NEXT:       - Type:            R_WASM_TABLE_INDEX_I32
150# CHECK-NEXT:         Index:           0
151# CHECK-NEXT:         Offset:          0x13
152# CHECK-NEXT:       - Type:            R_WASM_TABLE_INDEX_I32
153# CHECK-NEXT:         Index:           3
154# CHECK-NEXT:         Offset:          0x20
155# CHECK-NEXT:     Segments:
156# CHECK-NEXT:       - SectionOffset:   6
157# CHECK-NEXT:         InitFlags:       0
158# CHECK-NEXT:         Offset:
159# CHECK-NEXT:           Opcode:          I32_CONST
160# CHECK-NEXT:           Value:           0
161# CHECK-NEXT:         Content:         '0700000000000000'
162# CHECK-NEXT:       - SectionOffset:   19
163# CHECK-NEXT:         InitFlags:       0
164# CHECK-NEXT:         Offset:
165# CHECK-NEXT:           Opcode:          I32_CONST
166# CHECK-NEXT:           Value:           8
167# CHECK-NEXT:         Content:         '0100000000000000'
168# CHECK-NEXT:       - SectionOffset:   32
169# CHECK-NEXT:         InitFlags:       0
170# CHECK-NEXT:         Offset:
171# CHECK-NEXT:           Opcode:          I32_CONST
172# CHECK-NEXT:           Value:           16
173# CHECK-NEXT:         Content:         '0100000000000000'
174# CHECK-NEXT:   - Type:            CUSTOM
175# CHECK-NEXT:     Name:            linking
176# CHECK-NEXT:     Version:         2
177# CHECK-NEXT:     SymbolTable:
178# CHECK-NEXT:       - Index:           0
179# CHECK-NEXT:         Kind:            FUNCTION
180# CHECK-NEXT:         Name:            foo
181# CHECK-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
182# CHECK-NEXT:         Function:        0
183# CHECK-NEXT:       - Index:           1
184# CHECK-NEXT:         Kind:            FUNCTION
185# CHECK-NEXT:         Name:            call_direct
186# CHECK-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
187# CHECK-NEXT:         Function:        1
188# CHECK-NEXT:       - Index:           2
189# CHECK-NEXT:         Kind:            FUNCTION
190# CHECK-NEXT:         Name:            call_alias
191# CHECK-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
192# CHECK-NEXT:         Function:        2
193# CHECK-NEXT:       - Index:           3
194# CHECK-NEXT:         Kind:            FUNCTION
195# CHECK-NEXT:         Name:            foo_alias
196# CHECK-NEXT:         Flags:           [ BINDING_WEAK, VISIBILITY_HIDDEN, NO_STRIP ]
197# CHECK-NEXT:         Function:        0
198# CHECK-NEXT:       - Index:           4
199# CHECK-NEXT:         Kind:            FUNCTION
200# CHECK-NEXT:         Name:            call_direct_ptr
201# CHECK-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
202# CHECK-NEXT:         Function:        3
203# CHECK-NEXT:       - Index:           5
204# CHECK-NEXT:         Kind:            DATA
205# CHECK-NEXT:         Name:            direct_address
206# CHECK-NEXT:         Flags:           [  ]
207# CHECK-NEXT:         Segment:         1
208# CHECK-NEXT:         Size:            4
209# CHECK-NEXT:       - Index:           6
210# CHECK-NEXT:         Kind:            FUNCTION
211# CHECK-NEXT:         Name:            call_alias_ptr
212# CHECK-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
213# CHECK-NEXT:         Function:        4
214# CHECK-NEXT:       - Index:           7
215# CHECK-NEXT:         Kind:            DATA
216# CHECK-NEXT:         Name:            alias_address
217# CHECK-NEXT:         Flags:           [  ]
218# CHECK-NEXT:         Segment:         2
219# CHECK-NEXT:         Size:            4
220# CHECK-NEXT:       - Index:           8
221# CHECK-NEXT:         Kind:            DATA
222# CHECK-NEXT:         Name:            bar
223# CHECK-NEXT:         Flags:           [  ]
224# CHECK-NEXT:         Segment:         0
225# CHECK-NEXT:         Size:            4
226# CHECK-NEXT:       - Index:           9
227# CHECK-NEXT:         Kind:            DATA
228# CHECK-NEXT:         Name:            bar_alias
229# CHECK-NEXT:         Flags:           [ BINDING_WEAK, VISIBILITY_HIDDEN, NO_STRIP ]
230# CHECK-NEXT:         Segment:         0
231# CHECK-NEXT:         Size:            4
232# CHECK-NEXT:     SegmentInfo:
233# CHECK-NEXT:       - Index:           0
234# CHECK-NEXT:         Name:            .data.bar
235# CHECK-NEXT:         Alignment:       3
236# CHECK-NEXT:         Flags:           [  ]
237# CHECK-NEXT:       - Index:           1
238# CHECK-NEXT:         Name:            .data.direct_address
239# CHECK-NEXT:         Alignment:       3
240# CHECK-NEXT:         Flags:           [  ]
241# CHECK-NEXT:       - Index:           2
242# CHECK-NEXT:         Name:            .data.alias_address
243# CHECK-NEXT:         Alignment:       3
244# CHECK-NEXT:         Flags:           [  ]
245# CHECK-NEXT: ...
246
247# REF:        - Type:            TYPE
248# REF-NEXT:     Signatures:
249# REF-NEXT:       - Index:           0
250# REF-NEXT:         ParamTypes:      []
251# REF-NEXT:         ReturnTypes:
252# REF-NEXT:           - I32
253# REF-NEXT:   - Type:            IMPORT
254# REF-NEXT:     Imports:
255# REF-NEXT:       - Module:          env
256# REF-NEXT:         Field:           __linear_memory
257# REF-NEXT:         Kind:            MEMORY
258# REF-NEXT:         Memory:
259# REF-NEXT:           Minimum:         0x1
260# REF-NEXT:       - Module:          env
261# REF-NEXT:         Field:           __indirect_function_table
262# REF-NEXT:         Kind:            TABLE
263# REF-NEXT:         Table:
264# REF-NEXT:           Index:           0
265# REF-NEXT:           ElemType:        FUNCREF
266# REF-NEXT:           Limits:
267# REF-NEXT:             Minimum:         0x1
268# REF-NEXT:   - Type:            FUNCTION
269# REF-NEXT:     FunctionTypes:   [ 0, 0, 0, 0, 0 ]
270# REF-NEXT:   - Type:            ELEM
271# REF-NEXT:     Segments:
272# REF-NEXT:       - Offset:
273# REF-NEXT:           Opcode:          I32_CONST
274# REF-NEXT:           Value:           1
275# REF-NEXT:         Functions:       [ 0 ]
276# REF-NEXT:   - Type:            DATACOUNT
277# REF-NEXT:     Count:           3
278# REF-NEXT:   - Type:            CODE
279# REF-NEXT:     Relocations:
280# REF-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
281# REF-NEXT:         Index:           0
282# REF-NEXT:         Offset:          0x9
283# REF-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
284# REF-NEXT:         Index:           3
285# REF-NEXT:         Offset:          0x12
286# REF-NEXT:       - Type:            R_WASM_MEMORY_ADDR_LEB
287# REF-NEXT:         Index:           5
288# REF-NEXT:         Offset:          0x1E
289# REF-NEXT:       - Type:            R_WASM_TYPE_INDEX_LEB
290# REF-NEXT:         Index:           0
291# REF-NEXT:         Offset:          0x24
292# REF-NEXT:       - Type:            R_WASM_TABLE_NUMBER_LEB
293# REF-NEXT:         Index:           6
294# REF-NEXT:         Offset:          0x29
295# REF-NEXT:       - Type:            R_WASM_MEMORY_ADDR_LEB
296# REF-NEXT:         Index:           8
297# REF-NEXT:         Offset:          0x35
298# REF-NEXT:       - Type:            R_WASM_TYPE_INDEX_LEB
299# REF-NEXT:         Index:           0
300# REF-NEXT:         Offset:          0x3B
301# REF-NEXT:       - Type:            R_WASM_TABLE_NUMBER_LEB
302# REF-NEXT:         Index:           6
303# REF-NEXT:         Offset:          0x40
304# REF-NEXT:     Functions:
305# REF-NEXT:       - Index:           0
306# REF-NEXT:         Locals:          []
307# REF-NEXT:         Body:            41000B
308# REF-NEXT:       - Index:           1
309# REF-NEXT:         Locals:          []
310# REF-NEXT:         Body:            1080808080000B
311# REF-NEXT:       - Index:           2
312# REF-NEXT:         Locals:          []
313# REF-NEXT:         Body:            1080808080000B
314# REF-NEXT:       - Index:           3
315# REF-NEXT:         Locals:          []
316# REF-NEXT:         Body:            41002802888080800011808080800080808080000B
317# REF-NEXT:       - Index:           4
318# REF-NEXT:         Locals:          []
319# REF-NEXT:         Body:            41002802908080800011808080800080808080000B
320# REF-NEXT:   - Type:            DATA
321# REF-NEXT:     Relocations:
322# REF-NEXT:       - Type:            R_WASM_TABLE_INDEX_I32
323# REF-NEXT:         Index:           0
324# REF-NEXT:         Offset:          0x13
325# REF-NEXT:       - Type:            R_WASM_TABLE_INDEX_I32
326# REF-NEXT:         Index:           3
327# REF-NEXT:         Offset:          0x20
328# REF-NEXT:     Segments:
329# REF-NEXT:       - SectionOffset:   6
330# REF-NEXT:         InitFlags:       0
331# REF-NEXT:         Offset:
332# REF-NEXT:           Opcode:          I32_CONST
333# REF-NEXT:           Value:           0
334# REF-NEXT:         Content:         '0700000000000000'
335# REF-NEXT:       - SectionOffset:   19
336# REF-NEXT:         InitFlags:       0
337# REF-NEXT:         Offset:
338# REF-NEXT:           Opcode:          I32_CONST
339# REF-NEXT:           Value:           8
340# REF-NEXT:         Content:         '0100000000000000'
341# REF-NEXT:       - SectionOffset:   32
342# REF-NEXT:         InitFlags:       0
343# REF-NEXT:         Offset:
344# REF-NEXT:           Opcode:          I32_CONST
345# REF-NEXT:           Value:           16
346# REF-NEXT:         Content:         '0100000000000000'
347# REF-NEXT:   - Type:            CUSTOM
348# REF-NEXT:     Name:            linking
349# REF-NEXT:     Version:         2
350# REF-NEXT:     SymbolTable:
351# REF-NEXT:       - Index:           0
352# REF-NEXT:         Kind:            FUNCTION
353# REF-NEXT:         Name:            foo
354# REF-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
355# REF-NEXT:         Function:        0
356# REF-NEXT:       - Index:           1
357# REF-NEXT:         Kind:            FUNCTION
358# REF-NEXT:         Name:            call_direct
359# REF-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
360# REF-NEXT:         Function:        1
361# REF-NEXT:       - Index:           2
362# REF-NEXT:         Kind:            FUNCTION
363# REF-NEXT:         Name:            call_alias
364# REF-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
365# REF-NEXT:         Function:        2
366# REF-NEXT:       - Index:           3
367# REF-NEXT:         Kind:            FUNCTION
368# REF-NEXT:         Name:            foo_alias
369# REF-NEXT:         Flags:           [ BINDING_WEAK, VISIBILITY_HIDDEN, NO_STRIP ]
370# REF-NEXT:         Function:        0
371# REF-NEXT:       - Index:           4
372# REF-NEXT:         Kind:            FUNCTION
373# REF-NEXT:         Name:            call_direct_ptr
374# REF-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
375# REF-NEXT:         Function:        3
376# REF-NEXT:       - Index:           5
377# REF-NEXT:         Kind:            DATA
378# REF-NEXT:         Name:            direct_address
379# REF-NEXT:         Flags:           [  ]
380# REF-NEXT:         Segment:         1
381# REF-NEXT:         Size:            4
382# REF-NEXT:       - Index:           6
383# REF-NEXT:         Kind:            TABLE
384# REF-NEXT:         Name:            __indirect_function_table
385# REF-NEXT:         Flags:           [ UNDEFINED, NO_STRIP ]
386# REF-NEXT:         Table:           0
387# REF-NEXT:       - Index:           7
388# REF-NEXT:         Kind:            FUNCTION
389# REF-NEXT:         Name:            call_alias_ptr
390# REF-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
391# REF-NEXT:         Function:        4
392# REF-NEXT:       - Index:           8
393# REF-NEXT:         Kind:            DATA
394# REF-NEXT:         Name:            alias_address
395# REF-NEXT:         Flags:           [  ]
396# REF-NEXT:         Segment:         2
397# REF-NEXT:         Size:            4
398# REF-NEXT:       - Index:           9
399# REF-NEXT:         Kind:            DATA
400# REF-NEXT:         Name:            bar
401# REF-NEXT:         Flags:           [  ]
402# REF-NEXT:         Segment:         0
403# REF-NEXT:         Size:            4
404# REF-NEXT:       - Index:           10
405# REF-NEXT:         Kind:            DATA
406# REF-NEXT:         Name:            bar_alias
407# REF-NEXT:         Flags:           [ BINDING_WEAK, VISIBILITY_HIDDEN, NO_STRIP ]
408# REF-NEXT:         Segment:         0
409# REF-NEXT:         Size:            4
410# REF-NEXT:     SegmentInfo:
411# REF-NEXT:       - Index:           0
412# REF-NEXT:         Name:            .data.bar
413# REF-NEXT:         Alignment:       3
414# REF-NEXT:         Flags:           [  ]
415# REF-NEXT:       - Index:           1
416# REF-NEXT:         Name:            .data.direct_address
417# REF-NEXT:         Alignment:       3
418# REF-NEXT:         Flags:           [  ]
419# REF-NEXT:       - Index:           2
420# REF-NEXT:         Name:            .data.alias_address
421# REF-NEXT:         Alignment:       3
422# REF-NEXT:         Flags:           [  ]
423# REF-NEXT: ...
424
425# CHECK-SYMS: SYMBOL TABLE:
426# CHECK-SYMS-NEXT: 00000001 g     F CODE	.hidden foo
427# CHECK-SYMS-NEXT: 00000006 g     F CODE	.hidden call_direct
428# CHECK-SYMS-NEXT: 0000000f g     F CODE	.hidden call_alias
429# CHECK-SYMS-NEXT: 00000001 gw    F CODE	.hidden foo_alias
430# CHECK-SYMS-NEXT: 00000018 g     F CODE	.hidden call_direct_ptr
431# CHECK-SYMS-NEXT: 00000008 g     O DATA	direct_address
432# CHECK-SYMS-NEXT: 0000002b g     F CODE	.hidden call_alias_ptr
433# CHECK-SYMS-NEXT: 00000010 g     O DATA	alias_address
434# CHECK-SYMS-NEXT: 00000000 g     O DATA	bar
435# CHECK-SYMS-NEXT: 00000000 gw    O DATA	.hidden bar_alias
436