• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 -triple wasm32-unknown-unknown %s -emit-llvm -o - \
2 // RUN:   | FileCheck %s -check-prefix=WEBASSEMBLY32
3 // RUN: %clang_cc1 -triple wasm64-unknown-unknown %s -emit-llvm -o - \
4 // RUN:   | FileCheck %s -check-prefix=WEBASSEMBLY64
5 
6 // Basic argument/attribute tests for WebAssembly
7 
8 // WEBASSEMBLY32: define void @f0(i32 %i, i32 %j, i64 %k, double %l, fp128 %m)
9 // WEBASSEMBLY64: define void @f0(i32 %i, i64 %j, i64 %k, double %l, fp128 %m)
f0(int i,long j,long long k,double l,long double m)10 void f0(int i, long j, long long k, double l, long double m) {}
11 
12 typedef struct {
13   int aa;
14   int bb;
15 } s1;
16 // Structs should be passed byval and not split up.
17 // WEBASSEMBLY32: define void @f1(%struct.s1* byval align 4 %i)
18 // WEBASSEMBLY64: define void @f1(%struct.s1* byval align 4 %i)
f1(s1 i)19 void f1(s1 i) {}
20 
21 typedef struct {
22   int cc;
23 } s2;
24 // Single-element structs should be returned as the one element.
25 // WEBASSEMBLY32: define i32 @f2()
26 // WEBASSEMBLY64: define i32 @f2()
f2()27 s2 f2() {
28   s2 foo;
29   return foo;
30 }
31 
32 typedef struct {
33   int cc;
34   int dd;
35 } s3;
36 // Structs should be returned sret and not simplified by the frontend.
37 // WEBASSEMBLY32: define void @f3(%struct.s3* noalias sret %agg.result)
38 // WEBASSEMBLY64: define void @f3(%struct.s3* noalias sret %agg.result)
f3()39 s3 f3() {
40   s3 foo;
41   return foo;
42 }
43 
44 // WEBASSEMBLY32: define void @f4(i64 %i)
45 // WEBASSEMBLY64: define void @f4(i64 %i)
f4(long long i)46 void f4(long long i) {}
47 
48 // i8/i16 should be signext, i32 and higher should not.
49 // WEBASSEMBLY32: define void @f5(i8 signext %a, i16 signext %b)
50 // WEBASSEMBLY64: define void @f5(i8 signext %a, i16 signext %b)
f5(char a,short b)51 void f5(char a, short b) {}
52 
53 // WEBASSEMBLY32: define void @f6(i8 zeroext %a, i16 zeroext %b)
54 // WEBASSEMBLY64: define void @f6(i8 zeroext %a, i16 zeroext %b)
f6(unsigned char a,unsigned short b)55 void f6(unsigned char a, unsigned short b) {}
56 
57 
58 enum my_enum {
59   ENUM1,
60   ENUM2,
61   ENUM3,
62 };
63 // Enums should be treated as the underlying i32.
64 // WEBASSEMBLY32: define void @f7(i32 %a)
65 // WEBASSEMBLY64: define void @f7(i32 %a)
f7(enum my_enum a)66 void f7(enum my_enum a) {}
67 
68 enum my_big_enum {
69   ENUM4 = 0xFFFFFFFFFFFFFFFF,
70 };
71 // Big enums should be treated as the underlying i64.
72 // WEBASSEMBLY32: define void @f8(i64 %a)
73 // WEBASSEMBLY64: define void @f8(i64 %a)
f8(enum my_big_enum a)74 void f8(enum my_big_enum a) {}
75 
76 union simple_union {
77   int a;
78   char b;
79 };
80 // Unions should be passed as byval structs.
81 // WEBASSEMBLY32: define void @f9(%union.simple_union* byval align 4 %s)
82 // WEBASSEMBLY64: define void @f9(%union.simple_union* byval align 4 %s)
f9(union simple_union s)83 void f9(union simple_union s) {}
84 
85 typedef struct {
86   int b4 : 4;
87   int b3 : 3;
88   int b8 : 8;
89 } bitfield1;
90 // Bitfields should be passed as byval structs.
91 // WEBASSEMBLY32: define void @f10(%struct.bitfield1* byval align 4 %bf1)
92 // WEBASSEMBLY64: define void @f10(%struct.bitfield1* byval align 4 %bf1)
f10(bitfield1 bf1)93 void f10(bitfield1 bf1) {}
94