xref: /llvm-project/lld/test/wasm/weak-alias.ll (revision 8e44f037dc3ff86fb722037cb7832bb172b838eb)
1; RUN: llc -mcpu=mvp -filetype=obj -o %t.o %s
2; RUN: llc -mcpu=mvp -filetype=obj %S/Inputs/weak-alias.ll -o %t2.o
3; RUN: wasm-ld --export-dynamic %t.o %t2.o -o %t.wasm
4; RUN: obj2yaml %t.wasm | FileCheck %s
5
6; Test that weak aliases (alias_fn is a weak alias of direct_fn) are linked correctly
7
8target triple = "wasm32-unknown-unknown"
9
10declare i32 @alias_fn() local_unnamed_addr #1
11
12; Function Attrs: nounwind uwtable
13define void @_start() local_unnamed_addr #1 {
14entry:
15  %call = tail call i32 @alias_fn() #2
16  ret void
17}
18
19; CHECK:      --- !WASM
20; CHECK-NEXT: FileHeader:
21; CHECK-NEXT:   Version:         0x1
22; CHECK-NEXT: Sections:
23; CHECK-NEXT:   - Type:            TYPE
24; CHECK-NEXT:     Signatures:
25; CHECK-NEXT:       - Index:           0
26; CHECK-NEXT:         ParamTypes:
27; CHECK-NEXT:         ReturnTypes:     []
28; CHECK-NEXT:       - Index:           1
29; CHECK-NEXT:         ParamTypes:      []
30; CHECK-NEXT:         ReturnTypes:
31; CHECK-NEXT:           - I32
32; CHECK-NEXT:   - Type:            FUNCTION
33; CHECK-NEXT:     FunctionTypes:   [ 0, 1, 1, 1, 1, 1 ]
34; CHECK-NEXT:   - Type:            TABLE
35; CHECK-NEXT:     Tables:
36; CHECK-NEXT:       - Index:           0
37; CHECK-NEXT:         ElemType:        FUNCREF
38; CHECK-NEXT:         Limits:
39; CHECK-NEXT:           Flags:           [ HAS_MAX ]
40; CHECK-NEXT:           Minimum:         0x2
41; CHECK-NEXT:           Maximum:         0x2
42; CHECK-NEXT:   - Type:            MEMORY
43; CHECK-NEXT:     Memories:
44; CHECK-NEXT:       - Minimum:         0x2
45; CHECK-NEXT:   - Type:            GLOBAL
46; CHECK-NEXT:     Globals:
47; CHECK-NEXT:       - Index:           0
48; CHECK-NEXT:         Type:            I32
49; CHECK-NEXT:         Mutable:         true
50; CHECK-NEXT:         InitExpr:
51; CHECK-NEXT:           Opcode:          I32_CONST
52; CHECK-NEXT:           Value:           66560
53; CHECK-NEXT:   - Type:            EXPORT
54; CHECK-NEXT:     Exports:
55; CHECK-NEXT:       - Name:            memory
56; CHECK-NEXT:         Kind:            MEMORY
57; CHECK-NEXT:         Index:           0
58; CHECK-NEXT:       - Name:            _start
59; CHECK-NEXT:         Kind:            FUNCTION
60; CHECK-NEXT:         Index:           0
61; CHECK-NEXT:       - Name:            alias_fn
62; CHECK-NEXT:         Kind:            FUNCTION
63; CHECK-NEXT:         Index:           1
64; CHECK-NEXT:       - Name:            direct_fn
65; CHECK-NEXT:         Kind:            FUNCTION
66; CHECK-NEXT:         Index:           1
67; CHECK-NEXT:       - Name:            call_direct
68; CHECK-NEXT:         Kind:            FUNCTION
69; CHECK-NEXT:         Index:           2
70; CHECK-NEXT:       - Name:            call_alias
71; CHECK-NEXT:         Kind:            FUNCTION
72; CHECK-NEXT:         Index:           3
73; CHECK-NEXT:       - Name:            call_alias_ptr
74; CHECK-NEXT:         Kind:            FUNCTION
75; CHECK-NEXT:         Index:           4
76; CHECK-NEXT:       - Name:            call_direct_ptr
77; CHECK-NEXT:         Kind:            FUNCTION
78; CHECK-NEXT:         Index:           5
79; CHECK-NEXT:   - Type:            ELEM
80; CHECK-NEXT:     Segments:
81; CHECK-NEXT:       - Offset:
82; CHECK-NEXT:           Opcode:          I32_CONST
83; CHECK-NEXT:           Value:           1
84; CHECK-NEXT:         Functions:       [ 1 ]
85; CHECK-NEXT:   - Type:            CODE
86; CHECK-NEXT:     Functions:
87; CHECK-NEXT:       - Index:           0
88; CHECK-NEXT:         Locals:
89; CHECK-NEXT:         Body:            1081808080001A0B
90; CHECK-NEXT:       - Index:           1
91; CHECK-NEXT:         Locals:
92; CHECK-NEXT:         Body:            41000B
93; CHECK-NEXT:       - Index:           2
94; CHECK-NEXT:         Locals:
95; CHECK-NEXT:         Body:            1081808080000B
96; CHECK-NEXT:       - Index:           3
97; CHECK-NEXT:         Locals:
98; CHECK-NEXT:         Body:            1081808080000B
99; CHECK-NEXT:       - Index:           4
100; CHECK-NEXT:         Locals:
101; CHECK-NEXT:           - Type:            I32
102; CHECK-NEXT:             Count:           2
103; CHECK-NEXT:         Body:            23808080800041106B220024808080800020004181808080003602081081808080002101200041106A24808080800020010B
104; CHECK-NEXT:       - Index:           5
105; CHECK-NEXT:         Locals:
106; CHECK-NEXT:           - Type:            I32
107; CHECK-NEXT:             Count:           2
108; CHECK-NEXT:         Body:            23808080800041106B220024808080800020004181808080003602081081808080002101200041106A24808080800020010B
109; CHECK-NEXT:   - Type:            CUSTOM
110; CHECK-NEXT:     HeaderSecSizeEncodingLen: 2
111; CHECK-NEXT:     Name:            name
112; CHECK-NEXT:     FunctionNames:
113; CHECK-NEXT:       - Index:           0
114; CHECK-NEXT:         Name:            _start
115; CHECK-NEXT:       - Index:           1
116; CHECK-NEXT:         Name:            direct_fn
117; CHECK-NEXT:       - Index:           2
118; CHECK-NEXT:         Name:            call_direct
119; CHECK-NEXT:       - Index:           3
120; CHECK-NEXT:         Name:            call_alias
121; CHECK-NEXT:       - Index:           4
122; CHECK-NEXT:         Name:            call_alias_ptr
123; CHECK-NEXT:       - Index:           5
124; CHECK-NEXT:         Name:            call_direct_ptr
125; CHECK-NEXT:     GlobalNames:
126; CHECK-NEXT:       - Index:           0
127; CHECK-NEXT:         Name:            __stack_pointer
128; CHECK-NEXT: ...
129
130; RUN: wasm-ld --relocatable %t.o %t2.o -o %t.reloc.o
131; RUN: obj2yaml %t.reloc.o | FileCheck %s -check-prefix=RELOC
132
133; RELOC:      --- !WASM
134; RELOC-NEXT: FileHeader:
135; RELOC-NEXT:   Version:         0x1
136; RELOC-NEXT: Sections:
137; RELOC-NEXT:   - Type:            TYPE
138; RELOC-NEXT:     Signatures:
139; RELOC-NEXT:       - Index:           0
140; RELOC-NEXT:         ParamTypes:      []
141; RELOC-NEXT:         ReturnTypes:     []
142; RELOC-NEXT:       - Index:           1
143; RELOC-NEXT:         ParamTypes:      []
144; RELOC-NEXT:         ReturnTypes:
145; RELOC-NEXT:           - I32
146; RELOC-NEXT:   - Type:            IMPORT
147; RELOC-NEXT:     Imports:
148; RELOC-NEXT:       - Module:          env
149; RELOC-NEXT:         Field:           __indirect_function_table
150; RELOC-NEXT:         Kind:            TABLE
151; RELOC-NEXT:         Table:
152; RELOC-NEXT:           Index:           0
153; RELOC-NEXT:           ElemType:        FUNCREF
154; RELOC-NEXT:           Limits:
155; RELOC-NEXT:             Minimum:         0x2
156; RELOC-NEXT:       - Module:          env
157; RELOC-NEXT:         Field:           __stack_pointer
158; RELOC-NEXT:         Kind:            GLOBAL
159; RELOC-NEXT:         GlobalType:      I32
160; RELOC-NEXT:         GlobalMutable:   true
161; RELOC-NEXT:   - Type:            FUNCTION
162; RELOC-NEXT:     FunctionTypes:   [ 0, 1, 1, 1, 1, 1 ]
163; RELOC-NEXT:   - Type:            MEMORY
164; RELOC-NEXT:     Memories:
165; RELOC-NEXT:       - Minimum:         0x0
166; RELOC-NEXT:   - Type:            ELEM
167; RELOC-NEXT:     Segments:
168; RELOC-NEXT:       - Offset:
169; RELOC-NEXT:           Opcode:          I32_CONST
170; RELOC-NEXT:           Value:           1
171; RELOC-NEXT:         Functions:       [ 1 ]
172; RELOC-NEXT:   - Type:            CODE
173; RELOC-NEXT:     Relocations:
174; RELOC-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
175; RELOC-NEXT:         Index:           1
176; RELOC-NEXT:         Offset:          0x4
177; RELOC-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
178; RELOC-NEXT:         Index:           2
179; RELOC-NEXT:         Offset:          0x13
180; RELOC-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
181; RELOC-NEXT:         Index:           1
182; RELOC-NEXT:         Offset:          0x1C
183; RELOC-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
184; RELOC-NEXT:         Index:           6
185; RELOC-NEXT:         Offset:          0x27
186; RELOC-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
187; RELOC-NEXT:         Index:           6
188; RELOC-NEXT:         Offset:          0x32
189; RELOC-NEXT:       - Type:            R_WASM_TABLE_INDEX_SLEB
190; RELOC-NEXT:         Index:           1
191; RELOC-NEXT:         Offset:          0x3A
192; RELOC-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
193; RELOC-NEXT:         Index:           1
194; RELOC-NEXT:         Offset:          0x43
195; RELOC-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
196; RELOC-NEXT:         Index:           6
197; RELOC-NEXT:         Offset:          0x50
198; RELOC-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
199; RELOC-NEXT:         Index:           6
200; RELOC-NEXT:         Offset:          0x5D
201; RELOC-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
202; RELOC-NEXT:         Index:           6
203; RELOC-NEXT:         Offset:          0x68
204; RELOC-NEXT:       - Type:            R_WASM_TABLE_INDEX_SLEB
205; RELOC-NEXT:         Index:           2
206; RELOC-NEXT:         Offset:          0x70
207; RELOC-NEXT:       - Type:            R_WASM_FUNCTION_INDEX_LEB
208; RELOC-NEXT:         Index:           2
209; RELOC-NEXT:         Offset:          0x79
210; RELOC-NEXT:       - Type:            R_WASM_GLOBAL_INDEX_LEB
211; RELOC-NEXT:         Index:           6
212; RELOC-NEXT:         Offset:          0x86
213; RELOC-NEXT:     Functions:
214; RELOC-NEXT:       - Index:           0
215; RELOC-NEXT:         Locals:
216; RELOC-NEXT:         Body:            1081808080001A0B
217; RELOC-NEXT:       - Index:           1
218; RELOC-NEXT:         Locals:
219; RELOC-NEXT:         Body:            41000B
220; RELOC-NEXT:       - Index:           2
221; RELOC-NEXT:         Locals:
222; RELOC-NEXT:         Body:            1081808080000B
223; RELOC-NEXT:       - Index:           3
224; RELOC-NEXT:         Locals:
225; RELOC-NEXT:         Body:            1081808080000B
226; RELOC-NEXT:       - Index:           4
227; RELOC-NEXT:         Locals:
228; RELOC-NEXT:           - Type:            I32
229; RELOC-NEXT:             Count:           2
230; RELOC-NEXT:         Body:            23808080800041106B220024808080800020004181808080003602081081808080002101200041106A24808080800020010B
231; RELOC-NEXT:       - Index:           5
232; RELOC-NEXT:         Locals:
233; RELOC-NEXT:           - Type:            I32
234; RELOC-NEXT:             Count:           2
235; RELOC-NEXT:         Body:            23808080800041106B220024808080800020004181808080003602081081808080002101200041106A24808080800020010B
236; RELOC-NEXT:   - Type:            CUSTOM
237; RELOC-NEXT:     Name:            linking
238; RELOC-NEXT:     Version:         2
239; RELOC-NEXT:     SymbolTable:
240; RELOC-NEXT:       - Index:           0
241; RELOC-NEXT:         Kind:            FUNCTION
242; RELOC-NEXT:         Name:            _start
243; RELOC-NEXT:         Flags:           [  ]
244; RELOC-NEXT:         Function:        0
245; RELOC-NEXT:       - Index:           1
246; RELOC-NEXT:         Kind:            FUNCTION
247; RELOC-NEXT:         Name:            alias_fn
248; RELOC-NEXT:         Flags:           [ BINDING_WEAK ]
249; RELOC-NEXT:         Function:        1
250; RELOC-NEXT:       - Index:           2
251; RELOC-NEXT:         Kind:            FUNCTION
252; RELOC-NEXT:         Name:            direct_fn
253; RELOC-NEXT:         Flags:           [  ]
254; RELOC-NEXT:         Function:        1
255; RELOC-NEXT:       - Index:           3
256; RELOC-NEXT:         Kind:            FUNCTION
257; RELOC-NEXT:         Name:            call_direct
258; RELOC-NEXT:         Flags:           [  ]
259; RELOC-NEXT:         Function:        2
260; RELOC-NEXT:       - Index:           4
261; RELOC-NEXT:         Kind:            FUNCTION
262; RELOC-NEXT:         Name:            call_alias
263; RELOC-NEXT:         Flags:           [  ]
264; RELOC-NEXT:         Function:        3
265; RELOC-NEXT:       - Index:           5
266; RELOC-NEXT:         Kind:            FUNCTION
267; RELOC-NEXT:         Name:            call_alias_ptr
268; RELOC-NEXT:         Flags:           [  ]
269; RELOC-NEXT:         Function:        4
270; RELOC-NEXT:       - Index:           6
271; RELOC-NEXT:         Kind:            GLOBAL
272; RELOC-NEXT:         Name:            __stack_pointer
273; RELOC-NEXT:         Flags:           [ UNDEFINED ]
274; RELOC-NEXT:         Global:          0
275; RELOC-NEXT:       - Index:           7
276; RELOC-NEXT:         Kind:            FUNCTION
277; RELOC-NEXT:         Name:            call_direct_ptr
278; RELOC-NEXT:         Flags:           [  ]
279; RELOC-NEXT:         Function:        5
280; RELOC-NEXT:       - Index:           8
281; RELOC-NEXT:         Kind:            TABLE
282; RELOC-NEXT:         Name:            __indirect_function_table
283; RELOC-NEXT:         Flags:           [ UNDEFINED, NO_STRIP ]
284; RELOC-NEXT:         Table:           0
285; RELOC-NEXT:   - Type:            CUSTOM
286; RELOC-NEXT:     Name:            name
287; RELOC-NEXT:     FunctionNames:
288; RELOC-NEXT:       - Index:           0
289; RELOC-NEXT:         Name:            _start
290; RELOC-NEXT:       - Index:           1
291; RELOC-NEXT:         Name:            direct_fn
292; RELOC-NEXT:       - Index:           2
293; RELOC-NEXT:         Name:            call_direct
294; RELOC-NEXT:       - Index:           3
295; RELOC-NEXT:         Name:            call_alias
296; RELOC-NEXT:       - Index:           4
297; RELOC-NEXT:         Name:            call_alias_ptr
298; RELOC-NEXT:       - Index:           5
299; RELOC-NEXT:         Name:            call_direct_ptr
300; RELOC-NEXT:     GlobalNames:
301; RELOC-NEXT:       - Index:           0
302; RELOC-NEXT:         Name:            __stack_pointer
303; RELOC-NEXT: ...
304