1 // REQUIRES: powerpc-registered-target
2 // RUN: %clang_cc1 -triple powerpc-unknown-freebsd \
3 // RUN:   -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-SVR4
4 // RUN: %clang_cc1 -triple powerpc-unknown-aix \
5 // RUN:   -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-AIX
6 // RUN: %clang_cc1 -triple powerpc64-unknown-aix \
7 // RUN:   -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-AIX
8 // RUN: %clang_cc1 -triple powerpc-unknown-linux \
9 // RUN:   -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-AIX
10 // RUN: %clang_cc1 -triple powerpc-unknown-linux -maix-struct-return \
11 // RUN:   -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-AIX
12 // RUN: %clang_cc1 -triple powerpc-unknown-linux -msvr4-struct-return \
13 // RUN:   -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-SVR4
14 // RUN: %clang_cc1 -triple powerpc-unknown-netbsd \
15 // RUN:   -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-SVR4
16 // RUN: %clang_cc1 -triple powerpc-unknown-openbsd \
17 // RUN:   -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-SVR4
18 // RUN: %clang_cc1 -triple powerpc-unknown-openbsd -maix-struct-return \
19 // RUN:   -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-AIX
20 // RUN: %clang_cc1 -triple powerpc-unknown-openbsd -msvr4-struct-return \
21 // RUN:   -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-SVR4
22 
23 typedef struct {
24 } Zero;
25 typedef struct {
26   char c;
27 } One;
28 typedef struct {
29   short s;
30 } Two;
31 typedef struct {
32   char c[3];
33 } Three;
34 typedef struct {
35   float f;
36 } Four; // svr4 to return i32, not float
37 typedef struct {
38   char c[5];
39 } Five;
40 typedef struct {
41   short s[3];
42 } Six;
43 typedef struct {
44   char c[7];
45 } Seven;
46 typedef struct {
47   int i;
48   char c;
49 } Eight; // padded for alignment
50 typedef struct {
51   char c[9];
52 } Nine;
53 
54 // CHECK-AIX-LABEL:  define void @ret0(%struct.Zero* noalias sret {{[^,]*}})
55 // CHECK-SVR4-LABEL: define void @ret0()
ret0(void)56 Zero ret0(void) { return (Zero){}; }
57 
58 // CHECK-AIX-LABEL:  define void @ret1(%struct.One* noalias sret {{[^,]*}})
59 // CHECK-SVR4-LABEL: define i8 @ret1()
ret1(void)60 One ret1(void) { return (One){'a'}; }
61 
62 // CHECK-AIX-LABEL:  define void @ret2(%struct.Two* noalias sret {{[^,]*}})
63 // CHECK-SVR4-LABEL: define i16 @ret2()
ret2(void)64 Two ret2(void) { return (Two){123}; }
65 
66 // CHECK-AIX-LABEL:  define void @ret3(%struct.Three* noalias sret {{[^,]*}})
67 // CHECK-SVR4-LABEL: define i24 @ret3()
ret3(void)68 Three ret3(void) { return (Three){"abc"}; }
69 
70 // CHECK-AIX-LABEL:  define void @ret4(%struct.Four* noalias sret {{[^,]*}})
71 // CHECK-SVR4-LABEL: define i32 @ret4()
ret4(void)72 Four ret4(void) { return (Four){0.4}; }
73 
74 // CHECK-AIX-LABEL:  define void @ret5(%struct.Five* noalias sret {{[^,]*}})
75 // CHECK-SVR4-LABEL: define i40 @ret5()
ret5(void)76 Five ret5(void) { return (Five){"abcde"}; }
77 
78 // CHECK-AIX-LABEL:  define void @ret6(%struct.Six* noalias sret {{[^,]*}})
79 // CHECK-SVR4-LABEL: define i48 @ret6()
ret6(void)80 Six ret6(void) { return (Six){12, 34, 56}; }
81 
82 // CHECK-AIX-LABEL:  define void @ret7(%struct.Seven* noalias sret {{[^,]*}})
83 // CHECK-SVR4-LABEL: define i56 @ret7()
ret7(void)84 Seven ret7(void) { return (Seven){"abcdefg"}; }
85 
86 // CHECK-AIX-LABEL:  define void @ret8(%struct.Eight* noalias sret {{[^,]*}})
87 // CHECK-SVR4-LABEL: define i64 @ret8()
ret8(void)88 Eight ret8(void) { return (Eight){123, 'a'}; }
89 
90 // CHECK-AIX-LABEL:  define void @ret9(%struct.Nine* noalias sret {{[^,]*}})
91 // CHECK-SVR4-LABEL: define void @ret9(%struct.Nine* noalias sret {{[^,]*}})
ret9(void)92 Nine ret9(void) { return (Nine){"abcdefghi"}; }
93