1# RUN: llvm-mc -triple=wasm32-unknown-unknown -filetype=obj -o %t.o < %s
2# RUN: obj2yaml %t.o | FileCheck %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
8foo:
9  .hidden foo
10  .globl  foo
11  .functype foo () -> (i32)
12  i32.const 0
13  end_function
14
15call_direct:
16  .hidden call_direct
17  .globl call_direct
18  .functype call_direct () -> (i32)
19  call foo
20  end_function
21
22call_alias:
23  .hidden call_alias
24  .globl call_alias
25  .functype call_alias () -> (i32)
26  call foo_alias
27  end_function
28
29call_direct_ptr:
30  .hidden call_direct_ptr
31  .globl call_direct_ptr
32  .functype call_direct_ptr () -> (i32)
33  i32.const 0
34  i32.load direct_address
35  call_indirect () -> (i32)
36  end_function
37
38call_alias_ptr:
39  .hidden call_alias_ptr
40  .globl call_alias_ptr
41  .functype call_alias_ptr () -> (i32)
42  i32.const 0
43  i32.load alias_address
44  call_indirect () -> (i32)
45  end_function
46
47.section .data.bar,"",@
48bar:
49  .int32   7
50  .size    bar, 4
51  .globl   bar
52  .p2align 3
53
54.section .data.direct_address,"",@
55direct_address:
56  .int32 foo
57  .size  direct_address, 4
58  .globl direct_address
59  .p2align 3
60
61.section .data.alias_address,"",@
62alias_address:
63  .int32 foo_alias
64  .size  alias_address, 4
65  .globl alias_address
66  .p2align 3
67
68# Define Aliases
69.set foo_alias, foo
70  .weak   foo_alias
71  .type   foo_alias,@function
72  .hidden foo_alias
73
74.set bar_alias, bar
75  .weak   bar_alias
76  .hidden bar_alias
77
78# CHECK:        - Type:            TYPE
79# CHECK-NEXT:     Signatures:
80# CHECK-NEXT:       - Index:           0
81# CHECK-NEXT:         ParamTypes:
82# CHECK-NEXT:         ReturnTypes:
83# CHECK-NEXT:           - I32
84# CHECK-NEXT:   - Type:            IMPORT
85# CHECK-NEXT:     Imports:
86# CHECK-NEXT:       - Module:          env
87# CHECK-NEXT:         Field:           __linear_memory
88# CHECK-NEXT:         Kind:            MEMORY
89# CHECK-NEXT:         Memory:
90# CHECK-NEXT:           Initial:         0x1
91# CHECK-NEXT:       - Module:          env
92# CHECK-NEXT:         Field:           __indirect_function_table
93# CHECK-NEXT:         Kind:            TABLE
94# CHECK-NEXT:         Table:
95# CHECK-NEXT:           Index:           0
96# CHECK-NEXT:           ElemType:        FUNCREF
97# CHECK-NEXT:           Limits:
98# CHECK-NEXT:             Initial:         0x1
99# CHECK-NEXT:   - Type:            FUNCTION
100# CHECK-NEXT:     FunctionTypes:   [ 0, 0, 0, 0, 0 ]
101# CHECK-NEXT:   - Type:            ELEM
102# CHECK-NEXT:     Segments:
103# CHECK-NEXT:       - Offset:
104# CHECK-NEXT:           Opcode:          I32_CONST
105# CHECK-NEXT:           Value:           1
106# CHECK-NEXT:         Functions:       [ 0 ]
107# CHECK-NEXT:   - Type:            DATACOUNT
108# CHECK-NEXT:     Count:           3
109# CHECK-NEXT:   - Type:            CODE
110# CHECK-NEXT:     Relocations:
111# CHECK-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
112# CHECK-NEXT:         Index:           0
113# CHECK-NEXT:         Offset:          0x9
114# CHECK-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
115# CHECK-NEXT:         Index:           3
116# CHECK-NEXT:         Offset:          0x12
117# CHECK-NEXT:       - Type:            R_WASM_MEMORY_ADDR_LEB
118# CHECK-NEXT:         Index:           5
119# CHECK-NEXT:         Offset:          0x1E
120# CHECK-NEXT:       - Type:            R_WASM_TYPE_INDEX_LEB
121# CHECK-NEXT:         Index:           0
122# CHECK-NEXT:         Offset:          0x24
123# CHECK-NEXT:       - Type:            R_WASM_MEMORY_ADDR_LEB
124# CHECK-NEXT:         Index:           7
125# CHECK-NEXT:         Offset:          0x31
126# CHECK-NEXT:       - Type:            R_WASM_TYPE_INDEX_LEB
127# CHECK-NEXT:         Index:           0
128# CHECK-NEXT:         Offset:          0x37
129# CHECK-NEXT:     Functions:
130# CHECK-NEXT:       - Index:           0
131# CHECK-NEXT:         Locals:
132# CHECK-NEXT:         Body:            41000B
133# CHECK-NEXT:       - Index:           1
134# CHECK-NEXT:         Locals:
135# CHECK-NEXT:         Body:            1080808080000B
136# CHECK-NEXT:       - Index:           2
137# CHECK-NEXT:         Locals:
138# CHECK-NEXT:         Body:            1080808080000B
139# CHECK-NEXT:       - Index:           3
140# CHECK-NEXT:         Locals:
141# CHECK-NEXT:         Body:            410028028880808000118080808000000B
142# CHECK-NEXT:       - Index:           4
143# CHECK-NEXT:         Locals:
144# CHECK-NEXT:         Body:            410028029080808000118080808000000B
145# CHECK-NEXT:   - Type:            DATA
146# CHECK-NEXT:     Relocations:
147# CHECK-NEXT:       - Type:            R_WASM_TABLE_INDEX_I32
148# CHECK-NEXT:         Index:           0
149# CHECK-NEXT:         Offset:          0x13
150# CHECK-NEXT:       - Type:            R_WASM_TABLE_INDEX_I32
151# CHECK-NEXT:         Index:           3
152# CHECK-NEXT:         Offset:          0x20
153# CHECK-NEXT:     Segments:
154# CHECK-NEXT:       - SectionOffset:   6
155# CHECK-NEXT:         InitFlags:       0
156# CHECK-NEXT:         Offset:
157# CHECK-NEXT:           Opcode:          I32_CONST
158# CHECK-NEXT:           Value:           0
159# CHECK-NEXT:         Content:         '0700000000000000'
160# CHECK-NEXT:       - SectionOffset:   19
161# CHECK-NEXT:         InitFlags:       0
162# CHECK-NEXT:         Offset:
163# CHECK-NEXT:           Opcode:          I32_CONST
164# CHECK-NEXT:           Value:           8
165# CHECK-NEXT:         Content:         '0100000000000000'
166# CHECK-NEXT:       - SectionOffset:   32
167# CHECK-NEXT:         InitFlags:       0
168# CHECK-NEXT:         Offset:
169# CHECK-NEXT:           Opcode:          I32_CONST
170# CHECK-NEXT:           Value:           16
171# CHECK-NEXT:         Content:         '0100000000000000'
172# CHECK-NEXT:   - Type:            CUSTOM
173# CHECK-NEXT:     Name:            linking
174# CHECK-NEXT:     Version:         2
175# CHECK-NEXT:     SymbolTable:
176# CHECK-NEXT:       - Index:           0
177# CHECK-NEXT:         Kind:            FUNCTION
178# CHECK-NEXT:         Name:            foo
179# CHECK-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
180# CHECK-NEXT:         Function:        0
181# CHECK-NEXT:       - Index:           1
182# CHECK-NEXT:         Kind:            FUNCTION
183# CHECK-NEXT:         Name:            call_direct
184# CHECK-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
185# CHECK-NEXT:         Function:        1
186# CHECK-NEXT:       - Index:           2
187# CHECK-NEXT:         Kind:            FUNCTION
188# CHECK-NEXT:         Name:            call_alias
189# CHECK-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
190# CHECK-NEXT:         Function:        2
191# CHECK-NEXT:       - Index:           3
192# CHECK-NEXT:         Kind:            FUNCTION
193# CHECK-NEXT:         Name:            foo_alias
194# CHECK-NEXT:         Flags:           [ BINDING_WEAK, VISIBILITY_HIDDEN, NO_STRIP ]
195# CHECK-NEXT:         Function:        0
196# CHECK-NEXT:       - Index:           4
197# CHECK-NEXT:         Kind:            FUNCTION
198# CHECK-NEXT:         Name:            call_direct_ptr
199# CHECK-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
200# CHECK-NEXT:         Function:        3
201# CHECK-NEXT:       - Index:           5
202# CHECK-NEXT:         Kind:            DATA
203# CHECK-NEXT:         Name:            direct_address
204# CHECK-NEXT:         Flags:           [  ]
205# CHECK-NEXT:         Segment:         1
206# CHECK-NEXT:         Size:            4
207# CHECK-NEXT:       - Index:           6
208# CHECK-NEXT:         Kind:            FUNCTION
209# CHECK-NEXT:         Name:            call_alias_ptr
210# CHECK-NEXT:         Flags:           [ VISIBILITY_HIDDEN ]
211# CHECK-NEXT:         Function:        4
212# CHECK-NEXT:       - Index:           7
213# CHECK-NEXT:         Kind:            DATA
214# CHECK-NEXT:         Name:            alias_address
215# CHECK-NEXT:         Flags:           [  ]
216# CHECK-NEXT:         Segment:         2
217# CHECK-NEXT:         Size:            4
218# CHECK-NEXT:       - Index:           8
219# CHECK-NEXT:         Kind:            DATA
220# CHECK-NEXT:         Name:            bar
221# CHECK-NEXT:         Flags:           [  ]
222# CHECK-NEXT:         Segment:         0
223# CHECK-NEXT:         Size:            4
224# CHECK-NEXT:       - Index:           9
225# CHECK-NEXT:         Kind:            DATA
226# CHECK-NEXT:         Name:            bar_alias
227# CHECK-NEXT:         Flags:           [ BINDING_WEAK, VISIBILITY_HIDDEN, NO_STRIP ]
228# CHECK-NEXT:         Segment:         0
229# CHECK-NEXT:         Size:            4
230# CHECK-NEXT:     SegmentInfo:
231# CHECK-NEXT:       - Index:           0
232# CHECK-NEXT:         Name:            .data.bar
233# CHECK-NEXT:         Alignment:       3
234# CHECK-NEXT:         Flags:           [ ]
235# CHECK-NEXT:       - Index:           1
236# CHECK-NEXT:         Name:            .data.direct_address
237# CHECK-NEXT:         Alignment:       3
238# CHECK-NEXT:         Flags:           [ ]
239# CHECK-NEXT:       - Index:           2
240# CHECK-NEXT:         Name:            .data.alias_address
241# CHECK-NEXT:         Alignment:       3
242# CHECK-NEXT:         Flags:           [ ]
243# CHECK-NEXT: ...
244
245# CHECK-SYMS: SYMBOL TABLE:
246# CHECK-SYMS-NEXT: 00000001 g     F CODE	.hidden foo
247# CHECK-SYMS-NEXT: 00000006 g     F CODE	.hidden call_direct
248# CHECK-SYMS-NEXT: 0000000f g     F CODE	.hidden call_alias
249# CHECK-SYMS-NEXT: 00000001 gw    F CODE	.hidden foo_alias
250# CHECK-SYMS-NEXT: 00000018 g     F CODE	.hidden call_direct_ptr
251# CHECK-SYMS-NEXT: 00000008 g     O DATA	direct_address
252# CHECK-SYMS-NEXT: 0000002b g     F CODE	.hidden call_alias_ptr
253# CHECK-SYMS-NEXT: 00000010 g     O DATA	alias_address
254# CHECK-SYMS-NEXT: 00000000 g     O DATA	bar
255# CHECK-SYMS-NEXT: 00000000 gw    O DATA	.hidden bar_alias
256