xref: /aosp_15_r20/external/clang/test/CodeGenCXX/x86_32-arguments.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple i386-apple-darwin9 -emit-llvm -o - %s | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li // Non-trivial dtors, should both be passed indirectly.
4*67e74705SXin Li struct S {
5*67e74705SXin Li   ~S();
6*67e74705SXin Li   short s;
7*67e74705SXin Li };
8*67e74705SXin Li 
9*67e74705SXin Li // CHECK-LABEL: define void @_Z1fv(%struct.S* noalias sret %
f()10*67e74705SXin Li S f() { return S(); }
11*67e74705SXin Li // CHECK-LABEL: define void @_Z1f1S(%struct.S*)
f(S)12*67e74705SXin Li void f(S) { }
13*67e74705SXin Li 
14*67e74705SXin Li // Non-trivial dtors, should both be passed indirectly.
15*67e74705SXin Li class C {
16*67e74705SXin Li public:
17*67e74705SXin Li   ~C();
18*67e74705SXin Li   double c;
19*67e74705SXin Li };
20*67e74705SXin Li 
21*67e74705SXin Li // CHECK-LABEL: define void @_Z1gv(%class.C* noalias sret %
g()22*67e74705SXin Li C g() { return C(); }
23*67e74705SXin Li 
24*67e74705SXin Li // CHECK-LABEL: define void @_Z1f1C(%class.C*)
f(C)25*67e74705SXin Li void f(C) { }
26*67e74705SXin Li 
27*67e74705SXin Li 
28*67e74705SXin Li 
29*67e74705SXin Li 
30*67e74705SXin Li // PR7058 - Missing byval on MI thunk definition.
31*67e74705SXin Li 
32*67e74705SXin Li // CHECK-LABEL: define void @_ZThn4_N18BasicAliasAnalysis13getModRefInfoE8CallSite
33*67e74705SXin Li // ...
34*67e74705SXin Li // CHECK: %struct.CallSite* byval align 4 %CS)
35*67e74705SXin Li struct CallSite {
36*67e74705SXin Li   unsigned Ptr;
CallSiteCallSite37*67e74705SXin Li   CallSite(unsigned XX) : Ptr(XX) {}
38*67e74705SXin Li };
39*67e74705SXin Li 
40*67e74705SXin Li struct AliasAnalysis {
41*67e74705SXin Li   virtual void xyz();
42*67e74705SXin Li   virtual void getModRefInfo(CallSite CS) = 0;
43*67e74705SXin Li };
44*67e74705SXin Li 
45*67e74705SXin Li struct ModulePass {
46*67e74705SXin Li   virtual void xx();
47*67e74705SXin Li };
48*67e74705SXin Li 
49*67e74705SXin Li struct BasicAliasAnalysis : public ModulePass, public AliasAnalysis {
50*67e74705SXin Li   void getModRefInfo(CallSite CS);
51*67e74705SXin Li };
52*67e74705SXin Li 
getModRefInfo(CallSite CS)53*67e74705SXin Li void BasicAliasAnalysis::getModRefInfo(CallSite CS) {
54*67e74705SXin Li }
55*67e74705SXin Li 
56*67e74705SXin Li // Check various single element struct type conditions.
57*67e74705SXin Li //
58*67e74705SXin Li // PR7098.
59*67e74705SXin Li 
60*67e74705SXin Li // CHECK-LABEL: define i64 @_Z2f0v()
61*67e74705SXin Li struct s0_0 { int x; };
62*67e74705SXin Li struct s0_1 : s0_0 { int* y; };
f0()63*67e74705SXin Li s0_1 f0() { return s0_1(); }
64*67e74705SXin Li 
65*67e74705SXin Li // CHECK-LABEL: define i32 @_Z2f1v()
66*67e74705SXin Li struct s1_0 { int x; };
67*67e74705SXin Li struct s1_1 : s1_0 { };
f1()68*67e74705SXin Li s1_1 f1() { return s1_1(); }
69*67e74705SXin Li 
70*67e74705SXin Li // CHECK-LABEL: define double @_Z2f2v()
71*67e74705SXin Li struct s2_0 { double x; };
72*67e74705SXin Li struct s2_1 : s2_0 { };
f2()73*67e74705SXin Li s2_1 f2() { return s2_1(); }
74*67e74705SXin Li 
75*67e74705SXin Li // CHECK-LABEL: define double @_Z2f3v()
76*67e74705SXin Li struct s3_0 { };
77*67e74705SXin Li struct s3_1 { double x; };
78*67e74705SXin Li struct s3_2 : s3_0, s3_1 { };
f3()79*67e74705SXin Li s3_2 f3() { return s3_2(); }
80*67e74705SXin Li 
81*67e74705SXin Li // CHECK-LABEL: define i64 @_Z2f4v()
82*67e74705SXin Li struct s4_0 { float x; };
83*67e74705SXin Li struct s4_1 { float x; };
84*67e74705SXin Li struct s4_2 : s4_0, s4_1 { };
f4()85*67e74705SXin Li s4_2 f4() { return s4_2(); }
86*67e74705SXin Li 
87*67e74705SXin Li // CHECK-LABEL: define i32* @_Z2f5v()
88*67e74705SXin Li struct s5 { s5(); int &x; };
f5()89*67e74705SXin Li s5 f5() { return s5(); }
90*67e74705SXin Li 
91*67e74705SXin Li // CHECK-LABEL: define i32 @_Z4f6_0M2s6i(i32 %a)
92*67e74705SXin Li // CHECK: define i64 @_Z4f6_1M2s6FivE({ i32, i32 }* byval align 4)
93*67e74705SXin Li // FIXME: It would be nice to avoid byval on the previous case.
94*67e74705SXin Li struct s6 {};
95*67e74705SXin Li typedef int s6::* s6_mdp;
96*67e74705SXin Li typedef int (s6::*s6_mfp)();
f6_0(s6_mdp a)97*67e74705SXin Li s6_mdp f6_0(s6_mdp a) { return a; }
f6_1(s6_mfp a)98*67e74705SXin Li s6_mfp f6_1(s6_mfp a) { return a; }
99*67e74705SXin Li 
100*67e74705SXin Li // CHECK-LABEL: define double @_Z2f7v()
101*67e74705SXin Li struct s7_0 { unsigned : 0; };
102*67e74705SXin Li struct s7_1 { double x; };
103*67e74705SXin Li struct s7 : s7_0, s7_1 { };
f7()104*67e74705SXin Li s7 f7() { return s7(); }
105*67e74705SXin Li 
106*67e74705SXin Li // CHECK-LABEL: define void @_Z2f8v(%struct.s8* noalias sret %agg.result)
107*67e74705SXin Li struct s8_0 { };
108*67e74705SXin Li struct s8_1 { double x; };
109*67e74705SXin Li struct s8 { s8_0 a; s8_1 b; };
f8()110*67e74705SXin Li s8 f8() { return s8(); }
111*67e74705SXin Li 
112*67e74705SXin Li // CHECK-LABEL: define void @_Z2f9v(%struct.s9* noalias sret %agg.result)
113*67e74705SXin Li struct s9_0 { unsigned : 0; };
114*67e74705SXin Li struct s9_1 { double x; };
115*67e74705SXin Li struct s9 { s9_0 a; s9_1 b; };
f9()116*67e74705SXin Li s9 f9() { return s9(); }
117