xref: /llvm-project/lld/test/wasm/call-indirect.s (revision 70aa11187e5c7ecca327356569dbb2e56f06cbe0)
1# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
2# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/call-indirect.s -o %t2.o
3# RUN: wasm-ld --export-dynamic -o %t.wasm %t2.o %t.o
4# RUN: obj2yaml %t.wasm | FileCheck %s
5
6.globl foo
7foo:
8  .functype foo () -> (i32)
9  i32.const 2
10  end_function
11
12.globl  _start
13_start:
14  .functype _start () -> ()
15  i32.const 0
16  i32.load indirect_func
17  call_indirect () -> (i32)
18  drop
19  end_function
20
21# Indirect function call where no function actually has this type.
22# Ensures that the type entry is still created in this case.
23.section .text,"",@
24.globl call_ptr
25call_ptr:
26  .functype call_ptr (i32) -> ()
27  i64.const 1
28  local.get 0
29  call_indirect (i64) -> (i64)
30  drop
31  end_function
32
33.globl indirect_func
34.section .data.indirect_func,"",@
35indirect_func:
36 .int32 foo
37 .size indirect_func, 4
38
39# CHECK:      !WASM
40# CHECK-NEXT: FileHeader:
41# CHECK-NEXT:   Version:         0x1
42# CHECK-NEXT: Sections:
43# CHECK-NEXT:   - Type:            TYPE
44# CHECK-NEXT:     Signatures:
45# CHECK-NEXT:       - Index:           0
46# CHECK-NEXT:         ParamTypes:
47# CHECK-NEXT:         ReturnTypes:
48# CHECK-NEXT:           - I64
49# CHECK-NEXT:       - Index:           1
50# CHECK-NEXT:         ParamTypes:
51# CHECK-NEXT:         ReturnTypes:
52# CHECK-NEXT:           - I32
53# CHECK-NEXT:       - Index:           2
54# CHECK-NEXT:         ParamTypes:
55# CHECK-NEXT:           - I64
56# CHECK-NEXT:         ReturnTypes:
57# CHECK-NEXT:           - I64
58# CHECK-NEXT:       - Index:           3
59# CHECK-NEXT:         ParamTypes:
60# CHECK-NEXT:         ReturnTypes:     []
61# CHECK-NEXT:       - Index:           4
62# CHECK-NEXT:         ParamTypes:
63# CHECK-NEXT:           - I32
64# CHECK-NEXT:         ReturnTypes:     []
65# CHECK-NEXT:   - Type:            FUNCTION
66# CHECK-NEXT:     FunctionTypes:   [ 0, 3, 1, 3, 4 ]
67# CHECK-NEXT:   - Type:            TABLE
68# CHECK-NEXT:     Tables:
69# CHECK-NEXT:       - Index:           0
70# CHECK-NEXT:         ElemType:        FUNCREF
71# CHECK-NEXT:         Limits:
72# CHECK-NEXT:           Flags:           [ HAS_MAX ]
73# CHECK-NEXT:           Minimum:         0x3
74# CHECK-NEXT:           Maximum:         0x3
75# CHECK-NEXT:   - Type:            MEMORY
76# CHECK-NEXT:     Memories:
77# CHECK-NEXT:       - Minimum:         0x2
78# CHECK-NEXT:   - Type:            GLOBAL
79# CHECK-NEXT:     Globals:
80# CHECK-NEXT:       - Index:           0
81# CHECK-NEXT:         Type:            I32
82# CHECK-NEXT:         Mutable:         true
83# CHECK-NEXT:         InitExpr:
84# CHECK-NEXT:           Opcode:          I32_CONST
85# CHECK-NEXT:           Value:           66576
86# CHECK-NEXT:       - Index:           1
87# CHECK-NEXT:         Type:            I32
88# CHECK-NEXT:         Mutable:         false
89# CHECK-NEXT:         InitExpr:
90# CHECK-NEXT:           Opcode:          I32_CONST
91# CHECK-NEXT:           Value:           1032
92# CHECK-NEXT:   - Type:            EXPORT
93# CHECK-NEXT:     Exports:
94# CHECK-NEXT:       - Name:            memory
95# CHECK-NEXT:         Kind:            MEMORY
96# CHECK-NEXT:         Index:           0
97# CHECK-NEXT:       - Name:            bar
98# CHECK-NEXT:         Kind:            FUNCTION
99# CHECK-NEXT:         Index:           0
100# CHECK-NEXT:       - Name:            call_bar_indirect
101# CHECK-NEXT:         Kind:            FUNCTION
102# CHECK-NEXT:         Index:           1
103# CHECK-NEXT:       - Name:            foo
104# CHECK-NEXT:         Kind:            FUNCTION
105# CHECK-NEXT:         Index:           2
106# CHECK-NEXT:       - Name:            _start
107# CHECK-NEXT:         Kind:            FUNCTION
108# CHECK-NEXT:         Index:           3
109# CHECK-NEXT:       - Name:            indirect_func
110# CHECK-NEXT:         Kind:            GLOBAL
111# CHECK-NEXT:         Index:           1
112# CHECK-NEXT:       - Name:            call_ptr
113# CHECK-NEXT:         Kind:            FUNCTION
114# CHECK-NEXT:         Index:           4
115# CHECK-NEXT:   - Type:            ELEM
116# CHECK-NEXT:     Segments:
117# CHECK-NEXT:       - Offset:
118# CHECK-NEXT:           Opcode:          I32_CONST
119# CHECK-NEXT:           Value:           1
120# CHECK-NEXT:         Functions:       [ 0, 2 ]
121# CHECK-NEXT:   - Type:            CODE
122# CHECK-NEXT:     Functions:
123# CHECK-NEXT:       - Index:           0
124# CHECK-NEXT:         Locals:
125# CHECK-NEXT:         Body:            42010B
126# CHECK-NEXT:       - Index:           1
127# CHECK-NEXT:         Locals:
128# CHECK-NEXT:         Body:            410028028088808000118080808000001A410028028488808000118180808000001A0B
129# CHECK-NEXT:       - Index:           2
130# CHECK-NEXT:         Locals:
131# CHECK-NEXT:         Body:            41020B
132# CHECK-NEXT:       - Index:           3
133# CHECK-NEXT:         Locals:
134# CHECK-NEXT:         Body:            410028028888808000118180808000001A0B
135# CHECK-NEXT:       - Index:           4
136# CHECK-NEXT:         Locals:
137# CHECK-NEXT:         Body:            42012000118280808000001A0B
138# CHECK-NEXT:   - Type:            DATA
139# CHECK-NEXT:     Segments:
140# CHECK-NEXT:       - SectionOffset:    7
141# CHECK-NEXT:         InitFlags:        0
142# CHECK-NEXT:         Offset:
143# CHECK-NEXT:           Opcode:          I32_CONST
144# CHECK-NEXT:           Value:           1024
145# CHECK-NEXT:         Content:         '010000000200000002000000'
146# CHECK-NEXT:   - Type:            CUSTOM
147# CHECK-NEXT:     Name:            name
148# CHECK-NEXT:     FunctionNames:
149# CHECK-NEXT:       - Index:           0
150# CHECK-NEXT:         Name:            bar
151# CHECK-NEXT:       - Index:           1
152# CHECK-NEXT:         Name:            call_bar_indirect
153# CHECK-NEXT:       - Index:           2
154# CHECK-NEXT:         Name:            foo
155# CHECK-NEXT:       - Index:           3
156# CHECK-NEXT:         Name:            _start
157# CHECK-NEXT:       - Index:           4
158# CHECK-NEXT:         Name:            call_ptr
159# CHECK-NEXT:     GlobalNames:
160# CHECK-NEXT:       - Index:           0
161# CHECK-NEXT:         Name:            __stack_pointer
162# CHECK-NEXT:     DataSegmentNames:
163# CHECK-NEXT:       - Index:           0
164# CHECK-NEXT:         Name:            .data
165# CHECK-NEXT: ...
166