blob: 29630d0dda9f58166e6ccb4649c319b27987688d [file] [log] [blame]
Nicholas Wilson2e55ee72018-03-09 17:06:38 +00001; RUN: llc -filetype=obj %s -o %t.o
2; RUN: wasm-ld --check-signatures --no-entry %t.o -o %t.wasm
3; RUN: obj2yaml %t.wasm | FileCheck %s
4
5; Check that calling an undefined weak function generates an appropriate stub
6; that will fail at runtime with "unreachable".
7
8target triple = "wasm32-unknown-unknown-wasm"
9
10declare extern_weak void @weakFunc1()
11declare extern_weak void @weakFunc2() ; same signature
12declare extern_weak void @weakFunc3(i32 %arg) ; different
13declare extern_weak void @weakFunc4() ; should be GC'd as not called
14
15define i32 @callWeakFuncs() {
16 call void @weakFunc1()
17 call void @weakFunc2()
18 call void @weakFunc3(i32 2)
19 %addr1 = ptrtoint void ()* @weakFunc1 to i32
20 %addr4 = ptrtoint void ()* @weakFunc4 to i32
21 %sum = add i32 %addr1, %addr4
22 ret i32 %sum
23}
24
25; CHECK: --- !WASM
26; CHECK-NEXT: FileHeader:
27; CHECK-NEXT: Version: 0x00000001
28; CHECK-NEXT: Sections:
29; CHECK-NEXT: - Type: TYPE
30; CHECK-NEXT: Signatures:
31; CHECK-NEXT: - Index: 0
32; CHECK-NEXT: ReturnType: I32
33; CHECK-NEXT: ParamTypes:
34; CHECK-NEXT: - Index: 1
35; CHECK-NEXT: ReturnType: NORESULT
36; CHECK-NEXT: ParamTypes:
37; CHECK-NEXT: - Index: 2
38; CHECK-NEXT: ReturnType: NORESULT
39; CHECK-NEXT: ParamTypes:
40; CHECK-NEXT: - I32
41; CHECK-NEXT: - Type: FUNCTION
42; CHECK-NEXT: FunctionTypes: [ 0, 1, 1, 1, 2 ]
43; CHECK-NEXT: - Type: TABLE
44; CHECK-NEXT: Tables:
45; CHECK-NEXT: - ElemType: ANYFUNC
46; CHECK-NEXT: Limits:
47; CHECK-NEXT: Flags: [ HAS_MAX ]
48; CHECK-NEXT: Initial: 0x00000001
49; CHECK-NEXT: Maximum: 0x00000001
50; CHECK-NEXT: - Type: MEMORY
51; CHECK-NEXT: Memories:
52; CHECK-NEXT: - Initial: 0x00000002
53; CHECK-NEXT: - Type: GLOBAL
54; CHECK-NEXT: Globals:
55; CHECK-NEXT: - Index: 0
56; CHECK-NEXT: Type: I32
57; CHECK-NEXT: Mutable: true
58; CHECK-NEXT: InitExpr:
59; CHECK-NEXT: Opcode: I32_CONST
60; CHECK-NEXT: Value: 66560
61; CHECK-NEXT: - Index: 1
62; CHECK-NEXT: Type: I32
63; CHECK-NEXT: Mutable: false
64; CHECK-NEXT: InitExpr:
65; CHECK-NEXT: Opcode: I32_CONST
66; CHECK-NEXT: Value: 66560
67; CHECK-NEXT: - Index: 2
68; CHECK-NEXT: Type: I32
69; CHECK-NEXT: Mutable: false
70; CHECK-NEXT: InitExpr:
71; CHECK-NEXT: Opcode: I32_CONST
72; CHECK-NEXT: Value: 1024
73; CHECK-NEXT: - Type: EXPORT
74; CHECK-NEXT: Exports:
75; CHECK-NEXT: - Name: memory
76; CHECK-NEXT: Kind: MEMORY
77; CHECK-NEXT: Index: 0
78; CHECK-NEXT: - Name: __heap_base
79; CHECK-NEXT: Kind: GLOBAL
80; CHECK-NEXT: Index: 1
81; CHECK-NEXT: - Name: __data_end
82; CHECK-NEXT: Kind: GLOBAL
83; CHECK-NEXT: Index: 2
84; CHECK-NEXT: - Name: callWeakFuncs
85; CHECK-NEXT: Kind: FUNCTION
86; CHECK-NEXT: Index: 0
87; CHECK-NEXT: - Type: CODE
88; CHECK-NEXT: Functions:
89; CHECK-NEXT: - Index: 0
90; CHECK-NEXT: Locals:
91; CHECK-NEXT: Body: 10828080800010838080800041021084808080004180808080004180808080006A0B
92; CHECK-NEXT: - Index: 1
93; CHECK-NEXT: Locals:
94; CHECK-NEXT: Body: 0B
95; CHECK-NEXT: - Index: 2
96; CHECK-NEXT: Locals:
97; CHECK-NEXT: Body: 000B
98; CHECK-NEXT: - Index: 3
99; CHECK-NEXT: Locals:
100; CHECK-NEXT: Body: 000B
101; CHECK-NEXT: - Index: 4
102; CHECK-NEXT: Locals:
103; CHECK-NEXT: Body: 000B
104; CHECK-NEXT: - Type: CUSTOM
105; CHECK-NEXT: Name: name
106; CHECK-NEXT: FunctionNames:
107; CHECK-NEXT: - Index: 0
108; CHECK-NEXT: Name: callWeakFuncs
109; CHECK-NEXT: - Index: 1
110; CHECK-NEXT: Name: __wasm_call_ctors
111; CHECK-NEXT: - Index: 2
112; CHECK-NEXT: Name: undefined function weakFunc1
113; CHECK-NEXT: - Index: 3
114; CHECK-NEXT: Name: undefined function weakFunc2
115; CHECK-NEXT: - Index: 4
116; CHECK-NEXT: Name: undefined function weakFunc3
117; CHECK-NEXT: ...