xref: /llvm-project/llvm/test/CodeGen/WebAssembly/add-prototypes.ll (revision deab451e7a7f2dff42097049274637052c87eabd)
1; RUN: opt -S -wasm-add-missing-prototypes %s | FileCheck %s
2
3target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
4target triple = "wasm32-unknown-unknown"
5
6; CHECK: @foo_addr = global ptr @foo, align 8
7@foo_addr = global ptr @foo, align 8
8
9; CHECK: @foo_addr_i8 = global ptr @foo, align 8
10@foo_addr_i8 = global ptr @foo, align 8
11
12; CHECK-LABEL: @call_foo
13; CHECK: %call = call i64 @foo(i32 42)
14define void @call_foo(i32 %a) {
15  %call = call i64 @foo(i32 42)
16  ret void
17}
18
19; CHECK-LABEL: @call_foo_ptr
20; CHECK-NEXT: %call = call i64 @foo(i32 43)
21define i64 @call_foo_ptr(i32 %a) {
22  %call = call i64 (i32) @foo(i32 43)
23  ret i64 %call
24}
25
26; CHECK-LABEL: @to_intptr_inst
27; CHECK-NEXT: ret ptr @foo
28define ptr @to_intptr_inst() {
29  ret ptr @foo
30}
31
32; CHECK-LABEL: @to_intptr_constexpr
33; CHECK: ret ptr @foo
34define ptr @to_intptr_constexpr() {
35  ret ptr @foo
36}
37
38; CHECK-LABEL: @null_compare
39; CHECK: %cmp = icmp eq ptr @foo, null
40; CHECK: br i1 %cmp, label %if.then, label %if.end
41define i8 @null_compare() {
42  %cmp = icmp eq ptr @foo, null
43  br i1 %cmp, label %if.then, label %if.end
44if.then:
45  ret i8 0
46if.end:
47  ret i8 1
48}
49
50; CHECK-LABEL: @as_paramater
51; CHECK: call void @func_param(ptr @foo)
52define void @as_paramater() {
53  call void @func_param(ptr @foo)
54  ret void
55}
56
57; Check if a sret parameter works in a no-prototype function.
58; CHECK-LABEL: @sret_param
59; CHECK: call void @make_struct_foo(ptr sret(%struct.foo) %foo)
60%struct.foo = type { i32, i32 }
61declare void @make_struct_foo(ptr sret(%struct.foo), ...) #1
62define void @sret_param() {
63  %foo = alloca %struct.foo, align 4
64  call void @make_struct_foo(ptr sret(%struct.foo) %foo)
65  ret void
66}
67
68declare void @func_param(ptr)
69
70; CHECK: declare void @func_not_called()
71declare void @func_not_called(...) #1
72
73; CHECK: declare extern_weak i64 @foo(i32)
74declare extern_weak i64 @foo(...) #1
75
76; CHECK-NOT: attributes {{.*}} = { {{.*}}"no-prototype"{{.*}} }
77attributes #1 = { "no-prototype" }
78