xref: /freebsd-src/contrib/llvm-project/clang/lib/CodeGen/Targets/PPC.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
1*06c3fb27SDimitry Andric //===- PPC.cpp ------------------------------------------------------------===//
2*06c3fb27SDimitry Andric //
3*06c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*06c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*06c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*06c3fb27SDimitry Andric //
7*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
8*06c3fb27SDimitry Andric 
9*06c3fb27SDimitry Andric #include "ABIInfoImpl.h"
10*06c3fb27SDimitry Andric #include "TargetInfo.h"
11*06c3fb27SDimitry Andric 
12*06c3fb27SDimitry Andric using namespace clang;
13*06c3fb27SDimitry Andric using namespace clang::CodeGen;
14*06c3fb27SDimitry Andric 
15*06c3fb27SDimitry Andric static Address complexTempStructure(CodeGenFunction &CGF, Address VAListAddr,
16*06c3fb27SDimitry Andric                                     QualType Ty, CharUnits SlotSize,
17*06c3fb27SDimitry Andric                                     CharUnits EltSize, const ComplexType *CTy) {
18*06c3fb27SDimitry Andric   Address Addr =
19*06c3fb27SDimitry Andric       emitVoidPtrDirectVAArg(CGF, VAListAddr, CGF.Int8Ty, SlotSize * 2,
20*06c3fb27SDimitry Andric                              SlotSize, SlotSize, /*AllowHigher*/ true);
21*06c3fb27SDimitry Andric 
22*06c3fb27SDimitry Andric   Address RealAddr = Addr;
23*06c3fb27SDimitry Andric   Address ImagAddr = RealAddr;
24*06c3fb27SDimitry Andric   if (CGF.CGM.getDataLayout().isBigEndian()) {
25*06c3fb27SDimitry Andric     RealAddr =
26*06c3fb27SDimitry Andric         CGF.Builder.CreateConstInBoundsByteGEP(RealAddr, SlotSize - EltSize);
27*06c3fb27SDimitry Andric     ImagAddr = CGF.Builder.CreateConstInBoundsByteGEP(ImagAddr,
28*06c3fb27SDimitry Andric                                                       2 * SlotSize - EltSize);
29*06c3fb27SDimitry Andric   } else {
30*06c3fb27SDimitry Andric     ImagAddr = CGF.Builder.CreateConstInBoundsByteGEP(RealAddr, SlotSize);
31*06c3fb27SDimitry Andric   }
32*06c3fb27SDimitry Andric 
33*06c3fb27SDimitry Andric   llvm::Type *EltTy = CGF.ConvertTypeForMem(CTy->getElementType());
34*06c3fb27SDimitry Andric   RealAddr = RealAddr.withElementType(EltTy);
35*06c3fb27SDimitry Andric   ImagAddr = ImagAddr.withElementType(EltTy);
36*06c3fb27SDimitry Andric   llvm::Value *Real = CGF.Builder.CreateLoad(RealAddr, ".vareal");
37*06c3fb27SDimitry Andric   llvm::Value *Imag = CGF.Builder.CreateLoad(ImagAddr, ".vaimag");
38*06c3fb27SDimitry Andric 
39*06c3fb27SDimitry Andric   Address Temp = CGF.CreateMemTemp(Ty, "vacplx");
40*06c3fb27SDimitry Andric   CGF.EmitStoreOfComplex({Real, Imag}, CGF.MakeAddrLValue(Temp, Ty),
41*06c3fb27SDimitry Andric                          /*init*/ true);
42*06c3fb27SDimitry Andric   return Temp;
43*06c3fb27SDimitry Andric }
44*06c3fb27SDimitry Andric 
45*06c3fb27SDimitry Andric static bool PPC_initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
46*06c3fb27SDimitry Andric                                         llvm::Value *Address, bool Is64Bit,
47*06c3fb27SDimitry Andric                                         bool IsAIX) {
48*06c3fb27SDimitry Andric   // This is calculated from the LLVM and GCC tables and verified
49*06c3fb27SDimitry Andric   // against gcc output.  AFAIK all PPC ABIs use the same encoding.
50*06c3fb27SDimitry Andric 
51*06c3fb27SDimitry Andric   CodeGen::CGBuilderTy &Builder = CGF.Builder;
52*06c3fb27SDimitry Andric 
53*06c3fb27SDimitry Andric   llvm::IntegerType *i8 = CGF.Int8Ty;
54*06c3fb27SDimitry Andric   llvm::Value *Four8 = llvm::ConstantInt::get(i8, 4);
55*06c3fb27SDimitry Andric   llvm::Value *Eight8 = llvm::ConstantInt::get(i8, 8);
56*06c3fb27SDimitry Andric   llvm::Value *Sixteen8 = llvm::ConstantInt::get(i8, 16);
57*06c3fb27SDimitry Andric 
58*06c3fb27SDimitry Andric   // 0-31: r0-31, the 4-byte or 8-byte general-purpose registers
59*06c3fb27SDimitry Andric   AssignToArrayRange(Builder, Address, Is64Bit ? Eight8 : Four8, 0, 31);
60*06c3fb27SDimitry Andric 
61*06c3fb27SDimitry Andric   // 32-63: fp0-31, the 8-byte floating-point registers
62*06c3fb27SDimitry Andric   AssignToArrayRange(Builder, Address, Eight8, 32, 63);
63*06c3fb27SDimitry Andric 
64*06c3fb27SDimitry Andric   // 64-67 are various 4-byte or 8-byte special-purpose registers:
65*06c3fb27SDimitry Andric   // 64: mq
66*06c3fb27SDimitry Andric   // 65: lr
67*06c3fb27SDimitry Andric   // 66: ctr
68*06c3fb27SDimitry Andric   // 67: ap
69*06c3fb27SDimitry Andric   AssignToArrayRange(Builder, Address, Is64Bit ? Eight8 : Four8, 64, 67);
70*06c3fb27SDimitry Andric 
71*06c3fb27SDimitry Andric   // 68-76 are various 4-byte special-purpose registers:
72*06c3fb27SDimitry Andric   // 68-75 cr0-7
73*06c3fb27SDimitry Andric   // 76: xer
74*06c3fb27SDimitry Andric   AssignToArrayRange(Builder, Address, Four8, 68, 76);
75*06c3fb27SDimitry Andric 
76*06c3fb27SDimitry Andric   // 77-108: v0-31, the 16-byte vector registers
77*06c3fb27SDimitry Andric   AssignToArrayRange(Builder, Address, Sixteen8, 77, 108);
78*06c3fb27SDimitry Andric 
79*06c3fb27SDimitry Andric   // 109: vrsave
80*06c3fb27SDimitry Andric   // 110: vscr
81*06c3fb27SDimitry Andric   AssignToArrayRange(Builder, Address, Is64Bit ? Eight8 : Four8, 109, 110);
82*06c3fb27SDimitry Andric 
83*06c3fb27SDimitry Andric   // AIX does not utilize the rest of the registers.
84*06c3fb27SDimitry Andric   if (IsAIX)
85*06c3fb27SDimitry Andric     return false;
86*06c3fb27SDimitry Andric 
87*06c3fb27SDimitry Andric   // 111: spe_acc
88*06c3fb27SDimitry Andric   // 112: spefscr
89*06c3fb27SDimitry Andric   // 113: sfp
90*06c3fb27SDimitry Andric   AssignToArrayRange(Builder, Address, Is64Bit ? Eight8 : Four8, 111, 113);
91*06c3fb27SDimitry Andric 
92*06c3fb27SDimitry Andric   if (!Is64Bit)
93*06c3fb27SDimitry Andric     return false;
94*06c3fb27SDimitry Andric 
95*06c3fb27SDimitry Andric   // TODO: Need to verify if these registers are used on 64 bit AIX with Power8
96*06c3fb27SDimitry Andric   // or above CPU.
97*06c3fb27SDimitry Andric   // 64-bit only registers:
98*06c3fb27SDimitry Andric   // 114: tfhar
99*06c3fb27SDimitry Andric   // 115: tfiar
100*06c3fb27SDimitry Andric   // 116: texasr
101*06c3fb27SDimitry Andric   AssignToArrayRange(Builder, Address, Eight8, 114, 116);
102*06c3fb27SDimitry Andric 
103*06c3fb27SDimitry Andric   return false;
104*06c3fb27SDimitry Andric }
105*06c3fb27SDimitry Andric 
106*06c3fb27SDimitry Andric // AIX
107*06c3fb27SDimitry Andric namespace {
108*06c3fb27SDimitry Andric /// AIXABIInfo - The AIX XCOFF ABI information.
109*06c3fb27SDimitry Andric class AIXABIInfo : public ABIInfo {
110*06c3fb27SDimitry Andric   const bool Is64Bit;
111*06c3fb27SDimitry Andric   const unsigned PtrByteSize;
112*06c3fb27SDimitry Andric   CharUnits getParamTypeAlignment(QualType Ty) const;
113*06c3fb27SDimitry Andric 
114*06c3fb27SDimitry Andric public:
115*06c3fb27SDimitry Andric   AIXABIInfo(CodeGen::CodeGenTypes &CGT, bool Is64Bit)
116*06c3fb27SDimitry Andric       : ABIInfo(CGT), Is64Bit(Is64Bit), PtrByteSize(Is64Bit ? 8 : 4) {}
117*06c3fb27SDimitry Andric 
118*06c3fb27SDimitry Andric   bool isPromotableTypeForABI(QualType Ty) const;
119*06c3fb27SDimitry Andric 
120*06c3fb27SDimitry Andric   ABIArgInfo classifyReturnType(QualType RetTy) const;
121*06c3fb27SDimitry Andric   ABIArgInfo classifyArgumentType(QualType Ty) const;
122*06c3fb27SDimitry Andric 
123*06c3fb27SDimitry Andric   void computeInfo(CGFunctionInfo &FI) const override {
124*06c3fb27SDimitry Andric     if (!getCXXABI().classifyReturnType(FI))
125*06c3fb27SDimitry Andric       FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
126*06c3fb27SDimitry Andric 
127*06c3fb27SDimitry Andric     for (auto &I : FI.arguments())
128*06c3fb27SDimitry Andric       I.info = classifyArgumentType(I.type);
129*06c3fb27SDimitry Andric   }
130*06c3fb27SDimitry Andric 
131*06c3fb27SDimitry Andric   Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
132*06c3fb27SDimitry Andric                     QualType Ty) const override;
133*06c3fb27SDimitry Andric };
134*06c3fb27SDimitry Andric 
135*06c3fb27SDimitry Andric class AIXTargetCodeGenInfo : public TargetCodeGenInfo {
136*06c3fb27SDimitry Andric   const bool Is64Bit;
137*06c3fb27SDimitry Andric 
138*06c3fb27SDimitry Andric public:
139*06c3fb27SDimitry Andric   AIXTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, bool Is64Bit)
140*06c3fb27SDimitry Andric       : TargetCodeGenInfo(std::make_unique<AIXABIInfo>(CGT, Is64Bit)),
141*06c3fb27SDimitry Andric         Is64Bit(Is64Bit) {}
142*06c3fb27SDimitry Andric   int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
143*06c3fb27SDimitry Andric     return 1; // r1 is the dedicated stack pointer
144*06c3fb27SDimitry Andric   }
145*06c3fb27SDimitry Andric 
146*06c3fb27SDimitry Andric   bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
147*06c3fb27SDimitry Andric                                llvm::Value *Address) const override;
148*06c3fb27SDimitry Andric };
149*06c3fb27SDimitry Andric } // namespace
150*06c3fb27SDimitry Andric 
151*06c3fb27SDimitry Andric // Return true if the ABI requires Ty to be passed sign- or zero-
152*06c3fb27SDimitry Andric // extended to 32/64 bits.
153*06c3fb27SDimitry Andric bool AIXABIInfo::isPromotableTypeForABI(QualType Ty) const {
154*06c3fb27SDimitry Andric   // Treat an enum type as its underlying type.
155*06c3fb27SDimitry Andric   if (const EnumType *EnumTy = Ty->getAs<EnumType>())
156*06c3fb27SDimitry Andric     Ty = EnumTy->getDecl()->getIntegerType();
157*06c3fb27SDimitry Andric 
158*06c3fb27SDimitry Andric   // Promotable integer types are required to be promoted by the ABI.
159*06c3fb27SDimitry Andric   if (getContext().isPromotableIntegerType(Ty))
160*06c3fb27SDimitry Andric     return true;
161*06c3fb27SDimitry Andric 
162*06c3fb27SDimitry Andric   if (!Is64Bit)
163*06c3fb27SDimitry Andric     return false;
164*06c3fb27SDimitry Andric 
165*06c3fb27SDimitry Andric   // For 64 bit mode, in addition to the usual promotable integer types, we also
166*06c3fb27SDimitry Andric   // need to extend all 32-bit types, since the ABI requires promotion to 64
167*06c3fb27SDimitry Andric   // bits.
168*06c3fb27SDimitry Andric   if (const BuiltinType *BT = Ty->getAs<BuiltinType>())
169*06c3fb27SDimitry Andric     switch (BT->getKind()) {
170*06c3fb27SDimitry Andric     case BuiltinType::Int:
171*06c3fb27SDimitry Andric     case BuiltinType::UInt:
172*06c3fb27SDimitry Andric       return true;
173*06c3fb27SDimitry Andric     default:
174*06c3fb27SDimitry Andric       break;
175*06c3fb27SDimitry Andric     }
176*06c3fb27SDimitry Andric 
177*06c3fb27SDimitry Andric   return false;
178*06c3fb27SDimitry Andric }
179*06c3fb27SDimitry Andric 
180*06c3fb27SDimitry Andric ABIArgInfo AIXABIInfo::classifyReturnType(QualType RetTy) const {
181*06c3fb27SDimitry Andric   if (RetTy->isAnyComplexType())
182*06c3fb27SDimitry Andric     return ABIArgInfo::getDirect();
183*06c3fb27SDimitry Andric 
184*06c3fb27SDimitry Andric   if (RetTy->isVectorType())
185*06c3fb27SDimitry Andric     return ABIArgInfo::getDirect();
186*06c3fb27SDimitry Andric 
187*06c3fb27SDimitry Andric   if (RetTy->isVoidType())
188*06c3fb27SDimitry Andric     return ABIArgInfo::getIgnore();
189*06c3fb27SDimitry Andric 
190*06c3fb27SDimitry Andric   if (isAggregateTypeForABI(RetTy))
191*06c3fb27SDimitry Andric     return getNaturalAlignIndirect(RetTy);
192*06c3fb27SDimitry Andric 
193*06c3fb27SDimitry Andric   return (isPromotableTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
194*06c3fb27SDimitry Andric                                         : ABIArgInfo::getDirect());
195*06c3fb27SDimitry Andric }
196*06c3fb27SDimitry Andric 
197*06c3fb27SDimitry Andric ABIArgInfo AIXABIInfo::classifyArgumentType(QualType Ty) const {
198*06c3fb27SDimitry Andric   Ty = useFirstFieldIfTransparentUnion(Ty);
199*06c3fb27SDimitry Andric 
200*06c3fb27SDimitry Andric   if (Ty->isAnyComplexType())
201*06c3fb27SDimitry Andric     return ABIArgInfo::getDirect();
202*06c3fb27SDimitry Andric 
203*06c3fb27SDimitry Andric   if (Ty->isVectorType())
204*06c3fb27SDimitry Andric     return ABIArgInfo::getDirect();
205*06c3fb27SDimitry Andric 
206*06c3fb27SDimitry Andric   if (isAggregateTypeForABI(Ty)) {
207*06c3fb27SDimitry Andric     // Records with non-trivial destructors/copy-constructors should not be
208*06c3fb27SDimitry Andric     // passed by value.
209*06c3fb27SDimitry Andric     if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
210*06c3fb27SDimitry Andric       return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
211*06c3fb27SDimitry Andric 
212*06c3fb27SDimitry Andric     CharUnits CCAlign = getParamTypeAlignment(Ty);
213*06c3fb27SDimitry Andric     CharUnits TyAlign = getContext().getTypeAlignInChars(Ty);
214*06c3fb27SDimitry Andric 
215*06c3fb27SDimitry Andric     return ABIArgInfo::getIndirect(CCAlign, /*ByVal*/ true,
216*06c3fb27SDimitry Andric                                    /*Realign*/ TyAlign > CCAlign);
217*06c3fb27SDimitry Andric   }
218*06c3fb27SDimitry Andric 
219*06c3fb27SDimitry Andric   return (isPromotableTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
220*06c3fb27SDimitry Andric                                      : ABIArgInfo::getDirect());
221*06c3fb27SDimitry Andric }
222*06c3fb27SDimitry Andric 
223*06c3fb27SDimitry Andric CharUnits AIXABIInfo::getParamTypeAlignment(QualType Ty) const {
224*06c3fb27SDimitry Andric   // Complex types are passed just like their elements.
225*06c3fb27SDimitry Andric   if (const ComplexType *CTy = Ty->getAs<ComplexType>())
226*06c3fb27SDimitry Andric     Ty = CTy->getElementType();
227*06c3fb27SDimitry Andric 
228*06c3fb27SDimitry Andric   if (Ty->isVectorType())
229*06c3fb27SDimitry Andric     return CharUnits::fromQuantity(16);
230*06c3fb27SDimitry Andric 
231*06c3fb27SDimitry Andric   // If the structure contains a vector type, the alignment is 16.
232*06c3fb27SDimitry Andric   if (isRecordWithSIMDVectorType(getContext(), Ty))
233*06c3fb27SDimitry Andric     return CharUnits::fromQuantity(16);
234*06c3fb27SDimitry Andric 
235*06c3fb27SDimitry Andric   return CharUnits::fromQuantity(PtrByteSize);
236*06c3fb27SDimitry Andric }
237*06c3fb27SDimitry Andric 
238*06c3fb27SDimitry Andric Address AIXABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
239*06c3fb27SDimitry Andric                               QualType Ty) const {
240*06c3fb27SDimitry Andric 
241*06c3fb27SDimitry Andric   auto TypeInfo = getContext().getTypeInfoInChars(Ty);
242*06c3fb27SDimitry Andric   TypeInfo.Align = getParamTypeAlignment(Ty);
243*06c3fb27SDimitry Andric 
244*06c3fb27SDimitry Andric   CharUnits SlotSize = CharUnits::fromQuantity(PtrByteSize);
245*06c3fb27SDimitry Andric 
246*06c3fb27SDimitry Andric   // If we have a complex type and the base type is smaller than the register
247*06c3fb27SDimitry Andric   // size, the ABI calls for the real and imaginary parts to be right-adjusted
248*06c3fb27SDimitry Andric   // in separate words in 32bit mode or doublewords in 64bit mode. However,
249*06c3fb27SDimitry Andric   // Clang expects us to produce a pointer to a structure with the two parts
250*06c3fb27SDimitry Andric   // packed tightly. So generate loads of the real and imaginary parts relative
251*06c3fb27SDimitry Andric   // to the va_list pointer, and store them to a temporary structure. We do the
252*06c3fb27SDimitry Andric   // same as the PPC64ABI here.
253*06c3fb27SDimitry Andric   if (const ComplexType *CTy = Ty->getAs<ComplexType>()) {
254*06c3fb27SDimitry Andric     CharUnits EltSize = TypeInfo.Width / 2;
255*06c3fb27SDimitry Andric     if (EltSize < SlotSize)
256*06c3fb27SDimitry Andric       return complexTempStructure(CGF, VAListAddr, Ty, SlotSize, EltSize, CTy);
257*06c3fb27SDimitry Andric   }
258*06c3fb27SDimitry Andric 
259*06c3fb27SDimitry Andric   return emitVoidPtrVAArg(CGF, VAListAddr, Ty, /*Indirect*/ false, TypeInfo,
260*06c3fb27SDimitry Andric                           SlotSize, /*AllowHigher*/ true);
261*06c3fb27SDimitry Andric }
262*06c3fb27SDimitry Andric 
263*06c3fb27SDimitry Andric bool AIXTargetCodeGenInfo::initDwarfEHRegSizeTable(
264*06c3fb27SDimitry Andric     CodeGen::CodeGenFunction &CGF, llvm::Value *Address) const {
265*06c3fb27SDimitry Andric   return PPC_initDwarfEHRegSizeTable(CGF, Address, Is64Bit, /*IsAIX*/ true);
266*06c3fb27SDimitry Andric }
267*06c3fb27SDimitry Andric 
268*06c3fb27SDimitry Andric // PowerPC-32
269*06c3fb27SDimitry Andric namespace {
270*06c3fb27SDimitry Andric /// PPC32_SVR4_ABIInfo - The 32-bit PowerPC ELF (SVR4) ABI information.
271*06c3fb27SDimitry Andric class PPC32_SVR4_ABIInfo : public DefaultABIInfo {
272*06c3fb27SDimitry Andric   bool IsSoftFloatABI;
273*06c3fb27SDimitry Andric   bool IsRetSmallStructInRegABI;
274*06c3fb27SDimitry Andric 
275*06c3fb27SDimitry Andric   CharUnits getParamTypeAlignment(QualType Ty) const;
276*06c3fb27SDimitry Andric 
277*06c3fb27SDimitry Andric public:
278*06c3fb27SDimitry Andric   PPC32_SVR4_ABIInfo(CodeGen::CodeGenTypes &CGT, bool SoftFloatABI,
279*06c3fb27SDimitry Andric                      bool RetSmallStructInRegABI)
280*06c3fb27SDimitry Andric       : DefaultABIInfo(CGT), IsSoftFloatABI(SoftFloatABI),
281*06c3fb27SDimitry Andric         IsRetSmallStructInRegABI(RetSmallStructInRegABI) {}
282*06c3fb27SDimitry Andric 
283*06c3fb27SDimitry Andric   ABIArgInfo classifyReturnType(QualType RetTy) const;
284*06c3fb27SDimitry Andric 
285*06c3fb27SDimitry Andric   void computeInfo(CGFunctionInfo &FI) const override {
286*06c3fb27SDimitry Andric     if (!getCXXABI().classifyReturnType(FI))
287*06c3fb27SDimitry Andric       FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
288*06c3fb27SDimitry Andric     for (auto &I : FI.arguments())
289*06c3fb27SDimitry Andric       I.info = classifyArgumentType(I.type);
290*06c3fb27SDimitry Andric   }
291*06c3fb27SDimitry Andric 
292*06c3fb27SDimitry Andric   Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
293*06c3fb27SDimitry Andric                     QualType Ty) const override;
294*06c3fb27SDimitry Andric };
295*06c3fb27SDimitry Andric 
296*06c3fb27SDimitry Andric class PPC32TargetCodeGenInfo : public TargetCodeGenInfo {
297*06c3fb27SDimitry Andric public:
298*06c3fb27SDimitry Andric   PPC32TargetCodeGenInfo(CodeGenTypes &CGT, bool SoftFloatABI,
299*06c3fb27SDimitry Andric                          bool RetSmallStructInRegABI)
300*06c3fb27SDimitry Andric       : TargetCodeGenInfo(std::make_unique<PPC32_SVR4_ABIInfo>(
301*06c3fb27SDimitry Andric             CGT, SoftFloatABI, RetSmallStructInRegABI)) {}
302*06c3fb27SDimitry Andric 
303*06c3fb27SDimitry Andric   static bool isStructReturnInRegABI(const llvm::Triple &Triple,
304*06c3fb27SDimitry Andric                                      const CodeGenOptions &Opts);
305*06c3fb27SDimitry Andric 
306*06c3fb27SDimitry Andric   int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
307*06c3fb27SDimitry Andric     // This is recovered from gcc output.
308*06c3fb27SDimitry Andric     return 1; // r1 is the dedicated stack pointer
309*06c3fb27SDimitry Andric   }
310*06c3fb27SDimitry Andric 
311*06c3fb27SDimitry Andric   bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
312*06c3fb27SDimitry Andric                                llvm::Value *Address) const override;
313*06c3fb27SDimitry Andric };
314*06c3fb27SDimitry Andric }
315*06c3fb27SDimitry Andric 
316*06c3fb27SDimitry Andric CharUnits PPC32_SVR4_ABIInfo::getParamTypeAlignment(QualType Ty) const {
317*06c3fb27SDimitry Andric   // Complex types are passed just like their elements.
318*06c3fb27SDimitry Andric   if (const ComplexType *CTy = Ty->getAs<ComplexType>())
319*06c3fb27SDimitry Andric     Ty = CTy->getElementType();
320*06c3fb27SDimitry Andric 
321*06c3fb27SDimitry Andric   if (Ty->isVectorType())
322*06c3fb27SDimitry Andric     return CharUnits::fromQuantity(getContext().getTypeSize(Ty) == 128 ? 16
323*06c3fb27SDimitry Andric                                                                        : 4);
324*06c3fb27SDimitry Andric 
325*06c3fb27SDimitry Andric   // For single-element float/vector structs, we consider the whole type
326*06c3fb27SDimitry Andric   // to have the same alignment requirements as its single element.
327*06c3fb27SDimitry Andric   const Type *AlignTy = nullptr;
328*06c3fb27SDimitry Andric   if (const Type *EltType = isSingleElementStruct(Ty, getContext())) {
329*06c3fb27SDimitry Andric     const BuiltinType *BT = EltType->getAs<BuiltinType>();
330*06c3fb27SDimitry Andric     if ((EltType->isVectorType() && getContext().getTypeSize(EltType) == 128) ||
331*06c3fb27SDimitry Andric         (BT && BT->isFloatingPoint()))
332*06c3fb27SDimitry Andric       AlignTy = EltType;
333*06c3fb27SDimitry Andric   }
334*06c3fb27SDimitry Andric 
335*06c3fb27SDimitry Andric   if (AlignTy)
336*06c3fb27SDimitry Andric     return CharUnits::fromQuantity(AlignTy->isVectorType() ? 16 : 4);
337*06c3fb27SDimitry Andric   return CharUnits::fromQuantity(4);
338*06c3fb27SDimitry Andric }
339*06c3fb27SDimitry Andric 
340*06c3fb27SDimitry Andric ABIArgInfo PPC32_SVR4_ABIInfo::classifyReturnType(QualType RetTy) const {
341*06c3fb27SDimitry Andric   uint64_t Size;
342*06c3fb27SDimitry Andric 
343*06c3fb27SDimitry Andric   // -msvr4-struct-return puts small aggregates in GPR3 and GPR4.
344*06c3fb27SDimitry Andric   if (isAggregateTypeForABI(RetTy) && IsRetSmallStructInRegABI &&
345*06c3fb27SDimitry Andric       (Size = getContext().getTypeSize(RetTy)) <= 64) {
346*06c3fb27SDimitry Andric     // System V ABI (1995), page 3-22, specified:
347*06c3fb27SDimitry Andric     // > A structure or union whose size is less than or equal to 8 bytes
348*06c3fb27SDimitry Andric     // > shall be returned in r3 and r4, as if it were first stored in the
349*06c3fb27SDimitry Andric     // > 8-byte aligned memory area and then the low addressed word were
350*06c3fb27SDimitry Andric     // > loaded into r3 and the high-addressed word into r4.  Bits beyond
351*06c3fb27SDimitry Andric     // > the last member of the structure or union are not defined.
352*06c3fb27SDimitry Andric     //
353*06c3fb27SDimitry Andric     // GCC for big-endian PPC32 inserts the pad before the first member,
354*06c3fb27SDimitry Andric     // not "beyond the last member" of the struct.  To stay compatible
355*06c3fb27SDimitry Andric     // with GCC, we coerce the struct to an integer of the same size.
356*06c3fb27SDimitry Andric     // LLVM will extend it and return i32 in r3, or i64 in r3:r4.
357*06c3fb27SDimitry Andric     if (Size == 0)
358*06c3fb27SDimitry Andric       return ABIArgInfo::getIgnore();
359*06c3fb27SDimitry Andric     else {
360*06c3fb27SDimitry Andric       llvm::Type *CoerceTy = llvm::Type::getIntNTy(getVMContext(), Size);
361*06c3fb27SDimitry Andric       return ABIArgInfo::getDirect(CoerceTy);
362*06c3fb27SDimitry Andric     }
363*06c3fb27SDimitry Andric   }
364*06c3fb27SDimitry Andric 
365*06c3fb27SDimitry Andric   return DefaultABIInfo::classifyReturnType(RetTy);
366*06c3fb27SDimitry Andric }
367*06c3fb27SDimitry Andric 
368*06c3fb27SDimitry Andric // TODO: this implementation is now likely redundant with
369*06c3fb27SDimitry Andric // DefaultABIInfo::EmitVAArg.
370*06c3fb27SDimitry Andric Address PPC32_SVR4_ABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAList,
371*06c3fb27SDimitry Andric                                       QualType Ty) const {
372*06c3fb27SDimitry Andric   if (getTarget().getTriple().isOSDarwin()) {
373*06c3fb27SDimitry Andric     auto TI = getContext().getTypeInfoInChars(Ty);
374*06c3fb27SDimitry Andric     TI.Align = getParamTypeAlignment(Ty);
375*06c3fb27SDimitry Andric 
376*06c3fb27SDimitry Andric     CharUnits SlotSize = CharUnits::fromQuantity(4);
377*06c3fb27SDimitry Andric     return emitVoidPtrVAArg(CGF, VAList, Ty,
378*06c3fb27SDimitry Andric                             classifyArgumentType(Ty).isIndirect(), TI, SlotSize,
379*06c3fb27SDimitry Andric                             /*AllowHigherAlign=*/true);
380*06c3fb27SDimitry Andric   }
381*06c3fb27SDimitry Andric 
382*06c3fb27SDimitry Andric   const unsigned OverflowLimit = 8;
383*06c3fb27SDimitry Andric   if (const ComplexType *CTy = Ty->getAs<ComplexType>()) {
384*06c3fb27SDimitry Andric     // TODO: Implement this. For now ignore.
385*06c3fb27SDimitry Andric     (void)CTy;
386*06c3fb27SDimitry Andric     return Address::invalid(); // FIXME?
387*06c3fb27SDimitry Andric   }
388*06c3fb27SDimitry Andric 
389*06c3fb27SDimitry Andric   // struct __va_list_tag {
390*06c3fb27SDimitry Andric   //   unsigned char gpr;
391*06c3fb27SDimitry Andric   //   unsigned char fpr;
392*06c3fb27SDimitry Andric   //   unsigned short reserved;
393*06c3fb27SDimitry Andric   //   void *overflow_arg_area;
394*06c3fb27SDimitry Andric   //   void *reg_save_area;
395*06c3fb27SDimitry Andric   // };
396*06c3fb27SDimitry Andric 
397*06c3fb27SDimitry Andric   bool isI64 = Ty->isIntegerType() && getContext().getTypeSize(Ty) == 64;
398*06c3fb27SDimitry Andric   bool isInt = !Ty->isFloatingType();
399*06c3fb27SDimitry Andric   bool isF64 = Ty->isFloatingType() && getContext().getTypeSize(Ty) == 64;
400*06c3fb27SDimitry Andric 
401*06c3fb27SDimitry Andric   // All aggregates are passed indirectly?  That doesn't seem consistent
402*06c3fb27SDimitry Andric   // with the argument-lowering code.
403*06c3fb27SDimitry Andric   bool isIndirect = isAggregateTypeForABI(Ty);
404*06c3fb27SDimitry Andric 
405*06c3fb27SDimitry Andric   CGBuilderTy &Builder = CGF.Builder;
406*06c3fb27SDimitry Andric 
407*06c3fb27SDimitry Andric   // The calling convention either uses 1-2 GPRs or 1 FPR.
408*06c3fb27SDimitry Andric   Address NumRegsAddr = Address::invalid();
409*06c3fb27SDimitry Andric   if (isInt || IsSoftFloatABI) {
410*06c3fb27SDimitry Andric     NumRegsAddr = Builder.CreateStructGEP(VAList, 0, "gpr");
411*06c3fb27SDimitry Andric   } else {
412*06c3fb27SDimitry Andric     NumRegsAddr = Builder.CreateStructGEP(VAList, 1, "fpr");
413*06c3fb27SDimitry Andric   }
414*06c3fb27SDimitry Andric 
415*06c3fb27SDimitry Andric   llvm::Value *NumRegs = Builder.CreateLoad(NumRegsAddr, "numUsedRegs");
416*06c3fb27SDimitry Andric 
417*06c3fb27SDimitry Andric   // "Align" the register count when TY is i64.
418*06c3fb27SDimitry Andric   if (isI64 || (isF64 && IsSoftFloatABI)) {
419*06c3fb27SDimitry Andric     NumRegs = Builder.CreateAdd(NumRegs, Builder.getInt8(1));
420*06c3fb27SDimitry Andric     NumRegs = Builder.CreateAnd(NumRegs, Builder.getInt8((uint8_t) ~1U));
421*06c3fb27SDimitry Andric   }
422*06c3fb27SDimitry Andric 
423*06c3fb27SDimitry Andric   llvm::Value *CC =
424*06c3fb27SDimitry Andric       Builder.CreateICmpULT(NumRegs, Builder.getInt8(OverflowLimit), "cond");
425*06c3fb27SDimitry Andric 
426*06c3fb27SDimitry Andric   llvm::BasicBlock *UsingRegs = CGF.createBasicBlock("using_regs");
427*06c3fb27SDimitry Andric   llvm::BasicBlock *UsingOverflow = CGF.createBasicBlock("using_overflow");
428*06c3fb27SDimitry Andric   llvm::BasicBlock *Cont = CGF.createBasicBlock("cont");
429*06c3fb27SDimitry Andric 
430*06c3fb27SDimitry Andric   Builder.CreateCondBr(CC, UsingRegs, UsingOverflow);
431*06c3fb27SDimitry Andric 
432*06c3fb27SDimitry Andric   llvm::Type *DirectTy = CGF.ConvertType(Ty), *ElementTy = DirectTy;
433*06c3fb27SDimitry Andric   if (isIndirect)
434*06c3fb27SDimitry Andric     DirectTy = llvm::PointerType::getUnqual(CGF.getLLVMContext());
435*06c3fb27SDimitry Andric 
436*06c3fb27SDimitry Andric   // Case 1: consume registers.
437*06c3fb27SDimitry Andric   Address RegAddr = Address::invalid();
438*06c3fb27SDimitry Andric   {
439*06c3fb27SDimitry Andric     CGF.EmitBlock(UsingRegs);
440*06c3fb27SDimitry Andric 
441*06c3fb27SDimitry Andric     Address RegSaveAreaPtr = Builder.CreateStructGEP(VAList, 4);
442*06c3fb27SDimitry Andric     RegAddr = Address(Builder.CreateLoad(RegSaveAreaPtr), CGF.Int8Ty,
443*06c3fb27SDimitry Andric                       CharUnits::fromQuantity(8));
444*06c3fb27SDimitry Andric     assert(RegAddr.getElementType() == CGF.Int8Ty);
445*06c3fb27SDimitry Andric 
446*06c3fb27SDimitry Andric     // Floating-point registers start after the general-purpose registers.
447*06c3fb27SDimitry Andric     if (!(isInt || IsSoftFloatABI)) {
448*06c3fb27SDimitry Andric       RegAddr = Builder.CreateConstInBoundsByteGEP(RegAddr,
449*06c3fb27SDimitry Andric                                                    CharUnits::fromQuantity(32));
450*06c3fb27SDimitry Andric     }
451*06c3fb27SDimitry Andric 
452*06c3fb27SDimitry Andric     // Get the address of the saved value by scaling the number of
453*06c3fb27SDimitry Andric     // registers we've used by the number of
454*06c3fb27SDimitry Andric     CharUnits RegSize = CharUnits::fromQuantity((isInt || IsSoftFloatABI) ? 4 : 8);
455*06c3fb27SDimitry Andric     llvm::Value *RegOffset =
456*06c3fb27SDimitry Andric         Builder.CreateMul(NumRegs, Builder.getInt8(RegSize.getQuantity()));
457*06c3fb27SDimitry Andric     RegAddr = Address(
458*06c3fb27SDimitry Andric         Builder.CreateInBoundsGEP(CGF.Int8Ty, RegAddr.getPointer(), RegOffset),
459*06c3fb27SDimitry Andric         DirectTy, RegAddr.getAlignment().alignmentOfArrayElement(RegSize));
460*06c3fb27SDimitry Andric 
461*06c3fb27SDimitry Andric     // Increase the used-register count.
462*06c3fb27SDimitry Andric     NumRegs =
463*06c3fb27SDimitry Andric       Builder.CreateAdd(NumRegs,
464*06c3fb27SDimitry Andric                         Builder.getInt8((isI64 || (isF64 && IsSoftFloatABI)) ? 2 : 1));
465*06c3fb27SDimitry Andric     Builder.CreateStore(NumRegs, NumRegsAddr);
466*06c3fb27SDimitry Andric 
467*06c3fb27SDimitry Andric     CGF.EmitBranch(Cont);
468*06c3fb27SDimitry Andric   }
469*06c3fb27SDimitry Andric 
470*06c3fb27SDimitry Andric   // Case 2: consume space in the overflow area.
471*06c3fb27SDimitry Andric   Address MemAddr = Address::invalid();
472*06c3fb27SDimitry Andric   {
473*06c3fb27SDimitry Andric     CGF.EmitBlock(UsingOverflow);
474*06c3fb27SDimitry Andric 
475*06c3fb27SDimitry Andric     Builder.CreateStore(Builder.getInt8(OverflowLimit), NumRegsAddr);
476*06c3fb27SDimitry Andric 
477*06c3fb27SDimitry Andric     // Everything in the overflow area is rounded up to a size of at least 4.
478*06c3fb27SDimitry Andric     CharUnits OverflowAreaAlign = CharUnits::fromQuantity(4);
479*06c3fb27SDimitry Andric 
480*06c3fb27SDimitry Andric     CharUnits Size;
481*06c3fb27SDimitry Andric     if (!isIndirect) {
482*06c3fb27SDimitry Andric       auto TypeInfo = CGF.getContext().getTypeInfoInChars(Ty);
483*06c3fb27SDimitry Andric       Size = TypeInfo.Width.alignTo(OverflowAreaAlign);
484*06c3fb27SDimitry Andric     } else {
485*06c3fb27SDimitry Andric       Size = CGF.getPointerSize();
486*06c3fb27SDimitry Andric     }
487*06c3fb27SDimitry Andric 
488*06c3fb27SDimitry Andric     Address OverflowAreaAddr = Builder.CreateStructGEP(VAList, 3);
489*06c3fb27SDimitry Andric     Address OverflowArea =
490*06c3fb27SDimitry Andric         Address(Builder.CreateLoad(OverflowAreaAddr, "argp.cur"), CGF.Int8Ty,
491*06c3fb27SDimitry Andric                 OverflowAreaAlign);
492*06c3fb27SDimitry Andric     // Round up address of argument to alignment
493*06c3fb27SDimitry Andric     CharUnits Align = CGF.getContext().getTypeAlignInChars(Ty);
494*06c3fb27SDimitry Andric     if (Align > OverflowAreaAlign) {
495*06c3fb27SDimitry Andric       llvm::Value *Ptr = OverflowArea.getPointer();
496*06c3fb27SDimitry Andric       OverflowArea = Address(emitRoundPointerUpToAlignment(CGF, Ptr, Align),
497*06c3fb27SDimitry Andric                              OverflowArea.getElementType(), Align);
498*06c3fb27SDimitry Andric     }
499*06c3fb27SDimitry Andric 
500*06c3fb27SDimitry Andric     MemAddr = OverflowArea.withElementType(DirectTy);
501*06c3fb27SDimitry Andric 
502*06c3fb27SDimitry Andric     // Increase the overflow area.
503*06c3fb27SDimitry Andric     OverflowArea = Builder.CreateConstInBoundsByteGEP(OverflowArea, Size);
504*06c3fb27SDimitry Andric     Builder.CreateStore(OverflowArea.getPointer(), OverflowAreaAddr);
505*06c3fb27SDimitry Andric     CGF.EmitBranch(Cont);
506*06c3fb27SDimitry Andric   }
507*06c3fb27SDimitry Andric 
508*06c3fb27SDimitry Andric   CGF.EmitBlock(Cont);
509*06c3fb27SDimitry Andric 
510*06c3fb27SDimitry Andric   // Merge the cases with a phi.
511*06c3fb27SDimitry Andric   Address Result = emitMergePHI(CGF, RegAddr, UsingRegs, MemAddr, UsingOverflow,
512*06c3fb27SDimitry Andric                                 "vaarg.addr");
513*06c3fb27SDimitry Andric 
514*06c3fb27SDimitry Andric   // Load the pointer if the argument was passed indirectly.
515*06c3fb27SDimitry Andric   if (isIndirect) {
516*06c3fb27SDimitry Andric     Result = Address(Builder.CreateLoad(Result, "aggr"), ElementTy,
517*06c3fb27SDimitry Andric                      getContext().getTypeAlignInChars(Ty));
518*06c3fb27SDimitry Andric   }
519*06c3fb27SDimitry Andric 
520*06c3fb27SDimitry Andric   return Result;
521*06c3fb27SDimitry Andric }
522*06c3fb27SDimitry Andric 
523*06c3fb27SDimitry Andric bool PPC32TargetCodeGenInfo::isStructReturnInRegABI(
524*06c3fb27SDimitry Andric     const llvm::Triple &Triple, const CodeGenOptions &Opts) {
525*06c3fb27SDimitry Andric   assert(Triple.isPPC32());
526*06c3fb27SDimitry Andric 
527*06c3fb27SDimitry Andric   switch (Opts.getStructReturnConvention()) {
528*06c3fb27SDimitry Andric   case CodeGenOptions::SRCK_Default:
529*06c3fb27SDimitry Andric     break;
530*06c3fb27SDimitry Andric   case CodeGenOptions::SRCK_OnStack: // -maix-struct-return
531*06c3fb27SDimitry Andric     return false;
532*06c3fb27SDimitry Andric   case CodeGenOptions::SRCK_InRegs: // -msvr4-struct-return
533*06c3fb27SDimitry Andric     return true;
534*06c3fb27SDimitry Andric   }
535*06c3fb27SDimitry Andric 
536*06c3fb27SDimitry Andric   if (Triple.isOSBinFormatELF() && !Triple.isOSLinux())
537*06c3fb27SDimitry Andric     return true;
538*06c3fb27SDimitry Andric 
539*06c3fb27SDimitry Andric   return false;
540*06c3fb27SDimitry Andric }
541*06c3fb27SDimitry Andric 
542*06c3fb27SDimitry Andric bool
543*06c3fb27SDimitry Andric PPC32TargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
544*06c3fb27SDimitry Andric                                                 llvm::Value *Address) const {
545*06c3fb27SDimitry Andric   return PPC_initDwarfEHRegSizeTable(CGF, Address, /*Is64Bit*/ false,
546*06c3fb27SDimitry Andric                                      /*IsAIX*/ false);
547*06c3fb27SDimitry Andric }
548*06c3fb27SDimitry Andric 
549*06c3fb27SDimitry Andric // PowerPC-64
550*06c3fb27SDimitry Andric 
551*06c3fb27SDimitry Andric namespace {
552*06c3fb27SDimitry Andric 
553*06c3fb27SDimitry Andric /// PPC64_SVR4_ABIInfo - The 64-bit PowerPC ELF (SVR4) ABI information.
554*06c3fb27SDimitry Andric class PPC64_SVR4_ABIInfo : public ABIInfo {
555*06c3fb27SDimitry Andric   static const unsigned GPRBits = 64;
556*06c3fb27SDimitry Andric   PPC64_SVR4_ABIKind Kind;
557*06c3fb27SDimitry Andric   bool IsSoftFloatABI;
558*06c3fb27SDimitry Andric 
559*06c3fb27SDimitry Andric public:
560*06c3fb27SDimitry Andric   PPC64_SVR4_ABIInfo(CodeGen::CodeGenTypes &CGT, PPC64_SVR4_ABIKind Kind,
561*06c3fb27SDimitry Andric                      bool SoftFloatABI)
562*06c3fb27SDimitry Andric       : ABIInfo(CGT), Kind(Kind), IsSoftFloatABI(SoftFloatABI) {}
563*06c3fb27SDimitry Andric 
564*06c3fb27SDimitry Andric   bool isPromotableTypeForABI(QualType Ty) const;
565*06c3fb27SDimitry Andric   CharUnits getParamTypeAlignment(QualType Ty) const;
566*06c3fb27SDimitry Andric 
567*06c3fb27SDimitry Andric   ABIArgInfo classifyReturnType(QualType RetTy) const;
568*06c3fb27SDimitry Andric   ABIArgInfo classifyArgumentType(QualType Ty) const;
569*06c3fb27SDimitry Andric 
570*06c3fb27SDimitry Andric   bool isHomogeneousAggregateBaseType(QualType Ty) const override;
571*06c3fb27SDimitry Andric   bool isHomogeneousAggregateSmallEnough(const Type *Ty,
572*06c3fb27SDimitry Andric                                          uint64_t Members) const override;
573*06c3fb27SDimitry Andric 
574*06c3fb27SDimitry Andric   // TODO: We can add more logic to computeInfo to improve performance.
575*06c3fb27SDimitry Andric   // Example: For aggregate arguments that fit in a register, we could
576*06c3fb27SDimitry Andric   // use getDirectInReg (as is done below for structs containing a single
577*06c3fb27SDimitry Andric   // floating-point value) to avoid pushing them to memory on function
578*06c3fb27SDimitry Andric   // entry.  This would require changing the logic in PPCISelLowering
579*06c3fb27SDimitry Andric   // when lowering the parameters in the caller and args in the callee.
580*06c3fb27SDimitry Andric   void computeInfo(CGFunctionInfo &FI) const override {
581*06c3fb27SDimitry Andric     if (!getCXXABI().classifyReturnType(FI))
582*06c3fb27SDimitry Andric       FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
583*06c3fb27SDimitry Andric     for (auto &I : FI.arguments()) {
584*06c3fb27SDimitry Andric       // We rely on the default argument classification for the most part.
585*06c3fb27SDimitry Andric       // One exception:  An aggregate containing a single floating-point
586*06c3fb27SDimitry Andric       // or vector item must be passed in a register if one is available.
587*06c3fb27SDimitry Andric       const Type *T = isSingleElementStruct(I.type, getContext());
588*06c3fb27SDimitry Andric       if (T) {
589*06c3fb27SDimitry Andric         const BuiltinType *BT = T->getAs<BuiltinType>();
590*06c3fb27SDimitry Andric         if ((T->isVectorType() && getContext().getTypeSize(T) == 128) ||
591*06c3fb27SDimitry Andric             (BT && BT->isFloatingPoint())) {
592*06c3fb27SDimitry Andric           QualType QT(T, 0);
593*06c3fb27SDimitry Andric           I.info = ABIArgInfo::getDirectInReg(CGT.ConvertType(QT));
594*06c3fb27SDimitry Andric           continue;
595*06c3fb27SDimitry Andric         }
596*06c3fb27SDimitry Andric       }
597*06c3fb27SDimitry Andric       I.info = classifyArgumentType(I.type);
598*06c3fb27SDimitry Andric     }
599*06c3fb27SDimitry Andric   }
600*06c3fb27SDimitry Andric 
601*06c3fb27SDimitry Andric   Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
602*06c3fb27SDimitry Andric                     QualType Ty) const override;
603*06c3fb27SDimitry Andric };
604*06c3fb27SDimitry Andric 
605*06c3fb27SDimitry Andric class PPC64_SVR4_TargetCodeGenInfo : public TargetCodeGenInfo {
606*06c3fb27SDimitry Andric 
607*06c3fb27SDimitry Andric public:
608*06c3fb27SDimitry Andric   PPC64_SVR4_TargetCodeGenInfo(CodeGenTypes &CGT, PPC64_SVR4_ABIKind Kind,
609*06c3fb27SDimitry Andric                                bool SoftFloatABI)
610*06c3fb27SDimitry Andric       : TargetCodeGenInfo(
611*06c3fb27SDimitry Andric             std::make_unique<PPC64_SVR4_ABIInfo>(CGT, Kind, SoftFloatABI)) {
612*06c3fb27SDimitry Andric     SwiftInfo =
613*06c3fb27SDimitry Andric         std::make_unique<SwiftABIInfo>(CGT, /*SwiftErrorInRegister=*/false);
614*06c3fb27SDimitry Andric   }
615*06c3fb27SDimitry Andric 
616*06c3fb27SDimitry Andric   int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
617*06c3fb27SDimitry Andric     // This is recovered from gcc output.
618*06c3fb27SDimitry Andric     return 1; // r1 is the dedicated stack pointer
619*06c3fb27SDimitry Andric   }
620*06c3fb27SDimitry Andric 
621*06c3fb27SDimitry Andric   bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
622*06c3fb27SDimitry Andric                                llvm::Value *Address) const override;
623*06c3fb27SDimitry Andric };
624*06c3fb27SDimitry Andric 
625*06c3fb27SDimitry Andric class PPC64TargetCodeGenInfo : public TargetCodeGenInfo {
626*06c3fb27SDimitry Andric public:
627*06c3fb27SDimitry Andric   PPC64TargetCodeGenInfo(CodeGenTypes &CGT)
628*06c3fb27SDimitry Andric       : TargetCodeGenInfo(std::make_unique<DefaultABIInfo>(CGT)) {}
629*06c3fb27SDimitry Andric 
630*06c3fb27SDimitry Andric   int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
631*06c3fb27SDimitry Andric     // This is recovered from gcc output.
632*06c3fb27SDimitry Andric     return 1; // r1 is the dedicated stack pointer
633*06c3fb27SDimitry Andric   }
634*06c3fb27SDimitry Andric 
635*06c3fb27SDimitry Andric   bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
636*06c3fb27SDimitry Andric                                llvm::Value *Address) const override;
637*06c3fb27SDimitry Andric };
638*06c3fb27SDimitry Andric }
639*06c3fb27SDimitry Andric 
640*06c3fb27SDimitry Andric // Return true if the ABI requires Ty to be passed sign- or zero-
641*06c3fb27SDimitry Andric // extended to 64 bits.
642*06c3fb27SDimitry Andric bool
643*06c3fb27SDimitry Andric PPC64_SVR4_ABIInfo::isPromotableTypeForABI(QualType Ty) const {
644*06c3fb27SDimitry Andric   // Treat an enum type as its underlying type.
645*06c3fb27SDimitry Andric   if (const EnumType *EnumTy = Ty->getAs<EnumType>())
646*06c3fb27SDimitry Andric     Ty = EnumTy->getDecl()->getIntegerType();
647*06c3fb27SDimitry Andric 
648*06c3fb27SDimitry Andric   // Promotable integer types are required to be promoted by the ABI.
649*06c3fb27SDimitry Andric   if (isPromotableIntegerTypeForABI(Ty))
650*06c3fb27SDimitry Andric     return true;
651*06c3fb27SDimitry Andric 
652*06c3fb27SDimitry Andric   // In addition to the usual promotable integer types, we also need to
653*06c3fb27SDimitry Andric   // extend all 32-bit types, since the ABI requires promotion to 64 bits.
654*06c3fb27SDimitry Andric   if (const BuiltinType *BT = Ty->getAs<BuiltinType>())
655*06c3fb27SDimitry Andric     switch (BT->getKind()) {
656*06c3fb27SDimitry Andric     case BuiltinType::Int:
657*06c3fb27SDimitry Andric     case BuiltinType::UInt:
658*06c3fb27SDimitry Andric       return true;
659*06c3fb27SDimitry Andric     default:
660*06c3fb27SDimitry Andric       break;
661*06c3fb27SDimitry Andric     }
662*06c3fb27SDimitry Andric 
663*06c3fb27SDimitry Andric   if (const auto *EIT = Ty->getAs<BitIntType>())
664*06c3fb27SDimitry Andric     if (EIT->getNumBits() < 64)
665*06c3fb27SDimitry Andric       return true;
666*06c3fb27SDimitry Andric 
667*06c3fb27SDimitry Andric   return false;
668*06c3fb27SDimitry Andric }
669*06c3fb27SDimitry Andric 
670*06c3fb27SDimitry Andric /// isAlignedParamType - Determine whether a type requires 16-byte or
671*06c3fb27SDimitry Andric /// higher alignment in the parameter area.  Always returns at least 8.
672*06c3fb27SDimitry Andric CharUnits PPC64_SVR4_ABIInfo::getParamTypeAlignment(QualType Ty) const {
673*06c3fb27SDimitry Andric   // Complex types are passed just like their elements.
674*06c3fb27SDimitry Andric   if (const ComplexType *CTy = Ty->getAs<ComplexType>())
675*06c3fb27SDimitry Andric     Ty = CTy->getElementType();
676*06c3fb27SDimitry Andric 
677*06c3fb27SDimitry Andric   auto FloatUsesVector = [this](QualType Ty){
678*06c3fb27SDimitry Andric     return Ty->isRealFloatingType() && &getContext().getFloatTypeSemantics(
679*06c3fb27SDimitry Andric                                            Ty) == &llvm::APFloat::IEEEquad();
680*06c3fb27SDimitry Andric   };
681*06c3fb27SDimitry Andric 
682*06c3fb27SDimitry Andric   // Only vector types of size 16 bytes need alignment (larger types are
683*06c3fb27SDimitry Andric   // passed via reference, smaller types are not aligned).
684*06c3fb27SDimitry Andric   if (Ty->isVectorType()) {
685*06c3fb27SDimitry Andric     return CharUnits::fromQuantity(getContext().getTypeSize(Ty) == 128 ? 16 : 8);
686*06c3fb27SDimitry Andric   } else if (FloatUsesVector(Ty)) {
687*06c3fb27SDimitry Andric     // According to ABI document section 'Optional Save Areas': If extended
688*06c3fb27SDimitry Andric     // precision floating-point values in IEEE BINARY 128 QUADRUPLE PRECISION
689*06c3fb27SDimitry Andric     // format are supported, map them to a single quadword, quadword aligned.
690*06c3fb27SDimitry Andric     return CharUnits::fromQuantity(16);
691*06c3fb27SDimitry Andric   }
692*06c3fb27SDimitry Andric 
693*06c3fb27SDimitry Andric   // For single-element float/vector structs, we consider the whole type
694*06c3fb27SDimitry Andric   // to have the same alignment requirements as its single element.
695*06c3fb27SDimitry Andric   const Type *AlignAsType = nullptr;
696*06c3fb27SDimitry Andric   const Type *EltType = isSingleElementStruct(Ty, getContext());
697*06c3fb27SDimitry Andric   if (EltType) {
698*06c3fb27SDimitry Andric     const BuiltinType *BT = EltType->getAs<BuiltinType>();
699*06c3fb27SDimitry Andric     if ((EltType->isVectorType() && getContext().getTypeSize(EltType) == 128) ||
700*06c3fb27SDimitry Andric         (BT && BT->isFloatingPoint()))
701*06c3fb27SDimitry Andric       AlignAsType = EltType;
702*06c3fb27SDimitry Andric   }
703*06c3fb27SDimitry Andric 
704*06c3fb27SDimitry Andric   // Likewise for ELFv2 homogeneous aggregates.
705*06c3fb27SDimitry Andric   const Type *Base = nullptr;
706*06c3fb27SDimitry Andric   uint64_t Members = 0;
707*06c3fb27SDimitry Andric   if (!AlignAsType && Kind == PPC64_SVR4_ABIKind::ELFv2 &&
708*06c3fb27SDimitry Andric       isAggregateTypeForABI(Ty) && isHomogeneousAggregate(Ty, Base, Members))
709*06c3fb27SDimitry Andric     AlignAsType = Base;
710*06c3fb27SDimitry Andric 
711*06c3fb27SDimitry Andric   // With special case aggregates, only vector base types need alignment.
712*06c3fb27SDimitry Andric   if (AlignAsType) {
713*06c3fb27SDimitry Andric     bool UsesVector = AlignAsType->isVectorType() ||
714*06c3fb27SDimitry Andric                       FloatUsesVector(QualType(AlignAsType, 0));
715*06c3fb27SDimitry Andric     return CharUnits::fromQuantity(UsesVector ? 16 : 8);
716*06c3fb27SDimitry Andric   }
717*06c3fb27SDimitry Andric 
718*06c3fb27SDimitry Andric   // Otherwise, we only need alignment for any aggregate type that
719*06c3fb27SDimitry Andric   // has an alignment requirement of >= 16 bytes.
720*06c3fb27SDimitry Andric   if (isAggregateTypeForABI(Ty) && getContext().getTypeAlign(Ty) >= 128) {
721*06c3fb27SDimitry Andric     return CharUnits::fromQuantity(16);
722*06c3fb27SDimitry Andric   }
723*06c3fb27SDimitry Andric 
724*06c3fb27SDimitry Andric   return CharUnits::fromQuantity(8);
725*06c3fb27SDimitry Andric }
726*06c3fb27SDimitry Andric 
727*06c3fb27SDimitry Andric bool PPC64_SVR4_ABIInfo::isHomogeneousAggregateBaseType(QualType Ty) const {
728*06c3fb27SDimitry Andric   // Homogeneous aggregates for ELFv2 must have base types of float,
729*06c3fb27SDimitry Andric   // double, long double, or 128-bit vectors.
730*06c3fb27SDimitry Andric   if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
731*06c3fb27SDimitry Andric     if (BT->getKind() == BuiltinType::Float ||
732*06c3fb27SDimitry Andric         BT->getKind() == BuiltinType::Double ||
733*06c3fb27SDimitry Andric         BT->getKind() == BuiltinType::LongDouble ||
734*06c3fb27SDimitry Andric         BT->getKind() == BuiltinType::Ibm128 ||
735*06c3fb27SDimitry Andric         (getContext().getTargetInfo().hasFloat128Type() &&
736*06c3fb27SDimitry Andric          (BT->getKind() == BuiltinType::Float128))) {
737*06c3fb27SDimitry Andric       if (IsSoftFloatABI)
738*06c3fb27SDimitry Andric         return false;
739*06c3fb27SDimitry Andric       return true;
740*06c3fb27SDimitry Andric     }
741*06c3fb27SDimitry Andric   }
742*06c3fb27SDimitry Andric   if (const VectorType *VT = Ty->getAs<VectorType>()) {
743*06c3fb27SDimitry Andric     if (getContext().getTypeSize(VT) == 128)
744*06c3fb27SDimitry Andric       return true;
745*06c3fb27SDimitry Andric   }
746*06c3fb27SDimitry Andric   return false;
747*06c3fb27SDimitry Andric }
748*06c3fb27SDimitry Andric 
749*06c3fb27SDimitry Andric bool PPC64_SVR4_ABIInfo::isHomogeneousAggregateSmallEnough(
750*06c3fb27SDimitry Andric     const Type *Base, uint64_t Members) const {
751*06c3fb27SDimitry Andric   // Vector and fp128 types require one register, other floating point types
752*06c3fb27SDimitry Andric   // require one or two registers depending on their size.
753*06c3fb27SDimitry Andric   uint32_t NumRegs =
754*06c3fb27SDimitry Andric       ((getContext().getTargetInfo().hasFloat128Type() &&
755*06c3fb27SDimitry Andric           Base->isFloat128Type()) ||
756*06c3fb27SDimitry Andric         Base->isVectorType()) ? 1
757*06c3fb27SDimitry Andric                               : (getContext().getTypeSize(Base) + 63) / 64;
758*06c3fb27SDimitry Andric 
759*06c3fb27SDimitry Andric   // Homogeneous Aggregates may occupy at most 8 registers.
760*06c3fb27SDimitry Andric   return Members * NumRegs <= 8;
761*06c3fb27SDimitry Andric }
762*06c3fb27SDimitry Andric 
763*06c3fb27SDimitry Andric ABIArgInfo
764*06c3fb27SDimitry Andric PPC64_SVR4_ABIInfo::classifyArgumentType(QualType Ty) const {
765*06c3fb27SDimitry Andric   Ty = useFirstFieldIfTransparentUnion(Ty);
766*06c3fb27SDimitry Andric 
767*06c3fb27SDimitry Andric   if (Ty->isAnyComplexType())
768*06c3fb27SDimitry Andric     return ABIArgInfo::getDirect();
769*06c3fb27SDimitry Andric 
770*06c3fb27SDimitry Andric   // Non-Altivec vector types are passed in GPRs (smaller than 16 bytes)
771*06c3fb27SDimitry Andric   // or via reference (larger than 16 bytes).
772*06c3fb27SDimitry Andric   if (Ty->isVectorType()) {
773*06c3fb27SDimitry Andric     uint64_t Size = getContext().getTypeSize(Ty);
774*06c3fb27SDimitry Andric     if (Size > 128)
775*06c3fb27SDimitry Andric       return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
776*06c3fb27SDimitry Andric     else if (Size < 128) {
777*06c3fb27SDimitry Andric       llvm::Type *CoerceTy = llvm::IntegerType::get(getVMContext(), Size);
778*06c3fb27SDimitry Andric       return ABIArgInfo::getDirect(CoerceTy);
779*06c3fb27SDimitry Andric     }
780*06c3fb27SDimitry Andric   }
781*06c3fb27SDimitry Andric 
782*06c3fb27SDimitry Andric   if (const auto *EIT = Ty->getAs<BitIntType>())
783*06c3fb27SDimitry Andric     if (EIT->getNumBits() > 128)
784*06c3fb27SDimitry Andric       return getNaturalAlignIndirect(Ty, /*ByVal=*/true);
785*06c3fb27SDimitry Andric 
786*06c3fb27SDimitry Andric   if (isAggregateTypeForABI(Ty)) {
787*06c3fb27SDimitry Andric     if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
788*06c3fb27SDimitry Andric       return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
789*06c3fb27SDimitry Andric 
790*06c3fb27SDimitry Andric     uint64_t ABIAlign = getParamTypeAlignment(Ty).getQuantity();
791*06c3fb27SDimitry Andric     uint64_t TyAlign = getContext().getTypeAlignInChars(Ty).getQuantity();
792*06c3fb27SDimitry Andric 
793*06c3fb27SDimitry Andric     // ELFv2 homogeneous aggregates are passed as array types.
794*06c3fb27SDimitry Andric     const Type *Base = nullptr;
795*06c3fb27SDimitry Andric     uint64_t Members = 0;
796*06c3fb27SDimitry Andric     if (Kind == PPC64_SVR4_ABIKind::ELFv2 &&
797*06c3fb27SDimitry Andric         isHomogeneousAggregate(Ty, Base, Members)) {
798*06c3fb27SDimitry Andric       llvm::Type *BaseTy = CGT.ConvertType(QualType(Base, 0));
799*06c3fb27SDimitry Andric       llvm::Type *CoerceTy = llvm::ArrayType::get(BaseTy, Members);
800*06c3fb27SDimitry Andric       return ABIArgInfo::getDirect(CoerceTy);
801*06c3fb27SDimitry Andric     }
802*06c3fb27SDimitry Andric 
803*06c3fb27SDimitry Andric     // If an aggregate may end up fully in registers, we do not
804*06c3fb27SDimitry Andric     // use the ByVal method, but pass the aggregate as array.
805*06c3fb27SDimitry Andric     // This is usually beneficial since we avoid forcing the
806*06c3fb27SDimitry Andric     // back-end to store the argument to memory.
807*06c3fb27SDimitry Andric     uint64_t Bits = getContext().getTypeSize(Ty);
808*06c3fb27SDimitry Andric     if (Bits > 0 && Bits <= 8 * GPRBits) {
809*06c3fb27SDimitry Andric       llvm::Type *CoerceTy;
810*06c3fb27SDimitry Andric 
811*06c3fb27SDimitry Andric       // Types up to 8 bytes are passed as integer type (which will be
812*06c3fb27SDimitry Andric       // properly aligned in the argument save area doubleword).
813*06c3fb27SDimitry Andric       if (Bits <= GPRBits)
814*06c3fb27SDimitry Andric         CoerceTy =
815*06c3fb27SDimitry Andric             llvm::IntegerType::get(getVMContext(), llvm::alignTo(Bits, 8));
816*06c3fb27SDimitry Andric       // Larger types are passed as arrays, with the base type selected
817*06c3fb27SDimitry Andric       // according to the required alignment in the save area.
818*06c3fb27SDimitry Andric       else {
819*06c3fb27SDimitry Andric         uint64_t RegBits = ABIAlign * 8;
820*06c3fb27SDimitry Andric         uint64_t NumRegs = llvm::alignTo(Bits, RegBits) / RegBits;
821*06c3fb27SDimitry Andric         llvm::Type *RegTy = llvm::IntegerType::get(getVMContext(), RegBits);
822*06c3fb27SDimitry Andric         CoerceTy = llvm::ArrayType::get(RegTy, NumRegs);
823*06c3fb27SDimitry Andric       }
824*06c3fb27SDimitry Andric 
825*06c3fb27SDimitry Andric       return ABIArgInfo::getDirect(CoerceTy);
826*06c3fb27SDimitry Andric     }
827*06c3fb27SDimitry Andric 
828*06c3fb27SDimitry Andric     // All other aggregates are passed ByVal.
829*06c3fb27SDimitry Andric     return ABIArgInfo::getIndirect(CharUnits::fromQuantity(ABIAlign),
830*06c3fb27SDimitry Andric                                    /*ByVal=*/true,
831*06c3fb27SDimitry Andric                                    /*Realign=*/TyAlign > ABIAlign);
832*06c3fb27SDimitry Andric   }
833*06c3fb27SDimitry Andric 
834*06c3fb27SDimitry Andric   return (isPromotableTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
835*06c3fb27SDimitry Andric                                      : ABIArgInfo::getDirect());
836*06c3fb27SDimitry Andric }
837*06c3fb27SDimitry Andric 
838*06c3fb27SDimitry Andric ABIArgInfo
839*06c3fb27SDimitry Andric PPC64_SVR4_ABIInfo::classifyReturnType(QualType RetTy) const {
840*06c3fb27SDimitry Andric   if (RetTy->isVoidType())
841*06c3fb27SDimitry Andric     return ABIArgInfo::getIgnore();
842*06c3fb27SDimitry Andric 
843*06c3fb27SDimitry Andric   if (RetTy->isAnyComplexType())
844*06c3fb27SDimitry Andric     return ABIArgInfo::getDirect();
845*06c3fb27SDimitry Andric 
846*06c3fb27SDimitry Andric   // Non-Altivec vector types are returned in GPRs (smaller than 16 bytes)
847*06c3fb27SDimitry Andric   // or via reference (larger than 16 bytes).
848*06c3fb27SDimitry Andric   if (RetTy->isVectorType()) {
849*06c3fb27SDimitry Andric     uint64_t Size = getContext().getTypeSize(RetTy);
850*06c3fb27SDimitry Andric     if (Size > 128)
851*06c3fb27SDimitry Andric       return getNaturalAlignIndirect(RetTy);
852*06c3fb27SDimitry Andric     else if (Size < 128) {
853*06c3fb27SDimitry Andric       llvm::Type *CoerceTy = llvm::IntegerType::get(getVMContext(), Size);
854*06c3fb27SDimitry Andric       return ABIArgInfo::getDirect(CoerceTy);
855*06c3fb27SDimitry Andric     }
856*06c3fb27SDimitry Andric   }
857*06c3fb27SDimitry Andric 
858*06c3fb27SDimitry Andric   if (const auto *EIT = RetTy->getAs<BitIntType>())
859*06c3fb27SDimitry Andric     if (EIT->getNumBits() > 128)
860*06c3fb27SDimitry Andric       return getNaturalAlignIndirect(RetTy, /*ByVal=*/false);
861*06c3fb27SDimitry Andric 
862*06c3fb27SDimitry Andric   if (isAggregateTypeForABI(RetTy)) {
863*06c3fb27SDimitry Andric     // ELFv2 homogeneous aggregates are returned as array types.
864*06c3fb27SDimitry Andric     const Type *Base = nullptr;
865*06c3fb27SDimitry Andric     uint64_t Members = 0;
866*06c3fb27SDimitry Andric     if (Kind == PPC64_SVR4_ABIKind::ELFv2 &&
867*06c3fb27SDimitry Andric         isHomogeneousAggregate(RetTy, Base, Members)) {
868*06c3fb27SDimitry Andric       llvm::Type *BaseTy = CGT.ConvertType(QualType(Base, 0));
869*06c3fb27SDimitry Andric       llvm::Type *CoerceTy = llvm::ArrayType::get(BaseTy, Members);
870*06c3fb27SDimitry Andric       return ABIArgInfo::getDirect(CoerceTy);
871*06c3fb27SDimitry Andric     }
872*06c3fb27SDimitry Andric 
873*06c3fb27SDimitry Andric     // ELFv2 small aggregates are returned in up to two registers.
874*06c3fb27SDimitry Andric     uint64_t Bits = getContext().getTypeSize(RetTy);
875*06c3fb27SDimitry Andric     if (Kind == PPC64_SVR4_ABIKind::ELFv2 && Bits <= 2 * GPRBits) {
876*06c3fb27SDimitry Andric       if (Bits == 0)
877*06c3fb27SDimitry Andric         return ABIArgInfo::getIgnore();
878*06c3fb27SDimitry Andric 
879*06c3fb27SDimitry Andric       llvm::Type *CoerceTy;
880*06c3fb27SDimitry Andric       if (Bits > GPRBits) {
881*06c3fb27SDimitry Andric         CoerceTy = llvm::IntegerType::get(getVMContext(), GPRBits);
882*06c3fb27SDimitry Andric         CoerceTy = llvm::StructType::get(CoerceTy, CoerceTy);
883*06c3fb27SDimitry Andric       } else
884*06c3fb27SDimitry Andric         CoerceTy =
885*06c3fb27SDimitry Andric             llvm::IntegerType::get(getVMContext(), llvm::alignTo(Bits, 8));
886*06c3fb27SDimitry Andric       return ABIArgInfo::getDirect(CoerceTy);
887*06c3fb27SDimitry Andric     }
888*06c3fb27SDimitry Andric 
889*06c3fb27SDimitry Andric     // All other aggregates are returned indirectly.
890*06c3fb27SDimitry Andric     return getNaturalAlignIndirect(RetTy);
891*06c3fb27SDimitry Andric   }
892*06c3fb27SDimitry Andric 
893*06c3fb27SDimitry Andric   return (isPromotableTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
894*06c3fb27SDimitry Andric                                         : ABIArgInfo::getDirect());
895*06c3fb27SDimitry Andric }
896*06c3fb27SDimitry Andric 
897*06c3fb27SDimitry Andric // Based on ARMABIInfo::EmitVAArg, adjusted for 64-bit machine.
898*06c3fb27SDimitry Andric Address PPC64_SVR4_ABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
899*06c3fb27SDimitry Andric                                       QualType Ty) const {
900*06c3fb27SDimitry Andric   auto TypeInfo = getContext().getTypeInfoInChars(Ty);
901*06c3fb27SDimitry Andric   TypeInfo.Align = getParamTypeAlignment(Ty);
902*06c3fb27SDimitry Andric 
903*06c3fb27SDimitry Andric   CharUnits SlotSize = CharUnits::fromQuantity(8);
904*06c3fb27SDimitry Andric 
905*06c3fb27SDimitry Andric   // If we have a complex type and the base type is smaller than 8 bytes,
906*06c3fb27SDimitry Andric   // the ABI calls for the real and imaginary parts to be right-adjusted
907*06c3fb27SDimitry Andric   // in separate doublewords.  However, Clang expects us to produce a
908*06c3fb27SDimitry Andric   // pointer to a structure with the two parts packed tightly.  So generate
909*06c3fb27SDimitry Andric   // loads of the real and imaginary parts relative to the va_list pointer,
910*06c3fb27SDimitry Andric   // and store them to a temporary structure.
911*06c3fb27SDimitry Andric   if (const ComplexType *CTy = Ty->getAs<ComplexType>()) {
912*06c3fb27SDimitry Andric     CharUnits EltSize = TypeInfo.Width / 2;
913*06c3fb27SDimitry Andric     if (EltSize < SlotSize)
914*06c3fb27SDimitry Andric       return complexTempStructure(CGF, VAListAddr, Ty, SlotSize, EltSize, CTy);
915*06c3fb27SDimitry Andric   }
916*06c3fb27SDimitry Andric 
917*06c3fb27SDimitry Andric   // Otherwise, just use the general rule.
918*06c3fb27SDimitry Andric   //
919*06c3fb27SDimitry Andric   // The PPC64 ABI passes some arguments in integer registers, even to variadic
920*06c3fb27SDimitry Andric   // functions. To allow va_list to use the simple "void*" representation,
921*06c3fb27SDimitry Andric   // variadic calls allocate space in the argument area for the integer argument
922*06c3fb27SDimitry Andric   // registers, and variadic functions spill their integer argument registers to
923*06c3fb27SDimitry Andric   // this area in their prologues. When aggregates smaller than a register are
924*06c3fb27SDimitry Andric   // passed this way, they are passed in the least significant bits of the
925*06c3fb27SDimitry Andric   // register, which means that after spilling on big-endian targets they will
926*06c3fb27SDimitry Andric   // be right-aligned in their argument slot. This is uncommon; for a variety of
927*06c3fb27SDimitry Andric   // reasons, other big-endian targets don't end up right-aligning aggregate
928*06c3fb27SDimitry Andric   // types this way, and so right-alignment only applies to fundamental types.
929*06c3fb27SDimitry Andric   // So on PPC64, we must force the use of right-alignment even for aggregates.
930*06c3fb27SDimitry Andric   return emitVoidPtrVAArg(CGF, VAListAddr, Ty, /*Indirect*/ false, TypeInfo,
931*06c3fb27SDimitry Andric                           SlotSize, /*AllowHigher*/ true,
932*06c3fb27SDimitry Andric                           /*ForceRightAdjust*/ true);
933*06c3fb27SDimitry Andric }
934*06c3fb27SDimitry Andric 
935*06c3fb27SDimitry Andric bool
936*06c3fb27SDimitry Andric PPC64_SVR4_TargetCodeGenInfo::initDwarfEHRegSizeTable(
937*06c3fb27SDimitry Andric   CodeGen::CodeGenFunction &CGF,
938*06c3fb27SDimitry Andric   llvm::Value *Address) const {
939*06c3fb27SDimitry Andric   return PPC_initDwarfEHRegSizeTable(CGF, Address, /*Is64Bit*/ true,
940*06c3fb27SDimitry Andric                                      /*IsAIX*/ false);
941*06c3fb27SDimitry Andric }
942*06c3fb27SDimitry Andric 
943*06c3fb27SDimitry Andric bool
944*06c3fb27SDimitry Andric PPC64TargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
945*06c3fb27SDimitry Andric                                                 llvm::Value *Address) const {
946*06c3fb27SDimitry Andric   return PPC_initDwarfEHRegSizeTable(CGF, Address, /*Is64Bit*/ true,
947*06c3fb27SDimitry Andric                                      /*IsAIX*/ false);
948*06c3fb27SDimitry Andric }
949*06c3fb27SDimitry Andric 
950*06c3fb27SDimitry Andric std::unique_ptr<TargetCodeGenInfo>
951*06c3fb27SDimitry Andric CodeGen::createAIXTargetCodeGenInfo(CodeGenModule &CGM, bool Is64Bit) {
952*06c3fb27SDimitry Andric   return std::make_unique<AIXTargetCodeGenInfo>(CGM.getTypes(), Is64Bit);
953*06c3fb27SDimitry Andric }
954*06c3fb27SDimitry Andric 
955*06c3fb27SDimitry Andric std::unique_ptr<TargetCodeGenInfo>
956*06c3fb27SDimitry Andric CodeGen::createPPC32TargetCodeGenInfo(CodeGenModule &CGM, bool SoftFloatABI) {
957*06c3fb27SDimitry Andric   bool RetSmallStructInRegABI = PPC32TargetCodeGenInfo::isStructReturnInRegABI(
958*06c3fb27SDimitry Andric       CGM.getTriple(), CGM.getCodeGenOpts());
959*06c3fb27SDimitry Andric   return std::make_unique<PPC32TargetCodeGenInfo>(CGM.getTypes(), SoftFloatABI,
960*06c3fb27SDimitry Andric                                                   RetSmallStructInRegABI);
961*06c3fb27SDimitry Andric }
962*06c3fb27SDimitry Andric 
963*06c3fb27SDimitry Andric std::unique_ptr<TargetCodeGenInfo>
964*06c3fb27SDimitry Andric CodeGen::createPPC64TargetCodeGenInfo(CodeGenModule &CGM) {
965*06c3fb27SDimitry Andric   return std::make_unique<PPC64TargetCodeGenInfo>(CGM.getTypes());
966*06c3fb27SDimitry Andric }
967*06c3fb27SDimitry Andric 
968*06c3fb27SDimitry Andric std::unique_ptr<TargetCodeGenInfo> CodeGen::createPPC64_SVR4_TargetCodeGenInfo(
969*06c3fb27SDimitry Andric     CodeGenModule &CGM, PPC64_SVR4_ABIKind Kind, bool SoftFloatABI) {
970*06c3fb27SDimitry Andric   return std::make_unique<PPC64_SVR4_TargetCodeGenInfo>(CGM.getTypes(), Kind,
971*06c3fb27SDimitry Andric                                                         SoftFloatABI);
972*06c3fb27SDimitry Andric }
973