Index: test/CodeGen/emscripten-arguments.c |
diff --git a/test/CodeGen/emscripten-arguments.c b/test/CodeGen/emscripten-arguments.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b90164bfb8b466e20654c30cc1c615416ba369d1 |
--- /dev/null |
+++ b/test/CodeGen/emscripten-arguments.c |
@@ -0,0 +1,79 @@ |
+// RUN: %clang_cc1 -triple asmjs-unknown-emscripten %s -emit-llvm -o - | FileCheck %s |
+ |
+// Basic argument/attribute tests for asmjs/Emscripten |
+ |
+// CHECK: define void @f0(i32 %i, i32 %j, i64 %k, double %l, double %m) |
+void f0(int i, long j, long long k, double l, long double m) {} |
+ |
+typedef struct { |
+ int aa; |
+ int bb; |
+} s1; |
+// Structs should be passed byval and not split up. |
+// CHECK: define void @f1(%struct.s1* byval align 4 %i) |
+void f1(s1 i) {} |
+ |
+typedef struct { |
+ int cc; |
+} s2; |
+// Single-element structs should be returned as the one element. |
+// CHECK: define i32 @f2() |
+s2 f2() { |
+ s2 foo; |
+ return foo; |
+} |
+ |
+typedef struct { |
+ int cc; |
+ int dd; |
+} s3; |
+// Structs should be returned sret and not simplified by the frontend. |
+// CHECK: define void @f3(%struct.s3* noalias sret %agg.result) |
+s3 f3() { |
+ s3 foo; |
+ return foo; |
+} |
+ |
+// CHECK: define void @f4(i64 %i) |
+void f4(long long i) {} |
+ |
+// i8/i16 should be signext, i32 and higher should not. |
+// CHECK: define void @f5(i8 signext %a, i16 signext %b) |
+void f5(char a, short b) {} |
+ |
+// CHECK: define void @f6(i8 zeroext %a, i16 zeroext %b) |
+void f6(unsigned char a, unsigned short b) {} |
+ |
+ |
+enum my_enum { |
+ ENUM1, |
+ ENUM2, |
+ ENUM3, |
+}; |
+// Enums should be treated as the underlying i32. |
+// CHECK: define void @f7(i32 %a) |
+void f7(enum my_enum a) {} |
+ |
+enum my_big_enum { |
+ ENUM4 = 0xFFFFFFFFFFFFFFFF, |
+}; |
+// Big enums should be treated as the underlying i64. |
+// CHECK: define void @f8(i64 %a) |
+void f8(enum my_big_enum a) {} |
+ |
+union simple_union { |
+ int a; |
+ char b; |
+}; |
+// Unions should be passed as byval structs. |
+// CHECK: define void @f9(%union.simple_union* byval align 4 %s) |
+void f9(union simple_union s) {} |
+ |
+typedef struct { |
+ int b4 : 4; |
+ int b3 : 3; |
+ int b8 : 8; |
+} bitfield1; |
+// Bitfields should be passed as byval structs. |
+// CHECK: define void @f10(%struct.bitfield1* byval align 4 %bf1) |
+void f10(bitfield1 bf1) {} |