76 lines · c
1// RUN: %clang_cc1 -triple lanai-unknown-unknown %s -emit-llvm -o - \2// RUN: | FileCheck %s3 4// Basic argument/attribute tests for Lanai.5 6// CHECK: define{{.*}} void @f0(i32 inreg noundef %i, i32 inreg noundef %j, i64 inreg noundef %k)7void f0(int i, long j, long long k) {}8 9typedef struct {10 int aa;11 int bb;12} s1;13// CHECK: define{{.*}} void @f1(i32 inreg %i.coerce0, i32 inreg %i.coerce1)14void f1(s1 i) {}15 16typedef struct {17 int cc;18} s2;19// CHECK: define{{.*}} void @f2(ptr dead_on_unwind noalias writable sret(%struct.s2) align 4 %agg.result)20s2 f2(void) {21 s2 foo;22 return foo;23}24 25typedef struct {26 int cc;27 int dd;28} s3;29// CHECK: define{{.*}} void @f3(ptr dead_on_unwind noalias writable sret(%struct.s3) align 4 %agg.result)30s3 f3(void) {31 s3 foo;32 return foo;33}34 35// CHECK: define{{.*}} void @f4(i64 inreg noundef %i)36void f4(long long i) {}37 38// CHECK: define{{.*}} void @f5(i8 inreg noundef %a, i16 inreg noundef %b)39void f5(char a, short b) {}40 41// CHECK: define{{.*}} void @f6(i8 inreg noundef %a, i16 inreg noundef %b)42void f6(unsigned char a, unsigned short b) {}43 44enum my_enum {45 ENUM1,46 ENUM2,47 ENUM3,48};49// Enums should be treated as the underlying i32.50// CHECK: define{{.*}} void @f7(i32 inreg noundef %a)51void f7(enum my_enum a) {}52 53enum my_big_enum {54 ENUM4 = 0xFFFFFFFFFFFFFFFF,55};56// Big enums should be treated as the underlying i64.57// CHECK: define{{.*}} void @f8(i64 inreg noundef %a)58void f8(enum my_big_enum a) {}59 60union simple_union {61 int a;62 char b;63};64// Unions should be passed inreg.65// CHECK: define{{.*}} void @f9(i32 inreg %s.coerce)66void f9(union simple_union s) {}67 68typedef struct {69 int b4 : 4;70 int b3 : 3;71 int b8 : 8;72} bitfield1;73// Bitfields should be passed inreg.74// CHECK: define{{.*}} void @f10(i32 inreg %bf1.coerce)75void f10(bitfield1 bf1) {}76