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