1 //===---- TargetInfo.cpp - Encapsulate target details -----------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // These classes wrap the information about a call or function
10 // definition used to handle ABI compliancy.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "TargetInfo.h"
15 #include "ABIInfo.h"
16 #include "CGBlocks.h"
17 #include "CGCXXABI.h"
18 #include "CGValue.h"
19 #include "CodeGenFunction.h"
20 #include "clang/AST/Attr.h"
21 #include "clang/AST/RecordLayout.h"
22 #include "clang/Basic/CodeGenOptions.h"
23 #include "clang/Basic/DiagnosticFrontend.h"
24 #include "clang/Basic/Builtins.h"
25 #include "clang/CodeGen/CGFunctionInfo.h"
26 #include "clang/CodeGen/SwiftCallingConv.h"
27 #include "llvm/ADT/SmallBitVector.h"
28 #include "llvm/ADT/StringExtras.h"
29 #include "llvm/ADT/StringSwitch.h"
30 #include "llvm/ADT/Triple.h"
31 #include "llvm/ADT/Twine.h"
32 #include "llvm/IR/DataLayout.h"
33 #include "llvm/IR/IntrinsicsNVPTX.h"
34 #include "llvm/IR/IntrinsicsS390.h"
35 #include "llvm/IR/Type.h"
36 #include "llvm/Support/raw_ostream.h"
37 #include <algorithm> // std::sort
38
39 using namespace clang;
40 using namespace CodeGen;
41
42 // Helper for coercing an aggregate argument or return value into an integer
43 // array of the same size (including padding) and alignment. This alternate
44 // coercion happens only for the RenderScript ABI and can be removed after
45 // runtimes that rely on it are no longer supported.
46 //
47 // RenderScript assumes that the size of the argument / return value in the IR
48 // is the same as the size of the corresponding qualified type. This helper
49 // coerces the aggregate type into an array of the same size (including
50 // padding). This coercion is used in lieu of expansion of struct members or
51 // other canonical coercions that return a coerced-type of larger size.
52 //
53 // Ty - The argument / return value type
54 // Context - The associated ASTContext
55 // LLVMContext - The associated LLVMContext
coerceToIntArray(QualType Ty,ASTContext & Context,llvm::LLVMContext & LLVMContext)56 static ABIArgInfo coerceToIntArray(QualType Ty,
57 ASTContext &Context,
58 llvm::LLVMContext &LLVMContext) {
59 // Alignment and Size are measured in bits.
60 const uint64_t Size = Context.getTypeSize(Ty);
61 const uint64_t Alignment = Context.getTypeAlign(Ty);
62 llvm::Type *IntType = llvm::Type::getIntNTy(LLVMContext, Alignment);
63 const uint64_t NumElements = (Size + Alignment - 1) / Alignment;
64 return ABIArgInfo::getDirect(llvm::ArrayType::get(IntType, NumElements));
65 }
66
AssignToArrayRange(CodeGen::CGBuilderTy & Builder,llvm::Value * Array,llvm::Value * Value,unsigned FirstIndex,unsigned LastIndex)67 static void AssignToArrayRange(CodeGen::CGBuilderTy &Builder,
68 llvm::Value *Array,
69 llvm::Value *Value,
70 unsigned FirstIndex,
71 unsigned LastIndex) {
72 // Alternatively, we could emit this as a loop in the source.
73 for (unsigned I = FirstIndex; I <= LastIndex; ++I) {
74 llvm::Value *Cell =
75 Builder.CreateConstInBoundsGEP1_32(Builder.getInt8Ty(), Array, I);
76 Builder.CreateAlignedStore(Value, Cell, CharUnits::One());
77 }
78 }
79
isAggregateTypeForABI(QualType T)80 static bool isAggregateTypeForABI(QualType T) {
81 return !CodeGenFunction::hasScalarEvaluationKind(T) ||
82 T->isMemberFunctionPointerType();
83 }
84
getNaturalAlignIndirect(QualType Ty,bool ByVal,bool Realign,llvm::Type * Padding) const85 ABIArgInfo ABIInfo::getNaturalAlignIndirect(QualType Ty, bool ByVal,
86 bool Realign,
87 llvm::Type *Padding) const {
88 return ABIArgInfo::getIndirect(getContext().getTypeAlignInChars(Ty), ByVal,
89 Realign, Padding);
90 }
91
92 ABIArgInfo
getNaturalAlignIndirectInReg(QualType Ty,bool Realign) const93 ABIInfo::getNaturalAlignIndirectInReg(QualType Ty, bool Realign) const {
94 return ABIArgInfo::getIndirectInReg(getContext().getTypeAlignInChars(Ty),
95 /*ByVal*/ false, Realign);
96 }
97
EmitMSVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const98 Address ABIInfo::EmitMSVAArg(CodeGenFunction &CGF, Address VAListAddr,
99 QualType Ty) const {
100 return Address::invalid();
101 }
102
isPromotableIntegerTypeForABI(QualType Ty) const103 bool ABIInfo::isPromotableIntegerTypeForABI(QualType Ty) const {
104 if (Ty->isPromotableIntegerType())
105 return true;
106
107 if (const auto *EIT = Ty->getAs<ExtIntType>())
108 if (EIT->getNumBits() < getContext().getTypeSize(getContext().IntTy))
109 return true;
110
111 return false;
112 }
113
~ABIInfo()114 ABIInfo::~ABIInfo() {}
115
116 /// Does the given lowering require more than the given number of
117 /// registers when expanded?
118 ///
119 /// This is intended to be the basis of a reasonable basic implementation
120 /// of should{Pass,Return}IndirectlyForSwift.
121 ///
122 /// For most targets, a limit of four total registers is reasonable; this
123 /// limits the amount of code required in order to move around the value
124 /// in case it wasn't produced immediately prior to the call by the caller
125 /// (or wasn't produced in exactly the right registers) or isn't used
126 /// immediately within the callee. But some targets may need to further
127 /// limit the register count due to an inability to support that many
128 /// return registers.
occupiesMoreThan(CodeGenTypes & cgt,ArrayRef<llvm::Type * > scalarTypes,unsigned maxAllRegisters)129 static bool occupiesMoreThan(CodeGenTypes &cgt,
130 ArrayRef<llvm::Type*> scalarTypes,
131 unsigned maxAllRegisters) {
132 unsigned intCount = 0, fpCount = 0;
133 for (llvm::Type *type : scalarTypes) {
134 if (type->isPointerTy()) {
135 intCount++;
136 } else if (auto intTy = dyn_cast<llvm::IntegerType>(type)) {
137 auto ptrWidth = cgt.getTarget().getPointerWidth(0);
138 intCount += (intTy->getBitWidth() + ptrWidth - 1) / ptrWidth;
139 } else {
140 assert(type->isVectorTy() || type->isFloatingPointTy());
141 fpCount++;
142 }
143 }
144
145 return (intCount + fpCount > maxAllRegisters);
146 }
147
isLegalVectorTypeForSwift(CharUnits vectorSize,llvm::Type * eltTy,unsigned numElts) const148 bool SwiftABIInfo::isLegalVectorTypeForSwift(CharUnits vectorSize,
149 llvm::Type *eltTy,
150 unsigned numElts) const {
151 // The default implementation of this assumes that the target guarantees
152 // 128-bit SIMD support but nothing more.
153 return (vectorSize.getQuantity() > 8 && vectorSize.getQuantity() <= 16);
154 }
155
getRecordArgABI(const RecordType * RT,CGCXXABI & CXXABI)156 static CGCXXABI::RecordArgABI getRecordArgABI(const RecordType *RT,
157 CGCXXABI &CXXABI) {
158 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl());
159 if (!RD) {
160 if (!RT->getDecl()->canPassInRegisters())
161 return CGCXXABI::RAA_Indirect;
162 return CGCXXABI::RAA_Default;
163 }
164 return CXXABI.getRecordArgABI(RD);
165 }
166
getRecordArgABI(QualType T,CGCXXABI & CXXABI)167 static CGCXXABI::RecordArgABI getRecordArgABI(QualType T,
168 CGCXXABI &CXXABI) {
169 const RecordType *RT = T->getAs<RecordType>();
170 if (!RT)
171 return CGCXXABI::RAA_Default;
172 return getRecordArgABI(RT, CXXABI);
173 }
174
classifyReturnType(const CGCXXABI & CXXABI,CGFunctionInfo & FI,const ABIInfo & Info)175 static bool classifyReturnType(const CGCXXABI &CXXABI, CGFunctionInfo &FI,
176 const ABIInfo &Info) {
177 QualType Ty = FI.getReturnType();
178
179 if (const auto *RT = Ty->getAs<RecordType>())
180 if (!isa<CXXRecordDecl>(RT->getDecl()) &&
181 !RT->getDecl()->canPassInRegisters()) {
182 FI.getReturnInfo() = Info.getNaturalAlignIndirect(Ty);
183 return true;
184 }
185
186 return CXXABI.classifyReturnType(FI);
187 }
188
189 /// Pass transparent unions as if they were the type of the first element. Sema
190 /// should ensure that all elements of the union have the same "machine type".
useFirstFieldIfTransparentUnion(QualType Ty)191 static QualType useFirstFieldIfTransparentUnion(QualType Ty) {
192 if (const RecordType *UT = Ty->getAsUnionType()) {
193 const RecordDecl *UD = UT->getDecl();
194 if (UD->hasAttr<TransparentUnionAttr>()) {
195 assert(!UD->field_empty() && "sema created an empty transparent union");
196 return UD->field_begin()->getType();
197 }
198 }
199 return Ty;
200 }
201
getCXXABI() const202 CGCXXABI &ABIInfo::getCXXABI() const {
203 return CGT.getCXXABI();
204 }
205
getContext() const206 ASTContext &ABIInfo::getContext() const {
207 return CGT.getContext();
208 }
209
getVMContext() const210 llvm::LLVMContext &ABIInfo::getVMContext() const {
211 return CGT.getLLVMContext();
212 }
213
getDataLayout() const214 const llvm::DataLayout &ABIInfo::getDataLayout() const {
215 return CGT.getDataLayout();
216 }
217
getTarget() const218 const TargetInfo &ABIInfo::getTarget() const {
219 return CGT.getTarget();
220 }
221
getCodeGenOpts() const222 const CodeGenOptions &ABIInfo::getCodeGenOpts() const {
223 return CGT.getCodeGenOpts();
224 }
225
isAndroid() const226 bool ABIInfo::isAndroid() const { return getTarget().getTriple().isAndroid(); }
227
isHomogeneousAggregateBaseType(QualType Ty) const228 bool ABIInfo::isHomogeneousAggregateBaseType(QualType Ty) const {
229 return false;
230 }
231
isHomogeneousAggregateSmallEnough(const Type * Base,uint64_t Members) const232 bool ABIInfo::isHomogeneousAggregateSmallEnough(const Type *Base,
233 uint64_t Members) const {
234 return false;
235 }
236
dump() const237 LLVM_DUMP_METHOD void ABIArgInfo::dump() const {
238 raw_ostream &OS = llvm::errs();
239 OS << "(ABIArgInfo Kind=";
240 switch (TheKind) {
241 case Direct:
242 OS << "Direct Type=";
243 if (llvm::Type *Ty = getCoerceToType())
244 Ty->print(OS);
245 else
246 OS << "null";
247 break;
248 case Extend:
249 OS << "Extend";
250 break;
251 case Ignore:
252 OS << "Ignore";
253 break;
254 case InAlloca:
255 OS << "InAlloca Offset=" << getInAllocaFieldIndex();
256 break;
257 case Indirect:
258 OS << "Indirect Align=" << getIndirectAlign().getQuantity()
259 << " ByVal=" << getIndirectByVal()
260 << " Realign=" << getIndirectRealign();
261 break;
262 case IndirectAliased:
263 OS << "Indirect Align=" << getIndirectAlign().getQuantity()
264 << " AadrSpace=" << getIndirectAddrSpace()
265 << " Realign=" << getIndirectRealign();
266 break;
267 case Expand:
268 OS << "Expand";
269 break;
270 case CoerceAndExpand:
271 OS << "CoerceAndExpand Type=";
272 getCoerceAndExpandType()->print(OS);
273 break;
274 }
275 OS << ")\n";
276 }
277
278 // Dynamically round a pointer up to a multiple of the given alignment.
emitRoundPointerUpToAlignment(CodeGenFunction & CGF,llvm::Value * Ptr,CharUnits Align)279 static llvm::Value *emitRoundPointerUpToAlignment(CodeGenFunction &CGF,
280 llvm::Value *Ptr,
281 CharUnits Align) {
282 llvm::Value *PtrAsInt = Ptr;
283 // OverflowArgArea = (OverflowArgArea + Align - 1) & -Align;
284 PtrAsInt = CGF.Builder.CreatePtrToInt(PtrAsInt, CGF.IntPtrTy);
285 PtrAsInt = CGF.Builder.CreateAdd(PtrAsInt,
286 llvm::ConstantInt::get(CGF.IntPtrTy, Align.getQuantity() - 1));
287 PtrAsInt = CGF.Builder.CreateAnd(PtrAsInt,
288 llvm::ConstantInt::get(CGF.IntPtrTy, -Align.getQuantity()));
289 PtrAsInt = CGF.Builder.CreateIntToPtr(PtrAsInt,
290 Ptr->getType(),
291 Ptr->getName() + ".aligned");
292 return PtrAsInt;
293 }
294
295 /// Emit va_arg for a platform using the common void* representation,
296 /// where arguments are simply emitted in an array of slots on the stack.
297 ///
298 /// This version implements the core direct-value passing rules.
299 ///
300 /// \param SlotSize - The size and alignment of a stack slot.
301 /// Each argument will be allocated to a multiple of this number of
302 /// slots, and all the slots will be aligned to this value.
303 /// \param AllowHigherAlign - The slot alignment is not a cap;
304 /// an argument type with an alignment greater than the slot size
305 /// will be emitted on a higher-alignment address, potentially
306 /// leaving one or more empty slots behind as padding. If this
307 /// is false, the returned address might be less-aligned than
308 /// DirectAlign.
emitVoidPtrDirectVAArg(CodeGenFunction & CGF,Address VAListAddr,llvm::Type * DirectTy,CharUnits DirectSize,CharUnits DirectAlign,CharUnits SlotSize,bool AllowHigherAlign)309 static Address emitVoidPtrDirectVAArg(CodeGenFunction &CGF,
310 Address VAListAddr,
311 llvm::Type *DirectTy,
312 CharUnits DirectSize,
313 CharUnits DirectAlign,
314 CharUnits SlotSize,
315 bool AllowHigherAlign) {
316 // Cast the element type to i8* if necessary. Some platforms define
317 // va_list as a struct containing an i8* instead of just an i8*.
318 if (VAListAddr.getElementType() != CGF.Int8PtrTy)
319 VAListAddr = CGF.Builder.CreateElementBitCast(VAListAddr, CGF.Int8PtrTy);
320
321 llvm::Value *Ptr = CGF.Builder.CreateLoad(VAListAddr, "argp.cur");
322
323 // If the CC aligns values higher than the slot size, do so if needed.
324 Address Addr = Address::invalid();
325 if (AllowHigherAlign && DirectAlign > SlotSize) {
326 Addr = Address(emitRoundPointerUpToAlignment(CGF, Ptr, DirectAlign),
327 DirectAlign);
328 } else {
329 Addr = Address(Ptr, SlotSize);
330 }
331
332 // Advance the pointer past the argument, then store that back.
333 CharUnits FullDirectSize = DirectSize.alignTo(SlotSize);
334 Address NextPtr =
335 CGF.Builder.CreateConstInBoundsByteGEP(Addr, FullDirectSize, "argp.next");
336 CGF.Builder.CreateStore(NextPtr.getPointer(), VAListAddr);
337
338 // If the argument is smaller than a slot, and this is a big-endian
339 // target, the argument will be right-adjusted in its slot.
340 if (DirectSize < SlotSize && CGF.CGM.getDataLayout().isBigEndian() &&
341 !DirectTy->isStructTy()) {
342 Addr = CGF.Builder.CreateConstInBoundsByteGEP(Addr, SlotSize - DirectSize);
343 }
344
345 Addr = CGF.Builder.CreateElementBitCast(Addr, DirectTy);
346 return Addr;
347 }
348
349 /// Emit va_arg for a platform using the common void* representation,
350 /// where arguments are simply emitted in an array of slots on the stack.
351 ///
352 /// \param IsIndirect - Values of this type are passed indirectly.
353 /// \param ValueInfo - The size and alignment of this type, generally
354 /// computed with getContext().getTypeInfoInChars(ValueTy).
355 /// \param SlotSizeAndAlign - The size and alignment of a stack slot.
356 /// Each argument will be allocated to a multiple of this number of
357 /// slots, and all the slots will be aligned to this value.
358 /// \param AllowHigherAlign - The slot alignment is not a cap;
359 /// an argument type with an alignment greater than the slot size
360 /// will be emitted on a higher-alignment address, potentially
361 /// leaving one or more empty slots behind as padding.
emitVoidPtrVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType ValueTy,bool IsIndirect,TypeInfoChars ValueInfo,CharUnits SlotSizeAndAlign,bool AllowHigherAlign)362 static Address emitVoidPtrVAArg(CodeGenFunction &CGF, Address VAListAddr,
363 QualType ValueTy, bool IsIndirect,
364 TypeInfoChars ValueInfo,
365 CharUnits SlotSizeAndAlign,
366 bool AllowHigherAlign) {
367 // The size and alignment of the value that was passed directly.
368 CharUnits DirectSize, DirectAlign;
369 if (IsIndirect) {
370 DirectSize = CGF.getPointerSize();
371 DirectAlign = CGF.getPointerAlign();
372 } else {
373 DirectSize = ValueInfo.Width;
374 DirectAlign = ValueInfo.Align;
375 }
376
377 // Cast the address we've calculated to the right type.
378 llvm::Type *DirectTy = CGF.ConvertTypeForMem(ValueTy);
379 if (IsIndirect)
380 DirectTy = DirectTy->getPointerTo(0);
381
382 Address Addr = emitVoidPtrDirectVAArg(CGF, VAListAddr, DirectTy,
383 DirectSize, DirectAlign,
384 SlotSizeAndAlign,
385 AllowHigherAlign);
386
387 if (IsIndirect) {
388 Addr = Address(CGF.Builder.CreateLoad(Addr), ValueInfo.Align);
389 }
390
391 return Addr;
392
393 }
394
emitMergePHI(CodeGenFunction & CGF,Address Addr1,llvm::BasicBlock * Block1,Address Addr2,llvm::BasicBlock * Block2,const llvm::Twine & Name="")395 static Address emitMergePHI(CodeGenFunction &CGF,
396 Address Addr1, llvm::BasicBlock *Block1,
397 Address Addr2, llvm::BasicBlock *Block2,
398 const llvm::Twine &Name = "") {
399 assert(Addr1.getType() == Addr2.getType());
400 llvm::PHINode *PHI = CGF.Builder.CreatePHI(Addr1.getType(), 2, Name);
401 PHI->addIncoming(Addr1.getPointer(), Block1);
402 PHI->addIncoming(Addr2.getPointer(), Block2);
403 CharUnits Align = std::min(Addr1.getAlignment(), Addr2.getAlignment());
404 return Address(PHI, Align);
405 }
406
407 TargetCodeGenInfo::~TargetCodeGenInfo() = default;
408
409 // If someone can figure out a general rule for this, that would be great.
410 // It's probably just doomed to be platform-dependent, though.
getSizeOfUnwindException() const411 unsigned TargetCodeGenInfo::getSizeOfUnwindException() const {
412 // Verified for:
413 // x86-64 FreeBSD, Linux, Darwin
414 // x86-32 FreeBSD, Linux, Darwin
415 // PowerPC Linux, Darwin
416 // ARM Darwin (*not* EABI)
417 // AArch64 Linux
418 return 32;
419 }
420
isNoProtoCallVariadic(const CallArgList & args,const FunctionNoProtoType * fnType) const421 bool TargetCodeGenInfo::isNoProtoCallVariadic(const CallArgList &args,
422 const FunctionNoProtoType *fnType) const {
423 // The following conventions are known to require this to be false:
424 // x86_stdcall
425 // MIPS
426 // For everything else, we just prefer false unless we opt out.
427 return false;
428 }
429
430 void
getDependentLibraryOption(llvm::StringRef Lib,llvm::SmallString<24> & Opt) const431 TargetCodeGenInfo::getDependentLibraryOption(llvm::StringRef Lib,
432 llvm::SmallString<24> &Opt) const {
433 // This assumes the user is passing a library name like "rt" instead of a
434 // filename like "librt.a/so", and that they don't care whether it's static or
435 // dynamic.
436 Opt = "-l";
437 Opt += Lib;
438 }
439
getOpenCLKernelCallingConv() const440 unsigned TargetCodeGenInfo::getOpenCLKernelCallingConv() const {
441 // OpenCL kernels are called via an explicit runtime API with arguments
442 // set with clSetKernelArg(), not as normal sub-functions.
443 // Return SPIR_KERNEL by default as the kernel calling convention to
444 // ensure the fingerprint is fixed such way that each OpenCL argument
445 // gets one matching argument in the produced kernel function argument
446 // list to enable feasible implementation of clSetKernelArg() with
447 // aggregates etc. In case we would use the default C calling conv here,
448 // clSetKernelArg() might break depending on the target-specific
449 // conventions; different targets might split structs passed as values
450 // to multiple function arguments etc.
451 return llvm::CallingConv::SPIR_KERNEL;
452 }
453
getNullPointer(const CodeGen::CodeGenModule & CGM,llvm::PointerType * T,QualType QT) const454 llvm::Constant *TargetCodeGenInfo::getNullPointer(const CodeGen::CodeGenModule &CGM,
455 llvm::PointerType *T, QualType QT) const {
456 return llvm::ConstantPointerNull::get(T);
457 }
458
getGlobalVarAddressSpace(CodeGenModule & CGM,const VarDecl * D) const459 LangAS TargetCodeGenInfo::getGlobalVarAddressSpace(CodeGenModule &CGM,
460 const VarDecl *D) const {
461 assert(!CGM.getLangOpts().OpenCL &&
462 !(CGM.getLangOpts().CUDA && CGM.getLangOpts().CUDAIsDevice) &&
463 "Address space agnostic languages only");
464 return D ? D->getType().getAddressSpace() : LangAS::Default;
465 }
466
performAddrSpaceCast(CodeGen::CodeGenFunction & CGF,llvm::Value * Src,LangAS SrcAddr,LangAS DestAddr,llvm::Type * DestTy,bool isNonNull) const467 llvm::Value *TargetCodeGenInfo::performAddrSpaceCast(
468 CodeGen::CodeGenFunction &CGF, llvm::Value *Src, LangAS SrcAddr,
469 LangAS DestAddr, llvm::Type *DestTy, bool isNonNull) const {
470 // Since target may map different address spaces in AST to the same address
471 // space, an address space conversion may end up as a bitcast.
472 if (auto *C = dyn_cast<llvm::Constant>(Src))
473 return performAddrSpaceCast(CGF.CGM, C, SrcAddr, DestAddr, DestTy);
474 // Try to preserve the source's name to make IR more readable.
475 return CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(
476 Src, DestTy, Src->hasName() ? Src->getName() + ".ascast" : "");
477 }
478
479 llvm::Constant *
performAddrSpaceCast(CodeGenModule & CGM,llvm::Constant * Src,LangAS SrcAddr,LangAS DestAddr,llvm::Type * DestTy) const480 TargetCodeGenInfo::performAddrSpaceCast(CodeGenModule &CGM, llvm::Constant *Src,
481 LangAS SrcAddr, LangAS DestAddr,
482 llvm::Type *DestTy) const {
483 // Since target may map different address spaces in AST to the same address
484 // space, an address space conversion may end up as a bitcast.
485 return llvm::ConstantExpr::getPointerCast(Src, DestTy);
486 }
487
488 llvm::SyncScope::ID
getLLVMSyncScopeID(const LangOptions & LangOpts,SyncScope Scope,llvm::AtomicOrdering Ordering,llvm::LLVMContext & Ctx) const489 TargetCodeGenInfo::getLLVMSyncScopeID(const LangOptions &LangOpts,
490 SyncScope Scope,
491 llvm::AtomicOrdering Ordering,
492 llvm::LLVMContext &Ctx) const {
493 return Ctx.getOrInsertSyncScopeID(""); /* default sync scope */
494 }
495
496 static bool isEmptyRecord(ASTContext &Context, QualType T, bool AllowArrays);
497
498 /// isEmptyField - Return true iff a the field is "empty", that is it
499 /// is an unnamed bit-field or an (array of) empty record(s).
isEmptyField(ASTContext & Context,const FieldDecl * FD,bool AllowArrays)500 static bool isEmptyField(ASTContext &Context, const FieldDecl *FD,
501 bool AllowArrays) {
502 if (FD->isUnnamedBitfield())
503 return true;
504
505 QualType FT = FD->getType();
506
507 // Constant arrays of empty records count as empty, strip them off.
508 // Constant arrays of zero length always count as empty.
509 bool WasArray = false;
510 if (AllowArrays)
511 while (const ConstantArrayType *AT = Context.getAsConstantArrayType(FT)) {
512 if (AT->getSize() == 0)
513 return true;
514 FT = AT->getElementType();
515 // The [[no_unique_address]] special case below does not apply to
516 // arrays of C++ empty records, so we need to remember this fact.
517 WasArray = true;
518 }
519
520 const RecordType *RT = FT->getAs<RecordType>();
521 if (!RT)
522 return false;
523
524 // C++ record fields are never empty, at least in the Itanium ABI.
525 //
526 // FIXME: We should use a predicate for whether this behavior is true in the
527 // current ABI.
528 //
529 // The exception to the above rule are fields marked with the
530 // [[no_unique_address]] attribute (since C++20). Those do count as empty
531 // according to the Itanium ABI. The exception applies only to records,
532 // not arrays of records, so we must also check whether we stripped off an
533 // array type above.
534 if (isa<CXXRecordDecl>(RT->getDecl()) &&
535 (WasArray || !FD->hasAttr<NoUniqueAddressAttr>()))
536 return false;
537
538 return isEmptyRecord(Context, FT, AllowArrays);
539 }
540
541 /// isEmptyRecord - Return true iff a structure contains only empty
542 /// fields. Note that a structure with a flexible array member is not
543 /// considered empty.
isEmptyRecord(ASTContext & Context,QualType T,bool AllowArrays)544 static bool isEmptyRecord(ASTContext &Context, QualType T, bool AllowArrays) {
545 const RecordType *RT = T->getAs<RecordType>();
546 if (!RT)
547 return false;
548 const RecordDecl *RD = RT->getDecl();
549 if (RD->hasFlexibleArrayMember())
550 return false;
551
552 // If this is a C++ record, check the bases first.
553 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
554 for (const auto &I : CXXRD->bases())
555 if (!isEmptyRecord(Context, I.getType(), true))
556 return false;
557
558 for (const auto *I : RD->fields())
559 if (!isEmptyField(Context, I, AllowArrays))
560 return false;
561 return true;
562 }
563
564 /// isSingleElementStruct - Determine if a structure is a "single
565 /// element struct", i.e. it has exactly one non-empty field or
566 /// exactly one field which is itself a single element
567 /// struct. Structures with flexible array members are never
568 /// considered single element structs.
569 ///
570 /// \return The field declaration for the single non-empty field, if
571 /// it exists.
isSingleElementStruct(QualType T,ASTContext & Context)572 static const Type *isSingleElementStruct(QualType T, ASTContext &Context) {
573 const RecordType *RT = T->getAs<RecordType>();
574 if (!RT)
575 return nullptr;
576
577 const RecordDecl *RD = RT->getDecl();
578 if (RD->hasFlexibleArrayMember())
579 return nullptr;
580
581 const Type *Found = nullptr;
582
583 // If this is a C++ record, check the bases first.
584 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
585 for (const auto &I : CXXRD->bases()) {
586 // Ignore empty records.
587 if (isEmptyRecord(Context, I.getType(), true))
588 continue;
589
590 // If we already found an element then this isn't a single-element struct.
591 if (Found)
592 return nullptr;
593
594 // If this is non-empty and not a single element struct, the composite
595 // cannot be a single element struct.
596 Found = isSingleElementStruct(I.getType(), Context);
597 if (!Found)
598 return nullptr;
599 }
600 }
601
602 // Check for single element.
603 for (const auto *FD : RD->fields()) {
604 QualType FT = FD->getType();
605
606 // Ignore empty fields.
607 if (isEmptyField(Context, FD, true))
608 continue;
609
610 // If we already found an element then this isn't a single-element
611 // struct.
612 if (Found)
613 return nullptr;
614
615 // Treat single element arrays as the element.
616 while (const ConstantArrayType *AT = Context.getAsConstantArrayType(FT)) {
617 if (AT->getSize().getZExtValue() != 1)
618 break;
619 FT = AT->getElementType();
620 }
621
622 if (!isAggregateTypeForABI(FT)) {
623 Found = FT.getTypePtr();
624 } else {
625 Found = isSingleElementStruct(FT, Context);
626 if (!Found)
627 return nullptr;
628 }
629 }
630
631 // We don't consider a struct a single-element struct if it has
632 // padding beyond the element type.
633 if (Found && Context.getTypeSize(Found) != Context.getTypeSize(T))
634 return nullptr;
635
636 return Found;
637 }
638
639 namespace {
EmitVAArgInstr(CodeGenFunction & CGF,Address VAListAddr,QualType Ty,const ABIArgInfo & AI)640 Address EmitVAArgInstr(CodeGenFunction &CGF, Address VAListAddr, QualType Ty,
641 const ABIArgInfo &AI) {
642 // This default implementation defers to the llvm backend's va_arg
643 // instruction. It can handle only passing arguments directly
644 // (typically only handled in the backend for primitive types), or
645 // aggregates passed indirectly by pointer (NOTE: if the "byval"
646 // flag has ABI impact in the callee, this implementation cannot
647 // work.)
648
649 // Only a few cases are covered here at the moment -- those needed
650 // by the default abi.
651 llvm::Value *Val;
652
653 if (AI.isIndirect()) {
654 assert(!AI.getPaddingType() &&
655 "Unexpected PaddingType seen in arginfo in generic VAArg emitter!");
656 assert(
657 !AI.getIndirectRealign() &&
658 "Unexpected IndirectRealign seen in arginfo in generic VAArg emitter!");
659
660 auto TyInfo = CGF.getContext().getTypeInfoInChars(Ty);
661 CharUnits TyAlignForABI = TyInfo.Align;
662
663 llvm::Type *BaseTy =
664 llvm::PointerType::getUnqual(CGF.ConvertTypeForMem(Ty));
665 llvm::Value *Addr =
666 CGF.Builder.CreateVAArg(VAListAddr.getPointer(), BaseTy);
667 return Address(Addr, TyAlignForABI);
668 } else {
669 assert((AI.isDirect() || AI.isExtend()) &&
670 "Unexpected ArgInfo Kind in generic VAArg emitter!");
671
672 assert(!AI.getInReg() &&
673 "Unexpected InReg seen in arginfo in generic VAArg emitter!");
674 assert(!AI.getPaddingType() &&
675 "Unexpected PaddingType seen in arginfo in generic VAArg emitter!");
676 assert(!AI.getDirectOffset() &&
677 "Unexpected DirectOffset seen in arginfo in generic VAArg emitter!");
678 assert(!AI.getCoerceToType() &&
679 "Unexpected CoerceToType seen in arginfo in generic VAArg emitter!");
680
681 Address Temp = CGF.CreateMemTemp(Ty, "varet");
682 Val = CGF.Builder.CreateVAArg(VAListAddr.getPointer(), CGF.ConvertType(Ty));
683 CGF.Builder.CreateStore(Val, Temp);
684 return Temp;
685 }
686 }
687
688 /// DefaultABIInfo - The default implementation for ABI specific
689 /// details. This implementation provides information which results in
690 /// self-consistent and sensible LLVM IR generation, but does not
691 /// conform to any particular ABI.
692 class DefaultABIInfo : public ABIInfo {
693 public:
DefaultABIInfo(CodeGen::CodeGenTypes & CGT)694 DefaultABIInfo(CodeGen::CodeGenTypes &CGT) : ABIInfo(CGT) {}
695
696 ABIArgInfo classifyReturnType(QualType RetTy) const;
697 ABIArgInfo classifyArgumentType(QualType RetTy) const;
698
computeInfo(CGFunctionInfo & FI) const699 void computeInfo(CGFunctionInfo &FI) const override {
700 if (!getCXXABI().classifyReturnType(FI))
701 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
702 for (auto &I : FI.arguments())
703 I.info = classifyArgumentType(I.type);
704 }
705
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const706 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
707 QualType Ty) const override {
708 return EmitVAArgInstr(CGF, VAListAddr, Ty, classifyArgumentType(Ty));
709 }
710 };
711
712 class DefaultTargetCodeGenInfo : public TargetCodeGenInfo {
713 public:
DefaultTargetCodeGenInfo(CodeGen::CodeGenTypes & CGT)714 DefaultTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT)
715 : TargetCodeGenInfo(std::make_unique<DefaultABIInfo>(CGT)) {}
716 };
717
classifyArgumentType(QualType Ty) const718 ABIArgInfo DefaultABIInfo::classifyArgumentType(QualType Ty) const {
719 Ty = useFirstFieldIfTransparentUnion(Ty);
720
721 if (isAggregateTypeForABI(Ty)) {
722 // Records with non-trivial destructors/copy-constructors should not be
723 // passed by value.
724 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
725 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
726
727 return getNaturalAlignIndirect(Ty);
728 }
729
730 // Treat an enum type as its underlying type.
731 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
732 Ty = EnumTy->getDecl()->getIntegerType();
733
734 ASTContext &Context = getContext();
735 if (const auto *EIT = Ty->getAs<ExtIntType>())
736 if (EIT->getNumBits() >
737 Context.getTypeSize(Context.getTargetInfo().hasInt128Type()
738 ? Context.Int128Ty
739 : Context.LongLongTy))
740 return getNaturalAlignIndirect(Ty);
741
742 return (isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
743 : ABIArgInfo::getDirect());
744 }
745
classifyReturnType(QualType RetTy) const746 ABIArgInfo DefaultABIInfo::classifyReturnType(QualType RetTy) const {
747 if (RetTy->isVoidType())
748 return ABIArgInfo::getIgnore();
749
750 if (isAggregateTypeForABI(RetTy))
751 return getNaturalAlignIndirect(RetTy);
752
753 // Treat an enum type as its underlying type.
754 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
755 RetTy = EnumTy->getDecl()->getIntegerType();
756
757 if (const auto *EIT = RetTy->getAs<ExtIntType>())
758 if (EIT->getNumBits() >
759 getContext().getTypeSize(getContext().getTargetInfo().hasInt128Type()
760 ? getContext().Int128Ty
761 : getContext().LongLongTy))
762 return getNaturalAlignIndirect(RetTy);
763
764 return (isPromotableIntegerTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
765 : ABIArgInfo::getDirect());
766 }
767
768 //===----------------------------------------------------------------------===//
769 // WebAssembly ABI Implementation
770 //
771 // This is a very simple ABI that relies a lot on DefaultABIInfo.
772 //===----------------------------------------------------------------------===//
773
774 class WebAssemblyABIInfo final : public SwiftABIInfo {
775 public:
776 enum ABIKind {
777 MVP = 0,
778 ExperimentalMV = 1,
779 };
780
781 private:
782 DefaultABIInfo defaultInfo;
783 ABIKind Kind;
784
785 public:
WebAssemblyABIInfo(CodeGen::CodeGenTypes & CGT,ABIKind Kind)786 explicit WebAssemblyABIInfo(CodeGen::CodeGenTypes &CGT, ABIKind Kind)
787 : SwiftABIInfo(CGT), defaultInfo(CGT), Kind(Kind) {}
788
789 private:
790 ABIArgInfo classifyReturnType(QualType RetTy) const;
791 ABIArgInfo classifyArgumentType(QualType Ty) const;
792
793 // DefaultABIInfo's classifyReturnType and classifyArgumentType are
794 // non-virtual, but computeInfo and EmitVAArg are virtual, so we
795 // overload them.
computeInfo(CGFunctionInfo & FI) const796 void computeInfo(CGFunctionInfo &FI) const override {
797 if (!getCXXABI().classifyReturnType(FI))
798 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
799 for (auto &Arg : FI.arguments())
800 Arg.info = classifyArgumentType(Arg.type);
801 }
802
803 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
804 QualType Ty) const override;
805
shouldPassIndirectlyForSwift(ArrayRef<llvm::Type * > scalars,bool asReturnValue) const806 bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars,
807 bool asReturnValue) const override {
808 return occupiesMoreThan(CGT, scalars, /*total*/ 4);
809 }
810
isSwiftErrorInRegister() const811 bool isSwiftErrorInRegister() const override {
812 return false;
813 }
814 };
815
816 class WebAssemblyTargetCodeGenInfo final : public TargetCodeGenInfo {
817 public:
WebAssemblyTargetCodeGenInfo(CodeGen::CodeGenTypes & CGT,WebAssemblyABIInfo::ABIKind K)818 explicit WebAssemblyTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT,
819 WebAssemblyABIInfo::ABIKind K)
820 : TargetCodeGenInfo(std::make_unique<WebAssemblyABIInfo>(CGT, K)) {}
821
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const822 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
823 CodeGen::CodeGenModule &CGM) const override {
824 TargetCodeGenInfo::setTargetAttributes(D, GV, CGM);
825 if (const auto *FD = dyn_cast_or_null<FunctionDecl>(D)) {
826 if (const auto *Attr = FD->getAttr<WebAssemblyImportModuleAttr>()) {
827 llvm::Function *Fn = cast<llvm::Function>(GV);
828 llvm::AttrBuilder B;
829 B.addAttribute("wasm-import-module", Attr->getImportModule());
830 Fn->addAttributes(llvm::AttributeList::FunctionIndex, B);
831 }
832 if (const auto *Attr = FD->getAttr<WebAssemblyImportNameAttr>()) {
833 llvm::Function *Fn = cast<llvm::Function>(GV);
834 llvm::AttrBuilder B;
835 B.addAttribute("wasm-import-name", Attr->getImportName());
836 Fn->addAttributes(llvm::AttributeList::FunctionIndex, B);
837 }
838 if (const auto *Attr = FD->getAttr<WebAssemblyExportNameAttr>()) {
839 llvm::Function *Fn = cast<llvm::Function>(GV);
840 llvm::AttrBuilder B;
841 B.addAttribute("wasm-export-name", Attr->getExportName());
842 Fn->addAttributes(llvm::AttributeList::FunctionIndex, B);
843 }
844 }
845
846 if (auto *FD = dyn_cast_or_null<FunctionDecl>(D)) {
847 llvm::Function *Fn = cast<llvm::Function>(GV);
848 if (!FD->doesThisDeclarationHaveABody() && !FD->hasPrototype())
849 Fn->addFnAttr("no-prototype");
850 }
851 }
852 };
853
854 /// Classify argument of given type \p Ty.
classifyArgumentType(QualType Ty) const855 ABIArgInfo WebAssemblyABIInfo::classifyArgumentType(QualType Ty) const {
856 Ty = useFirstFieldIfTransparentUnion(Ty);
857
858 if (isAggregateTypeForABI(Ty)) {
859 // Records with non-trivial destructors/copy-constructors should not be
860 // passed by value.
861 if (auto RAA = getRecordArgABI(Ty, getCXXABI()))
862 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
863 // Ignore empty structs/unions.
864 if (isEmptyRecord(getContext(), Ty, true))
865 return ABIArgInfo::getIgnore();
866 // Lower single-element structs to just pass a regular value. TODO: We
867 // could do reasonable-size multiple-element structs too, using getExpand(),
868 // though watch out for things like bitfields.
869 if (const Type *SeltTy = isSingleElementStruct(Ty, getContext()))
870 return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0)));
871 // For the experimental multivalue ABI, fully expand all other aggregates
872 if (Kind == ABIKind::ExperimentalMV) {
873 const RecordType *RT = Ty->getAs<RecordType>();
874 assert(RT);
875 bool HasBitField = false;
876 for (auto *Field : RT->getDecl()->fields()) {
877 if (Field->isBitField()) {
878 HasBitField = true;
879 break;
880 }
881 }
882 if (!HasBitField)
883 return ABIArgInfo::getExpand();
884 }
885 }
886
887 // Otherwise just do the default thing.
888 return defaultInfo.classifyArgumentType(Ty);
889 }
890
classifyReturnType(QualType RetTy) const891 ABIArgInfo WebAssemblyABIInfo::classifyReturnType(QualType RetTy) const {
892 if (isAggregateTypeForABI(RetTy)) {
893 // Records with non-trivial destructors/copy-constructors should not be
894 // returned by value.
895 if (!getRecordArgABI(RetTy, getCXXABI())) {
896 // Ignore empty structs/unions.
897 if (isEmptyRecord(getContext(), RetTy, true))
898 return ABIArgInfo::getIgnore();
899 // Lower single-element structs to just return a regular value. TODO: We
900 // could do reasonable-size multiple-element structs too, using
901 // ABIArgInfo::getDirect().
902 if (const Type *SeltTy = isSingleElementStruct(RetTy, getContext()))
903 return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0)));
904 // For the experimental multivalue ABI, return all other aggregates
905 if (Kind == ABIKind::ExperimentalMV)
906 return ABIArgInfo::getDirect();
907 }
908 }
909
910 // Otherwise just do the default thing.
911 return defaultInfo.classifyReturnType(RetTy);
912 }
913
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const914 Address WebAssemblyABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
915 QualType Ty) const {
916 bool IsIndirect = isAggregateTypeForABI(Ty) &&
917 !isEmptyRecord(getContext(), Ty, true) &&
918 !isSingleElementStruct(Ty, getContext());
919 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, IsIndirect,
920 getContext().getTypeInfoInChars(Ty),
921 CharUnits::fromQuantity(4),
922 /*AllowHigherAlign=*/true);
923 }
924
925 //===----------------------------------------------------------------------===//
926 // le32/PNaCl bitcode ABI Implementation
927 //
928 // This is a simplified version of the x86_32 ABI. Arguments and return values
929 // are always passed on the stack.
930 //===----------------------------------------------------------------------===//
931
932 class PNaClABIInfo : public ABIInfo {
933 public:
PNaClABIInfo(CodeGen::CodeGenTypes & CGT)934 PNaClABIInfo(CodeGen::CodeGenTypes &CGT) : ABIInfo(CGT) {}
935
936 ABIArgInfo classifyReturnType(QualType RetTy) const;
937 ABIArgInfo classifyArgumentType(QualType RetTy) const;
938
939 void computeInfo(CGFunctionInfo &FI) const override;
940 Address EmitVAArg(CodeGenFunction &CGF,
941 Address VAListAddr, QualType Ty) const override;
942 };
943
944 class PNaClTargetCodeGenInfo : public TargetCodeGenInfo {
945 public:
PNaClTargetCodeGenInfo(CodeGen::CodeGenTypes & CGT)946 PNaClTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT)
947 : TargetCodeGenInfo(std::make_unique<PNaClABIInfo>(CGT)) {}
948 };
949
computeInfo(CGFunctionInfo & FI) const950 void PNaClABIInfo::computeInfo(CGFunctionInfo &FI) const {
951 if (!getCXXABI().classifyReturnType(FI))
952 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
953
954 for (auto &I : FI.arguments())
955 I.info = classifyArgumentType(I.type);
956 }
957
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const958 Address PNaClABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
959 QualType Ty) const {
960 // The PNaCL ABI is a bit odd, in that varargs don't use normal
961 // function classification. Structs get passed directly for varargs
962 // functions, through a rewriting transform in
963 // pnacl-llvm/lib/Transforms/NaCl/ExpandVarArgs.cpp, which allows
964 // this target to actually support a va_arg instructions with an
965 // aggregate type, unlike other targets.
966 return EmitVAArgInstr(CGF, VAListAddr, Ty, ABIArgInfo::getDirect());
967 }
968
969 /// Classify argument of given type \p Ty.
classifyArgumentType(QualType Ty) const970 ABIArgInfo PNaClABIInfo::classifyArgumentType(QualType Ty) const {
971 if (isAggregateTypeForABI(Ty)) {
972 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
973 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
974 return getNaturalAlignIndirect(Ty);
975 } else if (const EnumType *EnumTy = Ty->getAs<EnumType>()) {
976 // Treat an enum type as its underlying type.
977 Ty = EnumTy->getDecl()->getIntegerType();
978 } else if (Ty->isFloatingType()) {
979 // Floating-point types don't go inreg.
980 return ABIArgInfo::getDirect();
981 } else if (const auto *EIT = Ty->getAs<ExtIntType>()) {
982 // Treat extended integers as integers if <=64, otherwise pass indirectly.
983 if (EIT->getNumBits() > 64)
984 return getNaturalAlignIndirect(Ty);
985 return ABIArgInfo::getDirect();
986 }
987
988 return (isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
989 : ABIArgInfo::getDirect());
990 }
991
classifyReturnType(QualType RetTy) const992 ABIArgInfo PNaClABIInfo::classifyReturnType(QualType RetTy) const {
993 if (RetTy->isVoidType())
994 return ABIArgInfo::getIgnore();
995
996 // In the PNaCl ABI we always return records/structures on the stack.
997 if (isAggregateTypeForABI(RetTy))
998 return getNaturalAlignIndirect(RetTy);
999
1000 // Treat extended integers as integers if <=64, otherwise pass indirectly.
1001 if (const auto *EIT = RetTy->getAs<ExtIntType>()) {
1002 if (EIT->getNumBits() > 64)
1003 return getNaturalAlignIndirect(RetTy);
1004 return ABIArgInfo::getDirect();
1005 }
1006
1007 // Treat an enum type as its underlying type.
1008 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
1009 RetTy = EnumTy->getDecl()->getIntegerType();
1010
1011 return (isPromotableIntegerTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
1012 : ABIArgInfo::getDirect());
1013 }
1014
1015 /// IsX86_MMXType - Return true if this is an MMX type.
IsX86_MMXType(llvm::Type * IRType)1016 bool IsX86_MMXType(llvm::Type *IRType) {
1017 // Return true if the type is an MMX type <2 x i32>, <4 x i16>, or <8 x i8>.
1018 return IRType->isVectorTy() && IRType->getPrimitiveSizeInBits() == 64 &&
1019 cast<llvm::VectorType>(IRType)->getElementType()->isIntegerTy() &&
1020 IRType->getScalarSizeInBits() != 64;
1021 }
1022
X86AdjustInlineAsmType(CodeGen::CodeGenFunction & CGF,StringRef Constraint,llvm::Type * Ty)1023 static llvm::Type* X86AdjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
1024 StringRef Constraint,
1025 llvm::Type* Ty) {
1026 bool IsMMXCons = llvm::StringSwitch<bool>(Constraint)
1027 .Cases("y", "&y", "^Ym", true)
1028 .Default(false);
1029 if (IsMMXCons && Ty->isVectorTy()) {
1030 if (cast<llvm::VectorType>(Ty)->getPrimitiveSizeInBits().getFixedSize() !=
1031 64) {
1032 // Invalid MMX constraint
1033 return nullptr;
1034 }
1035
1036 return llvm::Type::getX86_MMXTy(CGF.getLLVMContext());
1037 }
1038
1039 // No operation needed
1040 return Ty;
1041 }
1042
1043 /// Returns true if this type can be passed in SSE registers with the
1044 /// X86_VectorCall calling convention. Shared between x86_32 and x86_64.
isX86VectorTypeForVectorCall(ASTContext & Context,QualType Ty)1045 static bool isX86VectorTypeForVectorCall(ASTContext &Context, QualType Ty) {
1046 if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
1047 if (BT->isFloatingPoint() && BT->getKind() != BuiltinType::Half) {
1048 if (BT->getKind() == BuiltinType::LongDouble) {
1049 if (&Context.getTargetInfo().getLongDoubleFormat() ==
1050 &llvm::APFloat::x87DoubleExtended())
1051 return false;
1052 }
1053 return true;
1054 }
1055 } else if (const VectorType *VT = Ty->getAs<VectorType>()) {
1056 // vectorcall can pass XMM, YMM, and ZMM vectors. We don't pass SSE1 MMX
1057 // registers specially.
1058 unsigned VecSize = Context.getTypeSize(VT);
1059 if (VecSize == 128 || VecSize == 256 || VecSize == 512)
1060 return true;
1061 }
1062 return false;
1063 }
1064
1065 /// Returns true if this aggregate is small enough to be passed in SSE registers
1066 /// in the X86_VectorCall calling convention. Shared between x86_32 and x86_64.
isX86VectorCallAggregateSmallEnough(uint64_t NumMembers)1067 static bool isX86VectorCallAggregateSmallEnough(uint64_t NumMembers) {
1068 return NumMembers <= 4;
1069 }
1070
1071 /// Returns a Homogeneous Vector Aggregate ABIArgInfo, used in X86.
getDirectX86Hva(llvm::Type * T=nullptr)1072 static ABIArgInfo getDirectX86Hva(llvm::Type* T = nullptr) {
1073 auto AI = ABIArgInfo::getDirect(T);
1074 AI.setInReg(true);
1075 AI.setCanBeFlattened(false);
1076 return AI;
1077 }
1078
1079 //===----------------------------------------------------------------------===//
1080 // X86-32 ABI Implementation
1081 //===----------------------------------------------------------------------===//
1082
1083 /// Similar to llvm::CCState, but for Clang.
1084 struct CCState {
CCState__anon6bad40bc0111::CCState1085 CCState(CGFunctionInfo &FI)
1086 : IsPreassigned(FI.arg_size()), CC(FI.getCallingConvention()) {}
1087
1088 llvm::SmallBitVector IsPreassigned;
1089 unsigned CC = CallingConv::CC_C;
1090 unsigned FreeRegs = 0;
1091 unsigned FreeSSERegs = 0;
1092 };
1093
1094 /// X86_32ABIInfo - The X86-32 ABI information.
1095 class X86_32ABIInfo : public SwiftABIInfo {
1096 enum Class {
1097 Integer,
1098 Float
1099 };
1100
1101 static const unsigned MinABIStackAlignInBytes = 4;
1102
1103 bool IsDarwinVectorABI;
1104 bool IsRetSmallStructInRegABI;
1105 bool IsWin32StructABI;
1106 bool IsSoftFloatABI;
1107 bool IsMCUABI;
1108 bool IsLinuxABI;
1109 unsigned DefaultNumRegisterParameters;
1110
isRegisterSize(unsigned Size)1111 static bool isRegisterSize(unsigned Size) {
1112 return (Size == 8 || Size == 16 || Size == 32 || Size == 64);
1113 }
1114
isHomogeneousAggregateBaseType(QualType Ty) const1115 bool isHomogeneousAggregateBaseType(QualType Ty) const override {
1116 // FIXME: Assumes vectorcall is in use.
1117 return isX86VectorTypeForVectorCall(getContext(), Ty);
1118 }
1119
isHomogeneousAggregateSmallEnough(const Type * Ty,uint64_t NumMembers) const1120 bool isHomogeneousAggregateSmallEnough(const Type *Ty,
1121 uint64_t NumMembers) const override {
1122 // FIXME: Assumes vectorcall is in use.
1123 return isX86VectorCallAggregateSmallEnough(NumMembers);
1124 }
1125
1126 bool shouldReturnTypeInRegister(QualType Ty, ASTContext &Context) const;
1127
1128 /// getIndirectResult - Give a source type \arg Ty, return a suitable result
1129 /// such that the argument will be passed in memory.
1130 ABIArgInfo getIndirectResult(QualType Ty, bool ByVal, CCState &State) const;
1131
1132 ABIArgInfo getIndirectReturnResult(QualType Ty, CCState &State) const;
1133
1134 /// Return the alignment to use for the given type on the stack.
1135 unsigned getTypeStackAlignInBytes(QualType Ty, unsigned Align) const;
1136
1137 Class classify(QualType Ty) const;
1138 ABIArgInfo classifyReturnType(QualType RetTy, CCState &State) const;
1139 ABIArgInfo classifyArgumentType(QualType RetTy, CCState &State) const;
1140
1141 /// Updates the number of available free registers, returns
1142 /// true if any registers were allocated.
1143 bool updateFreeRegs(QualType Ty, CCState &State) const;
1144
1145 bool shouldAggregateUseDirect(QualType Ty, CCState &State, bool &InReg,
1146 bool &NeedsPadding) const;
1147 bool shouldPrimitiveUseInReg(QualType Ty, CCState &State) const;
1148
1149 bool canExpandIndirectArgument(QualType Ty) const;
1150
1151 /// Rewrite the function info so that all memory arguments use
1152 /// inalloca.
1153 void rewriteWithInAlloca(CGFunctionInfo &FI) const;
1154
1155 void addFieldToArgStruct(SmallVector<llvm::Type *, 6> &FrameFields,
1156 CharUnits &StackOffset, ABIArgInfo &Info,
1157 QualType Type) const;
1158 void runVectorCallFirstPass(CGFunctionInfo &FI, CCState &State) const;
1159
1160 public:
1161
1162 void computeInfo(CGFunctionInfo &FI) const override;
1163 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
1164 QualType Ty) const override;
1165
X86_32ABIInfo(CodeGen::CodeGenTypes & CGT,bool DarwinVectorABI,bool RetSmallStructInRegABI,bool Win32StructABI,unsigned NumRegisterParameters,bool SoftFloatABI)1166 X86_32ABIInfo(CodeGen::CodeGenTypes &CGT, bool DarwinVectorABI,
1167 bool RetSmallStructInRegABI, bool Win32StructABI,
1168 unsigned NumRegisterParameters, bool SoftFloatABI)
1169 : SwiftABIInfo(CGT), IsDarwinVectorABI(DarwinVectorABI),
1170 IsRetSmallStructInRegABI(RetSmallStructInRegABI),
1171 IsWin32StructABI(Win32StructABI), IsSoftFloatABI(SoftFloatABI),
1172 IsMCUABI(CGT.getTarget().getTriple().isOSIAMCU()),
1173 IsLinuxABI(CGT.getTarget().getTriple().isOSLinux()),
1174 DefaultNumRegisterParameters(NumRegisterParameters) {}
1175
shouldPassIndirectlyForSwift(ArrayRef<llvm::Type * > scalars,bool asReturnValue) const1176 bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars,
1177 bool asReturnValue) const override {
1178 // LLVM's x86-32 lowering currently only assigns up to three
1179 // integer registers and three fp registers. Oddly, it'll use up to
1180 // four vector registers for vectors, but those can overlap with the
1181 // scalar registers.
1182 return occupiesMoreThan(CGT, scalars, /*total*/ 3);
1183 }
1184
isSwiftErrorInRegister() const1185 bool isSwiftErrorInRegister() const override {
1186 // x86-32 lowering does not support passing swifterror in a register.
1187 return false;
1188 }
1189 };
1190
1191 class X86_32TargetCodeGenInfo : public TargetCodeGenInfo {
1192 public:
X86_32TargetCodeGenInfo(CodeGen::CodeGenTypes & CGT,bool DarwinVectorABI,bool RetSmallStructInRegABI,bool Win32StructABI,unsigned NumRegisterParameters,bool SoftFloatABI)1193 X86_32TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, bool DarwinVectorABI,
1194 bool RetSmallStructInRegABI, bool Win32StructABI,
1195 unsigned NumRegisterParameters, bool SoftFloatABI)
1196 : TargetCodeGenInfo(std::make_unique<X86_32ABIInfo>(
1197 CGT, DarwinVectorABI, RetSmallStructInRegABI, Win32StructABI,
1198 NumRegisterParameters, SoftFloatABI)) {}
1199
1200 static bool isStructReturnInRegABI(
1201 const llvm::Triple &Triple, const CodeGenOptions &Opts);
1202
1203 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
1204 CodeGen::CodeGenModule &CGM) const override;
1205
getDwarfEHStackPointer(CodeGen::CodeGenModule & CGM) const1206 int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const override {
1207 // Darwin uses different dwarf register numbers for EH.
1208 if (CGM.getTarget().getTriple().isOSDarwin()) return 5;
1209 return 4;
1210 }
1211
1212 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
1213 llvm::Value *Address) const override;
1214
adjustInlineAsmType(CodeGen::CodeGenFunction & CGF,StringRef Constraint,llvm::Type * Ty) const1215 llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
1216 StringRef Constraint,
1217 llvm::Type* Ty) const override {
1218 return X86AdjustInlineAsmType(CGF, Constraint, Ty);
1219 }
1220
1221 void addReturnRegisterOutputs(CodeGenFunction &CGF, LValue ReturnValue,
1222 std::string &Constraints,
1223 std::vector<llvm::Type *> &ResultRegTypes,
1224 std::vector<llvm::Type *> &ResultTruncRegTypes,
1225 std::vector<LValue> &ResultRegDests,
1226 std::string &AsmString,
1227 unsigned NumOutputs) const override;
1228
1229 llvm::Constant *
getUBSanFunctionSignature(CodeGen::CodeGenModule & CGM) const1230 getUBSanFunctionSignature(CodeGen::CodeGenModule &CGM) const override {
1231 unsigned Sig = (0xeb << 0) | // jmp rel8
1232 (0x06 << 8) | // .+0x08
1233 ('v' << 16) |
1234 ('2' << 24);
1235 return llvm::ConstantInt::get(CGM.Int32Ty, Sig);
1236 }
1237
getARCRetainAutoreleasedReturnValueMarker() const1238 StringRef getARCRetainAutoreleasedReturnValueMarker() const override {
1239 return "movl\t%ebp, %ebp"
1240 "\t\t// marker for objc_retainAutoreleaseReturnValue";
1241 }
1242 };
1243
1244 }
1245
1246 /// Rewrite input constraint references after adding some output constraints.
1247 /// In the case where there is one output and one input and we add one output,
1248 /// we need to replace all operand references greater than or equal to 1:
1249 /// mov $0, $1
1250 /// mov eax, $1
1251 /// The result will be:
1252 /// mov $0, $2
1253 /// mov eax, $2
rewriteInputConstraintReferences(unsigned FirstIn,unsigned NumNewOuts,std::string & AsmString)1254 static void rewriteInputConstraintReferences(unsigned FirstIn,
1255 unsigned NumNewOuts,
1256 std::string &AsmString) {
1257 std::string Buf;
1258 llvm::raw_string_ostream OS(Buf);
1259 size_t Pos = 0;
1260 while (Pos < AsmString.size()) {
1261 size_t DollarStart = AsmString.find('$', Pos);
1262 if (DollarStart == std::string::npos)
1263 DollarStart = AsmString.size();
1264 size_t DollarEnd = AsmString.find_first_not_of('$', DollarStart);
1265 if (DollarEnd == std::string::npos)
1266 DollarEnd = AsmString.size();
1267 OS << StringRef(&AsmString[Pos], DollarEnd - Pos);
1268 Pos = DollarEnd;
1269 size_t NumDollars = DollarEnd - DollarStart;
1270 if (NumDollars % 2 != 0 && Pos < AsmString.size()) {
1271 // We have an operand reference.
1272 size_t DigitStart = Pos;
1273 if (AsmString[DigitStart] == '{') {
1274 OS << '{';
1275 ++DigitStart;
1276 }
1277 size_t DigitEnd = AsmString.find_first_not_of("0123456789", DigitStart);
1278 if (DigitEnd == std::string::npos)
1279 DigitEnd = AsmString.size();
1280 StringRef OperandStr(&AsmString[DigitStart], DigitEnd - DigitStart);
1281 unsigned OperandIndex;
1282 if (!OperandStr.getAsInteger(10, OperandIndex)) {
1283 if (OperandIndex >= FirstIn)
1284 OperandIndex += NumNewOuts;
1285 OS << OperandIndex;
1286 } else {
1287 OS << OperandStr;
1288 }
1289 Pos = DigitEnd;
1290 }
1291 }
1292 AsmString = std::move(OS.str());
1293 }
1294
1295 /// Add output constraints for EAX:EDX because they are return registers.
addReturnRegisterOutputs(CodeGenFunction & CGF,LValue ReturnSlot,std::string & Constraints,std::vector<llvm::Type * > & ResultRegTypes,std::vector<llvm::Type * > & ResultTruncRegTypes,std::vector<LValue> & ResultRegDests,std::string & AsmString,unsigned NumOutputs) const1296 void X86_32TargetCodeGenInfo::addReturnRegisterOutputs(
1297 CodeGenFunction &CGF, LValue ReturnSlot, std::string &Constraints,
1298 std::vector<llvm::Type *> &ResultRegTypes,
1299 std::vector<llvm::Type *> &ResultTruncRegTypes,
1300 std::vector<LValue> &ResultRegDests, std::string &AsmString,
1301 unsigned NumOutputs) const {
1302 uint64_t RetWidth = CGF.getContext().getTypeSize(ReturnSlot.getType());
1303
1304 // Use the EAX constraint if the width is 32 or smaller and EAX:EDX if it is
1305 // larger.
1306 if (!Constraints.empty())
1307 Constraints += ',';
1308 if (RetWidth <= 32) {
1309 Constraints += "={eax}";
1310 ResultRegTypes.push_back(CGF.Int32Ty);
1311 } else {
1312 // Use the 'A' constraint for EAX:EDX.
1313 Constraints += "=A";
1314 ResultRegTypes.push_back(CGF.Int64Ty);
1315 }
1316
1317 // Truncate EAX or EAX:EDX to an integer of the appropriate size.
1318 llvm::Type *CoerceTy = llvm::IntegerType::get(CGF.getLLVMContext(), RetWidth);
1319 ResultTruncRegTypes.push_back(CoerceTy);
1320
1321 // Coerce the integer by bitcasting the return slot pointer.
1322 ReturnSlot.setAddress(CGF.Builder.CreateBitCast(ReturnSlot.getAddress(CGF),
1323 CoerceTy->getPointerTo()));
1324 ResultRegDests.push_back(ReturnSlot);
1325
1326 rewriteInputConstraintReferences(NumOutputs, 1, AsmString);
1327 }
1328
1329 /// shouldReturnTypeInRegister - Determine if the given type should be
1330 /// returned in a register (for the Darwin and MCU ABI).
shouldReturnTypeInRegister(QualType Ty,ASTContext & Context) const1331 bool X86_32ABIInfo::shouldReturnTypeInRegister(QualType Ty,
1332 ASTContext &Context) const {
1333 uint64_t Size = Context.getTypeSize(Ty);
1334
1335 // For i386, type must be register sized.
1336 // For the MCU ABI, it only needs to be <= 8-byte
1337 if ((IsMCUABI && Size > 64) || (!IsMCUABI && !isRegisterSize(Size)))
1338 return false;
1339
1340 if (Ty->isVectorType()) {
1341 // 64- and 128- bit vectors inside structures are not returned in
1342 // registers.
1343 if (Size == 64 || Size == 128)
1344 return false;
1345
1346 return true;
1347 }
1348
1349 // If this is a builtin, pointer, enum, complex type, member pointer, or
1350 // member function pointer it is ok.
1351 if (Ty->getAs<BuiltinType>() || Ty->hasPointerRepresentation() ||
1352 Ty->isAnyComplexType() || Ty->isEnumeralType() ||
1353 Ty->isBlockPointerType() || Ty->isMemberPointerType())
1354 return true;
1355
1356 // Arrays are treated like records.
1357 if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty))
1358 return shouldReturnTypeInRegister(AT->getElementType(), Context);
1359
1360 // Otherwise, it must be a record type.
1361 const RecordType *RT = Ty->getAs<RecordType>();
1362 if (!RT) return false;
1363
1364 // FIXME: Traverse bases here too.
1365
1366 // Structure types are passed in register if all fields would be
1367 // passed in a register.
1368 for (const auto *FD : RT->getDecl()->fields()) {
1369 // Empty fields are ignored.
1370 if (isEmptyField(Context, FD, true))
1371 continue;
1372
1373 // Check fields recursively.
1374 if (!shouldReturnTypeInRegister(FD->getType(), Context))
1375 return false;
1376 }
1377 return true;
1378 }
1379
is32Or64BitBasicType(QualType Ty,ASTContext & Context)1380 static bool is32Or64BitBasicType(QualType Ty, ASTContext &Context) {
1381 // Treat complex types as the element type.
1382 if (const ComplexType *CTy = Ty->getAs<ComplexType>())
1383 Ty = CTy->getElementType();
1384
1385 // Check for a type which we know has a simple scalar argument-passing
1386 // convention without any padding. (We're specifically looking for 32
1387 // and 64-bit integer and integer-equivalents, float, and double.)
1388 if (!Ty->getAs<BuiltinType>() && !Ty->hasPointerRepresentation() &&
1389 !Ty->isEnumeralType() && !Ty->isBlockPointerType())
1390 return false;
1391
1392 uint64_t Size = Context.getTypeSize(Ty);
1393 return Size == 32 || Size == 64;
1394 }
1395
addFieldSizes(ASTContext & Context,const RecordDecl * RD,uint64_t & Size)1396 static bool addFieldSizes(ASTContext &Context, const RecordDecl *RD,
1397 uint64_t &Size) {
1398 for (const auto *FD : RD->fields()) {
1399 // Scalar arguments on the stack get 4 byte alignment on x86. If the
1400 // argument is smaller than 32-bits, expanding the struct will create
1401 // alignment padding.
1402 if (!is32Or64BitBasicType(FD->getType(), Context))
1403 return false;
1404
1405 // FIXME: Reject bit-fields wholesale; there are two problems, we don't know
1406 // how to expand them yet, and the predicate for telling if a bitfield still
1407 // counts as "basic" is more complicated than what we were doing previously.
1408 if (FD->isBitField())
1409 return false;
1410
1411 Size += Context.getTypeSize(FD->getType());
1412 }
1413 return true;
1414 }
1415
addBaseAndFieldSizes(ASTContext & Context,const CXXRecordDecl * RD,uint64_t & Size)1416 static bool addBaseAndFieldSizes(ASTContext &Context, const CXXRecordDecl *RD,
1417 uint64_t &Size) {
1418 // Don't do this if there are any non-empty bases.
1419 for (const CXXBaseSpecifier &Base : RD->bases()) {
1420 if (!addBaseAndFieldSizes(Context, Base.getType()->getAsCXXRecordDecl(),
1421 Size))
1422 return false;
1423 }
1424 if (!addFieldSizes(Context, RD, Size))
1425 return false;
1426 return true;
1427 }
1428
1429 /// Test whether an argument type which is to be passed indirectly (on the
1430 /// stack) would have the equivalent layout if it was expanded into separate
1431 /// arguments. If so, we prefer to do the latter to avoid inhibiting
1432 /// optimizations.
canExpandIndirectArgument(QualType Ty) const1433 bool X86_32ABIInfo::canExpandIndirectArgument(QualType Ty) const {
1434 // We can only expand structure types.
1435 const RecordType *RT = Ty->getAs<RecordType>();
1436 if (!RT)
1437 return false;
1438 const RecordDecl *RD = RT->getDecl();
1439 uint64_t Size = 0;
1440 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1441 if (!IsWin32StructABI) {
1442 // On non-Windows, we have to conservatively match our old bitcode
1443 // prototypes in order to be ABI-compatible at the bitcode level.
1444 if (!CXXRD->isCLike())
1445 return false;
1446 } else {
1447 // Don't do this for dynamic classes.
1448 if (CXXRD->isDynamicClass())
1449 return false;
1450 }
1451 if (!addBaseAndFieldSizes(getContext(), CXXRD, Size))
1452 return false;
1453 } else {
1454 if (!addFieldSizes(getContext(), RD, Size))
1455 return false;
1456 }
1457
1458 // We can do this if there was no alignment padding.
1459 return Size == getContext().getTypeSize(Ty);
1460 }
1461
getIndirectReturnResult(QualType RetTy,CCState & State) const1462 ABIArgInfo X86_32ABIInfo::getIndirectReturnResult(QualType RetTy, CCState &State) const {
1463 // If the return value is indirect, then the hidden argument is consuming one
1464 // integer register.
1465 if (State.FreeRegs) {
1466 --State.FreeRegs;
1467 if (!IsMCUABI)
1468 return getNaturalAlignIndirectInReg(RetTy);
1469 }
1470 return getNaturalAlignIndirect(RetTy, /*ByVal=*/false);
1471 }
1472
classifyReturnType(QualType RetTy,CCState & State) const1473 ABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy,
1474 CCState &State) const {
1475 if (RetTy->isVoidType())
1476 return ABIArgInfo::getIgnore();
1477
1478 const Type *Base = nullptr;
1479 uint64_t NumElts = 0;
1480 if ((State.CC == llvm::CallingConv::X86_VectorCall ||
1481 State.CC == llvm::CallingConv::X86_RegCall) &&
1482 isHomogeneousAggregate(RetTy, Base, NumElts)) {
1483 // The LLVM struct type for such an aggregate should lower properly.
1484 return ABIArgInfo::getDirect();
1485 }
1486
1487 if (const VectorType *VT = RetTy->getAs<VectorType>()) {
1488 // On Darwin, some vectors are returned in registers.
1489 if (IsDarwinVectorABI) {
1490 uint64_t Size = getContext().getTypeSize(RetTy);
1491
1492 // 128-bit vectors are a special case; they are returned in
1493 // registers and we need to make sure to pick a type the LLVM
1494 // backend will like.
1495 if (Size == 128)
1496 return ABIArgInfo::getDirect(llvm::FixedVectorType::get(
1497 llvm::Type::getInt64Ty(getVMContext()), 2));
1498
1499 // Always return in register if it fits in a general purpose
1500 // register, or if it is 64 bits and has a single element.
1501 if ((Size == 8 || Size == 16 || Size == 32) ||
1502 (Size == 64 && VT->getNumElements() == 1))
1503 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),
1504 Size));
1505
1506 return getIndirectReturnResult(RetTy, State);
1507 }
1508
1509 return ABIArgInfo::getDirect();
1510 }
1511
1512 if (isAggregateTypeForABI(RetTy)) {
1513 if (const RecordType *RT = RetTy->getAs<RecordType>()) {
1514 // Structures with flexible arrays are always indirect.
1515 if (RT->getDecl()->hasFlexibleArrayMember())
1516 return getIndirectReturnResult(RetTy, State);
1517 }
1518
1519 // If specified, structs and unions are always indirect.
1520 if (!IsRetSmallStructInRegABI && !RetTy->isAnyComplexType())
1521 return getIndirectReturnResult(RetTy, State);
1522
1523 // Ignore empty structs/unions.
1524 if (isEmptyRecord(getContext(), RetTy, true))
1525 return ABIArgInfo::getIgnore();
1526
1527 // Small structures which are register sized are generally returned
1528 // in a register.
1529 if (shouldReturnTypeInRegister(RetTy, getContext())) {
1530 uint64_t Size = getContext().getTypeSize(RetTy);
1531
1532 // As a special-case, if the struct is a "single-element" struct, and
1533 // the field is of type "float" or "double", return it in a
1534 // floating-point register. (MSVC does not apply this special case.)
1535 // We apply a similar transformation for pointer types to improve the
1536 // quality of the generated IR.
1537 if (const Type *SeltTy = isSingleElementStruct(RetTy, getContext()))
1538 if ((!IsWin32StructABI && SeltTy->isRealFloatingType())
1539 || SeltTy->hasPointerRepresentation())
1540 return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0)));
1541
1542 // FIXME: We should be able to narrow this integer in cases with dead
1543 // padding.
1544 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),Size));
1545 }
1546
1547 return getIndirectReturnResult(RetTy, State);
1548 }
1549
1550 // Treat an enum type as its underlying type.
1551 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
1552 RetTy = EnumTy->getDecl()->getIntegerType();
1553
1554 if (const auto *EIT = RetTy->getAs<ExtIntType>())
1555 if (EIT->getNumBits() > 64)
1556 return getIndirectReturnResult(RetTy, State);
1557
1558 return (isPromotableIntegerTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
1559 : ABIArgInfo::getDirect());
1560 }
1561
isSIMDVectorType(ASTContext & Context,QualType Ty)1562 static bool isSIMDVectorType(ASTContext &Context, QualType Ty) {
1563 return Ty->getAs<VectorType>() && Context.getTypeSize(Ty) == 128;
1564 }
1565
isRecordWithSIMDVectorType(ASTContext & Context,QualType Ty)1566 static bool isRecordWithSIMDVectorType(ASTContext &Context, QualType Ty) {
1567 const RecordType *RT = Ty->getAs<RecordType>();
1568 if (!RT)
1569 return 0;
1570 const RecordDecl *RD = RT->getDecl();
1571
1572 // If this is a C++ record, check the bases first.
1573 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
1574 for (const auto &I : CXXRD->bases())
1575 if (!isRecordWithSIMDVectorType(Context, I.getType()))
1576 return false;
1577
1578 for (const auto *i : RD->fields()) {
1579 QualType FT = i->getType();
1580
1581 if (isSIMDVectorType(Context, FT))
1582 return true;
1583
1584 if (isRecordWithSIMDVectorType(Context, FT))
1585 return true;
1586 }
1587
1588 return false;
1589 }
1590
getTypeStackAlignInBytes(QualType Ty,unsigned Align) const1591 unsigned X86_32ABIInfo::getTypeStackAlignInBytes(QualType Ty,
1592 unsigned Align) const {
1593 // Otherwise, if the alignment is less than or equal to the minimum ABI
1594 // alignment, just use the default; the backend will handle this.
1595 if (Align <= MinABIStackAlignInBytes)
1596 return 0; // Use default alignment.
1597
1598 if (IsLinuxABI) {
1599 // Exclude other System V OS (e.g Darwin, PS4 and FreeBSD) since we don't
1600 // want to spend any effort dealing with the ramifications of ABI breaks.
1601 //
1602 // If the vector type is __m128/__m256/__m512, return the default alignment.
1603 if (Ty->isVectorType() && (Align == 16 || Align == 32 || Align == 64))
1604 return Align;
1605 }
1606 // On non-Darwin, the stack type alignment is always 4.
1607 if (!IsDarwinVectorABI) {
1608 // Set explicit alignment, since we may need to realign the top.
1609 return MinABIStackAlignInBytes;
1610 }
1611
1612 // Otherwise, if the type contains an SSE vector type, the alignment is 16.
1613 if (Align >= 16 && (isSIMDVectorType(getContext(), Ty) ||
1614 isRecordWithSIMDVectorType(getContext(), Ty)))
1615 return 16;
1616
1617 return MinABIStackAlignInBytes;
1618 }
1619
getIndirectResult(QualType Ty,bool ByVal,CCState & State) const1620 ABIArgInfo X86_32ABIInfo::getIndirectResult(QualType Ty, bool ByVal,
1621 CCState &State) const {
1622 if (!ByVal) {
1623 if (State.FreeRegs) {
1624 --State.FreeRegs; // Non-byval indirects just use one pointer.
1625 if (!IsMCUABI)
1626 return getNaturalAlignIndirectInReg(Ty);
1627 }
1628 return getNaturalAlignIndirect(Ty, false);
1629 }
1630
1631 // Compute the byval alignment.
1632 unsigned TypeAlign = getContext().getTypeAlign(Ty) / 8;
1633 unsigned StackAlign = getTypeStackAlignInBytes(Ty, TypeAlign);
1634 if (StackAlign == 0)
1635 return ABIArgInfo::getIndirect(CharUnits::fromQuantity(4), /*ByVal=*/true);
1636
1637 // If the stack alignment is less than the type alignment, realign the
1638 // argument.
1639 bool Realign = TypeAlign > StackAlign;
1640 return ABIArgInfo::getIndirect(CharUnits::fromQuantity(StackAlign),
1641 /*ByVal=*/true, Realign);
1642 }
1643
classify(QualType Ty) const1644 X86_32ABIInfo::Class X86_32ABIInfo::classify(QualType Ty) const {
1645 const Type *T = isSingleElementStruct(Ty, getContext());
1646 if (!T)
1647 T = Ty.getTypePtr();
1648
1649 if (const BuiltinType *BT = T->getAs<BuiltinType>()) {
1650 BuiltinType::Kind K = BT->getKind();
1651 if (K == BuiltinType::Float || K == BuiltinType::Double)
1652 return Float;
1653 }
1654 return Integer;
1655 }
1656
updateFreeRegs(QualType Ty,CCState & State) const1657 bool X86_32ABIInfo::updateFreeRegs(QualType Ty, CCState &State) const {
1658 if (!IsSoftFloatABI) {
1659 Class C = classify(Ty);
1660 if (C == Float)
1661 return false;
1662 }
1663
1664 unsigned Size = getContext().getTypeSize(Ty);
1665 unsigned SizeInRegs = (Size + 31) / 32;
1666
1667 if (SizeInRegs == 0)
1668 return false;
1669
1670 if (!IsMCUABI) {
1671 if (SizeInRegs > State.FreeRegs) {
1672 State.FreeRegs = 0;
1673 return false;
1674 }
1675 } else {
1676 // The MCU psABI allows passing parameters in-reg even if there are
1677 // earlier parameters that are passed on the stack. Also,
1678 // it does not allow passing >8-byte structs in-register,
1679 // even if there are 3 free registers available.
1680 if (SizeInRegs > State.FreeRegs || SizeInRegs > 2)
1681 return false;
1682 }
1683
1684 State.FreeRegs -= SizeInRegs;
1685 return true;
1686 }
1687
shouldAggregateUseDirect(QualType Ty,CCState & State,bool & InReg,bool & NeedsPadding) const1688 bool X86_32ABIInfo::shouldAggregateUseDirect(QualType Ty, CCState &State,
1689 bool &InReg,
1690 bool &NeedsPadding) const {
1691 // On Windows, aggregates other than HFAs are never passed in registers, and
1692 // they do not consume register slots. Homogenous floating-point aggregates
1693 // (HFAs) have already been dealt with at this point.
1694 if (IsWin32StructABI && isAggregateTypeForABI(Ty))
1695 return false;
1696
1697 NeedsPadding = false;
1698 InReg = !IsMCUABI;
1699
1700 if (!updateFreeRegs(Ty, State))
1701 return false;
1702
1703 if (IsMCUABI)
1704 return true;
1705
1706 if (State.CC == llvm::CallingConv::X86_FastCall ||
1707 State.CC == llvm::CallingConv::X86_VectorCall ||
1708 State.CC == llvm::CallingConv::X86_RegCall) {
1709 if (getContext().getTypeSize(Ty) <= 32 && State.FreeRegs)
1710 NeedsPadding = true;
1711
1712 return false;
1713 }
1714
1715 return true;
1716 }
1717
shouldPrimitiveUseInReg(QualType Ty,CCState & State) const1718 bool X86_32ABIInfo::shouldPrimitiveUseInReg(QualType Ty, CCState &State) const {
1719 if (!updateFreeRegs(Ty, State))
1720 return false;
1721
1722 if (IsMCUABI)
1723 return false;
1724
1725 if (State.CC == llvm::CallingConv::X86_FastCall ||
1726 State.CC == llvm::CallingConv::X86_VectorCall ||
1727 State.CC == llvm::CallingConv::X86_RegCall) {
1728 if (getContext().getTypeSize(Ty) > 32)
1729 return false;
1730
1731 return (Ty->isIntegralOrEnumerationType() || Ty->isPointerType() ||
1732 Ty->isReferenceType());
1733 }
1734
1735 return true;
1736 }
1737
runVectorCallFirstPass(CGFunctionInfo & FI,CCState & State) const1738 void X86_32ABIInfo::runVectorCallFirstPass(CGFunctionInfo &FI, CCState &State) const {
1739 // Vectorcall x86 works subtly different than in x64, so the format is
1740 // a bit different than the x64 version. First, all vector types (not HVAs)
1741 // are assigned, with the first 6 ending up in the [XYZ]MM0-5 registers.
1742 // This differs from the x64 implementation, where the first 6 by INDEX get
1743 // registers.
1744 // In the second pass over the arguments, HVAs are passed in the remaining
1745 // vector registers if possible, or indirectly by address. The address will be
1746 // passed in ECX/EDX if available. Any other arguments are passed according to
1747 // the usual fastcall rules.
1748 MutableArrayRef<CGFunctionInfoArgInfo> Args = FI.arguments();
1749 for (int I = 0, E = Args.size(); I < E; ++I) {
1750 const Type *Base = nullptr;
1751 uint64_t NumElts = 0;
1752 const QualType &Ty = Args[I].type;
1753 if ((Ty->isVectorType() || Ty->isBuiltinType()) &&
1754 isHomogeneousAggregate(Ty, Base, NumElts)) {
1755 if (State.FreeSSERegs >= NumElts) {
1756 State.FreeSSERegs -= NumElts;
1757 Args[I].info = ABIArgInfo::getDirectInReg();
1758 State.IsPreassigned.set(I);
1759 }
1760 }
1761 }
1762 }
1763
classifyArgumentType(QualType Ty,CCState & State) const1764 ABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty,
1765 CCState &State) const {
1766 // FIXME: Set alignment on indirect arguments.
1767 bool IsFastCall = State.CC == llvm::CallingConv::X86_FastCall;
1768 bool IsRegCall = State.CC == llvm::CallingConv::X86_RegCall;
1769 bool IsVectorCall = State.CC == llvm::CallingConv::X86_VectorCall;
1770
1771 Ty = useFirstFieldIfTransparentUnion(Ty);
1772 TypeInfo TI = getContext().getTypeInfo(Ty);
1773
1774 // Check with the C++ ABI first.
1775 const RecordType *RT = Ty->getAs<RecordType>();
1776 if (RT) {
1777 CGCXXABI::RecordArgABI RAA = getRecordArgABI(RT, getCXXABI());
1778 if (RAA == CGCXXABI::RAA_Indirect) {
1779 return getIndirectResult(Ty, false, State);
1780 } else if (RAA == CGCXXABI::RAA_DirectInMemory) {
1781 // The field index doesn't matter, we'll fix it up later.
1782 return ABIArgInfo::getInAlloca(/*FieldIndex=*/0);
1783 }
1784 }
1785
1786 // Regcall uses the concept of a homogenous vector aggregate, similar
1787 // to other targets.
1788 const Type *Base = nullptr;
1789 uint64_t NumElts = 0;
1790 if ((IsRegCall || IsVectorCall) &&
1791 isHomogeneousAggregate(Ty, Base, NumElts)) {
1792 if (State.FreeSSERegs >= NumElts) {
1793 State.FreeSSERegs -= NumElts;
1794
1795 // Vectorcall passes HVAs directly and does not flatten them, but regcall
1796 // does.
1797 if (IsVectorCall)
1798 return getDirectX86Hva();
1799
1800 if (Ty->isBuiltinType() || Ty->isVectorType())
1801 return ABIArgInfo::getDirect();
1802 return ABIArgInfo::getExpand();
1803 }
1804 return getIndirectResult(Ty, /*ByVal=*/false, State);
1805 }
1806
1807 if (isAggregateTypeForABI(Ty)) {
1808 // Structures with flexible arrays are always indirect.
1809 // FIXME: This should not be byval!
1810 if (RT && RT->getDecl()->hasFlexibleArrayMember())
1811 return getIndirectResult(Ty, true, State);
1812
1813 // Ignore empty structs/unions on non-Windows.
1814 if (!IsWin32StructABI && isEmptyRecord(getContext(), Ty, true))
1815 return ABIArgInfo::getIgnore();
1816
1817 llvm::LLVMContext &LLVMContext = getVMContext();
1818 llvm::IntegerType *Int32 = llvm::Type::getInt32Ty(LLVMContext);
1819 bool NeedsPadding = false;
1820 bool InReg;
1821 if (shouldAggregateUseDirect(Ty, State, InReg, NeedsPadding)) {
1822 unsigned SizeInRegs = (TI.Width + 31) / 32;
1823 SmallVector<llvm::Type*, 3> Elements(SizeInRegs, Int32);
1824 llvm::Type *Result = llvm::StructType::get(LLVMContext, Elements);
1825 if (InReg)
1826 return ABIArgInfo::getDirectInReg(Result);
1827 else
1828 return ABIArgInfo::getDirect(Result);
1829 }
1830 llvm::IntegerType *PaddingType = NeedsPadding ? Int32 : nullptr;
1831
1832 // Pass over-aligned aggregates on Windows indirectly. This behavior was
1833 // added in MSVC 2015.
1834 if (IsWin32StructABI && TI.AlignIsRequired && TI.Align > 32)
1835 return getIndirectResult(Ty, /*ByVal=*/false, State);
1836
1837 // Expand small (<= 128-bit) record types when we know that the stack layout
1838 // of those arguments will match the struct. This is important because the
1839 // LLVM backend isn't smart enough to remove byval, which inhibits many
1840 // optimizations.
1841 // Don't do this for the MCU if there are still free integer registers
1842 // (see X86_64 ABI for full explanation).
1843 if (TI.Width <= 4 * 32 && (!IsMCUABI || State.FreeRegs == 0) &&
1844 canExpandIndirectArgument(Ty))
1845 return ABIArgInfo::getExpandWithPadding(
1846 IsFastCall || IsVectorCall || IsRegCall, PaddingType);
1847
1848 return getIndirectResult(Ty, true, State);
1849 }
1850
1851 if (const VectorType *VT = Ty->getAs<VectorType>()) {
1852 // On Windows, vectors are passed directly if registers are available, or
1853 // indirectly if not. This avoids the need to align argument memory. Pass
1854 // user-defined vector types larger than 512 bits indirectly for simplicity.
1855 if (IsWin32StructABI) {
1856 if (TI.Width <= 512 && State.FreeSSERegs > 0) {
1857 --State.FreeSSERegs;
1858 return ABIArgInfo::getDirectInReg();
1859 }
1860 return getIndirectResult(Ty, /*ByVal=*/false, State);
1861 }
1862
1863 // On Darwin, some vectors are passed in memory, we handle this by passing
1864 // it as an i8/i16/i32/i64.
1865 if (IsDarwinVectorABI) {
1866 if ((TI.Width == 8 || TI.Width == 16 || TI.Width == 32) ||
1867 (TI.Width == 64 && VT->getNumElements() == 1))
1868 return ABIArgInfo::getDirect(
1869 llvm::IntegerType::get(getVMContext(), TI.Width));
1870 }
1871
1872 if (IsX86_MMXType(CGT.ConvertType(Ty)))
1873 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), 64));
1874
1875 return ABIArgInfo::getDirect();
1876 }
1877
1878
1879 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
1880 Ty = EnumTy->getDecl()->getIntegerType();
1881
1882 bool InReg = shouldPrimitiveUseInReg(Ty, State);
1883
1884 if (isPromotableIntegerTypeForABI(Ty)) {
1885 if (InReg)
1886 return ABIArgInfo::getExtendInReg(Ty);
1887 return ABIArgInfo::getExtend(Ty);
1888 }
1889
1890 if (const auto * EIT = Ty->getAs<ExtIntType>()) {
1891 if (EIT->getNumBits() <= 64) {
1892 if (InReg)
1893 return ABIArgInfo::getDirectInReg();
1894 return ABIArgInfo::getDirect();
1895 }
1896 return getIndirectResult(Ty, /*ByVal=*/false, State);
1897 }
1898
1899 if (InReg)
1900 return ABIArgInfo::getDirectInReg();
1901 return ABIArgInfo::getDirect();
1902 }
1903
computeInfo(CGFunctionInfo & FI) const1904 void X86_32ABIInfo::computeInfo(CGFunctionInfo &FI) const {
1905 CCState State(FI);
1906 if (IsMCUABI)
1907 State.FreeRegs = 3;
1908 else if (State.CC == llvm::CallingConv::X86_FastCall) {
1909 State.FreeRegs = 2;
1910 State.FreeSSERegs = 3;
1911 } else if (State.CC == llvm::CallingConv::X86_VectorCall) {
1912 State.FreeRegs = 2;
1913 State.FreeSSERegs = 6;
1914 } else if (FI.getHasRegParm())
1915 State.FreeRegs = FI.getRegParm();
1916 else if (State.CC == llvm::CallingConv::X86_RegCall) {
1917 State.FreeRegs = 5;
1918 State.FreeSSERegs = 8;
1919 } else if (IsWin32StructABI) {
1920 // Since MSVC 2015, the first three SSE vectors have been passed in
1921 // registers. The rest are passed indirectly.
1922 State.FreeRegs = DefaultNumRegisterParameters;
1923 State.FreeSSERegs = 3;
1924 } else
1925 State.FreeRegs = DefaultNumRegisterParameters;
1926
1927 if (!::classifyReturnType(getCXXABI(), FI, *this)) {
1928 FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), State);
1929 } else if (FI.getReturnInfo().isIndirect()) {
1930 // The C++ ABI is not aware of register usage, so we have to check if the
1931 // return value was sret and put it in a register ourselves if appropriate.
1932 if (State.FreeRegs) {
1933 --State.FreeRegs; // The sret parameter consumes a register.
1934 if (!IsMCUABI)
1935 FI.getReturnInfo().setInReg(true);
1936 }
1937 }
1938
1939 // The chain argument effectively gives us another free register.
1940 if (FI.isChainCall())
1941 ++State.FreeRegs;
1942
1943 // For vectorcall, do a first pass over the arguments, assigning FP and vector
1944 // arguments to XMM registers as available.
1945 if (State.CC == llvm::CallingConv::X86_VectorCall)
1946 runVectorCallFirstPass(FI, State);
1947
1948 bool UsedInAlloca = false;
1949 MutableArrayRef<CGFunctionInfoArgInfo> Args = FI.arguments();
1950 for (int I = 0, E = Args.size(); I < E; ++I) {
1951 // Skip arguments that have already been assigned.
1952 if (State.IsPreassigned.test(I))
1953 continue;
1954
1955 Args[I].info = classifyArgumentType(Args[I].type, State);
1956 UsedInAlloca |= (Args[I].info.getKind() == ABIArgInfo::InAlloca);
1957 }
1958
1959 // If we needed to use inalloca for any argument, do a second pass and rewrite
1960 // all the memory arguments to use inalloca.
1961 if (UsedInAlloca)
1962 rewriteWithInAlloca(FI);
1963 }
1964
1965 void
addFieldToArgStruct(SmallVector<llvm::Type *,6> & FrameFields,CharUnits & StackOffset,ABIArgInfo & Info,QualType Type) const1966 X86_32ABIInfo::addFieldToArgStruct(SmallVector<llvm::Type *, 6> &FrameFields,
1967 CharUnits &StackOffset, ABIArgInfo &Info,
1968 QualType Type) const {
1969 // Arguments are always 4-byte-aligned.
1970 CharUnits WordSize = CharUnits::fromQuantity(4);
1971 assert(StackOffset.isMultipleOf(WordSize) && "unaligned inalloca struct");
1972
1973 // sret pointers and indirect things will require an extra pointer
1974 // indirection, unless they are byval. Most things are byval, and will not
1975 // require this indirection.
1976 bool IsIndirect = false;
1977 if (Info.isIndirect() && !Info.getIndirectByVal())
1978 IsIndirect = true;
1979 Info = ABIArgInfo::getInAlloca(FrameFields.size(), IsIndirect);
1980 llvm::Type *LLTy = CGT.ConvertTypeForMem(Type);
1981 if (IsIndirect)
1982 LLTy = LLTy->getPointerTo(0);
1983 FrameFields.push_back(LLTy);
1984 StackOffset += IsIndirect ? WordSize : getContext().getTypeSizeInChars(Type);
1985
1986 // Insert padding bytes to respect alignment.
1987 CharUnits FieldEnd = StackOffset;
1988 StackOffset = FieldEnd.alignTo(WordSize);
1989 if (StackOffset != FieldEnd) {
1990 CharUnits NumBytes = StackOffset - FieldEnd;
1991 llvm::Type *Ty = llvm::Type::getInt8Ty(getVMContext());
1992 Ty = llvm::ArrayType::get(Ty, NumBytes.getQuantity());
1993 FrameFields.push_back(Ty);
1994 }
1995 }
1996
isArgInAlloca(const ABIArgInfo & Info)1997 static bool isArgInAlloca(const ABIArgInfo &Info) {
1998 // Leave ignored and inreg arguments alone.
1999 switch (Info.getKind()) {
2000 case ABIArgInfo::InAlloca:
2001 return true;
2002 case ABIArgInfo::Ignore:
2003 case ABIArgInfo::IndirectAliased:
2004 return false;
2005 case ABIArgInfo::Indirect:
2006 case ABIArgInfo::Direct:
2007 case ABIArgInfo::Extend:
2008 return !Info.getInReg();
2009 case ABIArgInfo::Expand:
2010 case ABIArgInfo::CoerceAndExpand:
2011 // These are aggregate types which are never passed in registers when
2012 // inalloca is involved.
2013 return true;
2014 }
2015 llvm_unreachable("invalid enum");
2016 }
2017
rewriteWithInAlloca(CGFunctionInfo & FI) const2018 void X86_32ABIInfo::rewriteWithInAlloca(CGFunctionInfo &FI) const {
2019 assert(IsWin32StructABI && "inalloca only supported on win32");
2020
2021 // Build a packed struct type for all of the arguments in memory.
2022 SmallVector<llvm::Type *, 6> FrameFields;
2023
2024 // The stack alignment is always 4.
2025 CharUnits StackAlign = CharUnits::fromQuantity(4);
2026
2027 CharUnits StackOffset;
2028 CGFunctionInfo::arg_iterator I = FI.arg_begin(), E = FI.arg_end();
2029
2030 // Put 'this' into the struct before 'sret', if necessary.
2031 bool IsThisCall =
2032 FI.getCallingConvention() == llvm::CallingConv::X86_ThisCall;
2033 ABIArgInfo &Ret = FI.getReturnInfo();
2034 if (Ret.isIndirect() && Ret.isSRetAfterThis() && !IsThisCall &&
2035 isArgInAlloca(I->info)) {
2036 addFieldToArgStruct(FrameFields, StackOffset, I->info, I->type);
2037 ++I;
2038 }
2039
2040 // Put the sret parameter into the inalloca struct if it's in memory.
2041 if (Ret.isIndirect() && !Ret.getInReg()) {
2042 addFieldToArgStruct(FrameFields, StackOffset, Ret, FI.getReturnType());
2043 // On Windows, the hidden sret parameter is always returned in eax.
2044 Ret.setInAllocaSRet(IsWin32StructABI);
2045 }
2046
2047 // Skip the 'this' parameter in ecx.
2048 if (IsThisCall)
2049 ++I;
2050
2051 // Put arguments passed in memory into the struct.
2052 for (; I != E; ++I) {
2053 if (isArgInAlloca(I->info))
2054 addFieldToArgStruct(FrameFields, StackOffset, I->info, I->type);
2055 }
2056
2057 FI.setArgStruct(llvm::StructType::get(getVMContext(), FrameFields,
2058 /*isPacked=*/true),
2059 StackAlign);
2060 }
2061
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const2062 Address X86_32ABIInfo::EmitVAArg(CodeGenFunction &CGF,
2063 Address VAListAddr, QualType Ty) const {
2064
2065 auto TypeInfo = getContext().getTypeInfoInChars(Ty);
2066
2067 // x86-32 changes the alignment of certain arguments on the stack.
2068 //
2069 // Just messing with TypeInfo like this works because we never pass
2070 // anything indirectly.
2071 TypeInfo.Align = CharUnits::fromQuantity(
2072 getTypeStackAlignInBytes(Ty, TypeInfo.Align.getQuantity()));
2073
2074 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, /*Indirect*/ false,
2075 TypeInfo, CharUnits::fromQuantity(4),
2076 /*AllowHigherAlign*/ true);
2077 }
2078
isStructReturnInRegABI(const llvm::Triple & Triple,const CodeGenOptions & Opts)2079 bool X86_32TargetCodeGenInfo::isStructReturnInRegABI(
2080 const llvm::Triple &Triple, const CodeGenOptions &Opts) {
2081 assert(Triple.getArch() == llvm::Triple::x86);
2082
2083 switch (Opts.getStructReturnConvention()) {
2084 case CodeGenOptions::SRCK_Default:
2085 break;
2086 case CodeGenOptions::SRCK_OnStack: // -fpcc-struct-return
2087 return false;
2088 case CodeGenOptions::SRCK_InRegs: // -freg-struct-return
2089 return true;
2090 }
2091
2092 if (Triple.isOSDarwin() || Triple.isOSIAMCU())
2093 return true;
2094
2095 switch (Triple.getOS()) {
2096 case llvm::Triple::DragonFly:
2097 case llvm::Triple::FreeBSD:
2098 case llvm::Triple::OpenBSD:
2099 case llvm::Triple::Win32:
2100 return true;
2101 default:
2102 return false;
2103 }
2104 }
2105
addX86InterruptAttrs(const FunctionDecl * FD,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM)2106 static void addX86InterruptAttrs(const FunctionDecl *FD, llvm::GlobalValue *GV,
2107 CodeGen::CodeGenModule &CGM) {
2108 if (!FD->hasAttr<AnyX86InterruptAttr>())
2109 return;
2110
2111 llvm::Function *Fn = cast<llvm::Function>(GV);
2112 Fn->setCallingConv(llvm::CallingConv::X86_INTR);
2113 if (FD->getNumParams() == 0)
2114 return;
2115
2116 auto PtrTy = cast<PointerType>(FD->getParamDecl(0)->getType());
2117 llvm::Type *ByValTy = CGM.getTypes().ConvertType(PtrTy->getPointeeType());
2118 llvm::Attribute NewAttr = llvm::Attribute::getWithByValType(
2119 Fn->getContext(), ByValTy);
2120 Fn->addParamAttr(0, NewAttr);
2121 }
2122
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const2123 void X86_32TargetCodeGenInfo::setTargetAttributes(
2124 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const {
2125 if (GV->isDeclaration())
2126 return;
2127 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
2128 if (FD->hasAttr<X86ForceAlignArgPointerAttr>()) {
2129 llvm::Function *Fn = cast<llvm::Function>(GV);
2130 Fn->addFnAttr("stackrealign");
2131 }
2132
2133 addX86InterruptAttrs(FD, GV, CGM);
2134 }
2135 }
2136
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const2137 bool X86_32TargetCodeGenInfo::initDwarfEHRegSizeTable(
2138 CodeGen::CodeGenFunction &CGF,
2139 llvm::Value *Address) const {
2140 CodeGen::CGBuilderTy &Builder = CGF.Builder;
2141
2142 llvm::Value *Four8 = llvm::ConstantInt::get(CGF.Int8Ty, 4);
2143
2144 // 0-7 are the eight integer registers; the order is different
2145 // on Darwin (for EH), but the range is the same.
2146 // 8 is %eip.
2147 AssignToArrayRange(Builder, Address, Four8, 0, 8);
2148
2149 if (CGF.CGM.getTarget().getTriple().isOSDarwin()) {
2150 // 12-16 are st(0..4). Not sure why we stop at 4.
2151 // These have size 16, which is sizeof(long double) on
2152 // platforms with 8-byte alignment for that type.
2153 llvm::Value *Sixteen8 = llvm::ConstantInt::get(CGF.Int8Ty, 16);
2154 AssignToArrayRange(Builder, Address, Sixteen8, 12, 16);
2155
2156 } else {
2157 // 9 is %eflags, which doesn't get a size on Darwin for some
2158 // reason.
2159 Builder.CreateAlignedStore(
2160 Four8, Builder.CreateConstInBoundsGEP1_32(CGF.Int8Ty, Address, 9),
2161 CharUnits::One());
2162
2163 // 11-16 are st(0..5). Not sure why we stop at 5.
2164 // These have size 12, which is sizeof(long double) on
2165 // platforms with 4-byte alignment for that type.
2166 llvm::Value *Twelve8 = llvm::ConstantInt::get(CGF.Int8Ty, 12);
2167 AssignToArrayRange(Builder, Address, Twelve8, 11, 16);
2168 }
2169
2170 return false;
2171 }
2172
2173 //===----------------------------------------------------------------------===//
2174 // X86-64 ABI Implementation
2175 //===----------------------------------------------------------------------===//
2176
2177
2178 namespace {
2179 /// The AVX ABI level for X86 targets.
2180 enum class X86AVXABILevel {
2181 None,
2182 AVX,
2183 AVX512
2184 };
2185
2186 /// \p returns the size in bits of the largest (native) vector for \p AVXLevel.
getNativeVectorSizeForAVXABI(X86AVXABILevel AVXLevel)2187 static unsigned getNativeVectorSizeForAVXABI(X86AVXABILevel AVXLevel) {
2188 switch (AVXLevel) {
2189 case X86AVXABILevel::AVX512:
2190 return 512;
2191 case X86AVXABILevel::AVX:
2192 return 256;
2193 case X86AVXABILevel::None:
2194 return 128;
2195 }
2196 llvm_unreachable("Unknown AVXLevel");
2197 }
2198
2199 /// X86_64ABIInfo - The X86_64 ABI information.
2200 class X86_64ABIInfo : public SwiftABIInfo {
2201 enum Class {
2202 Integer = 0,
2203 SSE,
2204 SSEUp,
2205 X87,
2206 X87Up,
2207 ComplexX87,
2208 NoClass,
2209 Memory
2210 };
2211
2212 /// merge - Implement the X86_64 ABI merging algorithm.
2213 ///
2214 /// Merge an accumulating classification \arg Accum with a field
2215 /// classification \arg Field.
2216 ///
2217 /// \param Accum - The accumulating classification. This should
2218 /// always be either NoClass or the result of a previous merge
2219 /// call. In addition, this should never be Memory (the caller
2220 /// should just return Memory for the aggregate).
2221 static Class merge(Class Accum, Class Field);
2222
2223 /// postMerge - Implement the X86_64 ABI post merging algorithm.
2224 ///
2225 /// Post merger cleanup, reduces a malformed Hi and Lo pair to
2226 /// final MEMORY or SSE classes when necessary.
2227 ///
2228 /// \param AggregateSize - The size of the current aggregate in
2229 /// the classification process.
2230 ///
2231 /// \param Lo - The classification for the parts of the type
2232 /// residing in the low word of the containing object.
2233 ///
2234 /// \param Hi - The classification for the parts of the type
2235 /// residing in the higher words of the containing object.
2236 ///
2237 void postMerge(unsigned AggregateSize, Class &Lo, Class &Hi) const;
2238
2239 /// classify - Determine the x86_64 register classes in which the
2240 /// given type T should be passed.
2241 ///
2242 /// \param Lo - The classification for the parts of the type
2243 /// residing in the low word of the containing object.
2244 ///
2245 /// \param Hi - The classification for the parts of the type
2246 /// residing in the high word of the containing object.
2247 ///
2248 /// \param OffsetBase - The bit offset of this type in the
2249 /// containing object. Some parameters are classified different
2250 /// depending on whether they straddle an eightbyte boundary.
2251 ///
2252 /// \param isNamedArg - Whether the argument in question is a "named"
2253 /// argument, as used in AMD64-ABI 3.5.7.
2254 ///
2255 /// If a word is unused its result will be NoClass; if a type should
2256 /// be passed in Memory then at least the classification of \arg Lo
2257 /// will be Memory.
2258 ///
2259 /// The \arg Lo class will be NoClass iff the argument is ignored.
2260 ///
2261 /// If the \arg Lo class is ComplexX87, then the \arg Hi class will
2262 /// also be ComplexX87.
2263 void classify(QualType T, uint64_t OffsetBase, Class &Lo, Class &Hi,
2264 bool isNamedArg) const;
2265
2266 llvm::Type *GetByteVectorType(QualType Ty) const;
2267 llvm::Type *GetSSETypeAtOffset(llvm::Type *IRType,
2268 unsigned IROffset, QualType SourceTy,
2269 unsigned SourceOffset) const;
2270 llvm::Type *GetINTEGERTypeAtOffset(llvm::Type *IRType,
2271 unsigned IROffset, QualType SourceTy,
2272 unsigned SourceOffset) const;
2273
2274 /// getIndirectResult - Give a source type \arg Ty, return a suitable result
2275 /// such that the argument will be returned in memory.
2276 ABIArgInfo getIndirectReturnResult(QualType Ty) const;
2277
2278 /// getIndirectResult - Give a source type \arg Ty, return a suitable result
2279 /// such that the argument will be passed in memory.
2280 ///
2281 /// \param freeIntRegs - The number of free integer registers remaining
2282 /// available.
2283 ABIArgInfo getIndirectResult(QualType Ty, unsigned freeIntRegs) const;
2284
2285 ABIArgInfo classifyReturnType(QualType RetTy) const;
2286
2287 ABIArgInfo classifyArgumentType(QualType Ty, unsigned freeIntRegs,
2288 unsigned &neededInt, unsigned &neededSSE,
2289 bool isNamedArg) const;
2290
2291 ABIArgInfo classifyRegCallStructType(QualType Ty, unsigned &NeededInt,
2292 unsigned &NeededSSE) const;
2293
2294 ABIArgInfo classifyRegCallStructTypeImpl(QualType Ty, unsigned &NeededInt,
2295 unsigned &NeededSSE) const;
2296
2297 bool IsIllegalVectorType(QualType Ty) const;
2298
2299 /// The 0.98 ABI revision clarified a lot of ambiguities,
2300 /// unfortunately in ways that were not always consistent with
2301 /// certain previous compilers. In particular, platforms which
2302 /// required strict binary compatibility with older versions of GCC
2303 /// may need to exempt themselves.
honorsRevision0_98() const2304 bool honorsRevision0_98() const {
2305 return !getTarget().getTriple().isOSDarwin();
2306 }
2307
2308 /// GCC classifies <1 x long long> as SSE but some platform ABIs choose to
2309 /// classify it as INTEGER (for compatibility with older clang compilers).
classifyIntegerMMXAsSSE() const2310 bool classifyIntegerMMXAsSSE() const {
2311 // Clang <= 3.8 did not do this.
2312 if (getContext().getLangOpts().getClangABICompat() <=
2313 LangOptions::ClangABI::Ver3_8)
2314 return false;
2315
2316 const llvm::Triple &Triple = getTarget().getTriple();
2317 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::PS4)
2318 return false;
2319 if (Triple.isOSFreeBSD() && Triple.getOSMajorVersion() >= 10)
2320 return false;
2321 return true;
2322 }
2323
2324 // GCC classifies vectors of __int128 as memory.
passInt128VectorsInMem() const2325 bool passInt128VectorsInMem() const {
2326 // Clang <= 9.0 did not do this.
2327 if (getContext().getLangOpts().getClangABICompat() <=
2328 LangOptions::ClangABI::Ver9)
2329 return false;
2330
2331 const llvm::Triple &T = getTarget().getTriple();
2332 return T.isOSLinux() || T.isOSNetBSD();
2333 }
2334
2335 X86AVXABILevel AVXLevel;
2336 // Some ABIs (e.g. X32 ABI and Native Client OS) use 32 bit pointers on
2337 // 64-bit hardware.
2338 bool Has64BitPointers;
2339
2340 public:
X86_64ABIInfo(CodeGen::CodeGenTypes & CGT,X86AVXABILevel AVXLevel)2341 X86_64ABIInfo(CodeGen::CodeGenTypes &CGT, X86AVXABILevel AVXLevel) :
2342 SwiftABIInfo(CGT), AVXLevel(AVXLevel),
2343 Has64BitPointers(CGT.getDataLayout().getPointerSize(0) == 8) {
2344 }
2345
isPassedUsingAVXType(QualType type) const2346 bool isPassedUsingAVXType(QualType type) const {
2347 unsigned neededInt, neededSSE;
2348 // The freeIntRegs argument doesn't matter here.
2349 ABIArgInfo info = classifyArgumentType(type, 0, neededInt, neededSSE,
2350 /*isNamedArg*/true);
2351 if (info.isDirect()) {
2352 llvm::Type *ty = info.getCoerceToType();
2353 if (llvm::VectorType *vectorTy = dyn_cast_or_null<llvm::VectorType>(ty))
2354 return vectorTy->getPrimitiveSizeInBits().getFixedSize() > 128;
2355 }
2356 return false;
2357 }
2358
2359 void computeInfo(CGFunctionInfo &FI) const override;
2360
2361 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
2362 QualType Ty) const override;
2363 Address EmitMSVAArg(CodeGenFunction &CGF, Address VAListAddr,
2364 QualType Ty) const override;
2365
has64BitPointers() const2366 bool has64BitPointers() const {
2367 return Has64BitPointers;
2368 }
2369
shouldPassIndirectlyForSwift(ArrayRef<llvm::Type * > scalars,bool asReturnValue) const2370 bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars,
2371 bool asReturnValue) const override {
2372 return occupiesMoreThan(CGT, scalars, /*total*/ 4);
2373 }
isSwiftErrorInRegister() const2374 bool isSwiftErrorInRegister() const override {
2375 return true;
2376 }
2377 };
2378
2379 /// WinX86_64ABIInfo - The Windows X86_64 ABI information.
2380 class WinX86_64ABIInfo : public SwiftABIInfo {
2381 public:
WinX86_64ABIInfo(CodeGen::CodeGenTypes & CGT,X86AVXABILevel AVXLevel)2382 WinX86_64ABIInfo(CodeGen::CodeGenTypes &CGT, X86AVXABILevel AVXLevel)
2383 : SwiftABIInfo(CGT), AVXLevel(AVXLevel),
2384 IsMingw64(getTarget().getTriple().isWindowsGNUEnvironment()) {}
2385
2386 void computeInfo(CGFunctionInfo &FI) const override;
2387
2388 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
2389 QualType Ty) const override;
2390
isHomogeneousAggregateBaseType(QualType Ty) const2391 bool isHomogeneousAggregateBaseType(QualType Ty) const override {
2392 // FIXME: Assumes vectorcall is in use.
2393 return isX86VectorTypeForVectorCall(getContext(), Ty);
2394 }
2395
isHomogeneousAggregateSmallEnough(const Type * Ty,uint64_t NumMembers) const2396 bool isHomogeneousAggregateSmallEnough(const Type *Ty,
2397 uint64_t NumMembers) const override {
2398 // FIXME: Assumes vectorcall is in use.
2399 return isX86VectorCallAggregateSmallEnough(NumMembers);
2400 }
2401
shouldPassIndirectlyForSwift(ArrayRef<llvm::Type * > scalars,bool asReturnValue) const2402 bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type *> scalars,
2403 bool asReturnValue) const override {
2404 return occupiesMoreThan(CGT, scalars, /*total*/ 4);
2405 }
2406
isSwiftErrorInRegister() const2407 bool isSwiftErrorInRegister() const override {
2408 return true;
2409 }
2410
2411 private:
2412 ABIArgInfo classify(QualType Ty, unsigned &FreeSSERegs, bool IsReturnType,
2413 bool IsVectorCall, bool IsRegCall) const;
2414 ABIArgInfo reclassifyHvaArgForVectorCall(QualType Ty, unsigned &FreeSSERegs,
2415 const ABIArgInfo ¤t) const;
2416
2417 X86AVXABILevel AVXLevel;
2418
2419 bool IsMingw64;
2420 };
2421
2422 class X86_64TargetCodeGenInfo : public TargetCodeGenInfo {
2423 public:
X86_64TargetCodeGenInfo(CodeGen::CodeGenTypes & CGT,X86AVXABILevel AVXLevel)2424 X86_64TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, X86AVXABILevel AVXLevel)
2425 : TargetCodeGenInfo(std::make_unique<X86_64ABIInfo>(CGT, AVXLevel)) {}
2426
getABIInfo() const2427 const X86_64ABIInfo &getABIInfo() const {
2428 return static_cast<const X86_64ABIInfo&>(TargetCodeGenInfo::getABIInfo());
2429 }
2430
2431 /// Disable tail call on x86-64. The epilogue code before the tail jump blocks
2432 /// autoreleaseRV/retainRV and autoreleaseRV/unsafeClaimRV optimizations.
markARCOptimizedReturnCallsAsNoTail() const2433 bool markARCOptimizedReturnCallsAsNoTail() const override { return true; }
2434
getDwarfEHStackPointer(CodeGen::CodeGenModule & CGM) const2435 int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const override {
2436 return 7;
2437 }
2438
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const2439 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
2440 llvm::Value *Address) const override {
2441 llvm::Value *Eight8 = llvm::ConstantInt::get(CGF.Int8Ty, 8);
2442
2443 // 0-15 are the 16 integer registers.
2444 // 16 is %rip.
2445 AssignToArrayRange(CGF.Builder, Address, Eight8, 0, 16);
2446 return false;
2447 }
2448
adjustInlineAsmType(CodeGen::CodeGenFunction & CGF,StringRef Constraint,llvm::Type * Ty) const2449 llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
2450 StringRef Constraint,
2451 llvm::Type* Ty) const override {
2452 return X86AdjustInlineAsmType(CGF, Constraint, Ty);
2453 }
2454
isNoProtoCallVariadic(const CallArgList & args,const FunctionNoProtoType * fnType) const2455 bool isNoProtoCallVariadic(const CallArgList &args,
2456 const FunctionNoProtoType *fnType) const override {
2457 // The default CC on x86-64 sets %al to the number of SSA
2458 // registers used, and GCC sets this when calling an unprototyped
2459 // function, so we override the default behavior. However, don't do
2460 // that when AVX types are involved: the ABI explicitly states it is
2461 // undefined, and it doesn't work in practice because of how the ABI
2462 // defines varargs anyway.
2463 if (fnType->getCallConv() == CC_C) {
2464 bool HasAVXType = false;
2465 for (CallArgList::const_iterator
2466 it = args.begin(), ie = args.end(); it != ie; ++it) {
2467 if (getABIInfo().isPassedUsingAVXType(it->Ty)) {
2468 HasAVXType = true;
2469 break;
2470 }
2471 }
2472
2473 if (!HasAVXType)
2474 return true;
2475 }
2476
2477 return TargetCodeGenInfo::isNoProtoCallVariadic(args, fnType);
2478 }
2479
2480 llvm::Constant *
getUBSanFunctionSignature(CodeGen::CodeGenModule & CGM) const2481 getUBSanFunctionSignature(CodeGen::CodeGenModule &CGM) const override {
2482 unsigned Sig = (0xeb << 0) | // jmp rel8
2483 (0x06 << 8) | // .+0x08
2484 ('v' << 16) |
2485 ('2' << 24);
2486 return llvm::ConstantInt::get(CGM.Int32Ty, Sig);
2487 }
2488
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const2489 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
2490 CodeGen::CodeGenModule &CGM) const override {
2491 if (GV->isDeclaration())
2492 return;
2493 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
2494 if (FD->hasAttr<X86ForceAlignArgPointerAttr>()) {
2495 llvm::Function *Fn = cast<llvm::Function>(GV);
2496 Fn->addFnAttr("stackrealign");
2497 }
2498
2499 addX86InterruptAttrs(FD, GV, CGM);
2500 }
2501 }
2502
2503 void checkFunctionCallABI(CodeGenModule &CGM, SourceLocation CallLoc,
2504 const FunctionDecl *Caller,
2505 const FunctionDecl *Callee,
2506 const CallArgList &Args) const override;
2507 };
2508
initFeatureMaps(const ASTContext & Ctx,llvm::StringMap<bool> & CallerMap,const FunctionDecl * Caller,llvm::StringMap<bool> & CalleeMap,const FunctionDecl * Callee)2509 static void initFeatureMaps(const ASTContext &Ctx,
2510 llvm::StringMap<bool> &CallerMap,
2511 const FunctionDecl *Caller,
2512 llvm::StringMap<bool> &CalleeMap,
2513 const FunctionDecl *Callee) {
2514 if (CalleeMap.empty() && CallerMap.empty()) {
2515 // The caller is potentially nullptr in the case where the call isn't in a
2516 // function. In this case, the getFunctionFeatureMap ensures we just get
2517 // the TU level setting (since it cannot be modified by 'target'..
2518 Ctx.getFunctionFeatureMap(CallerMap, Caller);
2519 Ctx.getFunctionFeatureMap(CalleeMap, Callee);
2520 }
2521 }
2522
checkAVXParamFeature(DiagnosticsEngine & Diag,SourceLocation CallLoc,const llvm::StringMap<bool> & CallerMap,const llvm::StringMap<bool> & CalleeMap,QualType Ty,StringRef Feature,bool IsArgument)2523 static bool checkAVXParamFeature(DiagnosticsEngine &Diag,
2524 SourceLocation CallLoc,
2525 const llvm::StringMap<bool> &CallerMap,
2526 const llvm::StringMap<bool> &CalleeMap,
2527 QualType Ty, StringRef Feature,
2528 bool IsArgument) {
2529 bool CallerHasFeat = CallerMap.lookup(Feature);
2530 bool CalleeHasFeat = CalleeMap.lookup(Feature);
2531 if (!CallerHasFeat && !CalleeHasFeat)
2532 return Diag.Report(CallLoc, diag::warn_avx_calling_convention)
2533 << IsArgument << Ty << Feature;
2534
2535 // Mixing calling conventions here is very clearly an error.
2536 if (!CallerHasFeat || !CalleeHasFeat)
2537 return Diag.Report(CallLoc, diag::err_avx_calling_convention)
2538 << IsArgument << Ty << Feature;
2539
2540 // Else, both caller and callee have the required feature, so there is no need
2541 // to diagnose.
2542 return false;
2543 }
2544
checkAVXParam(DiagnosticsEngine & Diag,ASTContext & Ctx,SourceLocation CallLoc,const llvm::StringMap<bool> & CallerMap,const llvm::StringMap<bool> & CalleeMap,QualType Ty,bool IsArgument)2545 static bool checkAVXParam(DiagnosticsEngine &Diag, ASTContext &Ctx,
2546 SourceLocation CallLoc,
2547 const llvm::StringMap<bool> &CallerMap,
2548 const llvm::StringMap<bool> &CalleeMap, QualType Ty,
2549 bool IsArgument) {
2550 uint64_t Size = Ctx.getTypeSize(Ty);
2551 if (Size > 256)
2552 return checkAVXParamFeature(Diag, CallLoc, CallerMap, CalleeMap, Ty,
2553 "avx512f", IsArgument);
2554
2555 if (Size > 128)
2556 return checkAVXParamFeature(Diag, CallLoc, CallerMap, CalleeMap, Ty, "avx",
2557 IsArgument);
2558
2559 return false;
2560 }
2561
checkFunctionCallABI(CodeGenModule & CGM,SourceLocation CallLoc,const FunctionDecl * Caller,const FunctionDecl * Callee,const CallArgList & Args) const2562 void X86_64TargetCodeGenInfo::checkFunctionCallABI(
2563 CodeGenModule &CGM, SourceLocation CallLoc, const FunctionDecl *Caller,
2564 const FunctionDecl *Callee, const CallArgList &Args) const {
2565 llvm::StringMap<bool> CallerMap;
2566 llvm::StringMap<bool> CalleeMap;
2567 unsigned ArgIndex = 0;
2568
2569 // We need to loop through the actual call arguments rather than the the
2570 // function's parameters, in case this variadic.
2571 for (const CallArg &Arg : Args) {
2572 // The "avx" feature changes how vectors >128 in size are passed. "avx512f"
2573 // additionally changes how vectors >256 in size are passed. Like GCC, we
2574 // warn when a function is called with an argument where this will change.
2575 // Unlike GCC, we also error when it is an obvious ABI mismatch, that is,
2576 // the caller and callee features are mismatched.
2577 // Unfortunately, we cannot do this diagnostic in SEMA, since the callee can
2578 // change its ABI with attribute-target after this call.
2579 if (Arg.getType()->isVectorType() &&
2580 CGM.getContext().getTypeSize(Arg.getType()) > 128) {
2581 initFeatureMaps(CGM.getContext(), CallerMap, Caller, CalleeMap, Callee);
2582 QualType Ty = Arg.getType();
2583 // The CallArg seems to have desugared the type already, so for clearer
2584 // diagnostics, replace it with the type in the FunctionDecl if possible.
2585 if (ArgIndex < Callee->getNumParams())
2586 Ty = Callee->getParamDecl(ArgIndex)->getType();
2587
2588 if (checkAVXParam(CGM.getDiags(), CGM.getContext(), CallLoc, CallerMap,
2589 CalleeMap, Ty, /*IsArgument*/ true))
2590 return;
2591 }
2592 ++ArgIndex;
2593 }
2594
2595 // Check return always, as we don't have a good way of knowing in codegen
2596 // whether this value is used, tail-called, etc.
2597 if (Callee->getReturnType()->isVectorType() &&
2598 CGM.getContext().getTypeSize(Callee->getReturnType()) > 128) {
2599 initFeatureMaps(CGM.getContext(), CallerMap, Caller, CalleeMap, Callee);
2600 checkAVXParam(CGM.getDiags(), CGM.getContext(), CallLoc, CallerMap,
2601 CalleeMap, Callee->getReturnType(),
2602 /*IsArgument*/ false);
2603 }
2604 }
2605
qualifyWindowsLibrary(llvm::StringRef Lib)2606 static std::string qualifyWindowsLibrary(llvm::StringRef Lib) {
2607 // If the argument does not end in .lib, automatically add the suffix.
2608 // If the argument contains a space, enclose it in quotes.
2609 // This matches the behavior of MSVC.
2610 bool Quote = (Lib.find(' ') != StringRef::npos);
2611 std::string ArgStr = Quote ? "\"" : "";
2612 ArgStr += Lib;
2613 if (!Lib.endswith_lower(".lib") && !Lib.endswith_lower(".a"))
2614 ArgStr += ".lib";
2615 ArgStr += Quote ? "\"" : "";
2616 return ArgStr;
2617 }
2618
2619 class WinX86_32TargetCodeGenInfo : public X86_32TargetCodeGenInfo {
2620 public:
WinX86_32TargetCodeGenInfo(CodeGen::CodeGenTypes & CGT,bool DarwinVectorABI,bool RetSmallStructInRegABI,bool Win32StructABI,unsigned NumRegisterParameters)2621 WinX86_32TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT,
2622 bool DarwinVectorABI, bool RetSmallStructInRegABI, bool Win32StructABI,
2623 unsigned NumRegisterParameters)
2624 : X86_32TargetCodeGenInfo(CGT, DarwinVectorABI, RetSmallStructInRegABI,
2625 Win32StructABI, NumRegisterParameters, false) {}
2626
2627 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
2628 CodeGen::CodeGenModule &CGM) const override;
2629
getDependentLibraryOption(llvm::StringRef Lib,llvm::SmallString<24> & Opt) const2630 void getDependentLibraryOption(llvm::StringRef Lib,
2631 llvm::SmallString<24> &Opt) const override {
2632 Opt = "/DEFAULTLIB:";
2633 Opt += qualifyWindowsLibrary(Lib);
2634 }
2635
getDetectMismatchOption(llvm::StringRef Name,llvm::StringRef Value,llvm::SmallString<32> & Opt) const2636 void getDetectMismatchOption(llvm::StringRef Name,
2637 llvm::StringRef Value,
2638 llvm::SmallString<32> &Opt) const override {
2639 Opt = "/FAILIFMISMATCH:\"" + Name.str() + "=" + Value.str() + "\"";
2640 }
2641 };
2642
addStackProbeTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM)2643 static void addStackProbeTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
2644 CodeGen::CodeGenModule &CGM) {
2645 if (llvm::Function *Fn = dyn_cast_or_null<llvm::Function>(GV)) {
2646
2647 if (CGM.getCodeGenOpts().StackProbeSize != 4096)
2648 Fn->addFnAttr("stack-probe-size",
2649 llvm::utostr(CGM.getCodeGenOpts().StackProbeSize));
2650 if (CGM.getCodeGenOpts().NoStackArgProbe)
2651 Fn->addFnAttr("no-stack-arg-probe");
2652 }
2653 }
2654
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const2655 void WinX86_32TargetCodeGenInfo::setTargetAttributes(
2656 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const {
2657 X86_32TargetCodeGenInfo::setTargetAttributes(D, GV, CGM);
2658 if (GV->isDeclaration())
2659 return;
2660 addStackProbeTargetAttributes(D, GV, CGM);
2661 }
2662
2663 class WinX86_64TargetCodeGenInfo : public TargetCodeGenInfo {
2664 public:
WinX86_64TargetCodeGenInfo(CodeGen::CodeGenTypes & CGT,X86AVXABILevel AVXLevel)2665 WinX86_64TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT,
2666 X86AVXABILevel AVXLevel)
2667 : TargetCodeGenInfo(std::make_unique<WinX86_64ABIInfo>(CGT, AVXLevel)) {}
2668
2669 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
2670 CodeGen::CodeGenModule &CGM) const override;
2671
getDwarfEHStackPointer(CodeGen::CodeGenModule & CGM) const2672 int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const override {
2673 return 7;
2674 }
2675
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const2676 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
2677 llvm::Value *Address) const override {
2678 llvm::Value *Eight8 = llvm::ConstantInt::get(CGF.Int8Ty, 8);
2679
2680 // 0-15 are the 16 integer registers.
2681 // 16 is %rip.
2682 AssignToArrayRange(CGF.Builder, Address, Eight8, 0, 16);
2683 return false;
2684 }
2685
getDependentLibraryOption(llvm::StringRef Lib,llvm::SmallString<24> & Opt) const2686 void getDependentLibraryOption(llvm::StringRef Lib,
2687 llvm::SmallString<24> &Opt) const override {
2688 Opt = "/DEFAULTLIB:";
2689 Opt += qualifyWindowsLibrary(Lib);
2690 }
2691
getDetectMismatchOption(llvm::StringRef Name,llvm::StringRef Value,llvm::SmallString<32> & Opt) const2692 void getDetectMismatchOption(llvm::StringRef Name,
2693 llvm::StringRef Value,
2694 llvm::SmallString<32> &Opt) const override {
2695 Opt = "/FAILIFMISMATCH:\"" + Name.str() + "=" + Value.str() + "\"";
2696 }
2697 };
2698
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const2699 void WinX86_64TargetCodeGenInfo::setTargetAttributes(
2700 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const {
2701 TargetCodeGenInfo::setTargetAttributes(D, GV, CGM);
2702 if (GV->isDeclaration())
2703 return;
2704 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
2705 if (FD->hasAttr<X86ForceAlignArgPointerAttr>()) {
2706 llvm::Function *Fn = cast<llvm::Function>(GV);
2707 Fn->addFnAttr("stackrealign");
2708 }
2709
2710 addX86InterruptAttrs(FD, GV, CGM);
2711 }
2712
2713 addStackProbeTargetAttributes(D, GV, CGM);
2714 }
2715 }
2716
postMerge(unsigned AggregateSize,Class & Lo,Class & Hi) const2717 void X86_64ABIInfo::postMerge(unsigned AggregateSize, Class &Lo,
2718 Class &Hi) const {
2719 // AMD64-ABI 3.2.3p2: Rule 5. Then a post merger cleanup is done:
2720 //
2721 // (a) If one of the classes is Memory, the whole argument is passed in
2722 // memory.
2723 //
2724 // (b) If X87UP is not preceded by X87, the whole argument is passed in
2725 // memory.
2726 //
2727 // (c) If the size of the aggregate exceeds two eightbytes and the first
2728 // eightbyte isn't SSE or any other eightbyte isn't SSEUP, the whole
2729 // argument is passed in memory. NOTE: This is necessary to keep the
2730 // ABI working for processors that don't support the __m256 type.
2731 //
2732 // (d) If SSEUP is not preceded by SSE or SSEUP, it is converted to SSE.
2733 //
2734 // Some of these are enforced by the merging logic. Others can arise
2735 // only with unions; for example:
2736 // union { _Complex double; unsigned; }
2737 //
2738 // Note that clauses (b) and (c) were added in 0.98.
2739 //
2740 if (Hi == Memory)
2741 Lo = Memory;
2742 if (Hi == X87Up && Lo != X87 && honorsRevision0_98())
2743 Lo = Memory;
2744 if (AggregateSize > 128 && (Lo != SSE || Hi != SSEUp))
2745 Lo = Memory;
2746 if (Hi == SSEUp && Lo != SSE)
2747 Hi = SSE;
2748 }
2749
merge(Class Accum,Class Field)2750 X86_64ABIInfo::Class X86_64ABIInfo::merge(Class Accum, Class Field) {
2751 // AMD64-ABI 3.2.3p2: Rule 4. Each field of an object is
2752 // classified recursively so that always two fields are
2753 // considered. The resulting class is calculated according to
2754 // the classes of the fields in the eightbyte:
2755 //
2756 // (a) If both classes are equal, this is the resulting class.
2757 //
2758 // (b) If one of the classes is NO_CLASS, the resulting class is
2759 // the other class.
2760 //
2761 // (c) If one of the classes is MEMORY, the result is the MEMORY
2762 // class.
2763 //
2764 // (d) If one of the classes is INTEGER, the result is the
2765 // INTEGER.
2766 //
2767 // (e) If one of the classes is X87, X87UP, COMPLEX_X87 class,
2768 // MEMORY is used as class.
2769 //
2770 // (f) Otherwise class SSE is used.
2771
2772 // Accum should never be memory (we should have returned) or
2773 // ComplexX87 (because this cannot be passed in a structure).
2774 assert((Accum != Memory && Accum != ComplexX87) &&
2775 "Invalid accumulated classification during merge.");
2776 if (Accum == Field || Field == NoClass)
2777 return Accum;
2778 if (Field == Memory)
2779 return Memory;
2780 if (Accum == NoClass)
2781 return Field;
2782 if (Accum == Integer || Field == Integer)
2783 return Integer;
2784 if (Field == X87 || Field == X87Up || Field == ComplexX87 ||
2785 Accum == X87 || Accum == X87Up)
2786 return Memory;
2787 return SSE;
2788 }
2789
classify(QualType Ty,uint64_t OffsetBase,Class & Lo,Class & Hi,bool isNamedArg) const2790 void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase,
2791 Class &Lo, Class &Hi, bool isNamedArg) const {
2792 // FIXME: This code can be simplified by introducing a simple value class for
2793 // Class pairs with appropriate constructor methods for the various
2794 // situations.
2795
2796 // FIXME: Some of the split computations are wrong; unaligned vectors
2797 // shouldn't be passed in registers for example, so there is no chance they
2798 // can straddle an eightbyte. Verify & simplify.
2799
2800 Lo = Hi = NoClass;
2801
2802 Class &Current = OffsetBase < 64 ? Lo : Hi;
2803 Current = Memory;
2804
2805 if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
2806 BuiltinType::Kind k = BT->getKind();
2807
2808 if (k == BuiltinType::Void) {
2809 Current = NoClass;
2810 } else if (k == BuiltinType::Int128 || k == BuiltinType::UInt128) {
2811 Lo = Integer;
2812 Hi = Integer;
2813 } else if (k >= BuiltinType::Bool && k <= BuiltinType::LongLong) {
2814 Current = Integer;
2815 } else if (k == BuiltinType::Float || k == BuiltinType::Double) {
2816 Current = SSE;
2817 } else if (k == BuiltinType::LongDouble) {
2818 const llvm::fltSemantics *LDF = &getTarget().getLongDoubleFormat();
2819 if (LDF == &llvm::APFloat::IEEEquad()) {
2820 Lo = SSE;
2821 Hi = SSEUp;
2822 } else if (LDF == &llvm::APFloat::x87DoubleExtended()) {
2823 Lo = X87;
2824 Hi = X87Up;
2825 } else if (LDF == &llvm::APFloat::IEEEdouble()) {
2826 Current = SSE;
2827 } else
2828 llvm_unreachable("unexpected long double representation!");
2829 }
2830 // FIXME: _Decimal32 and _Decimal64 are SSE.
2831 // FIXME: _float128 and _Decimal128 are (SSE, SSEUp).
2832 return;
2833 }
2834
2835 if (const EnumType *ET = Ty->getAs<EnumType>()) {
2836 // Classify the underlying integer type.
2837 classify(ET->getDecl()->getIntegerType(), OffsetBase, Lo, Hi, isNamedArg);
2838 return;
2839 }
2840
2841 if (Ty->hasPointerRepresentation()) {
2842 Current = Integer;
2843 return;
2844 }
2845
2846 if (Ty->isMemberPointerType()) {
2847 if (Ty->isMemberFunctionPointerType()) {
2848 if (Has64BitPointers) {
2849 // If Has64BitPointers, this is an {i64, i64}, so classify both
2850 // Lo and Hi now.
2851 Lo = Hi = Integer;
2852 } else {
2853 // Otherwise, with 32-bit pointers, this is an {i32, i32}. If that
2854 // straddles an eightbyte boundary, Hi should be classified as well.
2855 uint64_t EB_FuncPtr = (OffsetBase) / 64;
2856 uint64_t EB_ThisAdj = (OffsetBase + 64 - 1) / 64;
2857 if (EB_FuncPtr != EB_ThisAdj) {
2858 Lo = Hi = Integer;
2859 } else {
2860 Current = Integer;
2861 }
2862 }
2863 } else {
2864 Current = Integer;
2865 }
2866 return;
2867 }
2868
2869 if (const VectorType *VT = Ty->getAs<VectorType>()) {
2870 uint64_t Size = getContext().getTypeSize(VT);
2871 if (Size == 1 || Size == 8 || Size == 16 || Size == 32) {
2872 // gcc passes the following as integer:
2873 // 4 bytes - <4 x char>, <2 x short>, <1 x int>, <1 x float>
2874 // 2 bytes - <2 x char>, <1 x short>
2875 // 1 byte - <1 x char>
2876 Current = Integer;
2877
2878 // If this type crosses an eightbyte boundary, it should be
2879 // split.
2880 uint64_t EB_Lo = (OffsetBase) / 64;
2881 uint64_t EB_Hi = (OffsetBase + Size - 1) / 64;
2882 if (EB_Lo != EB_Hi)
2883 Hi = Lo;
2884 } else if (Size == 64) {
2885 QualType ElementType = VT->getElementType();
2886
2887 // gcc passes <1 x double> in memory. :(
2888 if (ElementType->isSpecificBuiltinType(BuiltinType::Double))
2889 return;
2890
2891 // gcc passes <1 x long long> as SSE but clang used to unconditionally
2892 // pass them as integer. For platforms where clang is the de facto
2893 // platform compiler, we must continue to use integer.
2894 if (!classifyIntegerMMXAsSSE() &&
2895 (ElementType->isSpecificBuiltinType(BuiltinType::LongLong) ||
2896 ElementType->isSpecificBuiltinType(BuiltinType::ULongLong) ||
2897 ElementType->isSpecificBuiltinType(BuiltinType::Long) ||
2898 ElementType->isSpecificBuiltinType(BuiltinType::ULong)))
2899 Current = Integer;
2900 else
2901 Current = SSE;
2902
2903 // If this type crosses an eightbyte boundary, it should be
2904 // split.
2905 if (OffsetBase && OffsetBase != 64)
2906 Hi = Lo;
2907 } else if (Size == 128 ||
2908 (isNamedArg && Size <= getNativeVectorSizeForAVXABI(AVXLevel))) {
2909 QualType ElementType = VT->getElementType();
2910
2911 // gcc passes 256 and 512 bit <X x __int128> vectors in memory. :(
2912 if (passInt128VectorsInMem() && Size != 128 &&
2913 (ElementType->isSpecificBuiltinType(BuiltinType::Int128) ||
2914 ElementType->isSpecificBuiltinType(BuiltinType::UInt128)))
2915 return;
2916
2917 // Arguments of 256-bits are split into four eightbyte chunks. The
2918 // least significant one belongs to class SSE and all the others to class
2919 // SSEUP. The original Lo and Hi design considers that types can't be
2920 // greater than 128-bits, so a 64-bit split in Hi and Lo makes sense.
2921 // This design isn't correct for 256-bits, but since there're no cases
2922 // where the upper parts would need to be inspected, avoid adding
2923 // complexity and just consider Hi to match the 64-256 part.
2924 //
2925 // Note that per 3.5.7 of AMD64-ABI, 256-bit args are only passed in
2926 // registers if they are "named", i.e. not part of the "..." of a
2927 // variadic function.
2928 //
2929 // Similarly, per 3.2.3. of the AVX512 draft, 512-bits ("named") args are
2930 // split into eight eightbyte chunks, one SSE and seven SSEUP.
2931 Lo = SSE;
2932 Hi = SSEUp;
2933 }
2934 return;
2935 }
2936
2937 if (const ComplexType *CT = Ty->getAs<ComplexType>()) {
2938 QualType ET = getContext().getCanonicalType(CT->getElementType());
2939
2940 uint64_t Size = getContext().getTypeSize(Ty);
2941 if (ET->isIntegralOrEnumerationType()) {
2942 if (Size <= 64)
2943 Current = Integer;
2944 else if (Size <= 128)
2945 Lo = Hi = Integer;
2946 } else if (ET == getContext().FloatTy) {
2947 Current = SSE;
2948 } else if (ET == getContext().DoubleTy) {
2949 Lo = Hi = SSE;
2950 } else if (ET == getContext().LongDoubleTy) {
2951 const llvm::fltSemantics *LDF = &getTarget().getLongDoubleFormat();
2952 if (LDF == &llvm::APFloat::IEEEquad())
2953 Current = Memory;
2954 else if (LDF == &llvm::APFloat::x87DoubleExtended())
2955 Current = ComplexX87;
2956 else if (LDF == &llvm::APFloat::IEEEdouble())
2957 Lo = Hi = SSE;
2958 else
2959 llvm_unreachable("unexpected long double representation!");
2960 }
2961
2962 // If this complex type crosses an eightbyte boundary then it
2963 // should be split.
2964 uint64_t EB_Real = (OffsetBase) / 64;
2965 uint64_t EB_Imag = (OffsetBase + getContext().getTypeSize(ET)) / 64;
2966 if (Hi == NoClass && EB_Real != EB_Imag)
2967 Hi = Lo;
2968
2969 return;
2970 }
2971
2972 if (const auto *EITy = Ty->getAs<ExtIntType>()) {
2973 if (EITy->getNumBits() <= 64)
2974 Current = Integer;
2975 else if (EITy->getNumBits() <= 128)
2976 Lo = Hi = Integer;
2977 // Larger values need to get passed in memory.
2978 return;
2979 }
2980
2981 if (const ConstantArrayType *AT = getContext().getAsConstantArrayType(Ty)) {
2982 // Arrays are treated like structures.
2983
2984 uint64_t Size = getContext().getTypeSize(Ty);
2985
2986 // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
2987 // than eight eightbytes, ..., it has class MEMORY.
2988 if (Size > 512)
2989 return;
2990
2991 // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned
2992 // fields, it has class MEMORY.
2993 //
2994 // Only need to check alignment of array base.
2995 if (OffsetBase % getContext().getTypeAlign(AT->getElementType()))
2996 return;
2997
2998 // Otherwise implement simplified merge. We could be smarter about
2999 // this, but it isn't worth it and would be harder to verify.
3000 Current = NoClass;
3001 uint64_t EltSize = getContext().getTypeSize(AT->getElementType());
3002 uint64_t ArraySize = AT->getSize().getZExtValue();
3003
3004 // The only case a 256-bit wide vector could be used is when the array
3005 // contains a single 256-bit element. Since Lo and Hi logic isn't extended
3006 // to work for sizes wider than 128, early check and fallback to memory.
3007 //
3008 if (Size > 128 &&
3009 (Size != EltSize || Size > getNativeVectorSizeForAVXABI(AVXLevel)))
3010 return;
3011
3012 for (uint64_t i=0, Offset=OffsetBase; i<ArraySize; ++i, Offset += EltSize) {
3013 Class FieldLo, FieldHi;
3014 classify(AT->getElementType(), Offset, FieldLo, FieldHi, isNamedArg);
3015 Lo = merge(Lo, FieldLo);
3016 Hi = merge(Hi, FieldHi);
3017 if (Lo == Memory || Hi == Memory)
3018 break;
3019 }
3020
3021 postMerge(Size, Lo, Hi);
3022 assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp array classification.");
3023 return;
3024 }
3025
3026 if (const RecordType *RT = Ty->getAs<RecordType>()) {
3027 uint64_t Size = getContext().getTypeSize(Ty);
3028
3029 // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
3030 // than eight eightbytes, ..., it has class MEMORY.
3031 if (Size > 512)
3032 return;
3033
3034 // AMD64-ABI 3.2.3p2: Rule 2. If a C++ object has either a non-trivial
3035 // copy constructor or a non-trivial destructor, it is passed by invisible
3036 // reference.
3037 if (getRecordArgABI(RT, getCXXABI()))
3038 return;
3039
3040 const RecordDecl *RD = RT->getDecl();
3041
3042 // Assume variable sized types are passed in memory.
3043 if (RD->hasFlexibleArrayMember())
3044 return;
3045
3046 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
3047
3048 // Reset Lo class, this will be recomputed.
3049 Current = NoClass;
3050
3051 // If this is a C++ record, classify the bases first.
3052 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
3053 for (const auto &I : CXXRD->bases()) {
3054 assert(!I.isVirtual() && !I.getType()->isDependentType() &&
3055 "Unexpected base class!");
3056 const auto *Base =
3057 cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
3058
3059 // Classify this field.
3060 //
3061 // AMD64-ABI 3.2.3p2: Rule 3. If the size of the aggregate exceeds a
3062 // single eightbyte, each is classified separately. Each eightbyte gets
3063 // initialized to class NO_CLASS.
3064 Class FieldLo, FieldHi;
3065 uint64_t Offset =
3066 OffsetBase + getContext().toBits(Layout.getBaseClassOffset(Base));
3067 classify(I.getType(), Offset, FieldLo, FieldHi, isNamedArg);
3068 Lo = merge(Lo, FieldLo);
3069 Hi = merge(Hi, FieldHi);
3070 if (Lo == Memory || Hi == Memory) {
3071 postMerge(Size, Lo, Hi);
3072 return;
3073 }
3074 }
3075 }
3076
3077 // Classify the fields one at a time, merging the results.
3078 unsigned idx = 0;
3079 bool UseClang11Compat = getContext().getLangOpts().getClangABICompat() <=
3080 LangOptions::ClangABI::Ver11 ||
3081 getContext().getTargetInfo().getTriple().isPS4();
3082 bool IsUnion = RT->isUnionType() && !UseClang11Compat;
3083
3084 for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
3085 i != e; ++i, ++idx) {
3086 uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx);
3087 bool BitField = i->isBitField();
3088
3089 // Ignore padding bit-fields.
3090 if (BitField && i->isUnnamedBitfield())
3091 continue;
3092
3093 // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger than
3094 // eight eightbytes, or it contains unaligned fields, it has class MEMORY.
3095 //
3096 // The only case a 256-bit or a 512-bit wide vector could be used is when
3097 // the struct contains a single 256-bit or 512-bit element. Early check
3098 // and fallback to memory.
3099 //
3100 // FIXME: Extended the Lo and Hi logic properly to work for size wider
3101 // than 128.
3102 if (Size > 128 &&
3103 ((!IsUnion && Size != getContext().getTypeSize(i->getType())) ||
3104 Size > getNativeVectorSizeForAVXABI(AVXLevel))) {
3105 Lo = Memory;
3106 postMerge(Size, Lo, Hi);
3107 return;
3108 }
3109 // Note, skip this test for bit-fields, see below.
3110 if (!BitField && Offset % getContext().getTypeAlign(i->getType())) {
3111 Lo = Memory;
3112 postMerge(Size, Lo, Hi);
3113 return;
3114 }
3115
3116 // Classify this field.
3117 //
3118 // AMD64-ABI 3.2.3p2: Rule 3. If the size of the aggregate
3119 // exceeds a single eightbyte, each is classified
3120 // separately. Each eightbyte gets initialized to class
3121 // NO_CLASS.
3122 Class FieldLo, FieldHi;
3123
3124 // Bit-fields require special handling, they do not force the
3125 // structure to be passed in memory even if unaligned, and
3126 // therefore they can straddle an eightbyte.
3127 if (BitField) {
3128 assert(!i->isUnnamedBitfield());
3129 uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx);
3130 uint64_t Size = i->getBitWidthValue(getContext());
3131
3132 uint64_t EB_Lo = Offset / 64;
3133 uint64_t EB_Hi = (Offset + Size - 1) / 64;
3134
3135 if (EB_Lo) {
3136 assert(EB_Hi == EB_Lo && "Invalid classification, type > 16 bytes.");
3137 FieldLo = NoClass;
3138 FieldHi = Integer;
3139 } else {
3140 FieldLo = Integer;
3141 FieldHi = EB_Hi ? Integer : NoClass;
3142 }
3143 } else
3144 classify(i->getType(), Offset, FieldLo, FieldHi, isNamedArg);
3145 Lo = merge(Lo, FieldLo);
3146 Hi = merge(Hi, FieldHi);
3147 if (Lo == Memory || Hi == Memory)
3148 break;
3149 }
3150
3151 postMerge(Size, Lo, Hi);
3152 }
3153 }
3154
getIndirectReturnResult(QualType Ty) const3155 ABIArgInfo X86_64ABIInfo::getIndirectReturnResult(QualType Ty) const {
3156 // If this is a scalar LLVM value then assume LLVM will pass it in the right
3157 // place naturally.
3158 if (!isAggregateTypeForABI(Ty)) {
3159 // Treat an enum type as its underlying type.
3160 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
3161 Ty = EnumTy->getDecl()->getIntegerType();
3162
3163 if (Ty->isExtIntType())
3164 return getNaturalAlignIndirect(Ty);
3165
3166 return (isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
3167 : ABIArgInfo::getDirect());
3168 }
3169
3170 return getNaturalAlignIndirect(Ty);
3171 }
3172
IsIllegalVectorType(QualType Ty) const3173 bool X86_64ABIInfo::IsIllegalVectorType(QualType Ty) const {
3174 if (const VectorType *VecTy = Ty->getAs<VectorType>()) {
3175 uint64_t Size = getContext().getTypeSize(VecTy);
3176 unsigned LargestVector = getNativeVectorSizeForAVXABI(AVXLevel);
3177 if (Size <= 64 || Size > LargestVector)
3178 return true;
3179 QualType EltTy = VecTy->getElementType();
3180 if (passInt128VectorsInMem() &&
3181 (EltTy->isSpecificBuiltinType(BuiltinType::Int128) ||
3182 EltTy->isSpecificBuiltinType(BuiltinType::UInt128)))
3183 return true;
3184 }
3185
3186 return false;
3187 }
3188
getIndirectResult(QualType Ty,unsigned freeIntRegs) const3189 ABIArgInfo X86_64ABIInfo::getIndirectResult(QualType Ty,
3190 unsigned freeIntRegs) const {
3191 // If this is a scalar LLVM value then assume LLVM will pass it in the right
3192 // place naturally.
3193 //
3194 // This assumption is optimistic, as there could be free registers available
3195 // when we need to pass this argument in memory, and LLVM could try to pass
3196 // the argument in the free register. This does not seem to happen currently,
3197 // but this code would be much safer if we could mark the argument with
3198 // 'onstack'. See PR12193.
3199 if (!isAggregateTypeForABI(Ty) && !IsIllegalVectorType(Ty) &&
3200 !Ty->isExtIntType()) {
3201 // Treat an enum type as its underlying type.
3202 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
3203 Ty = EnumTy->getDecl()->getIntegerType();
3204
3205 return (isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
3206 : ABIArgInfo::getDirect());
3207 }
3208
3209 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
3210 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
3211
3212 // Compute the byval alignment. We specify the alignment of the byval in all
3213 // cases so that the mid-level optimizer knows the alignment of the byval.
3214 unsigned Align = std::max(getContext().getTypeAlign(Ty) / 8, 8U);
3215
3216 // Attempt to avoid passing indirect results using byval when possible. This
3217 // is important for good codegen.
3218 //
3219 // We do this by coercing the value into a scalar type which the backend can
3220 // handle naturally (i.e., without using byval).
3221 //
3222 // For simplicity, we currently only do this when we have exhausted all of the
3223 // free integer registers. Doing this when there are free integer registers
3224 // would require more care, as we would have to ensure that the coerced value
3225 // did not claim the unused register. That would require either reording the
3226 // arguments to the function (so that any subsequent inreg values came first),
3227 // or only doing this optimization when there were no following arguments that
3228 // might be inreg.
3229 //
3230 // We currently expect it to be rare (particularly in well written code) for
3231 // arguments to be passed on the stack when there are still free integer
3232 // registers available (this would typically imply large structs being passed
3233 // by value), so this seems like a fair tradeoff for now.
3234 //
3235 // We can revisit this if the backend grows support for 'onstack' parameter
3236 // attributes. See PR12193.
3237 if (freeIntRegs == 0) {
3238 uint64_t Size = getContext().getTypeSize(Ty);
3239
3240 // If this type fits in an eightbyte, coerce it into the matching integral
3241 // type, which will end up on the stack (with alignment 8).
3242 if (Align == 8 && Size <= 64)
3243 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),
3244 Size));
3245 }
3246
3247 return ABIArgInfo::getIndirect(CharUnits::fromQuantity(Align));
3248 }
3249
3250 /// The ABI specifies that a value should be passed in a full vector XMM/YMM
3251 /// register. Pick an LLVM IR type that will be passed as a vector register.
GetByteVectorType(QualType Ty) const3252 llvm::Type *X86_64ABIInfo::GetByteVectorType(QualType Ty) const {
3253 // Wrapper structs/arrays that only contain vectors are passed just like
3254 // vectors; strip them off if present.
3255 if (const Type *InnerTy = isSingleElementStruct(Ty, getContext()))
3256 Ty = QualType(InnerTy, 0);
3257
3258 llvm::Type *IRType = CGT.ConvertType(Ty);
3259 if (isa<llvm::VectorType>(IRType)) {
3260 // Don't pass vXi128 vectors in their native type, the backend can't
3261 // legalize them.
3262 if (passInt128VectorsInMem() &&
3263 cast<llvm::VectorType>(IRType)->getElementType()->isIntegerTy(128)) {
3264 // Use a vXi64 vector.
3265 uint64_t Size = getContext().getTypeSize(Ty);
3266 return llvm::FixedVectorType::get(llvm::Type::getInt64Ty(getVMContext()),
3267 Size / 64);
3268 }
3269
3270 return IRType;
3271 }
3272
3273 if (IRType->getTypeID() == llvm::Type::FP128TyID)
3274 return IRType;
3275
3276 // We couldn't find the preferred IR vector type for 'Ty'.
3277 uint64_t Size = getContext().getTypeSize(Ty);
3278 assert((Size == 128 || Size == 256 || Size == 512) && "Invalid type found!");
3279
3280
3281 // Return a LLVM IR vector type based on the size of 'Ty'.
3282 return llvm::FixedVectorType::get(llvm::Type::getDoubleTy(getVMContext()),
3283 Size / 64);
3284 }
3285
3286 /// BitsContainNoUserData - Return true if the specified [start,end) bit range
3287 /// is known to either be off the end of the specified type or being in
3288 /// alignment padding. The user type specified is known to be at most 128 bits
3289 /// in size, and have passed through X86_64ABIInfo::classify with a successful
3290 /// classification that put one of the two halves in the INTEGER class.
3291 ///
3292 /// It is conservatively correct to return false.
BitsContainNoUserData(QualType Ty,unsigned StartBit,unsigned EndBit,ASTContext & Context)3293 static bool BitsContainNoUserData(QualType Ty, unsigned StartBit,
3294 unsigned EndBit, ASTContext &Context) {
3295 // If the bytes being queried are off the end of the type, there is no user
3296 // data hiding here. This handles analysis of builtins, vectors and other
3297 // types that don't contain interesting padding.
3298 unsigned TySize = (unsigned)Context.getTypeSize(Ty);
3299 if (TySize <= StartBit)
3300 return true;
3301
3302 if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty)) {
3303 unsigned EltSize = (unsigned)Context.getTypeSize(AT->getElementType());
3304 unsigned NumElts = (unsigned)AT->getSize().getZExtValue();
3305
3306 // Check each element to see if the element overlaps with the queried range.
3307 for (unsigned i = 0; i != NumElts; ++i) {
3308 // If the element is after the span we care about, then we're done..
3309 unsigned EltOffset = i*EltSize;
3310 if (EltOffset >= EndBit) break;
3311
3312 unsigned EltStart = EltOffset < StartBit ? StartBit-EltOffset :0;
3313 if (!BitsContainNoUserData(AT->getElementType(), EltStart,
3314 EndBit-EltOffset, Context))
3315 return false;
3316 }
3317 // If it overlaps no elements, then it is safe to process as padding.
3318 return true;
3319 }
3320
3321 if (const RecordType *RT = Ty->getAs<RecordType>()) {
3322 const RecordDecl *RD = RT->getDecl();
3323 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
3324
3325 // If this is a C++ record, check the bases first.
3326 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
3327 for (const auto &I : CXXRD->bases()) {
3328 assert(!I.isVirtual() && !I.getType()->isDependentType() &&
3329 "Unexpected base class!");
3330 const auto *Base =
3331 cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
3332
3333 // If the base is after the span we care about, ignore it.
3334 unsigned BaseOffset = Context.toBits(Layout.getBaseClassOffset(Base));
3335 if (BaseOffset >= EndBit) continue;
3336
3337 unsigned BaseStart = BaseOffset < StartBit ? StartBit-BaseOffset :0;
3338 if (!BitsContainNoUserData(I.getType(), BaseStart,
3339 EndBit-BaseOffset, Context))
3340 return false;
3341 }
3342 }
3343
3344 // Verify that no field has data that overlaps the region of interest. Yes
3345 // this could be sped up a lot by being smarter about queried fields,
3346 // however we're only looking at structs up to 16 bytes, so we don't care
3347 // much.
3348 unsigned idx = 0;
3349 for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
3350 i != e; ++i, ++idx) {
3351 unsigned FieldOffset = (unsigned)Layout.getFieldOffset(idx);
3352
3353 // If we found a field after the region we care about, then we're done.
3354 if (FieldOffset >= EndBit) break;
3355
3356 unsigned FieldStart = FieldOffset < StartBit ? StartBit-FieldOffset :0;
3357 if (!BitsContainNoUserData(i->getType(), FieldStart, EndBit-FieldOffset,
3358 Context))
3359 return false;
3360 }
3361
3362 // If nothing in this record overlapped the area of interest, then we're
3363 // clean.
3364 return true;
3365 }
3366
3367 return false;
3368 }
3369
3370 /// ContainsFloatAtOffset - Return true if the specified LLVM IR type has a
3371 /// float member at the specified offset. For example, {int,{float}} has a
3372 /// float at offset 4. It is conservatively correct for this routine to return
3373 /// false.
ContainsFloatAtOffset(llvm::Type * IRType,unsigned IROffset,const llvm::DataLayout & TD)3374 static bool ContainsFloatAtOffset(llvm::Type *IRType, unsigned IROffset,
3375 const llvm::DataLayout &TD) {
3376 // Base case if we find a float.
3377 if (IROffset == 0 && IRType->isFloatTy())
3378 return true;
3379
3380 // If this is a struct, recurse into the field at the specified offset.
3381 if (llvm::StructType *STy = dyn_cast<llvm::StructType>(IRType)) {
3382 const llvm::StructLayout *SL = TD.getStructLayout(STy);
3383 unsigned Elt = SL->getElementContainingOffset(IROffset);
3384 IROffset -= SL->getElementOffset(Elt);
3385 return ContainsFloatAtOffset(STy->getElementType(Elt), IROffset, TD);
3386 }
3387
3388 // If this is an array, recurse into the field at the specified offset.
3389 if (llvm::ArrayType *ATy = dyn_cast<llvm::ArrayType>(IRType)) {
3390 llvm::Type *EltTy = ATy->getElementType();
3391 unsigned EltSize = TD.getTypeAllocSize(EltTy);
3392 IROffset -= IROffset/EltSize*EltSize;
3393 return ContainsFloatAtOffset(EltTy, IROffset, TD);
3394 }
3395
3396 return false;
3397 }
3398
3399
3400 /// GetSSETypeAtOffset - Return a type that will be passed by the backend in the
3401 /// low 8 bytes of an XMM register, corresponding to the SSE class.
3402 llvm::Type *X86_64ABIInfo::
GetSSETypeAtOffset(llvm::Type * IRType,unsigned IROffset,QualType SourceTy,unsigned SourceOffset) const3403 GetSSETypeAtOffset(llvm::Type *IRType, unsigned IROffset,
3404 QualType SourceTy, unsigned SourceOffset) const {
3405 // The only three choices we have are either double, <2 x float>, or float. We
3406 // pass as float if the last 4 bytes is just padding. This happens for
3407 // structs that contain 3 floats.
3408 if (BitsContainNoUserData(SourceTy, SourceOffset*8+32,
3409 SourceOffset*8+64, getContext()))
3410 return llvm::Type::getFloatTy(getVMContext());
3411
3412 // We want to pass as <2 x float> if the LLVM IR type contains a float at
3413 // offset+0 and offset+4. Walk the LLVM IR type to find out if this is the
3414 // case.
3415 if (ContainsFloatAtOffset(IRType, IROffset, getDataLayout()) &&
3416 ContainsFloatAtOffset(IRType, IROffset+4, getDataLayout()))
3417 return llvm::FixedVectorType::get(llvm::Type::getFloatTy(getVMContext()),
3418 2);
3419
3420 return llvm::Type::getDoubleTy(getVMContext());
3421 }
3422
3423
3424 /// GetINTEGERTypeAtOffset - The ABI specifies that a value should be passed in
3425 /// an 8-byte GPR. This means that we either have a scalar or we are talking
3426 /// about the high or low part of an up-to-16-byte struct. This routine picks
3427 /// the best LLVM IR type to represent this, which may be i64 or may be anything
3428 /// else that the backend will pass in a GPR that works better (e.g. i8, %foo*,
3429 /// etc).
3430 ///
3431 /// PrefType is an LLVM IR type that corresponds to (part of) the IR type for
3432 /// the source type. IROffset is an offset in bytes into the LLVM IR type that
3433 /// the 8-byte value references. PrefType may be null.
3434 ///
3435 /// SourceTy is the source-level type for the entire argument. SourceOffset is
3436 /// an offset into this that we're processing (which is always either 0 or 8).
3437 ///
3438 llvm::Type *X86_64ABIInfo::
GetINTEGERTypeAtOffset(llvm::Type * IRType,unsigned IROffset,QualType SourceTy,unsigned SourceOffset) const3439 GetINTEGERTypeAtOffset(llvm::Type *IRType, unsigned IROffset,
3440 QualType SourceTy, unsigned SourceOffset) const {
3441 // If we're dealing with an un-offset LLVM IR type, then it means that we're
3442 // returning an 8-byte unit starting with it. See if we can safely use it.
3443 if (IROffset == 0) {
3444 // Pointers and int64's always fill the 8-byte unit.
3445 if ((isa<llvm::PointerType>(IRType) && Has64BitPointers) ||
3446 IRType->isIntegerTy(64))
3447 return IRType;
3448
3449 // If we have a 1/2/4-byte integer, we can use it only if the rest of the
3450 // goodness in the source type is just tail padding. This is allowed to
3451 // kick in for struct {double,int} on the int, but not on
3452 // struct{double,int,int} because we wouldn't return the second int. We
3453 // have to do this analysis on the source type because we can't depend on
3454 // unions being lowered a specific way etc.
3455 if (IRType->isIntegerTy(8) || IRType->isIntegerTy(16) ||
3456 IRType->isIntegerTy(32) ||
3457 (isa<llvm::PointerType>(IRType) && !Has64BitPointers)) {
3458 unsigned BitWidth = isa<llvm::PointerType>(IRType) ? 32 :
3459 cast<llvm::IntegerType>(IRType)->getBitWidth();
3460
3461 if (BitsContainNoUserData(SourceTy, SourceOffset*8+BitWidth,
3462 SourceOffset*8+64, getContext()))
3463 return IRType;
3464 }
3465 }
3466
3467 if (llvm::StructType *STy = dyn_cast<llvm::StructType>(IRType)) {
3468 // If this is a struct, recurse into the field at the specified offset.
3469 const llvm::StructLayout *SL = getDataLayout().getStructLayout(STy);
3470 if (IROffset < SL->getSizeInBytes()) {
3471 unsigned FieldIdx = SL->getElementContainingOffset(IROffset);
3472 IROffset -= SL->getElementOffset(FieldIdx);
3473
3474 return GetINTEGERTypeAtOffset(STy->getElementType(FieldIdx), IROffset,
3475 SourceTy, SourceOffset);
3476 }
3477 }
3478
3479 if (llvm::ArrayType *ATy = dyn_cast<llvm::ArrayType>(IRType)) {
3480 llvm::Type *EltTy = ATy->getElementType();
3481 unsigned EltSize = getDataLayout().getTypeAllocSize(EltTy);
3482 unsigned EltOffset = IROffset/EltSize*EltSize;
3483 return GetINTEGERTypeAtOffset(EltTy, IROffset-EltOffset, SourceTy,
3484 SourceOffset);
3485 }
3486
3487 // Okay, we don't have any better idea of what to pass, so we pass this in an
3488 // integer register that isn't too big to fit the rest of the struct.
3489 unsigned TySizeInBytes =
3490 (unsigned)getContext().getTypeSizeInChars(SourceTy).getQuantity();
3491
3492 assert(TySizeInBytes != SourceOffset && "Empty field?");
3493
3494 // It is always safe to classify this as an integer type up to i64 that
3495 // isn't larger than the structure.
3496 return llvm::IntegerType::get(getVMContext(),
3497 std::min(TySizeInBytes-SourceOffset, 8U)*8);
3498 }
3499
3500
3501 /// GetX86_64ByValArgumentPair - Given a high and low type that can ideally
3502 /// be used as elements of a two register pair to pass or return, return a
3503 /// first class aggregate to represent them. For example, if the low part of
3504 /// a by-value argument should be passed as i32* and the high part as float,
3505 /// return {i32*, float}.
3506 static llvm::Type *
GetX86_64ByValArgumentPair(llvm::Type * Lo,llvm::Type * Hi,const llvm::DataLayout & TD)3507 GetX86_64ByValArgumentPair(llvm::Type *Lo, llvm::Type *Hi,
3508 const llvm::DataLayout &TD) {
3509 // In order to correctly satisfy the ABI, we need to the high part to start
3510 // at offset 8. If the high and low parts we inferred are both 4-byte types
3511 // (e.g. i32 and i32) then the resultant struct type ({i32,i32}) won't have
3512 // the second element at offset 8. Check for this:
3513 unsigned LoSize = (unsigned)TD.getTypeAllocSize(Lo);
3514 unsigned HiAlign = TD.getABITypeAlignment(Hi);
3515 unsigned HiStart = llvm::alignTo(LoSize, HiAlign);
3516 assert(HiStart != 0 && HiStart <= 8 && "Invalid x86-64 argument pair!");
3517
3518 // To handle this, we have to increase the size of the low part so that the
3519 // second element will start at an 8 byte offset. We can't increase the size
3520 // of the second element because it might make us access off the end of the
3521 // struct.
3522 if (HiStart != 8) {
3523 // There are usually two sorts of types the ABI generation code can produce
3524 // for the low part of a pair that aren't 8 bytes in size: float or
3525 // i8/i16/i32. This can also include pointers when they are 32-bit (X32 and
3526 // NaCl).
3527 // Promote these to a larger type.
3528 if (Lo->isFloatTy())
3529 Lo = llvm::Type::getDoubleTy(Lo->getContext());
3530 else {
3531 assert((Lo->isIntegerTy() || Lo->isPointerTy())
3532 && "Invalid/unknown lo type");
3533 Lo = llvm::Type::getInt64Ty(Lo->getContext());
3534 }
3535 }
3536
3537 llvm::StructType *Result = llvm::StructType::get(Lo, Hi);
3538
3539 // Verify that the second element is at an 8-byte offset.
3540 assert(TD.getStructLayout(Result)->getElementOffset(1) == 8 &&
3541 "Invalid x86-64 argument pair!");
3542 return Result;
3543 }
3544
3545 ABIArgInfo X86_64ABIInfo::
classifyReturnType(QualType RetTy) const3546 classifyReturnType(QualType RetTy) const {
3547 // AMD64-ABI 3.2.3p4: Rule 1. Classify the return type with the
3548 // classification algorithm.
3549 X86_64ABIInfo::Class Lo, Hi;
3550 classify(RetTy, 0, Lo, Hi, /*isNamedArg*/ true);
3551
3552 // Check some invariants.
3553 assert((Hi != Memory || Lo == Memory) && "Invalid memory classification.");
3554 assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification.");
3555
3556 llvm::Type *ResType = nullptr;
3557 switch (Lo) {
3558 case NoClass:
3559 if (Hi == NoClass)
3560 return ABIArgInfo::getIgnore();
3561 // If the low part is just padding, it takes no register, leave ResType
3562 // null.
3563 assert((Hi == SSE || Hi == Integer || Hi == X87Up) &&
3564 "Unknown missing lo part");
3565 break;
3566
3567 case SSEUp:
3568 case X87Up:
3569 llvm_unreachable("Invalid classification for lo word.");
3570
3571 // AMD64-ABI 3.2.3p4: Rule 2. Types of class memory are returned via
3572 // hidden argument.
3573 case Memory:
3574 return getIndirectReturnResult(RetTy);
3575
3576 // AMD64-ABI 3.2.3p4: Rule 3. If the class is INTEGER, the next
3577 // available register of the sequence %rax, %rdx is used.
3578 case Integer:
3579 ResType = GetINTEGERTypeAtOffset(CGT.ConvertType(RetTy), 0, RetTy, 0);
3580
3581 // If we have a sign or zero extended integer, make sure to return Extend
3582 // so that the parameter gets the right LLVM IR attributes.
3583 if (Hi == NoClass && isa<llvm::IntegerType>(ResType)) {
3584 // Treat an enum type as its underlying type.
3585 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
3586 RetTy = EnumTy->getDecl()->getIntegerType();
3587
3588 if (RetTy->isIntegralOrEnumerationType() &&
3589 isPromotableIntegerTypeForABI(RetTy))
3590 return ABIArgInfo::getExtend(RetTy);
3591 }
3592 break;
3593
3594 // AMD64-ABI 3.2.3p4: Rule 4. If the class is SSE, the next
3595 // available SSE register of the sequence %xmm0, %xmm1 is used.
3596 case SSE:
3597 ResType = GetSSETypeAtOffset(CGT.ConvertType(RetTy), 0, RetTy, 0);
3598 break;
3599
3600 // AMD64-ABI 3.2.3p4: Rule 6. If the class is X87, the value is
3601 // returned on the X87 stack in %st0 as 80-bit x87 number.
3602 case X87:
3603 ResType = llvm::Type::getX86_FP80Ty(getVMContext());
3604 break;
3605
3606 // AMD64-ABI 3.2.3p4: Rule 8. If the class is COMPLEX_X87, the real
3607 // part of the value is returned in %st0 and the imaginary part in
3608 // %st1.
3609 case ComplexX87:
3610 assert(Hi == ComplexX87 && "Unexpected ComplexX87 classification.");
3611 ResType = llvm::StructType::get(llvm::Type::getX86_FP80Ty(getVMContext()),
3612 llvm::Type::getX86_FP80Ty(getVMContext()));
3613 break;
3614 }
3615
3616 llvm::Type *HighPart = nullptr;
3617 switch (Hi) {
3618 // Memory was handled previously and X87 should
3619 // never occur as a hi class.
3620 case Memory:
3621 case X87:
3622 llvm_unreachable("Invalid classification for hi word.");
3623
3624 case ComplexX87: // Previously handled.
3625 case NoClass:
3626 break;
3627
3628 case Integer:
3629 HighPart = GetINTEGERTypeAtOffset(CGT.ConvertType(RetTy), 8, RetTy, 8);
3630 if (Lo == NoClass) // Return HighPart at offset 8 in memory.
3631 return ABIArgInfo::getDirect(HighPart, 8);
3632 break;
3633 case SSE:
3634 HighPart = GetSSETypeAtOffset(CGT.ConvertType(RetTy), 8, RetTy, 8);
3635 if (Lo == NoClass) // Return HighPart at offset 8 in memory.
3636 return ABIArgInfo::getDirect(HighPart, 8);
3637 break;
3638
3639 // AMD64-ABI 3.2.3p4: Rule 5. If the class is SSEUP, the eightbyte
3640 // is passed in the next available eightbyte chunk if the last used
3641 // vector register.
3642 //
3643 // SSEUP should always be preceded by SSE, just widen.
3644 case SSEUp:
3645 assert(Lo == SSE && "Unexpected SSEUp classification.");
3646 ResType = GetByteVectorType(RetTy);
3647 break;
3648
3649 // AMD64-ABI 3.2.3p4: Rule 7. If the class is X87UP, the value is
3650 // returned together with the previous X87 value in %st0.
3651 case X87Up:
3652 // If X87Up is preceded by X87, we don't need to do
3653 // anything. However, in some cases with unions it may not be
3654 // preceded by X87. In such situations we follow gcc and pass the
3655 // extra bits in an SSE reg.
3656 if (Lo != X87) {
3657 HighPart = GetSSETypeAtOffset(CGT.ConvertType(RetTy), 8, RetTy, 8);
3658 if (Lo == NoClass) // Return HighPart at offset 8 in memory.
3659 return ABIArgInfo::getDirect(HighPart, 8);
3660 }
3661 break;
3662 }
3663
3664 // If a high part was specified, merge it together with the low part. It is
3665 // known to pass in the high eightbyte of the result. We do this by forming a
3666 // first class struct aggregate with the high and low part: {low, high}
3667 if (HighPart)
3668 ResType = GetX86_64ByValArgumentPair(ResType, HighPart, getDataLayout());
3669
3670 return ABIArgInfo::getDirect(ResType);
3671 }
3672
classifyArgumentType(QualType Ty,unsigned freeIntRegs,unsigned & neededInt,unsigned & neededSSE,bool isNamedArg) const3673 ABIArgInfo X86_64ABIInfo::classifyArgumentType(
3674 QualType Ty, unsigned freeIntRegs, unsigned &neededInt, unsigned &neededSSE,
3675 bool isNamedArg)
3676 const
3677 {
3678 Ty = useFirstFieldIfTransparentUnion(Ty);
3679
3680 X86_64ABIInfo::Class Lo, Hi;
3681 classify(Ty, 0, Lo, Hi, isNamedArg);
3682
3683 // Check some invariants.
3684 // FIXME: Enforce these by construction.
3685 assert((Hi != Memory || Lo == Memory) && "Invalid memory classification.");
3686 assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification.");
3687
3688 neededInt = 0;
3689 neededSSE = 0;
3690 llvm::Type *ResType = nullptr;
3691 switch (Lo) {
3692 case NoClass:
3693 if (Hi == NoClass)
3694 return ABIArgInfo::getIgnore();
3695 // If the low part is just padding, it takes no register, leave ResType
3696 // null.
3697 assert((Hi == SSE || Hi == Integer || Hi == X87Up) &&
3698 "Unknown missing lo part");
3699 break;
3700
3701 // AMD64-ABI 3.2.3p3: Rule 1. If the class is MEMORY, pass the argument
3702 // on the stack.
3703 case Memory:
3704
3705 // AMD64-ABI 3.2.3p3: Rule 5. If the class is X87, X87UP or
3706 // COMPLEX_X87, it is passed in memory.
3707 case X87:
3708 case ComplexX87:
3709 if (getRecordArgABI(Ty, getCXXABI()) == CGCXXABI::RAA_Indirect)
3710 ++neededInt;
3711 return getIndirectResult(Ty, freeIntRegs);
3712
3713 case SSEUp:
3714 case X87Up:
3715 llvm_unreachable("Invalid classification for lo word.");
3716
3717 // AMD64-ABI 3.2.3p3: Rule 2. If the class is INTEGER, the next
3718 // available register of the sequence %rdi, %rsi, %rdx, %rcx, %r8
3719 // and %r9 is used.
3720 case Integer:
3721 ++neededInt;
3722
3723 // Pick an 8-byte type based on the preferred type.
3724 ResType = GetINTEGERTypeAtOffset(CGT.ConvertType(Ty), 0, Ty, 0);
3725
3726 // If we have a sign or zero extended integer, make sure to return Extend
3727 // so that the parameter gets the right LLVM IR attributes.
3728 if (Hi == NoClass && isa<llvm::IntegerType>(ResType)) {
3729 // Treat an enum type as its underlying type.
3730 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
3731 Ty = EnumTy->getDecl()->getIntegerType();
3732
3733 if (Ty->isIntegralOrEnumerationType() &&
3734 isPromotableIntegerTypeForABI(Ty))
3735 return ABIArgInfo::getExtend(Ty);
3736 }
3737
3738 break;
3739
3740 // AMD64-ABI 3.2.3p3: Rule 3. If the class is SSE, the next
3741 // available SSE register is used, the registers are taken in the
3742 // order from %xmm0 to %xmm7.
3743 case SSE: {
3744 llvm::Type *IRType = CGT.ConvertType(Ty);
3745 ResType = GetSSETypeAtOffset(IRType, 0, Ty, 0);
3746 ++neededSSE;
3747 break;
3748 }
3749 }
3750
3751 llvm::Type *HighPart = nullptr;
3752 switch (Hi) {
3753 // Memory was handled previously, ComplexX87 and X87 should
3754 // never occur as hi classes, and X87Up must be preceded by X87,
3755 // which is passed in memory.
3756 case Memory:
3757 case X87:
3758 case ComplexX87:
3759 llvm_unreachable("Invalid classification for hi word.");
3760
3761 case NoClass: break;
3762
3763 case Integer:
3764 ++neededInt;
3765 // Pick an 8-byte type based on the preferred type.
3766 HighPart = GetINTEGERTypeAtOffset(CGT.ConvertType(Ty), 8, Ty, 8);
3767
3768 if (Lo == NoClass) // Pass HighPart at offset 8 in memory.
3769 return ABIArgInfo::getDirect(HighPart, 8);
3770 break;
3771
3772 // X87Up generally doesn't occur here (long double is passed in
3773 // memory), except in situations involving unions.
3774 case X87Up:
3775 case SSE:
3776 HighPart = GetSSETypeAtOffset(CGT.ConvertType(Ty), 8, Ty, 8);
3777
3778 if (Lo == NoClass) // Pass HighPart at offset 8 in memory.
3779 return ABIArgInfo::getDirect(HighPart, 8);
3780
3781 ++neededSSE;
3782 break;
3783
3784 // AMD64-ABI 3.2.3p3: Rule 4. If the class is SSEUP, the
3785 // eightbyte is passed in the upper half of the last used SSE
3786 // register. This only happens when 128-bit vectors are passed.
3787 case SSEUp:
3788 assert(Lo == SSE && "Unexpected SSEUp classification");
3789 ResType = GetByteVectorType(Ty);
3790 break;
3791 }
3792
3793 // If a high part was specified, merge it together with the low part. It is
3794 // known to pass in the high eightbyte of the result. We do this by forming a
3795 // first class struct aggregate with the high and low part: {low, high}
3796 if (HighPart)
3797 ResType = GetX86_64ByValArgumentPair(ResType, HighPart, getDataLayout());
3798
3799 return ABIArgInfo::getDirect(ResType);
3800 }
3801
3802 ABIArgInfo
classifyRegCallStructTypeImpl(QualType Ty,unsigned & NeededInt,unsigned & NeededSSE) const3803 X86_64ABIInfo::classifyRegCallStructTypeImpl(QualType Ty, unsigned &NeededInt,
3804 unsigned &NeededSSE) const {
3805 auto RT = Ty->getAs<RecordType>();
3806 assert(RT && "classifyRegCallStructType only valid with struct types");
3807
3808 if (RT->getDecl()->hasFlexibleArrayMember())
3809 return getIndirectReturnResult(Ty);
3810
3811 // Sum up bases
3812 if (auto CXXRD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
3813 if (CXXRD->isDynamicClass()) {
3814 NeededInt = NeededSSE = 0;
3815 return getIndirectReturnResult(Ty);
3816 }
3817
3818 for (const auto &I : CXXRD->bases())
3819 if (classifyRegCallStructTypeImpl(I.getType(), NeededInt, NeededSSE)
3820 .isIndirect()) {
3821 NeededInt = NeededSSE = 0;
3822 return getIndirectReturnResult(Ty);
3823 }
3824 }
3825
3826 // Sum up members
3827 for (const auto *FD : RT->getDecl()->fields()) {
3828 if (FD->getType()->isRecordType() && !FD->getType()->isUnionType()) {
3829 if (classifyRegCallStructTypeImpl(FD->getType(), NeededInt, NeededSSE)
3830 .isIndirect()) {
3831 NeededInt = NeededSSE = 0;
3832 return getIndirectReturnResult(Ty);
3833 }
3834 } else {
3835 unsigned LocalNeededInt, LocalNeededSSE;
3836 if (classifyArgumentType(FD->getType(), UINT_MAX, LocalNeededInt,
3837 LocalNeededSSE, true)
3838 .isIndirect()) {
3839 NeededInt = NeededSSE = 0;
3840 return getIndirectReturnResult(Ty);
3841 }
3842 NeededInt += LocalNeededInt;
3843 NeededSSE += LocalNeededSSE;
3844 }
3845 }
3846
3847 return ABIArgInfo::getDirect();
3848 }
3849
classifyRegCallStructType(QualType Ty,unsigned & NeededInt,unsigned & NeededSSE) const3850 ABIArgInfo X86_64ABIInfo::classifyRegCallStructType(QualType Ty,
3851 unsigned &NeededInt,
3852 unsigned &NeededSSE) const {
3853
3854 NeededInt = 0;
3855 NeededSSE = 0;
3856
3857 return classifyRegCallStructTypeImpl(Ty, NeededInt, NeededSSE);
3858 }
3859
computeInfo(CGFunctionInfo & FI) const3860 void X86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const {
3861
3862 const unsigned CallingConv = FI.getCallingConvention();
3863 // It is possible to force Win64 calling convention on any x86_64 target by
3864 // using __attribute__((ms_abi)). In such case to correctly emit Win64
3865 // compatible code delegate this call to WinX86_64ABIInfo::computeInfo.
3866 if (CallingConv == llvm::CallingConv::Win64) {
3867 WinX86_64ABIInfo Win64ABIInfo(CGT, AVXLevel);
3868 Win64ABIInfo.computeInfo(FI);
3869 return;
3870 }
3871
3872 bool IsRegCall = CallingConv == llvm::CallingConv::X86_RegCall;
3873
3874 // Keep track of the number of assigned registers.
3875 unsigned FreeIntRegs = IsRegCall ? 11 : 6;
3876 unsigned FreeSSERegs = IsRegCall ? 16 : 8;
3877 unsigned NeededInt, NeededSSE;
3878
3879 if (!::classifyReturnType(getCXXABI(), FI, *this)) {
3880 if (IsRegCall && FI.getReturnType()->getTypePtr()->isRecordType() &&
3881 !FI.getReturnType()->getTypePtr()->isUnionType()) {
3882 FI.getReturnInfo() =
3883 classifyRegCallStructType(FI.getReturnType(), NeededInt, NeededSSE);
3884 if (FreeIntRegs >= NeededInt && FreeSSERegs >= NeededSSE) {
3885 FreeIntRegs -= NeededInt;
3886 FreeSSERegs -= NeededSSE;
3887 } else {
3888 FI.getReturnInfo() = getIndirectReturnResult(FI.getReturnType());
3889 }
3890 } else if (IsRegCall && FI.getReturnType()->getAs<ComplexType>() &&
3891 getContext().getCanonicalType(FI.getReturnType()
3892 ->getAs<ComplexType>()
3893 ->getElementType()) ==
3894 getContext().LongDoubleTy)
3895 // Complex Long Double Type is passed in Memory when Regcall
3896 // calling convention is used.
3897 FI.getReturnInfo() = getIndirectReturnResult(FI.getReturnType());
3898 else
3899 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
3900 }
3901
3902 // If the return value is indirect, then the hidden argument is consuming one
3903 // integer register.
3904 if (FI.getReturnInfo().isIndirect())
3905 --FreeIntRegs;
3906
3907 // The chain argument effectively gives us another free register.
3908 if (FI.isChainCall())
3909 ++FreeIntRegs;
3910
3911 unsigned NumRequiredArgs = FI.getNumRequiredArgs();
3912 // AMD64-ABI 3.2.3p3: Once arguments are classified, the registers
3913 // get assigned (in left-to-right order) for passing as follows...
3914 unsigned ArgNo = 0;
3915 for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
3916 it != ie; ++it, ++ArgNo) {
3917 bool IsNamedArg = ArgNo < NumRequiredArgs;
3918
3919 if (IsRegCall && it->type->isStructureOrClassType())
3920 it->info = classifyRegCallStructType(it->type, NeededInt, NeededSSE);
3921 else
3922 it->info = classifyArgumentType(it->type, FreeIntRegs, NeededInt,
3923 NeededSSE, IsNamedArg);
3924
3925 // AMD64-ABI 3.2.3p3: If there are no registers available for any
3926 // eightbyte of an argument, the whole argument is passed on the
3927 // stack. If registers have already been assigned for some
3928 // eightbytes of such an argument, the assignments get reverted.
3929 if (FreeIntRegs >= NeededInt && FreeSSERegs >= NeededSSE) {
3930 FreeIntRegs -= NeededInt;
3931 FreeSSERegs -= NeededSSE;
3932 } else {
3933 it->info = getIndirectResult(it->type, FreeIntRegs);
3934 }
3935 }
3936 }
3937
EmitX86_64VAArgFromMemory(CodeGenFunction & CGF,Address VAListAddr,QualType Ty)3938 static Address EmitX86_64VAArgFromMemory(CodeGenFunction &CGF,
3939 Address VAListAddr, QualType Ty) {
3940 Address overflow_arg_area_p =
3941 CGF.Builder.CreateStructGEP(VAListAddr, 2, "overflow_arg_area_p");
3942 llvm::Value *overflow_arg_area =
3943 CGF.Builder.CreateLoad(overflow_arg_area_p, "overflow_arg_area");
3944
3945 // AMD64-ABI 3.5.7p5: Step 7. Align l->overflow_arg_area upwards to a 16
3946 // byte boundary if alignment needed by type exceeds 8 byte boundary.
3947 // It isn't stated explicitly in the standard, but in practice we use
3948 // alignment greater than 16 where necessary.
3949 CharUnits Align = CGF.getContext().getTypeAlignInChars(Ty);
3950 if (Align > CharUnits::fromQuantity(8)) {
3951 overflow_arg_area = emitRoundPointerUpToAlignment(CGF, overflow_arg_area,
3952 Align);
3953 }
3954
3955 // AMD64-ABI 3.5.7p5: Step 8. Fetch type from l->overflow_arg_area.
3956 llvm::Type *LTy = CGF.ConvertTypeForMem(Ty);
3957 llvm::Value *Res =
3958 CGF.Builder.CreateBitCast(overflow_arg_area,
3959 llvm::PointerType::getUnqual(LTy));
3960
3961 // AMD64-ABI 3.5.7p5: Step 9. Set l->overflow_arg_area to:
3962 // l->overflow_arg_area + sizeof(type).
3963 // AMD64-ABI 3.5.7p5: Step 10. Align l->overflow_arg_area upwards to
3964 // an 8 byte boundary.
3965
3966 uint64_t SizeInBytes = (CGF.getContext().getTypeSize(Ty) + 7) / 8;
3967 llvm::Value *Offset =
3968 llvm::ConstantInt::get(CGF.Int32Ty, (SizeInBytes + 7) & ~7);
3969 overflow_arg_area = CGF.Builder.CreateGEP(overflow_arg_area, Offset,
3970 "overflow_arg_area.next");
3971 CGF.Builder.CreateStore(overflow_arg_area, overflow_arg_area_p);
3972
3973 // AMD64-ABI 3.5.7p5: Step 11. Return the fetched type.
3974 return Address(Res, Align);
3975 }
3976
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const3977 Address X86_64ABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
3978 QualType Ty) const {
3979 // Assume that va_list type is correct; should be pointer to LLVM type:
3980 // struct {
3981 // i32 gp_offset;
3982 // i32 fp_offset;
3983 // i8* overflow_arg_area;
3984 // i8* reg_save_area;
3985 // };
3986 unsigned neededInt, neededSSE;
3987
3988 Ty = getContext().getCanonicalType(Ty);
3989 ABIArgInfo AI = classifyArgumentType(Ty, 0, neededInt, neededSSE,
3990 /*isNamedArg*/false);
3991
3992 // AMD64-ABI 3.5.7p5: Step 1. Determine whether type may be passed
3993 // in the registers. If not go to step 7.
3994 if (!neededInt && !neededSSE)
3995 return EmitX86_64VAArgFromMemory(CGF, VAListAddr, Ty);
3996
3997 // AMD64-ABI 3.5.7p5: Step 2. Compute num_gp to hold the number of
3998 // general purpose registers needed to pass type and num_fp to hold
3999 // the number of floating point registers needed.
4000
4001 // AMD64-ABI 3.5.7p5: Step 3. Verify whether arguments fit into
4002 // registers. In the case: l->gp_offset > 48 - num_gp * 8 or
4003 // l->fp_offset > 304 - num_fp * 16 go to step 7.
4004 //
4005 // NOTE: 304 is a typo, there are (6 * 8 + 8 * 16) = 176 bytes of
4006 // register save space).
4007
4008 llvm::Value *InRegs = nullptr;
4009 Address gp_offset_p = Address::invalid(), fp_offset_p = Address::invalid();
4010 llvm::Value *gp_offset = nullptr, *fp_offset = nullptr;
4011 if (neededInt) {
4012 gp_offset_p = CGF.Builder.CreateStructGEP(VAListAddr, 0, "gp_offset_p");
4013 gp_offset = CGF.Builder.CreateLoad(gp_offset_p, "gp_offset");
4014 InRegs = llvm::ConstantInt::get(CGF.Int32Ty, 48 - neededInt * 8);
4015 InRegs = CGF.Builder.CreateICmpULE(gp_offset, InRegs, "fits_in_gp");
4016 }
4017
4018 if (neededSSE) {
4019 fp_offset_p = CGF.Builder.CreateStructGEP(VAListAddr, 1, "fp_offset_p");
4020 fp_offset = CGF.Builder.CreateLoad(fp_offset_p, "fp_offset");
4021 llvm::Value *FitsInFP =
4022 llvm::ConstantInt::get(CGF.Int32Ty, 176 - neededSSE * 16);
4023 FitsInFP = CGF.Builder.CreateICmpULE(fp_offset, FitsInFP, "fits_in_fp");
4024 InRegs = InRegs ? CGF.Builder.CreateAnd(InRegs, FitsInFP) : FitsInFP;
4025 }
4026
4027 llvm::BasicBlock *InRegBlock = CGF.createBasicBlock("vaarg.in_reg");
4028 llvm::BasicBlock *InMemBlock = CGF.createBasicBlock("vaarg.in_mem");
4029 llvm::BasicBlock *ContBlock = CGF.createBasicBlock("vaarg.end");
4030 CGF.Builder.CreateCondBr(InRegs, InRegBlock, InMemBlock);
4031
4032 // Emit code to load the value if it was passed in registers.
4033
4034 CGF.EmitBlock(InRegBlock);
4035
4036 // AMD64-ABI 3.5.7p5: Step 4. Fetch type from l->reg_save_area with
4037 // an offset of l->gp_offset and/or l->fp_offset. This may require
4038 // copying to a temporary location in case the parameter is passed
4039 // in different register classes or requires an alignment greater
4040 // than 8 for general purpose registers and 16 for XMM registers.
4041 //
4042 // FIXME: This really results in shameful code when we end up needing to
4043 // collect arguments from different places; often what should result in a
4044 // simple assembling of a structure from scattered addresses has many more
4045 // loads than necessary. Can we clean this up?
4046 llvm::Type *LTy = CGF.ConvertTypeForMem(Ty);
4047 llvm::Value *RegSaveArea = CGF.Builder.CreateLoad(
4048 CGF.Builder.CreateStructGEP(VAListAddr, 3), "reg_save_area");
4049
4050 Address RegAddr = Address::invalid();
4051 if (neededInt && neededSSE) {
4052 // FIXME: Cleanup.
4053 assert(AI.isDirect() && "Unexpected ABI info for mixed regs");
4054 llvm::StructType *ST = cast<llvm::StructType>(AI.getCoerceToType());
4055 Address Tmp = CGF.CreateMemTemp(Ty);
4056 Tmp = CGF.Builder.CreateElementBitCast(Tmp, ST);
4057 assert(ST->getNumElements() == 2 && "Unexpected ABI info for mixed regs");
4058 llvm::Type *TyLo = ST->getElementType(0);
4059 llvm::Type *TyHi = ST->getElementType(1);
4060 assert((TyLo->isFPOrFPVectorTy() ^ TyHi->isFPOrFPVectorTy()) &&
4061 "Unexpected ABI info for mixed regs");
4062 llvm::Type *PTyLo = llvm::PointerType::getUnqual(TyLo);
4063 llvm::Type *PTyHi = llvm::PointerType::getUnqual(TyHi);
4064 llvm::Value *GPAddr = CGF.Builder.CreateGEP(RegSaveArea, gp_offset);
4065 llvm::Value *FPAddr = CGF.Builder.CreateGEP(RegSaveArea, fp_offset);
4066 llvm::Value *RegLoAddr = TyLo->isFPOrFPVectorTy() ? FPAddr : GPAddr;
4067 llvm::Value *RegHiAddr = TyLo->isFPOrFPVectorTy() ? GPAddr : FPAddr;
4068
4069 // Copy the first element.
4070 // FIXME: Our choice of alignment here and below is probably pessimistic.
4071 llvm::Value *V = CGF.Builder.CreateAlignedLoad(
4072 TyLo, CGF.Builder.CreateBitCast(RegLoAddr, PTyLo),
4073 CharUnits::fromQuantity(getDataLayout().getABITypeAlignment(TyLo)));
4074 CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 0));
4075
4076 // Copy the second element.
4077 V = CGF.Builder.CreateAlignedLoad(
4078 TyHi, CGF.Builder.CreateBitCast(RegHiAddr, PTyHi),
4079 CharUnits::fromQuantity(getDataLayout().getABITypeAlignment(TyHi)));
4080 CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 1));
4081
4082 RegAddr = CGF.Builder.CreateElementBitCast(Tmp, LTy);
4083 } else if (neededInt) {
4084 RegAddr = Address(CGF.Builder.CreateGEP(RegSaveArea, gp_offset),
4085 CharUnits::fromQuantity(8));
4086 RegAddr = CGF.Builder.CreateElementBitCast(RegAddr, LTy);
4087
4088 // Copy to a temporary if necessary to ensure the appropriate alignment.
4089 auto TInfo = getContext().getTypeInfoInChars(Ty);
4090 uint64_t TySize = TInfo.Width.getQuantity();
4091 CharUnits TyAlign = TInfo.Align;
4092
4093 // Copy into a temporary if the type is more aligned than the
4094 // register save area.
4095 if (TyAlign.getQuantity() > 8) {
4096 Address Tmp = CGF.CreateMemTemp(Ty);
4097 CGF.Builder.CreateMemCpy(Tmp, RegAddr, TySize, false);
4098 RegAddr = Tmp;
4099 }
4100
4101 } else if (neededSSE == 1) {
4102 RegAddr = Address(CGF.Builder.CreateGEP(RegSaveArea, fp_offset),
4103 CharUnits::fromQuantity(16));
4104 RegAddr = CGF.Builder.CreateElementBitCast(RegAddr, LTy);
4105 } else {
4106 assert(neededSSE == 2 && "Invalid number of needed registers!");
4107 // SSE registers are spaced 16 bytes apart in the register save
4108 // area, we need to collect the two eightbytes together.
4109 // The ABI isn't explicit about this, but it seems reasonable
4110 // to assume that the slots are 16-byte aligned, since the stack is
4111 // naturally 16-byte aligned and the prologue is expected to store
4112 // all the SSE registers to the RSA.
4113 Address RegAddrLo = Address(CGF.Builder.CreateGEP(RegSaveArea, fp_offset),
4114 CharUnits::fromQuantity(16));
4115 Address RegAddrHi =
4116 CGF.Builder.CreateConstInBoundsByteGEP(RegAddrLo,
4117 CharUnits::fromQuantity(16));
4118 llvm::Type *ST = AI.canHaveCoerceToType()
4119 ? AI.getCoerceToType()
4120 : llvm::StructType::get(CGF.DoubleTy, CGF.DoubleTy);
4121 llvm::Value *V;
4122 Address Tmp = CGF.CreateMemTemp(Ty);
4123 Tmp = CGF.Builder.CreateElementBitCast(Tmp, ST);
4124 V = CGF.Builder.CreateLoad(CGF.Builder.CreateElementBitCast(
4125 RegAddrLo, ST->getStructElementType(0)));
4126 CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 0));
4127 V = CGF.Builder.CreateLoad(CGF.Builder.CreateElementBitCast(
4128 RegAddrHi, ST->getStructElementType(1)));
4129 CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 1));
4130
4131 RegAddr = CGF.Builder.CreateElementBitCast(Tmp, LTy);
4132 }
4133
4134 // AMD64-ABI 3.5.7p5: Step 5. Set:
4135 // l->gp_offset = l->gp_offset + num_gp * 8
4136 // l->fp_offset = l->fp_offset + num_fp * 16.
4137 if (neededInt) {
4138 llvm::Value *Offset = llvm::ConstantInt::get(CGF.Int32Ty, neededInt * 8);
4139 CGF.Builder.CreateStore(CGF.Builder.CreateAdd(gp_offset, Offset),
4140 gp_offset_p);
4141 }
4142 if (neededSSE) {
4143 llvm::Value *Offset = llvm::ConstantInt::get(CGF.Int32Ty, neededSSE * 16);
4144 CGF.Builder.CreateStore(CGF.Builder.CreateAdd(fp_offset, Offset),
4145 fp_offset_p);
4146 }
4147 CGF.EmitBranch(ContBlock);
4148
4149 // Emit code to load the value if it was passed in memory.
4150
4151 CGF.EmitBlock(InMemBlock);
4152 Address MemAddr = EmitX86_64VAArgFromMemory(CGF, VAListAddr, Ty);
4153
4154 // Return the appropriate result.
4155
4156 CGF.EmitBlock(ContBlock);
4157 Address ResAddr = emitMergePHI(CGF, RegAddr, InRegBlock, MemAddr, InMemBlock,
4158 "vaarg.addr");
4159 return ResAddr;
4160 }
4161
EmitMSVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const4162 Address X86_64ABIInfo::EmitMSVAArg(CodeGenFunction &CGF, Address VAListAddr,
4163 QualType Ty) const {
4164 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, /*indirect*/ false,
4165 CGF.getContext().getTypeInfoInChars(Ty),
4166 CharUnits::fromQuantity(8),
4167 /*allowHigherAlign*/ false);
4168 }
4169
reclassifyHvaArgForVectorCall(QualType Ty,unsigned & FreeSSERegs,const ABIArgInfo & current) const4170 ABIArgInfo WinX86_64ABIInfo::reclassifyHvaArgForVectorCall(
4171 QualType Ty, unsigned &FreeSSERegs, const ABIArgInfo ¤t) const {
4172 const Type *Base = nullptr;
4173 uint64_t NumElts = 0;
4174
4175 if (!Ty->isBuiltinType() && !Ty->isVectorType() &&
4176 isHomogeneousAggregate(Ty, Base, NumElts) && FreeSSERegs >= NumElts) {
4177 FreeSSERegs -= NumElts;
4178 return getDirectX86Hva();
4179 }
4180 return current;
4181 }
4182
classify(QualType Ty,unsigned & FreeSSERegs,bool IsReturnType,bool IsVectorCall,bool IsRegCall) const4183 ABIArgInfo WinX86_64ABIInfo::classify(QualType Ty, unsigned &FreeSSERegs,
4184 bool IsReturnType, bool IsVectorCall,
4185 bool IsRegCall) const {
4186
4187 if (Ty->isVoidType())
4188 return ABIArgInfo::getIgnore();
4189
4190 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
4191 Ty = EnumTy->getDecl()->getIntegerType();
4192
4193 TypeInfo Info = getContext().getTypeInfo(Ty);
4194 uint64_t Width = Info.Width;
4195 CharUnits Align = getContext().toCharUnitsFromBits(Info.Align);
4196
4197 const RecordType *RT = Ty->getAs<RecordType>();
4198 if (RT) {
4199 if (!IsReturnType) {
4200 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(RT, getCXXABI()))
4201 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
4202 }
4203
4204 if (RT->getDecl()->hasFlexibleArrayMember())
4205 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
4206
4207 }
4208
4209 const Type *Base = nullptr;
4210 uint64_t NumElts = 0;
4211 // vectorcall adds the concept of a homogenous vector aggregate, similar to
4212 // other targets.
4213 if ((IsVectorCall || IsRegCall) &&
4214 isHomogeneousAggregate(Ty, Base, NumElts)) {
4215 if (IsRegCall) {
4216 if (FreeSSERegs >= NumElts) {
4217 FreeSSERegs -= NumElts;
4218 if (IsReturnType || Ty->isBuiltinType() || Ty->isVectorType())
4219 return ABIArgInfo::getDirect();
4220 return ABIArgInfo::getExpand();
4221 }
4222 return ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
4223 } else if (IsVectorCall) {
4224 if (FreeSSERegs >= NumElts &&
4225 (IsReturnType || Ty->isBuiltinType() || Ty->isVectorType())) {
4226 FreeSSERegs -= NumElts;
4227 return ABIArgInfo::getDirect();
4228 } else if (IsReturnType) {
4229 return ABIArgInfo::getExpand();
4230 } else if (!Ty->isBuiltinType() && !Ty->isVectorType()) {
4231 // HVAs are delayed and reclassified in the 2nd step.
4232 return ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
4233 }
4234 }
4235 }
4236
4237 if (Ty->isMemberPointerType()) {
4238 // If the member pointer is represented by an LLVM int or ptr, pass it
4239 // directly.
4240 llvm::Type *LLTy = CGT.ConvertType(Ty);
4241 if (LLTy->isPointerTy() || LLTy->isIntegerTy())
4242 return ABIArgInfo::getDirect();
4243 }
4244
4245 if (RT || Ty->isAnyComplexType() || Ty->isMemberPointerType()) {
4246 // MS x64 ABI requirement: "Any argument that doesn't fit in 8 bytes, or is
4247 // not 1, 2, 4, or 8 bytes, must be passed by reference."
4248 if (Width > 64 || !llvm::isPowerOf2_64(Width))
4249 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
4250
4251 // Otherwise, coerce it to a small integer.
4252 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), Width));
4253 }
4254
4255 if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
4256 switch (BT->getKind()) {
4257 case BuiltinType::Bool:
4258 // Bool type is always extended to the ABI, other builtin types are not
4259 // extended.
4260 return ABIArgInfo::getExtend(Ty);
4261
4262 case BuiltinType::LongDouble:
4263 // Mingw64 GCC uses the old 80 bit extended precision floating point
4264 // unit. It passes them indirectly through memory.
4265 if (IsMingw64) {
4266 const llvm::fltSemantics *LDF = &getTarget().getLongDoubleFormat();
4267 if (LDF == &llvm::APFloat::x87DoubleExtended())
4268 return ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
4269 }
4270 break;
4271
4272 case BuiltinType::Int128:
4273 case BuiltinType::UInt128:
4274 // If it's a parameter type, the normal ABI rule is that arguments larger
4275 // than 8 bytes are passed indirectly. GCC follows it. We follow it too,
4276 // even though it isn't particularly efficient.
4277 if (!IsReturnType)
4278 return ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
4279
4280 // Mingw64 GCC returns i128 in XMM0. Coerce to v2i64 to handle that.
4281 // Clang matches them for compatibility.
4282 return ABIArgInfo::getDirect(llvm::FixedVectorType::get(
4283 llvm::Type::getInt64Ty(getVMContext()), 2));
4284
4285 default:
4286 break;
4287 }
4288 }
4289
4290 if (Ty->isExtIntType()) {
4291 // MS x64 ABI requirement: "Any argument that doesn't fit in 8 bytes, or is
4292 // not 1, 2, 4, or 8 bytes, must be passed by reference."
4293 // However, non-power-of-two _ExtInts will be passed as 1,2,4 or 8 bytes
4294 // anyway as long is it fits in them, so we don't have to check the power of
4295 // 2.
4296 if (Width <= 64)
4297 return ABIArgInfo::getDirect();
4298 return ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
4299 }
4300
4301 return ABIArgInfo::getDirect();
4302 }
4303
computeInfo(CGFunctionInfo & FI) const4304 void WinX86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const {
4305 const unsigned CC = FI.getCallingConvention();
4306 bool IsVectorCall = CC == llvm::CallingConv::X86_VectorCall;
4307 bool IsRegCall = CC == llvm::CallingConv::X86_RegCall;
4308
4309 // If __attribute__((sysv_abi)) is in use, use the SysV argument
4310 // classification rules.
4311 if (CC == llvm::CallingConv::X86_64_SysV) {
4312 X86_64ABIInfo SysVABIInfo(CGT, AVXLevel);
4313 SysVABIInfo.computeInfo(FI);
4314 return;
4315 }
4316
4317 unsigned FreeSSERegs = 0;
4318 if (IsVectorCall) {
4319 // We can use up to 4 SSE return registers with vectorcall.
4320 FreeSSERegs = 4;
4321 } else if (IsRegCall) {
4322 // RegCall gives us 16 SSE registers.
4323 FreeSSERegs = 16;
4324 }
4325
4326 if (!getCXXABI().classifyReturnType(FI))
4327 FI.getReturnInfo() = classify(FI.getReturnType(), FreeSSERegs, true,
4328 IsVectorCall, IsRegCall);
4329
4330 if (IsVectorCall) {
4331 // We can use up to 6 SSE register parameters with vectorcall.
4332 FreeSSERegs = 6;
4333 } else if (IsRegCall) {
4334 // RegCall gives us 16 SSE registers, we can reuse the return registers.
4335 FreeSSERegs = 16;
4336 }
4337
4338 unsigned ArgNum = 0;
4339 unsigned ZeroSSERegs = 0;
4340 for (auto &I : FI.arguments()) {
4341 // Vectorcall in x64 only permits the first 6 arguments to be passed as
4342 // XMM/YMM registers. After the sixth argument, pretend no vector
4343 // registers are left.
4344 unsigned *MaybeFreeSSERegs =
4345 (IsVectorCall && ArgNum >= 6) ? &ZeroSSERegs : &FreeSSERegs;
4346 I.info =
4347 classify(I.type, *MaybeFreeSSERegs, false, IsVectorCall, IsRegCall);
4348 ++ArgNum;
4349 }
4350
4351 if (IsVectorCall) {
4352 // For vectorcall, assign aggregate HVAs to any free vector registers in a
4353 // second pass.
4354 for (auto &I : FI.arguments())
4355 I.info = reclassifyHvaArgForVectorCall(I.type, FreeSSERegs, I.info);
4356 }
4357 }
4358
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const4359 Address WinX86_64ABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
4360 QualType Ty) const {
4361
4362 bool IsIndirect = false;
4363
4364 // MS x64 ABI requirement: "Any argument that doesn't fit in 8 bytes, or is
4365 // not 1, 2, 4, or 8 bytes, must be passed by reference."
4366 if (isAggregateTypeForABI(Ty) || Ty->isMemberPointerType()) {
4367 uint64_t Width = getContext().getTypeSize(Ty);
4368 IsIndirect = Width > 64 || !llvm::isPowerOf2_64(Width);
4369 }
4370
4371 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, IsIndirect,
4372 CGF.getContext().getTypeInfoInChars(Ty),
4373 CharUnits::fromQuantity(8),
4374 /*allowHigherAlign*/ false);
4375 }
4376
PPC_initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address,bool Is64Bit,bool IsAIX)4377 static bool PPC_initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
4378 llvm::Value *Address, bool Is64Bit,
4379 bool IsAIX) {
4380 // This is calculated from the LLVM and GCC tables and verified
4381 // against gcc output. AFAIK all PPC ABIs use the same encoding.
4382
4383 CodeGen::CGBuilderTy &Builder = CGF.Builder;
4384
4385 llvm::IntegerType *i8 = CGF.Int8Ty;
4386 llvm::Value *Four8 = llvm::ConstantInt::get(i8, 4);
4387 llvm::Value *Eight8 = llvm::ConstantInt::get(i8, 8);
4388 llvm::Value *Sixteen8 = llvm::ConstantInt::get(i8, 16);
4389
4390 // 0-31: r0-31, the 4-byte or 8-byte general-purpose registers
4391 AssignToArrayRange(Builder, Address, Is64Bit ? Eight8 : Four8, 0, 31);
4392
4393 // 32-63: fp0-31, the 8-byte floating-point registers
4394 AssignToArrayRange(Builder, Address, Eight8, 32, 63);
4395
4396 // 64-67 are various 4-byte or 8-byte special-purpose registers:
4397 // 64: mq
4398 // 65: lr
4399 // 66: ctr
4400 // 67: ap
4401 AssignToArrayRange(Builder, Address, Is64Bit ? Eight8 : Four8, 64, 67);
4402
4403 // 68-76 are various 4-byte special-purpose registers:
4404 // 68-75 cr0-7
4405 // 76: xer
4406 AssignToArrayRange(Builder, Address, Four8, 68, 76);
4407
4408 // 77-108: v0-31, the 16-byte vector registers
4409 AssignToArrayRange(Builder, Address, Sixteen8, 77, 108);
4410
4411 // 109: vrsave
4412 // 110: vscr
4413 AssignToArrayRange(Builder, Address, Is64Bit ? Eight8 : Four8, 109, 110);
4414
4415 // AIX does not utilize the rest of the registers.
4416 if (IsAIX)
4417 return false;
4418
4419 // 111: spe_acc
4420 // 112: spefscr
4421 // 113: sfp
4422 AssignToArrayRange(Builder, Address, Is64Bit ? Eight8 : Four8, 111, 113);
4423
4424 if (!Is64Bit)
4425 return false;
4426
4427 // TODO: Need to verify if these registers are used on 64 bit AIX with Power8
4428 // or above CPU.
4429 // 64-bit only registers:
4430 // 114: tfhar
4431 // 115: tfiar
4432 // 116: texasr
4433 AssignToArrayRange(Builder, Address, Eight8, 114, 116);
4434
4435 return false;
4436 }
4437
4438 // AIX
4439 namespace {
4440 /// AIXABIInfo - The AIX XCOFF ABI information.
4441 class AIXABIInfo : public ABIInfo {
4442 const bool Is64Bit;
4443 const unsigned PtrByteSize;
4444 CharUnits getParamTypeAlignment(QualType Ty) const;
4445
4446 public:
AIXABIInfo(CodeGen::CodeGenTypes & CGT,bool Is64Bit)4447 AIXABIInfo(CodeGen::CodeGenTypes &CGT, bool Is64Bit)
4448 : ABIInfo(CGT), Is64Bit(Is64Bit), PtrByteSize(Is64Bit ? 8 : 4) {}
4449
4450 bool isPromotableTypeForABI(QualType Ty) const;
4451
4452 ABIArgInfo classifyReturnType(QualType RetTy) const;
4453 ABIArgInfo classifyArgumentType(QualType Ty) const;
4454
computeInfo(CGFunctionInfo & FI) const4455 void computeInfo(CGFunctionInfo &FI) const override {
4456 if (!getCXXABI().classifyReturnType(FI))
4457 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
4458
4459 for (auto &I : FI.arguments())
4460 I.info = classifyArgumentType(I.type);
4461 }
4462
4463 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
4464 QualType Ty) const override;
4465 };
4466
4467 class AIXTargetCodeGenInfo : public TargetCodeGenInfo {
4468 const bool Is64Bit;
4469
4470 public:
AIXTargetCodeGenInfo(CodeGen::CodeGenTypes & CGT,bool Is64Bit)4471 AIXTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, bool Is64Bit)
4472 : TargetCodeGenInfo(std::make_unique<AIXABIInfo>(CGT, Is64Bit)),
4473 Is64Bit(Is64Bit) {}
getDwarfEHStackPointer(CodeGen::CodeGenModule & M) const4474 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
4475 return 1; // r1 is the dedicated stack pointer
4476 }
4477
4478 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
4479 llvm::Value *Address) const override;
4480 };
4481 } // namespace
4482
4483 // Return true if the ABI requires Ty to be passed sign- or zero-
4484 // extended to 32/64 bits.
isPromotableTypeForABI(QualType Ty) const4485 bool AIXABIInfo::isPromotableTypeForABI(QualType Ty) const {
4486 // Treat an enum type as its underlying type.
4487 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
4488 Ty = EnumTy->getDecl()->getIntegerType();
4489
4490 // Promotable integer types are required to be promoted by the ABI.
4491 if (Ty->isPromotableIntegerType())
4492 return true;
4493
4494 if (!Is64Bit)
4495 return false;
4496
4497 // For 64 bit mode, in addition to the usual promotable integer types, we also
4498 // need to extend all 32-bit types, since the ABI requires promotion to 64
4499 // bits.
4500 if (const BuiltinType *BT = Ty->getAs<BuiltinType>())
4501 switch (BT->getKind()) {
4502 case BuiltinType::Int:
4503 case BuiltinType::UInt:
4504 return true;
4505 default:
4506 break;
4507 }
4508
4509 return false;
4510 }
4511
classifyReturnType(QualType RetTy) const4512 ABIArgInfo AIXABIInfo::classifyReturnType(QualType RetTy) const {
4513 if (RetTy->isAnyComplexType())
4514 return ABIArgInfo::getDirect();
4515
4516 if (RetTy->isVectorType())
4517 return ABIArgInfo::getDirect();
4518
4519 if (RetTy->isVoidType())
4520 return ABIArgInfo::getIgnore();
4521
4522 if (isAggregateTypeForABI(RetTy))
4523 return getNaturalAlignIndirect(RetTy);
4524
4525 return (isPromotableTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
4526 : ABIArgInfo::getDirect());
4527 }
4528
classifyArgumentType(QualType Ty) const4529 ABIArgInfo AIXABIInfo::classifyArgumentType(QualType Ty) const {
4530 Ty = useFirstFieldIfTransparentUnion(Ty);
4531
4532 if (Ty->isAnyComplexType())
4533 return ABIArgInfo::getDirect();
4534
4535 if (Ty->isVectorType())
4536 return ABIArgInfo::getDirect();
4537
4538 if (isAggregateTypeForABI(Ty)) {
4539 // Records with non-trivial destructors/copy-constructors should not be
4540 // passed by value.
4541 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
4542 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
4543
4544 CharUnits CCAlign = getParamTypeAlignment(Ty);
4545 CharUnits TyAlign = getContext().getTypeAlignInChars(Ty);
4546
4547 return ABIArgInfo::getIndirect(CCAlign, /*ByVal*/ true,
4548 /*Realign*/ TyAlign > CCAlign);
4549 }
4550
4551 return (isPromotableTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
4552 : ABIArgInfo::getDirect());
4553 }
4554
getParamTypeAlignment(QualType Ty) const4555 CharUnits AIXABIInfo::getParamTypeAlignment(QualType Ty) const {
4556 // Complex types are passed just like their elements.
4557 if (const ComplexType *CTy = Ty->getAs<ComplexType>())
4558 Ty = CTy->getElementType();
4559
4560 if (Ty->isVectorType())
4561 return CharUnits::fromQuantity(16);
4562
4563 // If the structure contains a vector type, the alignment is 16.
4564 if (isRecordWithSIMDVectorType(getContext(), Ty))
4565 return CharUnits::fromQuantity(16);
4566
4567 return CharUnits::fromQuantity(PtrByteSize);
4568 }
4569
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const4570 Address AIXABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
4571 QualType Ty) const {
4572 if (Ty->isAnyComplexType())
4573 llvm::report_fatal_error("complex type is not supported on AIX yet");
4574
4575 auto TypeInfo = getContext().getTypeInfoInChars(Ty);
4576 TypeInfo.Align = getParamTypeAlignment(Ty);
4577
4578 CharUnits SlotSize = CharUnits::fromQuantity(PtrByteSize);
4579
4580 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, /*Indirect*/ false, TypeInfo,
4581 SlotSize, /*AllowHigher*/ true);
4582 }
4583
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const4584 bool AIXTargetCodeGenInfo::initDwarfEHRegSizeTable(
4585 CodeGen::CodeGenFunction &CGF, llvm::Value *Address) const {
4586 return PPC_initDwarfEHRegSizeTable(CGF, Address, Is64Bit, /*IsAIX*/ true);
4587 }
4588
4589 // PowerPC-32
4590 namespace {
4591 /// PPC32_SVR4_ABIInfo - The 32-bit PowerPC ELF (SVR4) ABI information.
4592 class PPC32_SVR4_ABIInfo : public DefaultABIInfo {
4593 bool IsSoftFloatABI;
4594 bool IsRetSmallStructInRegABI;
4595
4596 CharUnits getParamTypeAlignment(QualType Ty) const;
4597
4598 public:
PPC32_SVR4_ABIInfo(CodeGen::CodeGenTypes & CGT,bool SoftFloatABI,bool RetSmallStructInRegABI)4599 PPC32_SVR4_ABIInfo(CodeGen::CodeGenTypes &CGT, bool SoftFloatABI,
4600 bool RetSmallStructInRegABI)
4601 : DefaultABIInfo(CGT), IsSoftFloatABI(SoftFloatABI),
4602 IsRetSmallStructInRegABI(RetSmallStructInRegABI) {}
4603
4604 ABIArgInfo classifyReturnType(QualType RetTy) const;
4605
computeInfo(CGFunctionInfo & FI) const4606 void computeInfo(CGFunctionInfo &FI) const override {
4607 if (!getCXXABI().classifyReturnType(FI))
4608 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
4609 for (auto &I : FI.arguments())
4610 I.info = classifyArgumentType(I.type);
4611 }
4612
4613 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
4614 QualType Ty) const override;
4615 };
4616
4617 class PPC32TargetCodeGenInfo : public TargetCodeGenInfo {
4618 public:
PPC32TargetCodeGenInfo(CodeGenTypes & CGT,bool SoftFloatABI,bool RetSmallStructInRegABI)4619 PPC32TargetCodeGenInfo(CodeGenTypes &CGT, bool SoftFloatABI,
4620 bool RetSmallStructInRegABI)
4621 : TargetCodeGenInfo(std::make_unique<PPC32_SVR4_ABIInfo>(
4622 CGT, SoftFloatABI, RetSmallStructInRegABI)) {}
4623
4624 static bool isStructReturnInRegABI(const llvm::Triple &Triple,
4625 const CodeGenOptions &Opts);
4626
getDwarfEHStackPointer(CodeGen::CodeGenModule & M) const4627 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
4628 // This is recovered from gcc output.
4629 return 1; // r1 is the dedicated stack pointer
4630 }
4631
4632 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
4633 llvm::Value *Address) const override;
4634 };
4635 }
4636
getParamTypeAlignment(QualType Ty) const4637 CharUnits PPC32_SVR4_ABIInfo::getParamTypeAlignment(QualType Ty) const {
4638 // Complex types are passed just like their elements.
4639 if (const ComplexType *CTy = Ty->getAs<ComplexType>())
4640 Ty = CTy->getElementType();
4641
4642 if (Ty->isVectorType())
4643 return CharUnits::fromQuantity(getContext().getTypeSize(Ty) == 128 ? 16
4644 : 4);
4645
4646 // For single-element float/vector structs, we consider the whole type
4647 // to have the same alignment requirements as its single element.
4648 const Type *AlignTy = nullptr;
4649 if (const Type *EltType = isSingleElementStruct(Ty, getContext())) {
4650 const BuiltinType *BT = EltType->getAs<BuiltinType>();
4651 if ((EltType->isVectorType() && getContext().getTypeSize(EltType) == 128) ||
4652 (BT && BT->isFloatingPoint()))
4653 AlignTy = EltType;
4654 }
4655
4656 if (AlignTy)
4657 return CharUnits::fromQuantity(AlignTy->isVectorType() ? 16 : 4);
4658 return CharUnits::fromQuantity(4);
4659 }
4660
classifyReturnType(QualType RetTy) const4661 ABIArgInfo PPC32_SVR4_ABIInfo::classifyReturnType(QualType RetTy) const {
4662 uint64_t Size;
4663
4664 // -msvr4-struct-return puts small aggregates in GPR3 and GPR4.
4665 if (isAggregateTypeForABI(RetTy) && IsRetSmallStructInRegABI &&
4666 (Size = getContext().getTypeSize(RetTy)) <= 64) {
4667 // System V ABI (1995), page 3-22, specified:
4668 // > A structure or union whose size is less than or equal to 8 bytes
4669 // > shall be returned in r3 and r4, as if it were first stored in the
4670 // > 8-byte aligned memory area and then the low addressed word were
4671 // > loaded into r3 and the high-addressed word into r4. Bits beyond
4672 // > the last member of the structure or union are not defined.
4673 //
4674 // GCC for big-endian PPC32 inserts the pad before the first member,
4675 // not "beyond the last member" of the struct. To stay compatible
4676 // with GCC, we coerce the struct to an integer of the same size.
4677 // LLVM will extend it and return i32 in r3, or i64 in r3:r4.
4678 if (Size == 0)
4679 return ABIArgInfo::getIgnore();
4680 else {
4681 llvm::Type *CoerceTy = llvm::Type::getIntNTy(getVMContext(), Size);
4682 return ABIArgInfo::getDirect(CoerceTy);
4683 }
4684 }
4685
4686 return DefaultABIInfo::classifyReturnType(RetTy);
4687 }
4688
4689 // TODO: this implementation is now likely redundant with
4690 // DefaultABIInfo::EmitVAArg.
EmitVAArg(CodeGenFunction & CGF,Address VAList,QualType Ty) const4691 Address PPC32_SVR4_ABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAList,
4692 QualType Ty) const {
4693 if (getTarget().getTriple().isOSDarwin()) {
4694 auto TI = getContext().getTypeInfoInChars(Ty);
4695 TI.Align = getParamTypeAlignment(Ty);
4696
4697 CharUnits SlotSize = CharUnits::fromQuantity(4);
4698 return emitVoidPtrVAArg(CGF, VAList, Ty,
4699 classifyArgumentType(Ty).isIndirect(), TI, SlotSize,
4700 /*AllowHigherAlign=*/true);
4701 }
4702
4703 const unsigned OverflowLimit = 8;
4704 if (const ComplexType *CTy = Ty->getAs<ComplexType>()) {
4705 // TODO: Implement this. For now ignore.
4706 (void)CTy;
4707 return Address::invalid(); // FIXME?
4708 }
4709
4710 // struct __va_list_tag {
4711 // unsigned char gpr;
4712 // unsigned char fpr;
4713 // unsigned short reserved;
4714 // void *overflow_arg_area;
4715 // void *reg_save_area;
4716 // };
4717
4718 bool isI64 = Ty->isIntegerType() && getContext().getTypeSize(Ty) == 64;
4719 bool isInt = !Ty->isFloatingType();
4720 bool isF64 = Ty->isFloatingType() && getContext().getTypeSize(Ty) == 64;
4721
4722 // All aggregates are passed indirectly? That doesn't seem consistent
4723 // with the argument-lowering code.
4724 bool isIndirect = isAggregateTypeForABI(Ty);
4725
4726 CGBuilderTy &Builder = CGF.Builder;
4727
4728 // The calling convention either uses 1-2 GPRs or 1 FPR.
4729 Address NumRegsAddr = Address::invalid();
4730 if (isInt || IsSoftFloatABI) {
4731 NumRegsAddr = Builder.CreateStructGEP(VAList, 0, "gpr");
4732 } else {
4733 NumRegsAddr = Builder.CreateStructGEP(VAList, 1, "fpr");
4734 }
4735
4736 llvm::Value *NumRegs = Builder.CreateLoad(NumRegsAddr, "numUsedRegs");
4737
4738 // "Align" the register count when TY is i64.
4739 if (isI64 || (isF64 && IsSoftFloatABI)) {
4740 NumRegs = Builder.CreateAdd(NumRegs, Builder.getInt8(1));
4741 NumRegs = Builder.CreateAnd(NumRegs, Builder.getInt8((uint8_t) ~1U));
4742 }
4743
4744 llvm::Value *CC =
4745 Builder.CreateICmpULT(NumRegs, Builder.getInt8(OverflowLimit), "cond");
4746
4747 llvm::BasicBlock *UsingRegs = CGF.createBasicBlock("using_regs");
4748 llvm::BasicBlock *UsingOverflow = CGF.createBasicBlock("using_overflow");
4749 llvm::BasicBlock *Cont = CGF.createBasicBlock("cont");
4750
4751 Builder.CreateCondBr(CC, UsingRegs, UsingOverflow);
4752
4753 llvm::Type *DirectTy = CGF.ConvertType(Ty);
4754 if (isIndirect) DirectTy = DirectTy->getPointerTo(0);
4755
4756 // Case 1: consume registers.
4757 Address RegAddr = Address::invalid();
4758 {
4759 CGF.EmitBlock(UsingRegs);
4760
4761 Address RegSaveAreaPtr = Builder.CreateStructGEP(VAList, 4);
4762 RegAddr = Address(Builder.CreateLoad(RegSaveAreaPtr),
4763 CharUnits::fromQuantity(8));
4764 assert(RegAddr.getElementType() == CGF.Int8Ty);
4765
4766 // Floating-point registers start after the general-purpose registers.
4767 if (!(isInt || IsSoftFloatABI)) {
4768 RegAddr = Builder.CreateConstInBoundsByteGEP(RegAddr,
4769 CharUnits::fromQuantity(32));
4770 }
4771
4772 // Get the address of the saved value by scaling the number of
4773 // registers we've used by the number of
4774 CharUnits RegSize = CharUnits::fromQuantity((isInt || IsSoftFloatABI) ? 4 : 8);
4775 llvm::Value *RegOffset =
4776 Builder.CreateMul(NumRegs, Builder.getInt8(RegSize.getQuantity()));
4777 RegAddr = Address(Builder.CreateInBoundsGEP(CGF.Int8Ty,
4778 RegAddr.getPointer(), RegOffset),
4779 RegAddr.getAlignment().alignmentOfArrayElement(RegSize));
4780 RegAddr = Builder.CreateElementBitCast(RegAddr, DirectTy);
4781
4782 // Increase the used-register count.
4783 NumRegs =
4784 Builder.CreateAdd(NumRegs,
4785 Builder.getInt8((isI64 || (isF64 && IsSoftFloatABI)) ? 2 : 1));
4786 Builder.CreateStore(NumRegs, NumRegsAddr);
4787
4788 CGF.EmitBranch(Cont);
4789 }
4790
4791 // Case 2: consume space in the overflow area.
4792 Address MemAddr = Address::invalid();
4793 {
4794 CGF.EmitBlock(UsingOverflow);
4795
4796 Builder.CreateStore(Builder.getInt8(OverflowLimit), NumRegsAddr);
4797
4798 // Everything in the overflow area is rounded up to a size of at least 4.
4799 CharUnits OverflowAreaAlign = CharUnits::fromQuantity(4);
4800
4801 CharUnits Size;
4802 if (!isIndirect) {
4803 auto TypeInfo = CGF.getContext().getTypeInfoInChars(Ty);
4804 Size = TypeInfo.Width.alignTo(OverflowAreaAlign);
4805 } else {
4806 Size = CGF.getPointerSize();
4807 }
4808
4809 Address OverflowAreaAddr = Builder.CreateStructGEP(VAList, 3);
4810 Address OverflowArea(Builder.CreateLoad(OverflowAreaAddr, "argp.cur"),
4811 OverflowAreaAlign);
4812 // Round up address of argument to alignment
4813 CharUnits Align = CGF.getContext().getTypeAlignInChars(Ty);
4814 if (Align > OverflowAreaAlign) {
4815 llvm::Value *Ptr = OverflowArea.getPointer();
4816 OverflowArea = Address(emitRoundPointerUpToAlignment(CGF, Ptr, Align),
4817 Align);
4818 }
4819
4820 MemAddr = Builder.CreateElementBitCast(OverflowArea, DirectTy);
4821
4822 // Increase the overflow area.
4823 OverflowArea = Builder.CreateConstInBoundsByteGEP(OverflowArea, Size);
4824 Builder.CreateStore(OverflowArea.getPointer(), OverflowAreaAddr);
4825 CGF.EmitBranch(Cont);
4826 }
4827
4828 CGF.EmitBlock(Cont);
4829
4830 // Merge the cases with a phi.
4831 Address Result = emitMergePHI(CGF, RegAddr, UsingRegs, MemAddr, UsingOverflow,
4832 "vaarg.addr");
4833
4834 // Load the pointer if the argument was passed indirectly.
4835 if (isIndirect) {
4836 Result = Address(Builder.CreateLoad(Result, "aggr"),
4837 getContext().getTypeAlignInChars(Ty));
4838 }
4839
4840 return Result;
4841 }
4842
isStructReturnInRegABI(const llvm::Triple & Triple,const CodeGenOptions & Opts)4843 bool PPC32TargetCodeGenInfo::isStructReturnInRegABI(
4844 const llvm::Triple &Triple, const CodeGenOptions &Opts) {
4845 assert(Triple.isPPC32());
4846
4847 switch (Opts.getStructReturnConvention()) {
4848 case CodeGenOptions::SRCK_Default:
4849 break;
4850 case CodeGenOptions::SRCK_OnStack: // -maix-struct-return
4851 return false;
4852 case CodeGenOptions::SRCK_InRegs: // -msvr4-struct-return
4853 return true;
4854 }
4855
4856 if (Triple.isOSBinFormatELF() && !Triple.isOSLinux())
4857 return true;
4858
4859 return false;
4860 }
4861
4862 bool
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const4863 PPC32TargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
4864 llvm::Value *Address) const {
4865 return PPC_initDwarfEHRegSizeTable(CGF, Address, /*Is64Bit*/ false,
4866 /*IsAIX*/ false);
4867 }
4868
4869 // PowerPC-64
4870
4871 namespace {
4872 /// PPC64_SVR4_ABIInfo - The 64-bit PowerPC ELF (SVR4) ABI information.
4873 class PPC64_SVR4_ABIInfo : public SwiftABIInfo {
4874 public:
4875 enum ABIKind {
4876 ELFv1 = 0,
4877 ELFv2
4878 };
4879
4880 private:
4881 static const unsigned GPRBits = 64;
4882 ABIKind Kind;
4883 bool IsSoftFloatABI;
4884
4885 public:
PPC64_SVR4_ABIInfo(CodeGen::CodeGenTypes & CGT,ABIKind Kind,bool SoftFloatABI)4886 PPC64_SVR4_ABIInfo(CodeGen::CodeGenTypes &CGT, ABIKind Kind,
4887 bool SoftFloatABI)
4888 : SwiftABIInfo(CGT), Kind(Kind), IsSoftFloatABI(SoftFloatABI) {}
4889
4890 bool isPromotableTypeForABI(QualType Ty) const;
4891 CharUnits getParamTypeAlignment(QualType Ty) const;
4892
4893 ABIArgInfo classifyReturnType(QualType RetTy) const;
4894 ABIArgInfo classifyArgumentType(QualType Ty) const;
4895
4896 bool isHomogeneousAggregateBaseType(QualType Ty) const override;
4897 bool isHomogeneousAggregateSmallEnough(const Type *Ty,
4898 uint64_t Members) const override;
4899
4900 // TODO: We can add more logic to computeInfo to improve performance.
4901 // Example: For aggregate arguments that fit in a register, we could
4902 // use getDirectInReg (as is done below for structs containing a single
4903 // floating-point value) to avoid pushing them to memory on function
4904 // entry. This would require changing the logic in PPCISelLowering
4905 // when lowering the parameters in the caller and args in the callee.
computeInfo(CGFunctionInfo & FI) const4906 void computeInfo(CGFunctionInfo &FI) const override {
4907 if (!getCXXABI().classifyReturnType(FI))
4908 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
4909 for (auto &I : FI.arguments()) {
4910 // We rely on the default argument classification for the most part.
4911 // One exception: An aggregate containing a single floating-point
4912 // or vector item must be passed in a register if one is available.
4913 const Type *T = isSingleElementStruct(I.type, getContext());
4914 if (T) {
4915 const BuiltinType *BT = T->getAs<BuiltinType>();
4916 if ((T->isVectorType() && getContext().getTypeSize(T) == 128) ||
4917 (BT && BT->isFloatingPoint())) {
4918 QualType QT(T, 0);
4919 I.info = ABIArgInfo::getDirectInReg(CGT.ConvertType(QT));
4920 continue;
4921 }
4922 }
4923 I.info = classifyArgumentType(I.type);
4924 }
4925 }
4926
4927 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
4928 QualType Ty) const override;
4929
shouldPassIndirectlyForSwift(ArrayRef<llvm::Type * > scalars,bool asReturnValue) const4930 bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars,
4931 bool asReturnValue) const override {
4932 return occupiesMoreThan(CGT, scalars, /*total*/ 4);
4933 }
4934
isSwiftErrorInRegister() const4935 bool isSwiftErrorInRegister() const override {
4936 return false;
4937 }
4938 };
4939
4940 class PPC64_SVR4_TargetCodeGenInfo : public TargetCodeGenInfo {
4941
4942 public:
PPC64_SVR4_TargetCodeGenInfo(CodeGenTypes & CGT,PPC64_SVR4_ABIInfo::ABIKind Kind,bool SoftFloatABI)4943 PPC64_SVR4_TargetCodeGenInfo(CodeGenTypes &CGT,
4944 PPC64_SVR4_ABIInfo::ABIKind Kind,
4945 bool SoftFloatABI)
4946 : TargetCodeGenInfo(
4947 std::make_unique<PPC64_SVR4_ABIInfo>(CGT, Kind, SoftFloatABI)) {}
4948
getDwarfEHStackPointer(CodeGen::CodeGenModule & M) const4949 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
4950 // This is recovered from gcc output.
4951 return 1; // r1 is the dedicated stack pointer
4952 }
4953
4954 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
4955 llvm::Value *Address) const override;
4956 };
4957
4958 class PPC64TargetCodeGenInfo : public DefaultTargetCodeGenInfo {
4959 public:
PPC64TargetCodeGenInfo(CodeGenTypes & CGT)4960 PPC64TargetCodeGenInfo(CodeGenTypes &CGT) : DefaultTargetCodeGenInfo(CGT) {}
4961
getDwarfEHStackPointer(CodeGen::CodeGenModule & M) const4962 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
4963 // This is recovered from gcc output.
4964 return 1; // r1 is the dedicated stack pointer
4965 }
4966
4967 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
4968 llvm::Value *Address) const override;
4969 };
4970
4971 }
4972
4973 // Return true if the ABI requires Ty to be passed sign- or zero-
4974 // extended to 64 bits.
4975 bool
isPromotableTypeForABI(QualType Ty) const4976 PPC64_SVR4_ABIInfo::isPromotableTypeForABI(QualType Ty) const {
4977 // Treat an enum type as its underlying type.
4978 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
4979 Ty = EnumTy->getDecl()->getIntegerType();
4980
4981 // Promotable integer types are required to be promoted by the ABI.
4982 if (isPromotableIntegerTypeForABI(Ty))
4983 return true;
4984
4985 // In addition to the usual promotable integer types, we also need to
4986 // extend all 32-bit types, since the ABI requires promotion to 64 bits.
4987 if (const BuiltinType *BT = Ty->getAs<BuiltinType>())
4988 switch (BT->getKind()) {
4989 case BuiltinType::Int:
4990 case BuiltinType::UInt:
4991 return true;
4992 default:
4993 break;
4994 }
4995
4996 if (const auto *EIT = Ty->getAs<ExtIntType>())
4997 if (EIT->getNumBits() < 64)
4998 return true;
4999
5000 return false;
5001 }
5002
5003 /// isAlignedParamType - Determine whether a type requires 16-byte or
5004 /// higher alignment in the parameter area. Always returns at least 8.
getParamTypeAlignment(QualType Ty) const5005 CharUnits PPC64_SVR4_ABIInfo::getParamTypeAlignment(QualType Ty) const {
5006 // Complex types are passed just like their elements.
5007 if (const ComplexType *CTy = Ty->getAs<ComplexType>())
5008 Ty = CTy->getElementType();
5009
5010 // Only vector types of size 16 bytes need alignment (larger types are
5011 // passed via reference, smaller types are not aligned).
5012 if (Ty->isVectorType()) {
5013 return CharUnits::fromQuantity(getContext().getTypeSize(Ty) == 128 ? 16 : 8);
5014 } else if (Ty->isRealFloatingType() &&
5015 &getContext().getFloatTypeSemantics(Ty) ==
5016 &llvm::APFloat::IEEEquad()) {
5017 // According to ABI document section 'Optional Save Areas': If extended
5018 // precision floating-point values in IEEE BINARY 128 QUADRUPLE PRECISION
5019 // format are supported, map them to a single quadword, quadword aligned.
5020 return CharUnits::fromQuantity(16);
5021 }
5022
5023 // For single-element float/vector structs, we consider the whole type
5024 // to have the same alignment requirements as its single element.
5025 const Type *AlignAsType = nullptr;
5026 const Type *EltType = isSingleElementStruct(Ty, getContext());
5027 if (EltType) {
5028 const BuiltinType *BT = EltType->getAs<BuiltinType>();
5029 if ((EltType->isVectorType() && getContext().getTypeSize(EltType) == 128) ||
5030 (BT && BT->isFloatingPoint()))
5031 AlignAsType = EltType;
5032 }
5033
5034 // Likewise for ELFv2 homogeneous aggregates.
5035 const Type *Base = nullptr;
5036 uint64_t Members = 0;
5037 if (!AlignAsType && Kind == ELFv2 &&
5038 isAggregateTypeForABI(Ty) && isHomogeneousAggregate(Ty, Base, Members))
5039 AlignAsType = Base;
5040
5041 // With special case aggregates, only vector base types need alignment.
5042 if (AlignAsType) {
5043 return CharUnits::fromQuantity(AlignAsType->isVectorType() ? 16 : 8);
5044 }
5045
5046 // Otherwise, we only need alignment for any aggregate type that
5047 // has an alignment requirement of >= 16 bytes.
5048 if (isAggregateTypeForABI(Ty) && getContext().getTypeAlign(Ty) >= 128) {
5049 return CharUnits::fromQuantity(16);
5050 }
5051
5052 return CharUnits::fromQuantity(8);
5053 }
5054
5055 /// isHomogeneousAggregate - Return true if a type is an ELFv2 homogeneous
5056 /// aggregate. Base is set to the base element type, and Members is set
5057 /// to the number of base elements.
isHomogeneousAggregate(QualType Ty,const Type * & Base,uint64_t & Members) const5058 bool ABIInfo::isHomogeneousAggregate(QualType Ty, const Type *&Base,
5059 uint64_t &Members) const {
5060 if (const ConstantArrayType *AT = getContext().getAsConstantArrayType(Ty)) {
5061 uint64_t NElements = AT->getSize().getZExtValue();
5062 if (NElements == 0)
5063 return false;
5064 if (!isHomogeneousAggregate(AT->getElementType(), Base, Members))
5065 return false;
5066 Members *= NElements;
5067 } else if (const RecordType *RT = Ty->getAs<RecordType>()) {
5068 const RecordDecl *RD = RT->getDecl();
5069 if (RD->hasFlexibleArrayMember())
5070 return false;
5071
5072 Members = 0;
5073
5074 // If this is a C++ record, check the properties of the record such as
5075 // bases and ABI specific restrictions
5076 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
5077 if (!getCXXABI().isPermittedToBeHomogeneousAggregate(CXXRD))
5078 return false;
5079
5080 for (const auto &I : CXXRD->bases()) {
5081 // Ignore empty records.
5082 if (isEmptyRecord(getContext(), I.getType(), true))
5083 continue;
5084
5085 uint64_t FldMembers;
5086 if (!isHomogeneousAggregate(I.getType(), Base, FldMembers))
5087 return false;
5088
5089 Members += FldMembers;
5090 }
5091 }
5092
5093 for (const auto *FD : RD->fields()) {
5094 // Ignore (non-zero arrays of) empty records.
5095 QualType FT = FD->getType();
5096 while (const ConstantArrayType *AT =
5097 getContext().getAsConstantArrayType(FT)) {
5098 if (AT->getSize().getZExtValue() == 0)
5099 return false;
5100 FT = AT->getElementType();
5101 }
5102 if (isEmptyRecord(getContext(), FT, true))
5103 continue;
5104
5105 // For compatibility with GCC, ignore empty bitfields in C++ mode.
5106 if (getContext().getLangOpts().CPlusPlus &&
5107 FD->isZeroLengthBitField(getContext()))
5108 continue;
5109
5110 uint64_t FldMembers;
5111 if (!isHomogeneousAggregate(FD->getType(), Base, FldMembers))
5112 return false;
5113
5114 Members = (RD->isUnion() ?
5115 std::max(Members, FldMembers) : Members + FldMembers);
5116 }
5117
5118 if (!Base)
5119 return false;
5120
5121 // Ensure there is no padding.
5122 if (getContext().getTypeSize(Base) * Members !=
5123 getContext().getTypeSize(Ty))
5124 return false;
5125 } else {
5126 Members = 1;
5127 if (const ComplexType *CT = Ty->getAs<ComplexType>()) {
5128 Members = 2;
5129 Ty = CT->getElementType();
5130 }
5131
5132 // Most ABIs only support float, double, and some vector type widths.
5133 if (!isHomogeneousAggregateBaseType(Ty))
5134 return false;
5135
5136 // The base type must be the same for all members. Types that
5137 // agree in both total size and mode (float vs. vector) are
5138 // treated as being equivalent here.
5139 const Type *TyPtr = Ty.getTypePtr();
5140 if (!Base) {
5141 Base = TyPtr;
5142 // If it's a non-power-of-2 vector, its size is already a power-of-2,
5143 // so make sure to widen it explicitly.
5144 if (const VectorType *VT = Base->getAs<VectorType>()) {
5145 QualType EltTy = VT->getElementType();
5146 unsigned NumElements =
5147 getContext().getTypeSize(VT) / getContext().getTypeSize(EltTy);
5148 Base = getContext()
5149 .getVectorType(EltTy, NumElements, VT->getVectorKind())
5150 .getTypePtr();
5151 }
5152 }
5153
5154 if (Base->isVectorType() != TyPtr->isVectorType() ||
5155 getContext().getTypeSize(Base) != getContext().getTypeSize(TyPtr))
5156 return false;
5157 }
5158 return Members > 0 && isHomogeneousAggregateSmallEnough(Base, Members);
5159 }
5160
isHomogeneousAggregateBaseType(QualType Ty) const5161 bool PPC64_SVR4_ABIInfo::isHomogeneousAggregateBaseType(QualType Ty) const {
5162 // Homogeneous aggregates for ELFv2 must have base types of float,
5163 // double, long double, or 128-bit vectors.
5164 if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
5165 if (BT->getKind() == BuiltinType::Float ||
5166 BT->getKind() == BuiltinType::Double ||
5167 BT->getKind() == BuiltinType::LongDouble ||
5168 (getContext().getTargetInfo().hasFloat128Type() &&
5169 (BT->getKind() == BuiltinType::Float128))) {
5170 if (IsSoftFloatABI)
5171 return false;
5172 return true;
5173 }
5174 }
5175 if (const VectorType *VT = Ty->getAs<VectorType>()) {
5176 if (getContext().getTypeSize(VT) == 128)
5177 return true;
5178 }
5179 return false;
5180 }
5181
isHomogeneousAggregateSmallEnough(const Type * Base,uint64_t Members) const5182 bool PPC64_SVR4_ABIInfo::isHomogeneousAggregateSmallEnough(
5183 const Type *Base, uint64_t Members) const {
5184 // Vector and fp128 types require one register, other floating point types
5185 // require one or two registers depending on their size.
5186 uint32_t NumRegs =
5187 ((getContext().getTargetInfo().hasFloat128Type() &&
5188 Base->isFloat128Type()) ||
5189 Base->isVectorType()) ? 1
5190 : (getContext().getTypeSize(Base) + 63) / 64;
5191
5192 // Homogeneous Aggregates may occupy at most 8 registers.
5193 return Members * NumRegs <= 8;
5194 }
5195
5196 ABIArgInfo
classifyArgumentType(QualType Ty) const5197 PPC64_SVR4_ABIInfo::classifyArgumentType(QualType Ty) const {
5198 Ty = useFirstFieldIfTransparentUnion(Ty);
5199
5200 if (Ty->isAnyComplexType())
5201 return ABIArgInfo::getDirect();
5202
5203 // Non-Altivec vector types are passed in GPRs (smaller than 16 bytes)
5204 // or via reference (larger than 16 bytes).
5205 if (Ty->isVectorType()) {
5206 uint64_t Size = getContext().getTypeSize(Ty);
5207 if (Size > 128)
5208 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
5209 else if (Size < 128) {
5210 llvm::Type *CoerceTy = llvm::IntegerType::get(getVMContext(), Size);
5211 return ABIArgInfo::getDirect(CoerceTy);
5212 }
5213 }
5214
5215 if (const auto *EIT = Ty->getAs<ExtIntType>())
5216 if (EIT->getNumBits() > 128)
5217 return getNaturalAlignIndirect(Ty, /*ByVal=*/true);
5218
5219 if (isAggregateTypeForABI(Ty)) {
5220 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
5221 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
5222
5223 uint64_t ABIAlign = getParamTypeAlignment(Ty).getQuantity();
5224 uint64_t TyAlign = getContext().getTypeAlignInChars(Ty).getQuantity();
5225
5226 // ELFv2 homogeneous aggregates are passed as array types.
5227 const Type *Base = nullptr;
5228 uint64_t Members = 0;
5229 if (Kind == ELFv2 &&
5230 isHomogeneousAggregate(Ty, Base, Members)) {
5231 llvm::Type *BaseTy = CGT.ConvertType(QualType(Base, 0));
5232 llvm::Type *CoerceTy = llvm::ArrayType::get(BaseTy, Members);
5233 return ABIArgInfo::getDirect(CoerceTy);
5234 }
5235
5236 // If an aggregate may end up fully in registers, we do not
5237 // use the ByVal method, but pass the aggregate as array.
5238 // This is usually beneficial since we avoid forcing the
5239 // back-end to store the argument to memory.
5240 uint64_t Bits = getContext().getTypeSize(Ty);
5241 if (Bits > 0 && Bits <= 8 * GPRBits) {
5242 llvm::Type *CoerceTy;
5243
5244 // Types up to 8 bytes are passed as integer type (which will be
5245 // properly aligned in the argument save area doubleword).
5246 if (Bits <= GPRBits)
5247 CoerceTy =
5248 llvm::IntegerType::get(getVMContext(), llvm::alignTo(Bits, 8));
5249 // Larger types are passed as arrays, with the base type selected
5250 // according to the required alignment in the save area.
5251 else {
5252 uint64_t RegBits = ABIAlign * 8;
5253 uint64_t NumRegs = llvm::alignTo(Bits, RegBits) / RegBits;
5254 llvm::Type *RegTy = llvm::IntegerType::get(getVMContext(), RegBits);
5255 CoerceTy = llvm::ArrayType::get(RegTy, NumRegs);
5256 }
5257
5258 return ABIArgInfo::getDirect(CoerceTy);
5259 }
5260
5261 // All other aggregates are passed ByVal.
5262 return ABIArgInfo::getIndirect(CharUnits::fromQuantity(ABIAlign),
5263 /*ByVal=*/true,
5264 /*Realign=*/TyAlign > ABIAlign);
5265 }
5266
5267 return (isPromotableTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
5268 : ABIArgInfo::getDirect());
5269 }
5270
5271 ABIArgInfo
classifyReturnType(QualType RetTy) const5272 PPC64_SVR4_ABIInfo::classifyReturnType(QualType RetTy) const {
5273 if (RetTy->isVoidType())
5274 return ABIArgInfo::getIgnore();
5275
5276 if (RetTy->isAnyComplexType())
5277 return ABIArgInfo::getDirect();
5278
5279 // Non-Altivec vector types are returned in GPRs (smaller than 16 bytes)
5280 // or via reference (larger than 16 bytes).
5281 if (RetTy->isVectorType()) {
5282 uint64_t Size = getContext().getTypeSize(RetTy);
5283 if (Size > 128)
5284 return getNaturalAlignIndirect(RetTy);
5285 else if (Size < 128) {
5286 llvm::Type *CoerceTy = llvm::IntegerType::get(getVMContext(), Size);
5287 return ABIArgInfo::getDirect(CoerceTy);
5288 }
5289 }
5290
5291 if (const auto *EIT = RetTy->getAs<ExtIntType>())
5292 if (EIT->getNumBits() > 128)
5293 return getNaturalAlignIndirect(RetTy, /*ByVal=*/false);
5294
5295 if (isAggregateTypeForABI(RetTy)) {
5296 // ELFv2 homogeneous aggregates are returned as array types.
5297 const Type *Base = nullptr;
5298 uint64_t Members = 0;
5299 if (Kind == ELFv2 &&
5300 isHomogeneousAggregate(RetTy, Base, Members)) {
5301 llvm::Type *BaseTy = CGT.ConvertType(QualType(Base, 0));
5302 llvm::Type *CoerceTy = llvm::ArrayType::get(BaseTy, Members);
5303 return ABIArgInfo::getDirect(CoerceTy);
5304 }
5305
5306 // ELFv2 small aggregates are returned in up to two registers.
5307 uint64_t Bits = getContext().getTypeSize(RetTy);
5308 if (Kind == ELFv2 && Bits <= 2 * GPRBits) {
5309 if (Bits == 0)
5310 return ABIArgInfo::getIgnore();
5311
5312 llvm::Type *CoerceTy;
5313 if (Bits > GPRBits) {
5314 CoerceTy = llvm::IntegerType::get(getVMContext(), GPRBits);
5315 CoerceTy = llvm::StructType::get(CoerceTy, CoerceTy);
5316 } else
5317 CoerceTy =
5318 llvm::IntegerType::get(getVMContext(), llvm::alignTo(Bits, 8));
5319 return ABIArgInfo::getDirect(CoerceTy);
5320 }
5321
5322 // All other aggregates are returned indirectly.
5323 return getNaturalAlignIndirect(RetTy);
5324 }
5325
5326 return (isPromotableTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
5327 : ABIArgInfo::getDirect());
5328 }
5329
5330 // Based on ARMABIInfo::EmitVAArg, adjusted for 64-bit machine.
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const5331 Address PPC64_SVR4_ABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
5332 QualType Ty) const {
5333 auto TypeInfo = getContext().getTypeInfoInChars(Ty);
5334 TypeInfo.Align = getParamTypeAlignment(Ty);
5335
5336 CharUnits SlotSize = CharUnits::fromQuantity(8);
5337
5338 // If we have a complex type and the base type is smaller than 8 bytes,
5339 // the ABI calls for the real and imaginary parts to be right-adjusted
5340 // in separate doublewords. However, Clang expects us to produce a
5341 // pointer to a structure with the two parts packed tightly. So generate
5342 // loads of the real and imaginary parts relative to the va_list pointer,
5343 // and store them to a temporary structure.
5344 if (const ComplexType *CTy = Ty->getAs<ComplexType>()) {
5345 CharUnits EltSize = TypeInfo.Width / 2;
5346 if (EltSize < SlotSize) {
5347 Address Addr = emitVoidPtrDirectVAArg(CGF, VAListAddr, CGF.Int8Ty,
5348 SlotSize * 2, SlotSize,
5349 SlotSize, /*AllowHigher*/ true);
5350
5351 Address RealAddr = Addr;
5352 Address ImagAddr = RealAddr;
5353 if (CGF.CGM.getDataLayout().isBigEndian()) {
5354 RealAddr = CGF.Builder.CreateConstInBoundsByteGEP(RealAddr,
5355 SlotSize - EltSize);
5356 ImagAddr = CGF.Builder.CreateConstInBoundsByteGEP(ImagAddr,
5357 2 * SlotSize - EltSize);
5358 } else {
5359 ImagAddr = CGF.Builder.CreateConstInBoundsByteGEP(RealAddr, SlotSize);
5360 }
5361
5362 llvm::Type *EltTy = CGF.ConvertTypeForMem(CTy->getElementType());
5363 RealAddr = CGF.Builder.CreateElementBitCast(RealAddr, EltTy);
5364 ImagAddr = CGF.Builder.CreateElementBitCast(ImagAddr, EltTy);
5365 llvm::Value *Real = CGF.Builder.CreateLoad(RealAddr, ".vareal");
5366 llvm::Value *Imag = CGF.Builder.CreateLoad(ImagAddr, ".vaimag");
5367
5368 Address Temp = CGF.CreateMemTemp(Ty, "vacplx");
5369 CGF.EmitStoreOfComplex({Real, Imag}, CGF.MakeAddrLValue(Temp, Ty),
5370 /*init*/ true);
5371 return Temp;
5372 }
5373 }
5374
5375 // Otherwise, just use the general rule.
5376 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, /*Indirect*/ false,
5377 TypeInfo, SlotSize, /*AllowHigher*/ true);
5378 }
5379
5380 bool
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const5381 PPC64_SVR4_TargetCodeGenInfo::initDwarfEHRegSizeTable(
5382 CodeGen::CodeGenFunction &CGF,
5383 llvm::Value *Address) const {
5384 return PPC_initDwarfEHRegSizeTable(CGF, Address, /*Is64Bit*/ true,
5385 /*IsAIX*/ false);
5386 }
5387
5388 bool
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const5389 PPC64TargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
5390 llvm::Value *Address) const {
5391 return PPC_initDwarfEHRegSizeTable(CGF, Address, /*Is64Bit*/ true,
5392 /*IsAIX*/ false);
5393 }
5394
5395 //===----------------------------------------------------------------------===//
5396 // AArch64 ABI Implementation
5397 //===----------------------------------------------------------------------===//
5398
5399 namespace {
5400
5401 class AArch64ABIInfo : public SwiftABIInfo {
5402 public:
5403 enum ABIKind {
5404 AAPCS = 0,
5405 DarwinPCS,
5406 Win64
5407 };
5408
5409 private:
5410 ABIKind Kind;
5411
5412 public:
AArch64ABIInfo(CodeGenTypes & CGT,ABIKind Kind)5413 AArch64ABIInfo(CodeGenTypes &CGT, ABIKind Kind)
5414 : SwiftABIInfo(CGT), Kind(Kind) {}
5415
5416 private:
getABIKind() const5417 ABIKind getABIKind() const { return Kind; }
isDarwinPCS() const5418 bool isDarwinPCS() const { return Kind == DarwinPCS; }
5419
5420 ABIArgInfo classifyReturnType(QualType RetTy, bool IsVariadic) const;
5421 ABIArgInfo classifyArgumentType(QualType RetTy, bool IsVariadic,
5422 unsigned CallingConvention) const;
5423 ABIArgInfo coerceIllegalVector(QualType Ty) const;
5424 bool isHomogeneousAggregateBaseType(QualType Ty) const override;
5425 bool isHomogeneousAggregateSmallEnough(const Type *Ty,
5426 uint64_t Members) const override;
5427
5428 bool isIllegalVectorType(QualType Ty) const;
5429
computeInfo(CGFunctionInfo & FI) const5430 void computeInfo(CGFunctionInfo &FI) const override {
5431 if (!::classifyReturnType(getCXXABI(), FI, *this))
5432 FI.getReturnInfo() =
5433 classifyReturnType(FI.getReturnType(), FI.isVariadic());
5434
5435 for (auto &it : FI.arguments())
5436 it.info = classifyArgumentType(it.type, FI.isVariadic(),
5437 FI.getCallingConvention());
5438 }
5439
5440 Address EmitDarwinVAArg(Address VAListAddr, QualType Ty,
5441 CodeGenFunction &CGF) const;
5442
5443 Address EmitAAPCSVAArg(Address VAListAddr, QualType Ty,
5444 CodeGenFunction &CGF) const;
5445
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const5446 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
5447 QualType Ty) const override {
5448 llvm::Type *BaseTy = CGF.ConvertType(Ty);
5449 if (isa<llvm::ScalableVectorType>(BaseTy))
5450 llvm::report_fatal_error("Passing SVE types to variadic functions is "
5451 "currently not supported");
5452
5453 return Kind == Win64 ? EmitMSVAArg(CGF, VAListAddr, Ty)
5454 : isDarwinPCS() ? EmitDarwinVAArg(VAListAddr, Ty, CGF)
5455 : EmitAAPCSVAArg(VAListAddr, Ty, CGF);
5456 }
5457
5458 Address EmitMSVAArg(CodeGenFunction &CGF, Address VAListAddr,
5459 QualType Ty) const override;
5460
shouldPassIndirectlyForSwift(ArrayRef<llvm::Type * > scalars,bool asReturnValue) const5461 bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars,
5462 bool asReturnValue) const override {
5463 return occupiesMoreThan(CGT, scalars, /*total*/ 4);
5464 }
isSwiftErrorInRegister() const5465 bool isSwiftErrorInRegister() const override {
5466 return true;
5467 }
5468
5469 bool isLegalVectorTypeForSwift(CharUnits totalSize, llvm::Type *eltTy,
5470 unsigned elts) const override;
5471
allowBFloatArgsAndRet() const5472 bool allowBFloatArgsAndRet() const override {
5473 return getTarget().hasBFloat16Type();
5474 }
5475 };
5476
5477 class AArch64TargetCodeGenInfo : public TargetCodeGenInfo {
5478 public:
AArch64TargetCodeGenInfo(CodeGenTypes & CGT,AArch64ABIInfo::ABIKind Kind)5479 AArch64TargetCodeGenInfo(CodeGenTypes &CGT, AArch64ABIInfo::ABIKind Kind)
5480 : TargetCodeGenInfo(std::make_unique<AArch64ABIInfo>(CGT, Kind)) {}
5481
getARCRetainAutoreleasedReturnValueMarker() const5482 StringRef getARCRetainAutoreleasedReturnValueMarker() const override {
5483 return "mov\tfp, fp\t\t// marker for objc_retainAutoreleaseReturnValue";
5484 }
5485
getDwarfEHStackPointer(CodeGen::CodeGenModule & M) const5486 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
5487 return 31;
5488 }
5489
doesReturnSlotInterfereWithArgs() const5490 bool doesReturnSlotInterfereWithArgs() const override { return false; }
5491
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const5492 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
5493 CodeGen::CodeGenModule &CGM) const override {
5494 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
5495 if (!FD)
5496 return;
5497
5498 const auto *TA = FD->getAttr<TargetAttr>();
5499 if (TA == nullptr)
5500 return;
5501
5502 ParsedTargetAttr Attr = TA->parse();
5503 if (Attr.BranchProtection.empty())
5504 return;
5505
5506 TargetInfo::BranchProtectionInfo BPI;
5507 StringRef Error;
5508 (void)CGM.getTarget().validateBranchProtection(Attr.BranchProtection,
5509 BPI, Error);
5510 assert(Error.empty());
5511
5512 auto *Fn = cast<llvm::Function>(GV);
5513 static const char *SignReturnAddrStr[] = {"none", "non-leaf", "all"};
5514 Fn->addFnAttr("sign-return-address", SignReturnAddrStr[static_cast<int>(BPI.SignReturnAddr)]);
5515
5516 if (BPI.SignReturnAddr != LangOptions::SignReturnAddressScopeKind::None) {
5517 Fn->addFnAttr("sign-return-address-key",
5518 BPI.SignKey == LangOptions::SignReturnAddressKeyKind::AKey
5519 ? "a_key"
5520 : "b_key");
5521 }
5522
5523 Fn->addFnAttr("branch-target-enforcement",
5524 BPI.BranchTargetEnforcement ? "true" : "false");
5525 }
5526 };
5527
5528 class WindowsAArch64TargetCodeGenInfo : public AArch64TargetCodeGenInfo {
5529 public:
WindowsAArch64TargetCodeGenInfo(CodeGenTypes & CGT,AArch64ABIInfo::ABIKind K)5530 WindowsAArch64TargetCodeGenInfo(CodeGenTypes &CGT, AArch64ABIInfo::ABIKind K)
5531 : AArch64TargetCodeGenInfo(CGT, K) {}
5532
5533 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
5534 CodeGen::CodeGenModule &CGM) const override;
5535
getDependentLibraryOption(llvm::StringRef Lib,llvm::SmallString<24> & Opt) const5536 void getDependentLibraryOption(llvm::StringRef Lib,
5537 llvm::SmallString<24> &Opt) const override {
5538 Opt = "/DEFAULTLIB:" + qualifyWindowsLibrary(Lib);
5539 }
5540
getDetectMismatchOption(llvm::StringRef Name,llvm::StringRef Value,llvm::SmallString<32> & Opt) const5541 void getDetectMismatchOption(llvm::StringRef Name, llvm::StringRef Value,
5542 llvm::SmallString<32> &Opt) const override {
5543 Opt = "/FAILIFMISMATCH:\"" + Name.str() + "=" + Value.str() + "\"";
5544 }
5545 };
5546
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const5547 void WindowsAArch64TargetCodeGenInfo::setTargetAttributes(
5548 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const {
5549 AArch64TargetCodeGenInfo::setTargetAttributes(D, GV, CGM);
5550 if (GV->isDeclaration())
5551 return;
5552 addStackProbeTargetAttributes(D, GV, CGM);
5553 }
5554 }
5555
coerceIllegalVector(QualType Ty) const5556 ABIArgInfo AArch64ABIInfo::coerceIllegalVector(QualType Ty) const {
5557 assert(Ty->isVectorType() && "expected vector type!");
5558
5559 const auto *VT = Ty->castAs<VectorType>();
5560 if (VT->getVectorKind() == VectorType::SveFixedLengthPredicateVector) {
5561 assert(VT->getElementType()->isBuiltinType() && "expected builtin type!");
5562 assert(VT->getElementType()->castAs<BuiltinType>()->getKind() ==
5563 BuiltinType::UChar &&
5564 "unexpected builtin type for SVE predicate!");
5565 return ABIArgInfo::getDirect(llvm::ScalableVectorType::get(
5566 llvm::Type::getInt1Ty(getVMContext()), 16));
5567 }
5568
5569 if (VT->getVectorKind() == VectorType::SveFixedLengthDataVector) {
5570 assert(VT->getElementType()->isBuiltinType() && "expected builtin type!");
5571
5572 const auto *BT = VT->getElementType()->castAs<BuiltinType>();
5573 llvm::ScalableVectorType *ResType = nullptr;
5574 switch (BT->getKind()) {
5575 default:
5576 llvm_unreachable("unexpected builtin type for SVE vector!");
5577 case BuiltinType::SChar:
5578 case BuiltinType::UChar:
5579 ResType = llvm::ScalableVectorType::get(
5580 llvm::Type::getInt8Ty(getVMContext()), 16);
5581 break;
5582 case BuiltinType::Short:
5583 case BuiltinType::UShort:
5584 ResType = llvm::ScalableVectorType::get(
5585 llvm::Type::getInt16Ty(getVMContext()), 8);
5586 break;
5587 case BuiltinType::Int:
5588 case BuiltinType::UInt:
5589 ResType = llvm::ScalableVectorType::get(
5590 llvm::Type::getInt32Ty(getVMContext()), 4);
5591 break;
5592 case BuiltinType::Long:
5593 case BuiltinType::ULong:
5594 ResType = llvm::ScalableVectorType::get(
5595 llvm::Type::getInt64Ty(getVMContext()), 2);
5596 break;
5597 case BuiltinType::Half:
5598 ResType = llvm::ScalableVectorType::get(
5599 llvm::Type::getHalfTy(getVMContext()), 8);
5600 break;
5601 case BuiltinType::Float:
5602 ResType = llvm::ScalableVectorType::get(
5603 llvm::Type::getFloatTy(getVMContext()), 4);
5604 break;
5605 case BuiltinType::Double:
5606 ResType = llvm::ScalableVectorType::get(
5607 llvm::Type::getDoubleTy(getVMContext()), 2);
5608 break;
5609 case BuiltinType::BFloat16:
5610 ResType = llvm::ScalableVectorType::get(
5611 llvm::Type::getBFloatTy(getVMContext()), 8);
5612 break;
5613 }
5614 return ABIArgInfo::getDirect(ResType);
5615 }
5616
5617 uint64_t Size = getContext().getTypeSize(Ty);
5618 // Android promotes <2 x i8> to i16, not i32
5619 if (isAndroid() && (Size <= 16)) {
5620 llvm::Type *ResType = llvm::Type::getInt16Ty(getVMContext());
5621 return ABIArgInfo::getDirect(ResType);
5622 }
5623 if (Size <= 32) {
5624 llvm::Type *ResType = llvm::Type::getInt32Ty(getVMContext());
5625 return ABIArgInfo::getDirect(ResType);
5626 }
5627 if (Size == 64) {
5628 auto *ResType =
5629 llvm::FixedVectorType::get(llvm::Type::getInt32Ty(getVMContext()), 2);
5630 return ABIArgInfo::getDirect(ResType);
5631 }
5632 if (Size == 128) {
5633 auto *ResType =
5634 llvm::FixedVectorType::get(llvm::Type::getInt32Ty(getVMContext()), 4);
5635 return ABIArgInfo::getDirect(ResType);
5636 }
5637 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
5638 }
5639
5640 ABIArgInfo
classifyArgumentType(QualType Ty,bool IsVariadic,unsigned CallingConvention) const5641 AArch64ABIInfo::classifyArgumentType(QualType Ty, bool IsVariadic,
5642 unsigned CallingConvention) const {
5643 Ty = useFirstFieldIfTransparentUnion(Ty);
5644
5645 // Handle illegal vector types here.
5646 if (isIllegalVectorType(Ty))
5647 return coerceIllegalVector(Ty);
5648
5649 if (!isAggregateTypeForABI(Ty)) {
5650 // Treat an enum type as its underlying type.
5651 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
5652 Ty = EnumTy->getDecl()->getIntegerType();
5653
5654 if (const auto *EIT = Ty->getAs<ExtIntType>())
5655 if (EIT->getNumBits() > 128)
5656 return getNaturalAlignIndirect(Ty);
5657
5658 return (isPromotableIntegerTypeForABI(Ty) && isDarwinPCS()
5659 ? ABIArgInfo::getExtend(Ty)
5660 : ABIArgInfo::getDirect());
5661 }
5662
5663 // Structures with either a non-trivial destructor or a non-trivial
5664 // copy constructor are always indirect.
5665 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI())) {
5666 return getNaturalAlignIndirect(Ty, /*ByVal=*/RAA ==
5667 CGCXXABI::RAA_DirectInMemory);
5668 }
5669
5670 // Empty records are always ignored on Darwin, but actually passed in C++ mode
5671 // elsewhere for GNU compatibility.
5672 uint64_t Size = getContext().getTypeSize(Ty);
5673 bool IsEmpty = isEmptyRecord(getContext(), Ty, true);
5674 if (IsEmpty || Size == 0) {
5675 if (!getContext().getLangOpts().CPlusPlus || isDarwinPCS())
5676 return ABIArgInfo::getIgnore();
5677
5678 // GNU C mode. The only argument that gets ignored is an empty one with size
5679 // 0.
5680 if (IsEmpty && Size == 0)
5681 return ABIArgInfo::getIgnore();
5682 return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext()));
5683 }
5684
5685 // Homogeneous Floating-point Aggregates (HFAs) need to be expanded.
5686 const Type *Base = nullptr;
5687 uint64_t Members = 0;
5688 bool IsWin64 = Kind == Win64 || CallingConvention == llvm::CallingConv::Win64;
5689 bool IsWinVariadic = IsWin64 && IsVariadic;
5690 // In variadic functions on Windows, all composite types are treated alike,
5691 // no special handling of HFAs/HVAs.
5692 if (!IsWinVariadic && isHomogeneousAggregate(Ty, Base, Members)) {
5693 if (Kind != AArch64ABIInfo::AAPCS)
5694 return ABIArgInfo::getDirect(
5695 llvm::ArrayType::get(CGT.ConvertType(QualType(Base, 0)), Members));
5696
5697 // For alignment adjusted HFAs, cap the argument alignment to 16, leave it
5698 // default otherwise.
5699 unsigned Align =
5700 getContext().getTypeUnadjustedAlignInChars(Ty).getQuantity();
5701 unsigned BaseAlign = getContext().getTypeAlignInChars(Base).getQuantity();
5702 Align = (Align > BaseAlign && Align >= 16) ? 16 : 0;
5703 return ABIArgInfo::getDirect(
5704 llvm::ArrayType::get(CGT.ConvertType(QualType(Base, 0)), Members), 0,
5705 nullptr, true, Align);
5706 }
5707
5708 // Aggregates <= 16 bytes are passed directly in registers or on the stack.
5709 if (Size <= 128) {
5710 // On RenderScript, coerce Aggregates <= 16 bytes to an integer array of
5711 // same size and alignment.
5712 if (getTarget().isRenderScriptTarget()) {
5713 return coerceToIntArray(Ty, getContext(), getVMContext());
5714 }
5715 unsigned Alignment;
5716 if (Kind == AArch64ABIInfo::AAPCS) {
5717 Alignment = getContext().getTypeUnadjustedAlign(Ty);
5718 Alignment = Alignment < 128 ? 64 : 128;
5719 } else {
5720 Alignment = std::max(getContext().getTypeAlign(Ty),
5721 (unsigned)getTarget().getPointerWidth(0));
5722 }
5723 Size = llvm::alignTo(Size, Alignment);
5724
5725 // We use a pair of i64 for 16-byte aggregate with 8-byte alignment.
5726 // For aggregates with 16-byte alignment, we use i128.
5727 llvm::Type *BaseTy = llvm::Type::getIntNTy(getVMContext(), Alignment);
5728 return ABIArgInfo::getDirect(
5729 Size == Alignment ? BaseTy
5730 : llvm::ArrayType::get(BaseTy, Size / Alignment));
5731 }
5732
5733 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
5734 }
5735
classifyReturnType(QualType RetTy,bool IsVariadic) const5736 ABIArgInfo AArch64ABIInfo::classifyReturnType(QualType RetTy,
5737 bool IsVariadic) const {
5738 if (RetTy->isVoidType())
5739 return ABIArgInfo::getIgnore();
5740
5741 if (const auto *VT = RetTy->getAs<VectorType>()) {
5742 if (VT->getVectorKind() == VectorType::SveFixedLengthDataVector ||
5743 VT->getVectorKind() == VectorType::SveFixedLengthPredicateVector)
5744 return coerceIllegalVector(RetTy);
5745 }
5746
5747 // Large vector types should be returned via memory.
5748 if (RetTy->isVectorType() && getContext().getTypeSize(RetTy) > 128)
5749 return getNaturalAlignIndirect(RetTy);
5750
5751 if (!isAggregateTypeForABI(RetTy)) {
5752 // Treat an enum type as its underlying type.
5753 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
5754 RetTy = EnumTy->getDecl()->getIntegerType();
5755
5756 if (const auto *EIT = RetTy->getAs<ExtIntType>())
5757 if (EIT->getNumBits() > 128)
5758 return getNaturalAlignIndirect(RetTy);
5759
5760 return (isPromotableIntegerTypeForABI(RetTy) && isDarwinPCS()
5761 ? ABIArgInfo::getExtend(RetTy)
5762 : ABIArgInfo::getDirect());
5763 }
5764
5765 uint64_t Size = getContext().getTypeSize(RetTy);
5766 if (isEmptyRecord(getContext(), RetTy, true) || Size == 0)
5767 return ABIArgInfo::getIgnore();
5768
5769 const Type *Base = nullptr;
5770 uint64_t Members = 0;
5771 if (isHomogeneousAggregate(RetTy, Base, Members) &&
5772 !(getTarget().getTriple().getArch() == llvm::Triple::aarch64_32 &&
5773 IsVariadic))
5774 // Homogeneous Floating-point Aggregates (HFAs) are returned directly.
5775 return ABIArgInfo::getDirect();
5776
5777 // Aggregates <= 16 bytes are returned directly in registers or on the stack.
5778 if (Size <= 128) {
5779 // On RenderScript, coerce Aggregates <= 16 bytes to an integer array of
5780 // same size and alignment.
5781 if (getTarget().isRenderScriptTarget()) {
5782 return coerceToIntArray(RetTy, getContext(), getVMContext());
5783 }
5784
5785 if (Size <= 64 && getDataLayout().isLittleEndian()) {
5786 // Composite types are returned in lower bits of a 64-bit register for LE,
5787 // and in higher bits for BE. However, integer types are always returned
5788 // in lower bits for both LE and BE, and they are not rounded up to
5789 // 64-bits. We can skip rounding up of composite types for LE, but not for
5790 // BE, otherwise composite types will be indistinguishable from integer
5791 // types.
5792 return ABIArgInfo::getDirect(
5793 llvm::IntegerType::get(getVMContext(), Size));
5794 }
5795
5796 unsigned Alignment = getContext().getTypeAlign(RetTy);
5797 Size = llvm::alignTo(Size, 64); // round up to multiple of 8 bytes
5798
5799 // We use a pair of i64 for 16-byte aggregate with 8-byte alignment.
5800 // For aggregates with 16-byte alignment, we use i128.
5801 if (Alignment < 128 && Size == 128) {
5802 llvm::Type *BaseTy = llvm::Type::getInt64Ty(getVMContext());
5803 return ABIArgInfo::getDirect(llvm::ArrayType::get(BaseTy, Size / 64));
5804 }
5805 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), Size));
5806 }
5807
5808 return getNaturalAlignIndirect(RetTy);
5809 }
5810
5811 /// isIllegalVectorType - check whether the vector type is legal for AArch64.
isIllegalVectorType(QualType Ty) const5812 bool AArch64ABIInfo::isIllegalVectorType(QualType Ty) const {
5813 if (const VectorType *VT = Ty->getAs<VectorType>()) {
5814 // Check whether VT is a fixed-length SVE vector. These types are
5815 // represented as scalable vectors in function args/return and must be
5816 // coerced from fixed vectors.
5817 if (VT->getVectorKind() == VectorType::SveFixedLengthDataVector ||
5818 VT->getVectorKind() == VectorType::SveFixedLengthPredicateVector)
5819 return true;
5820
5821 // Check whether VT is legal.
5822 unsigned NumElements = VT->getNumElements();
5823 uint64_t Size = getContext().getTypeSize(VT);
5824 // NumElements should be power of 2.
5825 if (!llvm::isPowerOf2_32(NumElements))
5826 return true;
5827
5828 // arm64_32 has to be compatible with the ARM logic here, which allows huge
5829 // vectors for some reason.
5830 llvm::Triple Triple = getTarget().getTriple();
5831 if (Triple.getArch() == llvm::Triple::aarch64_32 &&
5832 Triple.isOSBinFormatMachO())
5833 return Size <= 32;
5834
5835 return Size != 64 && (Size != 128 || NumElements == 1);
5836 }
5837 return false;
5838 }
5839
isLegalVectorTypeForSwift(CharUnits totalSize,llvm::Type * eltTy,unsigned elts) const5840 bool AArch64ABIInfo::isLegalVectorTypeForSwift(CharUnits totalSize,
5841 llvm::Type *eltTy,
5842 unsigned elts) const {
5843 if (!llvm::isPowerOf2_32(elts))
5844 return false;
5845 if (totalSize.getQuantity() != 8 &&
5846 (totalSize.getQuantity() != 16 || elts == 1))
5847 return false;
5848 return true;
5849 }
5850
isHomogeneousAggregateBaseType(QualType Ty) const5851 bool AArch64ABIInfo::isHomogeneousAggregateBaseType(QualType Ty) const {
5852 // Homogeneous aggregates for AAPCS64 must have base types of a floating
5853 // point type or a short-vector type. This is the same as the 32-bit ABI,
5854 // but with the difference that any floating-point type is allowed,
5855 // including __fp16.
5856 if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
5857 if (BT->isFloatingPoint())
5858 return true;
5859 } else if (const VectorType *VT = Ty->getAs<VectorType>()) {
5860 unsigned VecSize = getContext().getTypeSize(VT);
5861 if (VecSize == 64 || VecSize == 128)
5862 return true;
5863 }
5864 return false;
5865 }
5866
isHomogeneousAggregateSmallEnough(const Type * Base,uint64_t Members) const5867 bool AArch64ABIInfo::isHomogeneousAggregateSmallEnough(const Type *Base,
5868 uint64_t Members) const {
5869 return Members <= 4;
5870 }
5871
EmitAAPCSVAArg(Address VAListAddr,QualType Ty,CodeGenFunction & CGF) const5872 Address AArch64ABIInfo::EmitAAPCSVAArg(Address VAListAddr, QualType Ty,
5873 CodeGenFunction &CGF) const {
5874 ABIArgInfo AI = classifyArgumentType(Ty, /*IsVariadic=*/true,
5875 CGF.CurFnInfo->getCallingConvention());
5876 bool IsIndirect = AI.isIndirect();
5877
5878 llvm::Type *BaseTy = CGF.ConvertType(Ty);
5879 if (IsIndirect)
5880 BaseTy = llvm::PointerType::getUnqual(BaseTy);
5881 else if (AI.getCoerceToType())
5882 BaseTy = AI.getCoerceToType();
5883
5884 unsigned NumRegs = 1;
5885 if (llvm::ArrayType *ArrTy = dyn_cast<llvm::ArrayType>(BaseTy)) {
5886 BaseTy = ArrTy->getElementType();
5887 NumRegs = ArrTy->getNumElements();
5888 }
5889 bool IsFPR = BaseTy->isFloatingPointTy() || BaseTy->isVectorTy();
5890
5891 // The AArch64 va_list type and handling is specified in the Procedure Call
5892 // Standard, section B.4:
5893 //
5894 // struct {
5895 // void *__stack;
5896 // void *__gr_top;
5897 // void *__vr_top;
5898 // int __gr_offs;
5899 // int __vr_offs;
5900 // };
5901
5902 llvm::BasicBlock *MaybeRegBlock = CGF.createBasicBlock("vaarg.maybe_reg");
5903 llvm::BasicBlock *InRegBlock = CGF.createBasicBlock("vaarg.in_reg");
5904 llvm::BasicBlock *OnStackBlock = CGF.createBasicBlock("vaarg.on_stack");
5905 llvm::BasicBlock *ContBlock = CGF.createBasicBlock("vaarg.end");
5906
5907 CharUnits TySize = getContext().getTypeSizeInChars(Ty);
5908 CharUnits TyAlign = getContext().getTypeUnadjustedAlignInChars(Ty);
5909
5910 Address reg_offs_p = Address::invalid();
5911 llvm::Value *reg_offs = nullptr;
5912 int reg_top_index;
5913 int RegSize = IsIndirect ? 8 : TySize.getQuantity();
5914 if (!IsFPR) {
5915 // 3 is the field number of __gr_offs
5916 reg_offs_p = CGF.Builder.CreateStructGEP(VAListAddr, 3, "gr_offs_p");
5917 reg_offs = CGF.Builder.CreateLoad(reg_offs_p, "gr_offs");
5918 reg_top_index = 1; // field number for __gr_top
5919 RegSize = llvm::alignTo(RegSize, 8);
5920 } else {
5921 // 4 is the field number of __vr_offs.
5922 reg_offs_p = CGF.Builder.CreateStructGEP(VAListAddr, 4, "vr_offs_p");
5923 reg_offs = CGF.Builder.CreateLoad(reg_offs_p, "vr_offs");
5924 reg_top_index = 2; // field number for __vr_top
5925 RegSize = 16 * NumRegs;
5926 }
5927
5928 //=======================================
5929 // Find out where argument was passed
5930 //=======================================
5931
5932 // If reg_offs >= 0 we're already using the stack for this type of
5933 // argument. We don't want to keep updating reg_offs (in case it overflows,
5934 // though anyone passing 2GB of arguments, each at most 16 bytes, deserves
5935 // whatever they get).
5936 llvm::Value *UsingStack = nullptr;
5937 UsingStack = CGF.Builder.CreateICmpSGE(
5938 reg_offs, llvm::ConstantInt::get(CGF.Int32Ty, 0));
5939
5940 CGF.Builder.CreateCondBr(UsingStack, OnStackBlock, MaybeRegBlock);
5941
5942 // Otherwise, at least some kind of argument could go in these registers, the
5943 // question is whether this particular type is too big.
5944 CGF.EmitBlock(MaybeRegBlock);
5945
5946 // Integer arguments may need to correct register alignment (for example a
5947 // "struct { __int128 a; };" gets passed in x_2N, x_{2N+1}). In this case we
5948 // align __gr_offs to calculate the potential address.
5949 if (!IsFPR && !IsIndirect && TyAlign.getQuantity() > 8) {
5950 int Align = TyAlign.getQuantity();
5951
5952 reg_offs = CGF.Builder.CreateAdd(
5953 reg_offs, llvm::ConstantInt::get(CGF.Int32Ty, Align - 1),
5954 "align_regoffs");
5955 reg_offs = CGF.Builder.CreateAnd(
5956 reg_offs, llvm::ConstantInt::get(CGF.Int32Ty, -Align),
5957 "aligned_regoffs");
5958 }
5959
5960 // Update the gr_offs/vr_offs pointer for next call to va_arg on this va_list.
5961 // The fact that this is done unconditionally reflects the fact that
5962 // allocating an argument to the stack also uses up all the remaining
5963 // registers of the appropriate kind.
5964 llvm::Value *NewOffset = nullptr;
5965 NewOffset = CGF.Builder.CreateAdd(
5966 reg_offs, llvm::ConstantInt::get(CGF.Int32Ty, RegSize), "new_reg_offs");
5967 CGF.Builder.CreateStore(NewOffset, reg_offs_p);
5968
5969 // Now we're in a position to decide whether this argument really was in
5970 // registers or not.
5971 llvm::Value *InRegs = nullptr;
5972 InRegs = CGF.Builder.CreateICmpSLE(
5973 NewOffset, llvm::ConstantInt::get(CGF.Int32Ty, 0), "inreg");
5974
5975 CGF.Builder.CreateCondBr(InRegs, InRegBlock, OnStackBlock);
5976
5977 //=======================================
5978 // Argument was in registers
5979 //=======================================
5980
5981 // Now we emit the code for if the argument was originally passed in
5982 // registers. First start the appropriate block:
5983 CGF.EmitBlock(InRegBlock);
5984
5985 llvm::Value *reg_top = nullptr;
5986 Address reg_top_p =
5987 CGF.Builder.CreateStructGEP(VAListAddr, reg_top_index, "reg_top_p");
5988 reg_top = CGF.Builder.CreateLoad(reg_top_p, "reg_top");
5989 Address BaseAddr(CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, reg_top, reg_offs),
5990 CharUnits::fromQuantity(IsFPR ? 16 : 8));
5991 Address RegAddr = Address::invalid();
5992 llvm::Type *MemTy = CGF.ConvertTypeForMem(Ty);
5993
5994 if (IsIndirect) {
5995 // If it's been passed indirectly (actually a struct), whatever we find from
5996 // stored registers or on the stack will actually be a struct **.
5997 MemTy = llvm::PointerType::getUnqual(MemTy);
5998 }
5999
6000 const Type *Base = nullptr;
6001 uint64_t NumMembers = 0;
6002 bool IsHFA = isHomogeneousAggregate(Ty, Base, NumMembers);
6003 if (IsHFA && NumMembers > 1) {
6004 // Homogeneous aggregates passed in registers will have their elements split
6005 // and stored 16-bytes apart regardless of size (they're notionally in qN,
6006 // qN+1, ...). We reload and store into a temporary local variable
6007 // contiguously.
6008 assert(!IsIndirect && "Homogeneous aggregates should be passed directly");
6009 auto BaseTyInfo = getContext().getTypeInfoInChars(QualType(Base, 0));
6010 llvm::Type *BaseTy = CGF.ConvertType(QualType(Base, 0));
6011 llvm::Type *HFATy = llvm::ArrayType::get(BaseTy, NumMembers);
6012 Address Tmp = CGF.CreateTempAlloca(HFATy,
6013 std::max(TyAlign, BaseTyInfo.Align));
6014
6015 // On big-endian platforms, the value will be right-aligned in its slot.
6016 int Offset = 0;
6017 if (CGF.CGM.getDataLayout().isBigEndian() &&
6018 BaseTyInfo.Width.getQuantity() < 16)
6019 Offset = 16 - BaseTyInfo.Width.getQuantity();
6020
6021 for (unsigned i = 0; i < NumMembers; ++i) {
6022 CharUnits BaseOffset = CharUnits::fromQuantity(16 * i + Offset);
6023 Address LoadAddr =
6024 CGF.Builder.CreateConstInBoundsByteGEP(BaseAddr, BaseOffset);
6025 LoadAddr = CGF.Builder.CreateElementBitCast(LoadAddr, BaseTy);
6026
6027 Address StoreAddr = CGF.Builder.CreateConstArrayGEP(Tmp, i);
6028
6029 llvm::Value *Elem = CGF.Builder.CreateLoad(LoadAddr);
6030 CGF.Builder.CreateStore(Elem, StoreAddr);
6031 }
6032
6033 RegAddr = CGF.Builder.CreateElementBitCast(Tmp, MemTy);
6034 } else {
6035 // Otherwise the object is contiguous in memory.
6036
6037 // It might be right-aligned in its slot.
6038 CharUnits SlotSize = BaseAddr.getAlignment();
6039 if (CGF.CGM.getDataLayout().isBigEndian() && !IsIndirect &&
6040 (IsHFA || !isAggregateTypeForABI(Ty)) &&
6041 TySize < SlotSize) {
6042 CharUnits Offset = SlotSize - TySize;
6043 BaseAddr = CGF.Builder.CreateConstInBoundsByteGEP(BaseAddr, Offset);
6044 }
6045
6046 RegAddr = CGF.Builder.CreateElementBitCast(BaseAddr, MemTy);
6047 }
6048
6049 CGF.EmitBranch(ContBlock);
6050
6051 //=======================================
6052 // Argument was on the stack
6053 //=======================================
6054 CGF.EmitBlock(OnStackBlock);
6055
6056 Address stack_p = CGF.Builder.CreateStructGEP(VAListAddr, 0, "stack_p");
6057 llvm::Value *OnStackPtr = CGF.Builder.CreateLoad(stack_p, "stack");
6058
6059 // Again, stack arguments may need realignment. In this case both integer and
6060 // floating-point ones might be affected.
6061 if (!IsIndirect && TyAlign.getQuantity() > 8) {
6062 int Align = TyAlign.getQuantity();
6063
6064 OnStackPtr = CGF.Builder.CreatePtrToInt(OnStackPtr, CGF.Int64Ty);
6065
6066 OnStackPtr = CGF.Builder.CreateAdd(
6067 OnStackPtr, llvm::ConstantInt::get(CGF.Int64Ty, Align - 1),
6068 "align_stack");
6069 OnStackPtr = CGF.Builder.CreateAnd(
6070 OnStackPtr, llvm::ConstantInt::get(CGF.Int64Ty, -Align),
6071 "align_stack");
6072
6073 OnStackPtr = CGF.Builder.CreateIntToPtr(OnStackPtr, CGF.Int8PtrTy);
6074 }
6075 Address OnStackAddr(OnStackPtr,
6076 std::max(CharUnits::fromQuantity(8), TyAlign));
6077
6078 // All stack slots are multiples of 8 bytes.
6079 CharUnits StackSlotSize = CharUnits::fromQuantity(8);
6080 CharUnits StackSize;
6081 if (IsIndirect)
6082 StackSize = StackSlotSize;
6083 else
6084 StackSize = TySize.alignTo(StackSlotSize);
6085
6086 llvm::Value *StackSizeC = CGF.Builder.getSize(StackSize);
6087 llvm::Value *NewStack = CGF.Builder.CreateInBoundsGEP(
6088 CGF.Int8Ty, OnStackPtr, StackSizeC, "new_stack");
6089
6090 // Write the new value of __stack for the next call to va_arg
6091 CGF.Builder.CreateStore(NewStack, stack_p);
6092
6093 if (CGF.CGM.getDataLayout().isBigEndian() && !isAggregateTypeForABI(Ty) &&
6094 TySize < StackSlotSize) {
6095 CharUnits Offset = StackSlotSize - TySize;
6096 OnStackAddr = CGF.Builder.CreateConstInBoundsByteGEP(OnStackAddr, Offset);
6097 }
6098
6099 OnStackAddr = CGF.Builder.CreateElementBitCast(OnStackAddr, MemTy);
6100
6101 CGF.EmitBranch(ContBlock);
6102
6103 //=======================================
6104 // Tidy up
6105 //=======================================
6106 CGF.EmitBlock(ContBlock);
6107
6108 Address ResAddr = emitMergePHI(CGF, RegAddr, InRegBlock,
6109 OnStackAddr, OnStackBlock, "vaargs.addr");
6110
6111 if (IsIndirect)
6112 return Address(CGF.Builder.CreateLoad(ResAddr, "vaarg.addr"),
6113 TyAlign);
6114
6115 return ResAddr;
6116 }
6117
EmitDarwinVAArg(Address VAListAddr,QualType Ty,CodeGenFunction & CGF) const6118 Address AArch64ABIInfo::EmitDarwinVAArg(Address VAListAddr, QualType Ty,
6119 CodeGenFunction &CGF) const {
6120 // The backend's lowering doesn't support va_arg for aggregates or
6121 // illegal vector types. Lower VAArg here for these cases and use
6122 // the LLVM va_arg instruction for everything else.
6123 if (!isAggregateTypeForABI(Ty) && !isIllegalVectorType(Ty))
6124 return EmitVAArgInstr(CGF, VAListAddr, Ty, ABIArgInfo::getDirect());
6125
6126 uint64_t PointerSize = getTarget().getPointerWidth(0) / 8;
6127 CharUnits SlotSize = CharUnits::fromQuantity(PointerSize);
6128
6129 // Empty records are ignored for parameter passing purposes.
6130 if (isEmptyRecord(getContext(), Ty, true)) {
6131 Address Addr(CGF.Builder.CreateLoad(VAListAddr, "ap.cur"), SlotSize);
6132 Addr = CGF.Builder.CreateElementBitCast(Addr, CGF.ConvertTypeForMem(Ty));
6133 return Addr;
6134 }
6135
6136 // The size of the actual thing passed, which might end up just
6137 // being a pointer for indirect types.
6138 auto TyInfo = getContext().getTypeInfoInChars(Ty);
6139
6140 // Arguments bigger than 16 bytes which aren't homogeneous
6141 // aggregates should be passed indirectly.
6142 bool IsIndirect = false;
6143 if (TyInfo.Width.getQuantity() > 16) {
6144 const Type *Base = nullptr;
6145 uint64_t Members = 0;
6146 IsIndirect = !isHomogeneousAggregate(Ty, Base, Members);
6147 }
6148
6149 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, IsIndirect,
6150 TyInfo, SlotSize, /*AllowHigherAlign*/ true);
6151 }
6152
EmitMSVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const6153 Address AArch64ABIInfo::EmitMSVAArg(CodeGenFunction &CGF, Address VAListAddr,
6154 QualType Ty) const {
6155 bool IsIndirect = false;
6156
6157 // Composites larger than 16 bytes are passed by reference.
6158 if (isAggregateTypeForABI(Ty) && getContext().getTypeSize(Ty) > 128)
6159 IsIndirect = true;
6160
6161 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, IsIndirect,
6162 CGF.getContext().getTypeInfoInChars(Ty),
6163 CharUnits::fromQuantity(8),
6164 /*allowHigherAlign*/ false);
6165 }
6166
6167 //===----------------------------------------------------------------------===//
6168 // ARM ABI Implementation
6169 //===----------------------------------------------------------------------===//
6170
6171 namespace {
6172
6173 class ARMABIInfo : public SwiftABIInfo {
6174 public:
6175 enum ABIKind {
6176 APCS = 0,
6177 AAPCS = 1,
6178 AAPCS_VFP = 2,
6179 AAPCS16_VFP = 3,
6180 };
6181
6182 private:
6183 ABIKind Kind;
6184 bool IsFloatABISoftFP;
6185
6186 public:
ARMABIInfo(CodeGenTypes & CGT,ABIKind _Kind)6187 ARMABIInfo(CodeGenTypes &CGT, ABIKind _Kind)
6188 : SwiftABIInfo(CGT), Kind(_Kind) {
6189 setCCs();
6190 IsFloatABISoftFP = CGT.getCodeGenOpts().FloatABI == "softfp" ||
6191 CGT.getCodeGenOpts().FloatABI == ""; // default
6192 }
6193
isEABI() const6194 bool isEABI() const {
6195 switch (getTarget().getTriple().getEnvironment()) {
6196 case llvm::Triple::Android:
6197 case llvm::Triple::EABI:
6198 case llvm::Triple::EABIHF:
6199 case llvm::Triple::GNUEABI:
6200 case llvm::Triple::GNUEABIHF:
6201 case llvm::Triple::MuslEABI:
6202 case llvm::Triple::MuslEABIHF:
6203 return true;
6204 default:
6205 return false;
6206 }
6207 }
6208
isEABIHF() const6209 bool isEABIHF() const {
6210 switch (getTarget().getTriple().getEnvironment()) {
6211 case llvm::Triple::EABIHF:
6212 case llvm::Triple::GNUEABIHF:
6213 case llvm::Triple::MuslEABIHF:
6214 return true;
6215 default:
6216 return false;
6217 }
6218 }
6219
getABIKind() const6220 ABIKind getABIKind() const { return Kind; }
6221
allowBFloatArgsAndRet() const6222 bool allowBFloatArgsAndRet() const override {
6223 return !IsFloatABISoftFP && getTarget().hasBFloat16Type();
6224 }
6225
6226 private:
6227 ABIArgInfo classifyReturnType(QualType RetTy, bool isVariadic,
6228 unsigned functionCallConv) const;
6229 ABIArgInfo classifyArgumentType(QualType RetTy, bool isVariadic,
6230 unsigned functionCallConv) const;
6231 ABIArgInfo classifyHomogeneousAggregate(QualType Ty, const Type *Base,
6232 uint64_t Members) const;
6233 ABIArgInfo coerceIllegalVector(QualType Ty) const;
6234 bool isIllegalVectorType(QualType Ty) const;
6235 bool containsAnyFP16Vectors(QualType Ty) const;
6236
6237 bool isHomogeneousAggregateBaseType(QualType Ty) const override;
6238 bool isHomogeneousAggregateSmallEnough(const Type *Ty,
6239 uint64_t Members) const override;
6240
6241 bool isEffectivelyAAPCS_VFP(unsigned callConvention, bool acceptHalf) const;
6242
6243 void computeInfo(CGFunctionInfo &FI) const override;
6244
6245 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
6246 QualType Ty) const override;
6247
6248 llvm::CallingConv::ID getLLVMDefaultCC() const;
6249 llvm::CallingConv::ID getABIDefaultCC() const;
6250 void setCCs();
6251
shouldPassIndirectlyForSwift(ArrayRef<llvm::Type * > scalars,bool asReturnValue) const6252 bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars,
6253 bool asReturnValue) const override {
6254 return occupiesMoreThan(CGT, scalars, /*total*/ 4);
6255 }
isSwiftErrorInRegister() const6256 bool isSwiftErrorInRegister() const override {
6257 return true;
6258 }
6259 bool isLegalVectorTypeForSwift(CharUnits totalSize, llvm::Type *eltTy,
6260 unsigned elts) const override;
6261 };
6262
6263 class ARMTargetCodeGenInfo : public TargetCodeGenInfo {
6264 public:
ARMTargetCodeGenInfo(CodeGenTypes & CGT,ARMABIInfo::ABIKind K)6265 ARMTargetCodeGenInfo(CodeGenTypes &CGT, ARMABIInfo::ABIKind K)
6266 : TargetCodeGenInfo(std::make_unique<ARMABIInfo>(CGT, K)) {}
6267
getABIInfo() const6268 const ARMABIInfo &getABIInfo() const {
6269 return static_cast<const ARMABIInfo&>(TargetCodeGenInfo::getABIInfo());
6270 }
6271
getDwarfEHStackPointer(CodeGen::CodeGenModule & M) const6272 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
6273 return 13;
6274 }
6275
getARCRetainAutoreleasedReturnValueMarker() const6276 StringRef getARCRetainAutoreleasedReturnValueMarker() const override {
6277 return "mov\tr7, r7\t\t// marker for objc_retainAutoreleaseReturnValue";
6278 }
6279
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const6280 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
6281 llvm::Value *Address) const override {
6282 llvm::Value *Four8 = llvm::ConstantInt::get(CGF.Int8Ty, 4);
6283
6284 // 0-15 are the 16 integer registers.
6285 AssignToArrayRange(CGF.Builder, Address, Four8, 0, 15);
6286 return false;
6287 }
6288
getSizeOfUnwindException() const6289 unsigned getSizeOfUnwindException() const override {
6290 if (getABIInfo().isEABI()) return 88;
6291 return TargetCodeGenInfo::getSizeOfUnwindException();
6292 }
6293
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const6294 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
6295 CodeGen::CodeGenModule &CGM) const override {
6296 if (GV->isDeclaration())
6297 return;
6298 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
6299 if (!FD)
6300 return;
6301
6302 const ARMInterruptAttr *Attr = FD->getAttr<ARMInterruptAttr>();
6303 if (!Attr)
6304 return;
6305
6306 const char *Kind;
6307 switch (Attr->getInterrupt()) {
6308 case ARMInterruptAttr::Generic: Kind = ""; break;
6309 case ARMInterruptAttr::IRQ: Kind = "IRQ"; break;
6310 case ARMInterruptAttr::FIQ: Kind = "FIQ"; break;
6311 case ARMInterruptAttr::SWI: Kind = "SWI"; break;
6312 case ARMInterruptAttr::ABORT: Kind = "ABORT"; break;
6313 case ARMInterruptAttr::UNDEF: Kind = "UNDEF"; break;
6314 }
6315
6316 llvm::Function *Fn = cast<llvm::Function>(GV);
6317
6318 Fn->addFnAttr("interrupt", Kind);
6319
6320 ARMABIInfo::ABIKind ABI = cast<ARMABIInfo>(getABIInfo()).getABIKind();
6321 if (ABI == ARMABIInfo::APCS)
6322 return;
6323
6324 // AAPCS guarantees that sp will be 8-byte aligned on any public interface,
6325 // however this is not necessarily true on taking any interrupt. Instruct
6326 // the backend to perform a realignment as part of the function prologue.
6327 llvm::AttrBuilder B;
6328 B.addStackAlignmentAttr(8);
6329 Fn->addAttributes(llvm::AttributeList::FunctionIndex, B);
6330 }
6331 };
6332
6333 class WindowsARMTargetCodeGenInfo : public ARMTargetCodeGenInfo {
6334 public:
WindowsARMTargetCodeGenInfo(CodeGenTypes & CGT,ARMABIInfo::ABIKind K)6335 WindowsARMTargetCodeGenInfo(CodeGenTypes &CGT, ARMABIInfo::ABIKind K)
6336 : ARMTargetCodeGenInfo(CGT, K) {}
6337
6338 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
6339 CodeGen::CodeGenModule &CGM) const override;
6340
getDependentLibraryOption(llvm::StringRef Lib,llvm::SmallString<24> & Opt) const6341 void getDependentLibraryOption(llvm::StringRef Lib,
6342 llvm::SmallString<24> &Opt) const override {
6343 Opt = "/DEFAULTLIB:" + qualifyWindowsLibrary(Lib);
6344 }
6345
getDetectMismatchOption(llvm::StringRef Name,llvm::StringRef Value,llvm::SmallString<32> & Opt) const6346 void getDetectMismatchOption(llvm::StringRef Name, llvm::StringRef Value,
6347 llvm::SmallString<32> &Opt) const override {
6348 Opt = "/FAILIFMISMATCH:\"" + Name.str() + "=" + Value.str() + "\"";
6349 }
6350 };
6351
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const6352 void WindowsARMTargetCodeGenInfo::setTargetAttributes(
6353 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const {
6354 ARMTargetCodeGenInfo::setTargetAttributes(D, GV, CGM);
6355 if (GV->isDeclaration())
6356 return;
6357 addStackProbeTargetAttributes(D, GV, CGM);
6358 }
6359 }
6360
computeInfo(CGFunctionInfo & FI) const6361 void ARMABIInfo::computeInfo(CGFunctionInfo &FI) const {
6362 if (!::classifyReturnType(getCXXABI(), FI, *this))
6363 FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), FI.isVariadic(),
6364 FI.getCallingConvention());
6365
6366 for (auto &I : FI.arguments())
6367 I.info = classifyArgumentType(I.type, FI.isVariadic(),
6368 FI.getCallingConvention());
6369
6370
6371 // Always honor user-specified calling convention.
6372 if (FI.getCallingConvention() != llvm::CallingConv::C)
6373 return;
6374
6375 llvm::CallingConv::ID cc = getRuntimeCC();
6376 if (cc != llvm::CallingConv::C)
6377 FI.setEffectiveCallingConvention(cc);
6378 }
6379
6380 /// Return the default calling convention that LLVM will use.
getLLVMDefaultCC() const6381 llvm::CallingConv::ID ARMABIInfo::getLLVMDefaultCC() const {
6382 // The default calling convention that LLVM will infer.
6383 if (isEABIHF() || getTarget().getTriple().isWatchABI())
6384 return llvm::CallingConv::ARM_AAPCS_VFP;
6385 else if (isEABI())
6386 return llvm::CallingConv::ARM_AAPCS;
6387 else
6388 return llvm::CallingConv::ARM_APCS;
6389 }
6390
6391 /// Return the calling convention that our ABI would like us to use
6392 /// as the C calling convention.
getABIDefaultCC() const6393 llvm::CallingConv::ID ARMABIInfo::getABIDefaultCC() const {
6394 switch (getABIKind()) {
6395 case APCS: return llvm::CallingConv::ARM_APCS;
6396 case AAPCS: return llvm::CallingConv::ARM_AAPCS;
6397 case AAPCS_VFP: return llvm::CallingConv::ARM_AAPCS_VFP;
6398 case AAPCS16_VFP: return llvm::CallingConv::ARM_AAPCS_VFP;
6399 }
6400 llvm_unreachable("bad ABI kind");
6401 }
6402
setCCs()6403 void ARMABIInfo::setCCs() {
6404 assert(getRuntimeCC() == llvm::CallingConv::C);
6405
6406 // Don't muddy up the IR with a ton of explicit annotations if
6407 // they'd just match what LLVM will infer from the triple.
6408 llvm::CallingConv::ID abiCC = getABIDefaultCC();
6409 if (abiCC != getLLVMDefaultCC())
6410 RuntimeCC = abiCC;
6411 }
6412
coerceIllegalVector(QualType Ty) const6413 ABIArgInfo ARMABIInfo::coerceIllegalVector(QualType Ty) const {
6414 uint64_t Size = getContext().getTypeSize(Ty);
6415 if (Size <= 32) {
6416 llvm::Type *ResType =
6417 llvm::Type::getInt32Ty(getVMContext());
6418 return ABIArgInfo::getDirect(ResType);
6419 }
6420 if (Size == 64 || Size == 128) {
6421 auto *ResType = llvm::FixedVectorType::get(
6422 llvm::Type::getInt32Ty(getVMContext()), Size / 32);
6423 return ABIArgInfo::getDirect(ResType);
6424 }
6425 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
6426 }
6427
classifyHomogeneousAggregate(QualType Ty,const Type * Base,uint64_t Members) const6428 ABIArgInfo ARMABIInfo::classifyHomogeneousAggregate(QualType Ty,
6429 const Type *Base,
6430 uint64_t Members) const {
6431 assert(Base && "Base class should be set for homogeneous aggregate");
6432 // Base can be a floating-point or a vector.
6433 if (const VectorType *VT = Base->getAs<VectorType>()) {
6434 // FP16 vectors should be converted to integer vectors
6435 if (!getTarget().hasLegalHalfType() && containsAnyFP16Vectors(Ty)) {
6436 uint64_t Size = getContext().getTypeSize(VT);
6437 auto *NewVecTy = llvm::FixedVectorType::get(
6438 llvm::Type::getInt32Ty(getVMContext()), Size / 32);
6439 llvm::Type *Ty = llvm::ArrayType::get(NewVecTy, Members);
6440 return ABIArgInfo::getDirect(Ty, 0, nullptr, false);
6441 }
6442 }
6443 unsigned Align = 0;
6444 if (getABIKind() == ARMABIInfo::AAPCS ||
6445 getABIKind() == ARMABIInfo::AAPCS_VFP) {
6446 // For alignment adjusted HFAs, cap the argument alignment to 8, leave it
6447 // default otherwise.
6448 Align = getContext().getTypeUnadjustedAlignInChars(Ty).getQuantity();
6449 unsigned BaseAlign = getContext().getTypeAlignInChars(Base).getQuantity();
6450 Align = (Align > BaseAlign && Align >= 8) ? 8 : 0;
6451 }
6452 return ABIArgInfo::getDirect(nullptr, 0, nullptr, false, Align);
6453 }
6454
classifyArgumentType(QualType Ty,bool isVariadic,unsigned functionCallConv) const6455 ABIArgInfo ARMABIInfo::classifyArgumentType(QualType Ty, bool isVariadic,
6456 unsigned functionCallConv) const {
6457 // 6.1.2.1 The following argument types are VFP CPRCs:
6458 // A single-precision floating-point type (including promoted
6459 // half-precision types); A double-precision floating-point type;
6460 // A 64-bit or 128-bit containerized vector type; Homogeneous Aggregate
6461 // with a Base Type of a single- or double-precision floating-point type,
6462 // 64-bit containerized vectors or 128-bit containerized vectors with one
6463 // to four Elements.
6464 // Variadic functions should always marshal to the base standard.
6465 bool IsAAPCS_VFP =
6466 !isVariadic && isEffectivelyAAPCS_VFP(functionCallConv, /* AAPCS16 */ false);
6467
6468 Ty = useFirstFieldIfTransparentUnion(Ty);
6469
6470 // Handle illegal vector types here.
6471 if (isIllegalVectorType(Ty))
6472 return coerceIllegalVector(Ty);
6473
6474 if (!isAggregateTypeForABI(Ty)) {
6475 // Treat an enum type as its underlying type.
6476 if (const EnumType *EnumTy = Ty->getAs<EnumType>()) {
6477 Ty = EnumTy->getDecl()->getIntegerType();
6478 }
6479
6480 if (const auto *EIT = Ty->getAs<ExtIntType>())
6481 if (EIT->getNumBits() > 64)
6482 return getNaturalAlignIndirect(Ty, /*ByVal=*/true);
6483
6484 return (isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
6485 : ABIArgInfo::getDirect());
6486 }
6487
6488 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI())) {
6489 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
6490 }
6491
6492 // Ignore empty records.
6493 if (isEmptyRecord(getContext(), Ty, true))
6494 return ABIArgInfo::getIgnore();
6495
6496 if (IsAAPCS_VFP) {
6497 // Homogeneous Aggregates need to be expanded when we can fit the aggregate
6498 // into VFP registers.
6499 const Type *Base = nullptr;
6500 uint64_t Members = 0;
6501 if (isHomogeneousAggregate(Ty, Base, Members))
6502 return classifyHomogeneousAggregate(Ty, Base, Members);
6503 } else if (getABIKind() == ARMABIInfo::AAPCS16_VFP) {
6504 // WatchOS does have homogeneous aggregates. Note that we intentionally use
6505 // this convention even for a variadic function: the backend will use GPRs
6506 // if needed.
6507 const Type *Base = nullptr;
6508 uint64_t Members = 0;
6509 if (isHomogeneousAggregate(Ty, Base, Members)) {
6510 assert(Base && Members <= 4 && "unexpected homogeneous aggregate");
6511 llvm::Type *Ty =
6512 llvm::ArrayType::get(CGT.ConvertType(QualType(Base, 0)), Members);
6513 return ABIArgInfo::getDirect(Ty, 0, nullptr, false);
6514 }
6515 }
6516
6517 if (getABIKind() == ARMABIInfo::AAPCS16_VFP &&
6518 getContext().getTypeSizeInChars(Ty) > CharUnits::fromQuantity(16)) {
6519 // WatchOS is adopting the 64-bit AAPCS rule on composite types: if they're
6520 // bigger than 128-bits, they get placed in space allocated by the caller,
6521 // and a pointer is passed.
6522 return ABIArgInfo::getIndirect(
6523 CharUnits::fromQuantity(getContext().getTypeAlign(Ty) / 8), false);
6524 }
6525
6526 // Support byval for ARM.
6527 // The ABI alignment for APCS is 4-byte and for AAPCS at least 4-byte and at
6528 // most 8-byte. We realign the indirect argument if type alignment is bigger
6529 // than ABI alignment.
6530 uint64_t ABIAlign = 4;
6531 uint64_t TyAlign;
6532 if (getABIKind() == ARMABIInfo::AAPCS_VFP ||
6533 getABIKind() == ARMABIInfo::AAPCS) {
6534 TyAlign = getContext().getTypeUnadjustedAlignInChars(Ty).getQuantity();
6535 ABIAlign = std::min(std::max(TyAlign, (uint64_t)4), (uint64_t)8);
6536 } else {
6537 TyAlign = getContext().getTypeAlignInChars(Ty).getQuantity();
6538 }
6539 if (getContext().getTypeSizeInChars(Ty) > CharUnits::fromQuantity(64)) {
6540 assert(getABIKind() != ARMABIInfo::AAPCS16_VFP && "unexpected byval");
6541 return ABIArgInfo::getIndirect(CharUnits::fromQuantity(ABIAlign),
6542 /*ByVal=*/true,
6543 /*Realign=*/TyAlign > ABIAlign);
6544 }
6545
6546 // On RenderScript, coerce Aggregates <= 64 bytes to an integer array of
6547 // same size and alignment.
6548 if (getTarget().isRenderScriptTarget()) {
6549 return coerceToIntArray(Ty, getContext(), getVMContext());
6550 }
6551
6552 // Otherwise, pass by coercing to a structure of the appropriate size.
6553 llvm::Type* ElemTy;
6554 unsigned SizeRegs;
6555 // FIXME: Try to match the types of the arguments more accurately where
6556 // we can.
6557 if (TyAlign <= 4) {
6558 ElemTy = llvm::Type::getInt32Ty(getVMContext());
6559 SizeRegs = (getContext().getTypeSize(Ty) + 31) / 32;
6560 } else {
6561 ElemTy = llvm::Type::getInt64Ty(getVMContext());
6562 SizeRegs = (getContext().getTypeSize(Ty) + 63) / 64;
6563 }
6564
6565 return ABIArgInfo::getDirect(llvm::ArrayType::get(ElemTy, SizeRegs));
6566 }
6567
isIntegerLikeType(QualType Ty,ASTContext & Context,llvm::LLVMContext & VMContext)6568 static bool isIntegerLikeType(QualType Ty, ASTContext &Context,
6569 llvm::LLVMContext &VMContext) {
6570 // APCS, C Language Calling Conventions, Non-Simple Return Values: A structure
6571 // is called integer-like if its size is less than or equal to one word, and
6572 // the offset of each of its addressable sub-fields is zero.
6573
6574 uint64_t Size = Context.getTypeSize(Ty);
6575
6576 // Check that the type fits in a word.
6577 if (Size > 32)
6578 return false;
6579
6580 // FIXME: Handle vector types!
6581 if (Ty->isVectorType())
6582 return false;
6583
6584 // Float types are never treated as "integer like".
6585 if (Ty->isRealFloatingType())
6586 return false;
6587
6588 // If this is a builtin or pointer type then it is ok.
6589 if (Ty->getAs<BuiltinType>() || Ty->isPointerType())
6590 return true;
6591
6592 // Small complex integer types are "integer like".
6593 if (const ComplexType *CT = Ty->getAs<ComplexType>())
6594 return isIntegerLikeType(CT->getElementType(), Context, VMContext);
6595
6596 // Single element and zero sized arrays should be allowed, by the definition
6597 // above, but they are not.
6598
6599 // Otherwise, it must be a record type.
6600 const RecordType *RT = Ty->getAs<RecordType>();
6601 if (!RT) return false;
6602
6603 // Ignore records with flexible arrays.
6604 const RecordDecl *RD = RT->getDecl();
6605 if (RD->hasFlexibleArrayMember())
6606 return false;
6607
6608 // Check that all sub-fields are at offset 0, and are themselves "integer
6609 // like".
6610 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
6611
6612 bool HadField = false;
6613 unsigned idx = 0;
6614 for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
6615 i != e; ++i, ++idx) {
6616 const FieldDecl *FD = *i;
6617
6618 // Bit-fields are not addressable, we only need to verify they are "integer
6619 // like". We still have to disallow a subsequent non-bitfield, for example:
6620 // struct { int : 0; int x }
6621 // is non-integer like according to gcc.
6622 if (FD->isBitField()) {
6623 if (!RD->isUnion())
6624 HadField = true;
6625
6626 if (!isIntegerLikeType(FD->getType(), Context, VMContext))
6627 return false;
6628
6629 continue;
6630 }
6631
6632 // Check if this field is at offset 0.
6633 if (Layout.getFieldOffset(idx) != 0)
6634 return false;
6635
6636 if (!isIntegerLikeType(FD->getType(), Context, VMContext))
6637 return false;
6638
6639 // Only allow at most one field in a structure. This doesn't match the
6640 // wording above, but follows gcc in situations with a field following an
6641 // empty structure.
6642 if (!RD->isUnion()) {
6643 if (HadField)
6644 return false;
6645
6646 HadField = true;
6647 }
6648 }
6649
6650 return true;
6651 }
6652
classifyReturnType(QualType RetTy,bool isVariadic,unsigned functionCallConv) const6653 ABIArgInfo ARMABIInfo::classifyReturnType(QualType RetTy, bool isVariadic,
6654 unsigned functionCallConv) const {
6655
6656 // Variadic functions should always marshal to the base standard.
6657 bool IsAAPCS_VFP =
6658 !isVariadic && isEffectivelyAAPCS_VFP(functionCallConv, /* AAPCS16 */ true);
6659
6660 if (RetTy->isVoidType())
6661 return ABIArgInfo::getIgnore();
6662
6663 if (const VectorType *VT = RetTy->getAs<VectorType>()) {
6664 // Large vector types should be returned via memory.
6665 if (getContext().getTypeSize(RetTy) > 128)
6666 return getNaturalAlignIndirect(RetTy);
6667 // TODO: FP16/BF16 vectors should be converted to integer vectors
6668 // This check is similar to isIllegalVectorType - refactor?
6669 if ((!getTarget().hasLegalHalfType() &&
6670 (VT->getElementType()->isFloat16Type() ||
6671 VT->getElementType()->isHalfType())) ||
6672 (IsFloatABISoftFP &&
6673 VT->getElementType()->isBFloat16Type()))
6674 return coerceIllegalVector(RetTy);
6675 }
6676
6677 if (!isAggregateTypeForABI(RetTy)) {
6678 // Treat an enum type as its underlying type.
6679 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
6680 RetTy = EnumTy->getDecl()->getIntegerType();
6681
6682 if (const auto *EIT = RetTy->getAs<ExtIntType>())
6683 if (EIT->getNumBits() > 64)
6684 return getNaturalAlignIndirect(RetTy, /*ByVal=*/false);
6685
6686 return isPromotableIntegerTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
6687 : ABIArgInfo::getDirect();
6688 }
6689
6690 // Are we following APCS?
6691 if (getABIKind() == APCS) {
6692 if (isEmptyRecord(getContext(), RetTy, false))
6693 return ABIArgInfo::getIgnore();
6694
6695 // Complex types are all returned as packed integers.
6696 //
6697 // FIXME: Consider using 2 x vector types if the back end handles them
6698 // correctly.
6699 if (RetTy->isAnyComplexType())
6700 return ABIArgInfo::getDirect(llvm::IntegerType::get(
6701 getVMContext(), getContext().getTypeSize(RetTy)));
6702
6703 // Integer like structures are returned in r0.
6704 if (isIntegerLikeType(RetTy, getContext(), getVMContext())) {
6705 // Return in the smallest viable integer type.
6706 uint64_t Size = getContext().getTypeSize(RetTy);
6707 if (Size <= 8)
6708 return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext()));
6709 if (Size <= 16)
6710 return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext()));
6711 return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
6712 }
6713
6714 // Otherwise return in memory.
6715 return getNaturalAlignIndirect(RetTy);
6716 }
6717
6718 // Otherwise this is an AAPCS variant.
6719
6720 if (isEmptyRecord(getContext(), RetTy, true))
6721 return ABIArgInfo::getIgnore();
6722
6723 // Check for homogeneous aggregates with AAPCS-VFP.
6724 if (IsAAPCS_VFP) {
6725 const Type *Base = nullptr;
6726 uint64_t Members = 0;
6727 if (isHomogeneousAggregate(RetTy, Base, Members))
6728 return classifyHomogeneousAggregate(RetTy, Base, Members);
6729 }
6730
6731 // Aggregates <= 4 bytes are returned in r0; other aggregates
6732 // are returned indirectly.
6733 uint64_t Size = getContext().getTypeSize(RetTy);
6734 if (Size <= 32) {
6735 // On RenderScript, coerce Aggregates <= 4 bytes to an integer array of
6736 // same size and alignment.
6737 if (getTarget().isRenderScriptTarget()) {
6738 return coerceToIntArray(RetTy, getContext(), getVMContext());
6739 }
6740 if (getDataLayout().isBigEndian())
6741 // Return in 32 bit integer integer type (as if loaded by LDR, AAPCS 5.4)
6742 return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
6743
6744 // Return in the smallest viable integer type.
6745 if (Size <= 8)
6746 return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext()));
6747 if (Size <= 16)
6748 return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext()));
6749 return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
6750 } else if (Size <= 128 && getABIKind() == AAPCS16_VFP) {
6751 llvm::Type *Int32Ty = llvm::Type::getInt32Ty(getVMContext());
6752 llvm::Type *CoerceTy =
6753 llvm::ArrayType::get(Int32Ty, llvm::alignTo(Size, 32) / 32);
6754 return ABIArgInfo::getDirect(CoerceTy);
6755 }
6756
6757 return getNaturalAlignIndirect(RetTy);
6758 }
6759
6760 /// isIllegalVector - check whether Ty is an illegal vector type.
isIllegalVectorType(QualType Ty) const6761 bool ARMABIInfo::isIllegalVectorType(QualType Ty) const {
6762 if (const VectorType *VT = Ty->getAs<VectorType> ()) {
6763 // On targets that don't support half, fp16 or bfloat, they are expanded
6764 // into float, and we don't want the ABI to depend on whether or not they
6765 // are supported in hardware. Thus return false to coerce vectors of these
6766 // types into integer vectors.
6767 // We do not depend on hasLegalHalfType for bfloat as it is a
6768 // separate IR type.
6769 if ((!getTarget().hasLegalHalfType() &&
6770 (VT->getElementType()->isFloat16Type() ||
6771 VT->getElementType()->isHalfType())) ||
6772 (IsFloatABISoftFP &&
6773 VT->getElementType()->isBFloat16Type()))
6774 return true;
6775 if (isAndroid()) {
6776 // Android shipped using Clang 3.1, which supported a slightly different
6777 // vector ABI. The primary differences were that 3-element vector types
6778 // were legal, and so were sub 32-bit vectors (i.e. <2 x i8>). This path
6779 // accepts that legacy behavior for Android only.
6780 // Check whether VT is legal.
6781 unsigned NumElements = VT->getNumElements();
6782 // NumElements should be power of 2 or equal to 3.
6783 if (!llvm::isPowerOf2_32(NumElements) && NumElements != 3)
6784 return true;
6785 } else {
6786 // Check whether VT is legal.
6787 unsigned NumElements = VT->getNumElements();
6788 uint64_t Size = getContext().getTypeSize(VT);
6789 // NumElements should be power of 2.
6790 if (!llvm::isPowerOf2_32(NumElements))
6791 return true;
6792 // Size should be greater than 32 bits.
6793 return Size <= 32;
6794 }
6795 }
6796 return false;
6797 }
6798
6799 /// Return true if a type contains any 16-bit floating point vectors
containsAnyFP16Vectors(QualType Ty) const6800 bool ARMABIInfo::containsAnyFP16Vectors(QualType Ty) const {
6801 if (const ConstantArrayType *AT = getContext().getAsConstantArrayType(Ty)) {
6802 uint64_t NElements = AT->getSize().getZExtValue();
6803 if (NElements == 0)
6804 return false;
6805 return containsAnyFP16Vectors(AT->getElementType());
6806 } else if (const RecordType *RT = Ty->getAs<RecordType>()) {
6807 const RecordDecl *RD = RT->getDecl();
6808
6809 // If this is a C++ record, check the bases first.
6810 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
6811 if (llvm::any_of(CXXRD->bases(), [this](const CXXBaseSpecifier &B) {
6812 return containsAnyFP16Vectors(B.getType());
6813 }))
6814 return true;
6815
6816 if (llvm::any_of(RD->fields(), [this](FieldDecl *FD) {
6817 return FD && containsAnyFP16Vectors(FD->getType());
6818 }))
6819 return true;
6820
6821 return false;
6822 } else {
6823 if (const VectorType *VT = Ty->getAs<VectorType>())
6824 return (VT->getElementType()->isFloat16Type() ||
6825 VT->getElementType()->isBFloat16Type() ||
6826 VT->getElementType()->isHalfType());
6827 return false;
6828 }
6829 }
6830
isLegalVectorTypeForSwift(CharUnits vectorSize,llvm::Type * eltTy,unsigned numElts) const6831 bool ARMABIInfo::isLegalVectorTypeForSwift(CharUnits vectorSize,
6832 llvm::Type *eltTy,
6833 unsigned numElts) const {
6834 if (!llvm::isPowerOf2_32(numElts))
6835 return false;
6836 unsigned size = getDataLayout().getTypeStoreSizeInBits(eltTy);
6837 if (size > 64)
6838 return false;
6839 if (vectorSize.getQuantity() != 8 &&
6840 (vectorSize.getQuantity() != 16 || numElts == 1))
6841 return false;
6842 return true;
6843 }
6844
isHomogeneousAggregateBaseType(QualType Ty) const6845 bool ARMABIInfo::isHomogeneousAggregateBaseType(QualType Ty) const {
6846 // Homogeneous aggregates for AAPCS-VFP must have base types of float,
6847 // double, or 64-bit or 128-bit vectors.
6848 if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
6849 if (BT->getKind() == BuiltinType::Float ||
6850 BT->getKind() == BuiltinType::Double ||
6851 BT->getKind() == BuiltinType::LongDouble)
6852 return true;
6853 } else if (const VectorType *VT = Ty->getAs<VectorType>()) {
6854 unsigned VecSize = getContext().getTypeSize(VT);
6855 if (VecSize == 64 || VecSize == 128)
6856 return true;
6857 }
6858 return false;
6859 }
6860
isHomogeneousAggregateSmallEnough(const Type * Base,uint64_t Members) const6861 bool ARMABIInfo::isHomogeneousAggregateSmallEnough(const Type *Base,
6862 uint64_t Members) const {
6863 return Members <= 4;
6864 }
6865
isEffectivelyAAPCS_VFP(unsigned callConvention,bool acceptHalf) const6866 bool ARMABIInfo::isEffectivelyAAPCS_VFP(unsigned callConvention,
6867 bool acceptHalf) const {
6868 // Give precedence to user-specified calling conventions.
6869 if (callConvention != llvm::CallingConv::C)
6870 return (callConvention == llvm::CallingConv::ARM_AAPCS_VFP);
6871 else
6872 return (getABIKind() == AAPCS_VFP) ||
6873 (acceptHalf && (getABIKind() == AAPCS16_VFP));
6874 }
6875
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const6876 Address ARMABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
6877 QualType Ty) const {
6878 CharUnits SlotSize = CharUnits::fromQuantity(4);
6879
6880 // Empty records are ignored for parameter passing purposes.
6881 if (isEmptyRecord(getContext(), Ty, true)) {
6882 Address Addr(CGF.Builder.CreateLoad(VAListAddr), SlotSize);
6883 Addr = CGF.Builder.CreateElementBitCast(Addr, CGF.ConvertTypeForMem(Ty));
6884 return Addr;
6885 }
6886
6887 CharUnits TySize = getContext().getTypeSizeInChars(Ty);
6888 CharUnits TyAlignForABI = getContext().getTypeUnadjustedAlignInChars(Ty);
6889
6890 // Use indirect if size of the illegal vector is bigger than 16 bytes.
6891 bool IsIndirect = false;
6892 const Type *Base = nullptr;
6893 uint64_t Members = 0;
6894 if (TySize > CharUnits::fromQuantity(16) && isIllegalVectorType(Ty)) {
6895 IsIndirect = true;
6896
6897 // ARMv7k passes structs bigger than 16 bytes indirectly, in space
6898 // allocated by the caller.
6899 } else if (TySize > CharUnits::fromQuantity(16) &&
6900 getABIKind() == ARMABIInfo::AAPCS16_VFP &&
6901 !isHomogeneousAggregate(Ty, Base, Members)) {
6902 IsIndirect = true;
6903
6904 // Otherwise, bound the type's ABI alignment.
6905 // The ABI alignment for 64-bit or 128-bit vectors is 8 for AAPCS and 4 for
6906 // APCS. For AAPCS, the ABI alignment is at least 4-byte and at most 8-byte.
6907 // Our callers should be prepared to handle an under-aligned address.
6908 } else if (getABIKind() == ARMABIInfo::AAPCS_VFP ||
6909 getABIKind() == ARMABIInfo::AAPCS) {
6910 TyAlignForABI = std::max(TyAlignForABI, CharUnits::fromQuantity(4));
6911 TyAlignForABI = std::min(TyAlignForABI, CharUnits::fromQuantity(8));
6912 } else if (getABIKind() == ARMABIInfo::AAPCS16_VFP) {
6913 // ARMv7k allows type alignment up to 16 bytes.
6914 TyAlignForABI = std::max(TyAlignForABI, CharUnits::fromQuantity(4));
6915 TyAlignForABI = std::min(TyAlignForABI, CharUnits::fromQuantity(16));
6916 } else {
6917 TyAlignForABI = CharUnits::fromQuantity(4);
6918 }
6919
6920 TypeInfoChars TyInfo(TySize, TyAlignForABI, false);
6921 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, IsIndirect, TyInfo,
6922 SlotSize, /*AllowHigherAlign*/ true);
6923 }
6924
6925 //===----------------------------------------------------------------------===//
6926 // NVPTX ABI Implementation
6927 //===----------------------------------------------------------------------===//
6928
6929 namespace {
6930
6931 class NVPTXTargetCodeGenInfo;
6932
6933 class NVPTXABIInfo : public ABIInfo {
6934 NVPTXTargetCodeGenInfo &CGInfo;
6935
6936 public:
NVPTXABIInfo(CodeGenTypes & CGT,NVPTXTargetCodeGenInfo & Info)6937 NVPTXABIInfo(CodeGenTypes &CGT, NVPTXTargetCodeGenInfo &Info)
6938 : ABIInfo(CGT), CGInfo(Info) {}
6939
6940 ABIArgInfo classifyReturnType(QualType RetTy) const;
6941 ABIArgInfo classifyArgumentType(QualType Ty) const;
6942
6943 void computeInfo(CGFunctionInfo &FI) const override;
6944 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
6945 QualType Ty) const override;
6946 bool isUnsupportedType(QualType T) const;
6947 ABIArgInfo coerceToIntArrayWithLimit(QualType Ty, unsigned MaxSize) const;
6948 };
6949
6950 class NVPTXTargetCodeGenInfo : public TargetCodeGenInfo {
6951 public:
NVPTXTargetCodeGenInfo(CodeGenTypes & CGT)6952 NVPTXTargetCodeGenInfo(CodeGenTypes &CGT)
6953 : TargetCodeGenInfo(std::make_unique<NVPTXABIInfo>(CGT, *this)) {}
6954
6955 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
6956 CodeGen::CodeGenModule &M) const override;
6957 bool shouldEmitStaticExternCAliases() const override;
6958
getCUDADeviceBuiltinSurfaceDeviceType() const6959 llvm::Type *getCUDADeviceBuiltinSurfaceDeviceType() const override {
6960 // On the device side, surface reference is represented as an object handle
6961 // in 64-bit integer.
6962 return llvm::Type::getInt64Ty(getABIInfo().getVMContext());
6963 }
6964
getCUDADeviceBuiltinTextureDeviceType() const6965 llvm::Type *getCUDADeviceBuiltinTextureDeviceType() const override {
6966 // On the device side, texture reference is represented as an object handle
6967 // in 64-bit integer.
6968 return llvm::Type::getInt64Ty(getABIInfo().getVMContext());
6969 }
6970
emitCUDADeviceBuiltinSurfaceDeviceCopy(CodeGenFunction & CGF,LValue Dst,LValue Src) const6971 bool emitCUDADeviceBuiltinSurfaceDeviceCopy(CodeGenFunction &CGF, LValue Dst,
6972 LValue Src) const override {
6973 emitBuiltinSurfTexDeviceCopy(CGF, Dst, Src);
6974 return true;
6975 }
6976
emitCUDADeviceBuiltinTextureDeviceCopy(CodeGenFunction & CGF,LValue Dst,LValue Src) const6977 bool emitCUDADeviceBuiltinTextureDeviceCopy(CodeGenFunction &CGF, LValue Dst,
6978 LValue Src) const override {
6979 emitBuiltinSurfTexDeviceCopy(CGF, Dst, Src);
6980 return true;
6981 }
6982
6983 private:
6984 // Adds a NamedMDNode with GV, Name, and Operand as operands, and adds the
6985 // resulting MDNode to the nvvm.annotations MDNode.
6986 static void addNVVMMetadata(llvm::GlobalValue *GV, StringRef Name,
6987 int Operand);
6988
emitBuiltinSurfTexDeviceCopy(CodeGenFunction & CGF,LValue Dst,LValue Src)6989 static void emitBuiltinSurfTexDeviceCopy(CodeGenFunction &CGF, LValue Dst,
6990 LValue Src) {
6991 llvm::Value *Handle = nullptr;
6992 llvm::Constant *C =
6993 llvm::dyn_cast<llvm::Constant>(Src.getAddress(CGF).getPointer());
6994 // Lookup `addrspacecast` through the constant pointer if any.
6995 if (auto *ASC = llvm::dyn_cast_or_null<llvm::AddrSpaceCastOperator>(C))
6996 C = llvm::cast<llvm::Constant>(ASC->getPointerOperand());
6997 if (auto *GV = llvm::dyn_cast_or_null<llvm::GlobalVariable>(C)) {
6998 // Load the handle from the specific global variable using
6999 // `nvvm.texsurf.handle.internal` intrinsic.
7000 Handle = CGF.EmitRuntimeCall(
7001 CGF.CGM.getIntrinsic(llvm::Intrinsic::nvvm_texsurf_handle_internal,
7002 {GV->getType()}),
7003 {GV}, "texsurf_handle");
7004 } else
7005 Handle = CGF.EmitLoadOfScalar(Src, SourceLocation());
7006 CGF.EmitStoreOfScalar(Handle, Dst);
7007 }
7008 };
7009
7010 /// Checks if the type is unsupported directly by the current target.
isUnsupportedType(QualType T) const7011 bool NVPTXABIInfo::isUnsupportedType(QualType T) const {
7012 ASTContext &Context = getContext();
7013 if (!Context.getTargetInfo().hasFloat16Type() && T->isFloat16Type())
7014 return true;
7015 if (!Context.getTargetInfo().hasFloat128Type() &&
7016 (T->isFloat128Type() ||
7017 (T->isRealFloatingType() && Context.getTypeSize(T) == 128)))
7018 return true;
7019 if (const auto *EIT = T->getAs<ExtIntType>())
7020 return EIT->getNumBits() >
7021 (Context.getTargetInfo().hasInt128Type() ? 128U : 64U);
7022 if (!Context.getTargetInfo().hasInt128Type() && T->isIntegerType() &&
7023 Context.getTypeSize(T) > 64U)
7024 return true;
7025 if (const auto *AT = T->getAsArrayTypeUnsafe())
7026 return isUnsupportedType(AT->getElementType());
7027 const auto *RT = T->getAs<RecordType>();
7028 if (!RT)
7029 return false;
7030 const RecordDecl *RD = RT->getDecl();
7031
7032 // If this is a C++ record, check the bases first.
7033 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
7034 for (const CXXBaseSpecifier &I : CXXRD->bases())
7035 if (isUnsupportedType(I.getType()))
7036 return true;
7037
7038 for (const FieldDecl *I : RD->fields())
7039 if (isUnsupportedType(I->getType()))
7040 return true;
7041 return false;
7042 }
7043
7044 /// Coerce the given type into an array with maximum allowed size of elements.
coerceToIntArrayWithLimit(QualType Ty,unsigned MaxSize) const7045 ABIArgInfo NVPTXABIInfo::coerceToIntArrayWithLimit(QualType Ty,
7046 unsigned MaxSize) const {
7047 // Alignment and Size are measured in bits.
7048 const uint64_t Size = getContext().getTypeSize(Ty);
7049 const uint64_t Alignment = getContext().getTypeAlign(Ty);
7050 const unsigned Div = std::min<unsigned>(MaxSize, Alignment);
7051 llvm::Type *IntType = llvm::Type::getIntNTy(getVMContext(), Div);
7052 const uint64_t NumElements = (Size + Div - 1) / Div;
7053 return ABIArgInfo::getDirect(llvm::ArrayType::get(IntType, NumElements));
7054 }
7055
classifyReturnType(QualType RetTy) const7056 ABIArgInfo NVPTXABIInfo::classifyReturnType(QualType RetTy) const {
7057 if (RetTy->isVoidType())
7058 return ABIArgInfo::getIgnore();
7059
7060 if (getContext().getLangOpts().OpenMP &&
7061 getContext().getLangOpts().OpenMPIsDevice && isUnsupportedType(RetTy))
7062 return coerceToIntArrayWithLimit(RetTy, 64);
7063
7064 // note: this is different from default ABI
7065 if (!RetTy->isScalarType())
7066 return ABIArgInfo::getDirect();
7067
7068 // Treat an enum type as its underlying type.
7069 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
7070 RetTy = EnumTy->getDecl()->getIntegerType();
7071
7072 return (isPromotableIntegerTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
7073 : ABIArgInfo::getDirect());
7074 }
7075
classifyArgumentType(QualType Ty) const7076 ABIArgInfo NVPTXABIInfo::classifyArgumentType(QualType Ty) const {
7077 // Treat an enum type as its underlying type.
7078 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
7079 Ty = EnumTy->getDecl()->getIntegerType();
7080
7081 // Return aggregates type as indirect by value
7082 if (isAggregateTypeForABI(Ty)) {
7083 // Under CUDA device compilation, tex/surf builtin types are replaced with
7084 // object types and passed directly.
7085 if (getContext().getLangOpts().CUDAIsDevice) {
7086 if (Ty->isCUDADeviceBuiltinSurfaceType())
7087 return ABIArgInfo::getDirect(
7088 CGInfo.getCUDADeviceBuiltinSurfaceDeviceType());
7089 if (Ty->isCUDADeviceBuiltinTextureType())
7090 return ABIArgInfo::getDirect(
7091 CGInfo.getCUDADeviceBuiltinTextureDeviceType());
7092 }
7093 return getNaturalAlignIndirect(Ty, /* byval */ true);
7094 }
7095
7096 if (const auto *EIT = Ty->getAs<ExtIntType>()) {
7097 if ((EIT->getNumBits() > 128) ||
7098 (!getContext().getTargetInfo().hasInt128Type() &&
7099 EIT->getNumBits() > 64))
7100 return getNaturalAlignIndirect(Ty, /* byval */ true);
7101 }
7102
7103 return (isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
7104 : ABIArgInfo::getDirect());
7105 }
7106
computeInfo(CGFunctionInfo & FI) const7107 void NVPTXABIInfo::computeInfo(CGFunctionInfo &FI) const {
7108 if (!getCXXABI().classifyReturnType(FI))
7109 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
7110 for (auto &I : FI.arguments())
7111 I.info = classifyArgumentType(I.type);
7112
7113 // Always honor user-specified calling convention.
7114 if (FI.getCallingConvention() != llvm::CallingConv::C)
7115 return;
7116
7117 FI.setEffectiveCallingConvention(getRuntimeCC());
7118 }
7119
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const7120 Address NVPTXABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
7121 QualType Ty) const {
7122 llvm_unreachable("NVPTX does not support varargs");
7123 }
7124
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & M) const7125 void NVPTXTargetCodeGenInfo::setTargetAttributes(
7126 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &M) const {
7127 if (GV->isDeclaration())
7128 return;
7129 const VarDecl *VD = dyn_cast_or_null<VarDecl>(D);
7130 if (VD) {
7131 if (M.getLangOpts().CUDA) {
7132 if (VD->getType()->isCUDADeviceBuiltinSurfaceType())
7133 addNVVMMetadata(GV, "surface", 1);
7134 else if (VD->getType()->isCUDADeviceBuiltinTextureType())
7135 addNVVMMetadata(GV, "texture", 1);
7136 return;
7137 }
7138 }
7139
7140 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
7141 if (!FD) return;
7142
7143 llvm::Function *F = cast<llvm::Function>(GV);
7144
7145 // Perform special handling in OpenCL mode
7146 if (M.getLangOpts().OpenCL) {
7147 // Use OpenCL function attributes to check for kernel functions
7148 // By default, all functions are device functions
7149 if (FD->hasAttr<OpenCLKernelAttr>()) {
7150 // OpenCL __kernel functions get kernel metadata
7151 // Create !{<func-ref>, metadata !"kernel", i32 1} node
7152 addNVVMMetadata(F, "kernel", 1);
7153 // And kernel functions are not subject to inlining
7154 F->addFnAttr(llvm::Attribute::NoInline);
7155 }
7156 }
7157
7158 // Perform special handling in CUDA mode.
7159 if (M.getLangOpts().CUDA) {
7160 // CUDA __global__ functions get a kernel metadata entry. Since
7161 // __global__ functions cannot be called from the device, we do not
7162 // need to set the noinline attribute.
7163 if (FD->hasAttr<CUDAGlobalAttr>()) {
7164 // Create !{<func-ref>, metadata !"kernel", i32 1} node
7165 addNVVMMetadata(F, "kernel", 1);
7166 }
7167 if (CUDALaunchBoundsAttr *Attr = FD->getAttr<CUDALaunchBoundsAttr>()) {
7168 // Create !{<func-ref>, metadata !"maxntidx", i32 <val>} node
7169 llvm::APSInt MaxThreads(32);
7170 MaxThreads = Attr->getMaxThreads()->EvaluateKnownConstInt(M.getContext());
7171 if (MaxThreads > 0)
7172 addNVVMMetadata(F, "maxntidx", MaxThreads.getExtValue());
7173
7174 // min blocks is an optional argument for CUDALaunchBoundsAttr. If it was
7175 // not specified in __launch_bounds__ or if the user specified a 0 value,
7176 // we don't have to add a PTX directive.
7177 if (Attr->getMinBlocks()) {
7178 llvm::APSInt MinBlocks(32);
7179 MinBlocks = Attr->getMinBlocks()->EvaluateKnownConstInt(M.getContext());
7180 if (MinBlocks > 0)
7181 // Create !{<func-ref>, metadata !"minctasm", i32 <val>} node
7182 addNVVMMetadata(F, "minctasm", MinBlocks.getExtValue());
7183 }
7184 }
7185 }
7186 }
7187
addNVVMMetadata(llvm::GlobalValue * GV,StringRef Name,int Operand)7188 void NVPTXTargetCodeGenInfo::addNVVMMetadata(llvm::GlobalValue *GV,
7189 StringRef Name, int Operand) {
7190 llvm::Module *M = GV->getParent();
7191 llvm::LLVMContext &Ctx = M->getContext();
7192
7193 // Get "nvvm.annotations" metadata node
7194 llvm::NamedMDNode *MD = M->getOrInsertNamedMetadata("nvvm.annotations");
7195
7196 llvm::Metadata *MDVals[] = {
7197 llvm::ConstantAsMetadata::get(GV), llvm::MDString::get(Ctx, Name),
7198 llvm::ConstantAsMetadata::get(
7199 llvm::ConstantInt::get(llvm::Type::getInt32Ty(Ctx), Operand))};
7200 // Append metadata to nvvm.annotations
7201 MD->addOperand(llvm::MDNode::get(Ctx, MDVals));
7202 }
7203
shouldEmitStaticExternCAliases() const7204 bool NVPTXTargetCodeGenInfo::shouldEmitStaticExternCAliases() const {
7205 return false;
7206 }
7207 }
7208
7209 //===----------------------------------------------------------------------===//
7210 // SystemZ ABI Implementation
7211 //===----------------------------------------------------------------------===//
7212
7213 namespace {
7214
7215 class SystemZABIInfo : public SwiftABIInfo {
7216 bool HasVector;
7217 bool IsSoftFloatABI;
7218
7219 public:
SystemZABIInfo(CodeGenTypes & CGT,bool HV,bool SF)7220 SystemZABIInfo(CodeGenTypes &CGT, bool HV, bool SF)
7221 : SwiftABIInfo(CGT), HasVector(HV), IsSoftFloatABI(SF) {}
7222
7223 bool isPromotableIntegerTypeForABI(QualType Ty) const;
7224 bool isCompoundType(QualType Ty) const;
7225 bool isVectorArgumentType(QualType Ty) const;
7226 bool isFPArgumentType(QualType Ty) const;
7227 QualType GetSingleElementType(QualType Ty) const;
7228
7229 ABIArgInfo classifyReturnType(QualType RetTy) const;
7230 ABIArgInfo classifyArgumentType(QualType ArgTy) const;
7231
computeInfo(CGFunctionInfo & FI) const7232 void computeInfo(CGFunctionInfo &FI) const override {
7233 if (!getCXXABI().classifyReturnType(FI))
7234 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
7235 for (auto &I : FI.arguments())
7236 I.info = classifyArgumentType(I.type);
7237 }
7238
7239 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
7240 QualType Ty) const override;
7241
shouldPassIndirectlyForSwift(ArrayRef<llvm::Type * > scalars,bool asReturnValue) const7242 bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars,
7243 bool asReturnValue) const override {
7244 return occupiesMoreThan(CGT, scalars, /*total*/ 4);
7245 }
isSwiftErrorInRegister() const7246 bool isSwiftErrorInRegister() const override {
7247 return false;
7248 }
7249 };
7250
7251 class SystemZTargetCodeGenInfo : public TargetCodeGenInfo {
7252 public:
SystemZTargetCodeGenInfo(CodeGenTypes & CGT,bool HasVector,bool SoftFloatABI)7253 SystemZTargetCodeGenInfo(CodeGenTypes &CGT, bool HasVector, bool SoftFloatABI)
7254 : TargetCodeGenInfo(
7255 std::make_unique<SystemZABIInfo>(CGT, HasVector, SoftFloatABI)) {}
7256
testFPKind(llvm::Value * V,unsigned BuiltinID,CGBuilderTy & Builder,CodeGenModule & CGM) const7257 llvm::Value *testFPKind(llvm::Value *V, unsigned BuiltinID,
7258 CGBuilderTy &Builder,
7259 CodeGenModule &CGM) const override {
7260 assert(V->getType()->isFloatingPointTy() && "V should have an FP type.");
7261 // Only use TDC in constrained FP mode.
7262 if (!Builder.getIsFPConstrained())
7263 return nullptr;
7264
7265 llvm::Type *Ty = V->getType();
7266 if (Ty->isFloatTy() || Ty->isDoubleTy() || Ty->isFP128Ty()) {
7267 llvm::Module &M = CGM.getModule();
7268 auto &Ctx = M.getContext();
7269 llvm::Function *TDCFunc =
7270 llvm::Intrinsic::getDeclaration(&M, llvm::Intrinsic::s390_tdc, Ty);
7271 unsigned TDCBits = 0;
7272 switch (BuiltinID) {
7273 case Builtin::BI__builtin_isnan:
7274 TDCBits = 0xf;
7275 break;
7276 case Builtin::BIfinite:
7277 case Builtin::BI__finite:
7278 case Builtin::BIfinitef:
7279 case Builtin::BI__finitef:
7280 case Builtin::BIfinitel:
7281 case Builtin::BI__finitel:
7282 case Builtin::BI__builtin_isfinite:
7283 TDCBits = 0xfc0;
7284 break;
7285 case Builtin::BI__builtin_isinf:
7286 TDCBits = 0x30;
7287 break;
7288 default:
7289 break;
7290 }
7291 if (TDCBits)
7292 return Builder.CreateCall(
7293 TDCFunc,
7294 {V, llvm::ConstantInt::get(llvm::Type::getInt64Ty(Ctx), TDCBits)});
7295 }
7296 return nullptr;
7297 }
7298 };
7299 }
7300
isPromotableIntegerTypeForABI(QualType Ty) const7301 bool SystemZABIInfo::isPromotableIntegerTypeForABI(QualType Ty) const {
7302 // Treat an enum type as its underlying type.
7303 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
7304 Ty = EnumTy->getDecl()->getIntegerType();
7305
7306 // Promotable integer types are required to be promoted by the ABI.
7307 if (ABIInfo::isPromotableIntegerTypeForABI(Ty))
7308 return true;
7309
7310 if (const auto *EIT = Ty->getAs<ExtIntType>())
7311 if (EIT->getNumBits() < 64)
7312 return true;
7313
7314 // 32-bit values must also be promoted.
7315 if (const BuiltinType *BT = Ty->getAs<BuiltinType>())
7316 switch (BT->getKind()) {
7317 case BuiltinType::Int:
7318 case BuiltinType::UInt:
7319 return true;
7320 default:
7321 return false;
7322 }
7323 return false;
7324 }
7325
isCompoundType(QualType Ty) const7326 bool SystemZABIInfo::isCompoundType(QualType Ty) const {
7327 return (Ty->isAnyComplexType() ||
7328 Ty->isVectorType() ||
7329 isAggregateTypeForABI(Ty));
7330 }
7331
isVectorArgumentType(QualType Ty) const7332 bool SystemZABIInfo::isVectorArgumentType(QualType Ty) const {
7333 return (HasVector &&
7334 Ty->isVectorType() &&
7335 getContext().getTypeSize(Ty) <= 128);
7336 }
7337
isFPArgumentType(QualType Ty) const7338 bool SystemZABIInfo::isFPArgumentType(QualType Ty) const {
7339 if (IsSoftFloatABI)
7340 return false;
7341
7342 if (const BuiltinType *BT = Ty->getAs<BuiltinType>())
7343 switch (BT->getKind()) {
7344 case BuiltinType::Float:
7345 case BuiltinType::Double:
7346 return true;
7347 default:
7348 return false;
7349 }
7350
7351 return false;
7352 }
7353
GetSingleElementType(QualType Ty) const7354 QualType SystemZABIInfo::GetSingleElementType(QualType Ty) const {
7355 const RecordType *RT = Ty->getAs<RecordType>();
7356
7357 if (RT && RT->isStructureOrClassType()) {
7358 const RecordDecl *RD = RT->getDecl();
7359 QualType Found;
7360
7361 // If this is a C++ record, check the bases first.
7362 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
7363 for (const auto &I : CXXRD->bases()) {
7364 QualType Base = I.getType();
7365
7366 // Empty bases don't affect things either way.
7367 if (isEmptyRecord(getContext(), Base, true))
7368 continue;
7369
7370 if (!Found.isNull())
7371 return Ty;
7372 Found = GetSingleElementType(Base);
7373 }
7374
7375 // Check the fields.
7376 for (const auto *FD : RD->fields()) {
7377 // For compatibility with GCC, ignore empty bitfields in C++ mode.
7378 // Unlike isSingleElementStruct(), empty structure and array fields
7379 // do count. So do anonymous bitfields that aren't zero-sized.
7380 if (getContext().getLangOpts().CPlusPlus &&
7381 FD->isZeroLengthBitField(getContext()))
7382 continue;
7383 // Like isSingleElementStruct(), ignore C++20 empty data members.
7384 if (FD->hasAttr<NoUniqueAddressAttr>() &&
7385 isEmptyRecord(getContext(), FD->getType(), true))
7386 continue;
7387
7388 // Unlike isSingleElementStruct(), arrays do not count.
7389 // Nested structures still do though.
7390 if (!Found.isNull())
7391 return Ty;
7392 Found = GetSingleElementType(FD->getType());
7393 }
7394
7395 // Unlike isSingleElementStruct(), trailing padding is allowed.
7396 // An 8-byte aligned struct s { float f; } is passed as a double.
7397 if (!Found.isNull())
7398 return Found;
7399 }
7400
7401 return Ty;
7402 }
7403
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const7404 Address SystemZABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
7405 QualType Ty) const {
7406 // Assume that va_list type is correct; should be pointer to LLVM type:
7407 // struct {
7408 // i64 __gpr;
7409 // i64 __fpr;
7410 // i8 *__overflow_arg_area;
7411 // i8 *__reg_save_area;
7412 // };
7413
7414 // Every non-vector argument occupies 8 bytes and is passed by preference
7415 // in either GPRs or FPRs. Vector arguments occupy 8 or 16 bytes and are
7416 // always passed on the stack.
7417 Ty = getContext().getCanonicalType(Ty);
7418 auto TyInfo = getContext().getTypeInfoInChars(Ty);
7419 llvm::Type *ArgTy = CGF.ConvertTypeForMem(Ty);
7420 llvm::Type *DirectTy = ArgTy;
7421 ABIArgInfo AI = classifyArgumentType(Ty);
7422 bool IsIndirect = AI.isIndirect();
7423 bool InFPRs = false;
7424 bool IsVector = false;
7425 CharUnits UnpaddedSize;
7426 CharUnits DirectAlign;
7427 if (IsIndirect) {
7428 DirectTy = llvm::PointerType::getUnqual(DirectTy);
7429 UnpaddedSize = DirectAlign = CharUnits::fromQuantity(8);
7430 } else {
7431 if (AI.getCoerceToType())
7432 ArgTy = AI.getCoerceToType();
7433 InFPRs = (!IsSoftFloatABI && (ArgTy->isFloatTy() || ArgTy->isDoubleTy()));
7434 IsVector = ArgTy->isVectorTy();
7435 UnpaddedSize = TyInfo.Width;
7436 DirectAlign = TyInfo.Align;
7437 }
7438 CharUnits PaddedSize = CharUnits::fromQuantity(8);
7439 if (IsVector && UnpaddedSize > PaddedSize)
7440 PaddedSize = CharUnits::fromQuantity(16);
7441 assert((UnpaddedSize <= PaddedSize) && "Invalid argument size.");
7442
7443 CharUnits Padding = (PaddedSize - UnpaddedSize);
7444
7445 llvm::Type *IndexTy = CGF.Int64Ty;
7446 llvm::Value *PaddedSizeV =
7447 llvm::ConstantInt::get(IndexTy, PaddedSize.getQuantity());
7448
7449 if (IsVector) {
7450 // Work out the address of a vector argument on the stack.
7451 // Vector arguments are always passed in the high bits of a
7452 // single (8 byte) or double (16 byte) stack slot.
7453 Address OverflowArgAreaPtr =
7454 CGF.Builder.CreateStructGEP(VAListAddr, 2, "overflow_arg_area_ptr");
7455 Address OverflowArgArea =
7456 Address(CGF.Builder.CreateLoad(OverflowArgAreaPtr, "overflow_arg_area"),
7457 TyInfo.Align);
7458 Address MemAddr =
7459 CGF.Builder.CreateElementBitCast(OverflowArgArea, DirectTy, "mem_addr");
7460
7461 // Update overflow_arg_area_ptr pointer
7462 llvm::Value *NewOverflowArgArea =
7463 CGF.Builder.CreateGEP(OverflowArgArea.getPointer(), PaddedSizeV,
7464 "overflow_arg_area");
7465 CGF.Builder.CreateStore(NewOverflowArgArea, OverflowArgAreaPtr);
7466
7467 return MemAddr;
7468 }
7469
7470 assert(PaddedSize.getQuantity() == 8);
7471
7472 unsigned MaxRegs, RegCountField, RegSaveIndex;
7473 CharUnits RegPadding;
7474 if (InFPRs) {
7475 MaxRegs = 4; // Maximum of 4 FPR arguments
7476 RegCountField = 1; // __fpr
7477 RegSaveIndex = 16; // save offset for f0
7478 RegPadding = CharUnits(); // floats are passed in the high bits of an FPR
7479 } else {
7480 MaxRegs = 5; // Maximum of 5 GPR arguments
7481 RegCountField = 0; // __gpr
7482 RegSaveIndex = 2; // save offset for r2
7483 RegPadding = Padding; // values are passed in the low bits of a GPR
7484 }
7485
7486 Address RegCountPtr =
7487 CGF.Builder.CreateStructGEP(VAListAddr, RegCountField, "reg_count_ptr");
7488 llvm::Value *RegCount = CGF.Builder.CreateLoad(RegCountPtr, "reg_count");
7489 llvm::Value *MaxRegsV = llvm::ConstantInt::get(IndexTy, MaxRegs);
7490 llvm::Value *InRegs = CGF.Builder.CreateICmpULT(RegCount, MaxRegsV,
7491 "fits_in_regs");
7492
7493 llvm::BasicBlock *InRegBlock = CGF.createBasicBlock("vaarg.in_reg");
7494 llvm::BasicBlock *InMemBlock = CGF.createBasicBlock("vaarg.in_mem");
7495 llvm::BasicBlock *ContBlock = CGF.createBasicBlock("vaarg.end");
7496 CGF.Builder.CreateCondBr(InRegs, InRegBlock, InMemBlock);
7497
7498 // Emit code to load the value if it was passed in registers.
7499 CGF.EmitBlock(InRegBlock);
7500
7501 // Work out the address of an argument register.
7502 llvm::Value *ScaledRegCount =
7503 CGF.Builder.CreateMul(RegCount, PaddedSizeV, "scaled_reg_count");
7504 llvm::Value *RegBase =
7505 llvm::ConstantInt::get(IndexTy, RegSaveIndex * PaddedSize.getQuantity()
7506 + RegPadding.getQuantity());
7507 llvm::Value *RegOffset =
7508 CGF.Builder.CreateAdd(ScaledRegCount, RegBase, "reg_offset");
7509 Address RegSaveAreaPtr =
7510 CGF.Builder.CreateStructGEP(VAListAddr, 3, "reg_save_area_ptr");
7511 llvm::Value *RegSaveArea =
7512 CGF.Builder.CreateLoad(RegSaveAreaPtr, "reg_save_area");
7513 Address RawRegAddr(CGF.Builder.CreateGEP(RegSaveArea, RegOffset,
7514 "raw_reg_addr"),
7515 PaddedSize);
7516 Address RegAddr =
7517 CGF.Builder.CreateElementBitCast(RawRegAddr, DirectTy, "reg_addr");
7518
7519 // Update the register count
7520 llvm::Value *One = llvm::ConstantInt::get(IndexTy, 1);
7521 llvm::Value *NewRegCount =
7522 CGF.Builder.CreateAdd(RegCount, One, "reg_count");
7523 CGF.Builder.CreateStore(NewRegCount, RegCountPtr);
7524 CGF.EmitBranch(ContBlock);
7525
7526 // Emit code to load the value if it was passed in memory.
7527 CGF.EmitBlock(InMemBlock);
7528
7529 // Work out the address of a stack argument.
7530 Address OverflowArgAreaPtr =
7531 CGF.Builder.CreateStructGEP(VAListAddr, 2, "overflow_arg_area_ptr");
7532 Address OverflowArgArea =
7533 Address(CGF.Builder.CreateLoad(OverflowArgAreaPtr, "overflow_arg_area"),
7534 PaddedSize);
7535 Address RawMemAddr =
7536 CGF.Builder.CreateConstByteGEP(OverflowArgArea, Padding, "raw_mem_addr");
7537 Address MemAddr =
7538 CGF.Builder.CreateElementBitCast(RawMemAddr, DirectTy, "mem_addr");
7539
7540 // Update overflow_arg_area_ptr pointer
7541 llvm::Value *NewOverflowArgArea =
7542 CGF.Builder.CreateGEP(OverflowArgArea.getPointer(), PaddedSizeV,
7543 "overflow_arg_area");
7544 CGF.Builder.CreateStore(NewOverflowArgArea, OverflowArgAreaPtr);
7545 CGF.EmitBranch(ContBlock);
7546
7547 // Return the appropriate result.
7548 CGF.EmitBlock(ContBlock);
7549 Address ResAddr = emitMergePHI(CGF, RegAddr, InRegBlock,
7550 MemAddr, InMemBlock, "va_arg.addr");
7551
7552 if (IsIndirect)
7553 ResAddr = Address(CGF.Builder.CreateLoad(ResAddr, "indirect_arg"),
7554 TyInfo.Align);
7555
7556 return ResAddr;
7557 }
7558
classifyReturnType(QualType RetTy) const7559 ABIArgInfo SystemZABIInfo::classifyReturnType(QualType RetTy) const {
7560 if (RetTy->isVoidType())
7561 return ABIArgInfo::getIgnore();
7562 if (isVectorArgumentType(RetTy))
7563 return ABIArgInfo::getDirect();
7564 if (isCompoundType(RetTy) || getContext().getTypeSize(RetTy) > 64)
7565 return getNaturalAlignIndirect(RetTy);
7566 return (isPromotableIntegerTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
7567 : ABIArgInfo::getDirect());
7568 }
7569
classifyArgumentType(QualType Ty) const7570 ABIArgInfo SystemZABIInfo::classifyArgumentType(QualType Ty) const {
7571 // Handle the generic C++ ABI.
7572 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
7573 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
7574
7575 // Integers and enums are extended to full register width.
7576 if (isPromotableIntegerTypeForABI(Ty))
7577 return ABIArgInfo::getExtend(Ty);
7578
7579 // Handle vector types and vector-like structure types. Note that
7580 // as opposed to float-like structure types, we do not allow any
7581 // padding for vector-like structures, so verify the sizes match.
7582 uint64_t Size = getContext().getTypeSize(Ty);
7583 QualType SingleElementTy = GetSingleElementType(Ty);
7584 if (isVectorArgumentType(SingleElementTy) &&
7585 getContext().getTypeSize(SingleElementTy) == Size)
7586 return ABIArgInfo::getDirect(CGT.ConvertType(SingleElementTy));
7587
7588 // Values that are not 1, 2, 4 or 8 bytes in size are passed indirectly.
7589 if (Size != 8 && Size != 16 && Size != 32 && Size != 64)
7590 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
7591
7592 // Handle small structures.
7593 if (const RecordType *RT = Ty->getAs<RecordType>()) {
7594 // Structures with flexible arrays have variable length, so really
7595 // fail the size test above.
7596 const RecordDecl *RD = RT->getDecl();
7597 if (RD->hasFlexibleArrayMember())
7598 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
7599
7600 // The structure is passed as an unextended integer, a float, or a double.
7601 llvm::Type *PassTy;
7602 if (isFPArgumentType(SingleElementTy)) {
7603 assert(Size == 32 || Size == 64);
7604 if (Size == 32)
7605 PassTy = llvm::Type::getFloatTy(getVMContext());
7606 else
7607 PassTy = llvm::Type::getDoubleTy(getVMContext());
7608 } else
7609 PassTy = llvm::IntegerType::get(getVMContext(), Size);
7610 return ABIArgInfo::getDirect(PassTy);
7611 }
7612
7613 // Non-structure compounds are passed indirectly.
7614 if (isCompoundType(Ty))
7615 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
7616
7617 return ABIArgInfo::getDirect(nullptr);
7618 }
7619
7620 //===----------------------------------------------------------------------===//
7621 // MSP430 ABI Implementation
7622 //===----------------------------------------------------------------------===//
7623
7624 namespace {
7625
7626 class MSP430ABIInfo : public DefaultABIInfo {
complexArgInfo()7627 static ABIArgInfo complexArgInfo() {
7628 ABIArgInfo Info = ABIArgInfo::getDirect();
7629 Info.setCanBeFlattened(false);
7630 return Info;
7631 }
7632
7633 public:
MSP430ABIInfo(CodeGenTypes & CGT)7634 MSP430ABIInfo(CodeGenTypes &CGT) : DefaultABIInfo(CGT) {}
7635
classifyReturnType(QualType RetTy) const7636 ABIArgInfo classifyReturnType(QualType RetTy) const {
7637 if (RetTy->isAnyComplexType())
7638 return complexArgInfo();
7639
7640 return DefaultABIInfo::classifyReturnType(RetTy);
7641 }
7642
classifyArgumentType(QualType RetTy) const7643 ABIArgInfo classifyArgumentType(QualType RetTy) const {
7644 if (RetTy->isAnyComplexType())
7645 return complexArgInfo();
7646
7647 return DefaultABIInfo::classifyArgumentType(RetTy);
7648 }
7649
7650 // Just copy the original implementations because
7651 // DefaultABIInfo::classify{Return,Argument}Type() are not virtual
computeInfo(CGFunctionInfo & FI) const7652 void computeInfo(CGFunctionInfo &FI) const override {
7653 if (!getCXXABI().classifyReturnType(FI))
7654 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
7655 for (auto &I : FI.arguments())
7656 I.info = classifyArgumentType(I.type);
7657 }
7658
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const7659 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
7660 QualType Ty) const override {
7661 return EmitVAArgInstr(CGF, VAListAddr, Ty, classifyArgumentType(Ty));
7662 }
7663 };
7664
7665 class MSP430TargetCodeGenInfo : public TargetCodeGenInfo {
7666 public:
MSP430TargetCodeGenInfo(CodeGenTypes & CGT)7667 MSP430TargetCodeGenInfo(CodeGenTypes &CGT)
7668 : TargetCodeGenInfo(std::make_unique<MSP430ABIInfo>(CGT)) {}
7669 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
7670 CodeGen::CodeGenModule &M) const override;
7671 };
7672
7673 }
7674
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & M) const7675 void MSP430TargetCodeGenInfo::setTargetAttributes(
7676 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &M) const {
7677 if (GV->isDeclaration())
7678 return;
7679 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
7680 const auto *InterruptAttr = FD->getAttr<MSP430InterruptAttr>();
7681 if (!InterruptAttr)
7682 return;
7683
7684 // Handle 'interrupt' attribute:
7685 llvm::Function *F = cast<llvm::Function>(GV);
7686
7687 // Step 1: Set ISR calling convention.
7688 F->setCallingConv(llvm::CallingConv::MSP430_INTR);
7689
7690 // Step 2: Add attributes goodness.
7691 F->addFnAttr(llvm::Attribute::NoInline);
7692 F->addFnAttr("interrupt", llvm::utostr(InterruptAttr->getNumber()));
7693 }
7694 }
7695
7696 //===----------------------------------------------------------------------===//
7697 // MIPS ABI Implementation. This works for both little-endian and
7698 // big-endian variants.
7699 //===----------------------------------------------------------------------===//
7700
7701 namespace {
7702 class MipsABIInfo : public ABIInfo {
7703 bool IsO32;
7704 unsigned MinABIStackAlignInBytes, StackAlignInBytes;
7705 void CoerceToIntArgs(uint64_t TySize,
7706 SmallVectorImpl<llvm::Type *> &ArgList) const;
7707 llvm::Type* HandleAggregates(QualType Ty, uint64_t TySize) const;
7708 llvm::Type* returnAggregateInRegs(QualType RetTy, uint64_t Size) const;
7709 llvm::Type* getPaddingType(uint64_t Align, uint64_t Offset) const;
7710 public:
MipsABIInfo(CodeGenTypes & CGT,bool _IsO32)7711 MipsABIInfo(CodeGenTypes &CGT, bool _IsO32) :
7712 ABIInfo(CGT), IsO32(_IsO32), MinABIStackAlignInBytes(IsO32 ? 4 : 8),
7713 StackAlignInBytes(IsO32 ? 8 : 16) {}
7714
7715 ABIArgInfo classifyReturnType(QualType RetTy) const;
7716 ABIArgInfo classifyArgumentType(QualType RetTy, uint64_t &Offset) const;
7717 void computeInfo(CGFunctionInfo &FI) const override;
7718 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
7719 QualType Ty) const override;
7720 ABIArgInfo extendType(QualType Ty) const;
7721 };
7722
7723 class MIPSTargetCodeGenInfo : public TargetCodeGenInfo {
7724 unsigned SizeOfUnwindException;
7725 public:
MIPSTargetCodeGenInfo(CodeGenTypes & CGT,bool IsO32)7726 MIPSTargetCodeGenInfo(CodeGenTypes &CGT, bool IsO32)
7727 : TargetCodeGenInfo(std::make_unique<MipsABIInfo>(CGT, IsO32)),
7728 SizeOfUnwindException(IsO32 ? 24 : 32) {}
7729
getDwarfEHStackPointer(CodeGen::CodeGenModule & CGM) const7730 int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const override {
7731 return 29;
7732 }
7733
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const7734 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
7735 CodeGen::CodeGenModule &CGM) const override {
7736 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
7737 if (!FD) return;
7738 llvm::Function *Fn = cast<llvm::Function>(GV);
7739
7740 if (FD->hasAttr<MipsLongCallAttr>())
7741 Fn->addFnAttr("long-call");
7742 else if (FD->hasAttr<MipsShortCallAttr>())
7743 Fn->addFnAttr("short-call");
7744
7745 // Other attributes do not have a meaning for declarations.
7746 if (GV->isDeclaration())
7747 return;
7748
7749 if (FD->hasAttr<Mips16Attr>()) {
7750 Fn->addFnAttr("mips16");
7751 }
7752 else if (FD->hasAttr<NoMips16Attr>()) {
7753 Fn->addFnAttr("nomips16");
7754 }
7755
7756 if (FD->hasAttr<MicroMipsAttr>())
7757 Fn->addFnAttr("micromips");
7758 else if (FD->hasAttr<NoMicroMipsAttr>())
7759 Fn->addFnAttr("nomicromips");
7760
7761 const MipsInterruptAttr *Attr = FD->getAttr<MipsInterruptAttr>();
7762 if (!Attr)
7763 return;
7764
7765 const char *Kind;
7766 switch (Attr->getInterrupt()) {
7767 case MipsInterruptAttr::eic: Kind = "eic"; break;
7768 case MipsInterruptAttr::sw0: Kind = "sw0"; break;
7769 case MipsInterruptAttr::sw1: Kind = "sw1"; break;
7770 case MipsInterruptAttr::hw0: Kind = "hw0"; break;
7771 case MipsInterruptAttr::hw1: Kind = "hw1"; break;
7772 case MipsInterruptAttr::hw2: Kind = "hw2"; break;
7773 case MipsInterruptAttr::hw3: Kind = "hw3"; break;
7774 case MipsInterruptAttr::hw4: Kind = "hw4"; break;
7775 case MipsInterruptAttr::hw5: Kind = "hw5"; break;
7776 }
7777
7778 Fn->addFnAttr("interrupt", Kind);
7779
7780 }
7781
7782 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
7783 llvm::Value *Address) const override;
7784
getSizeOfUnwindException() const7785 unsigned getSizeOfUnwindException() const override {
7786 return SizeOfUnwindException;
7787 }
7788 };
7789 }
7790
CoerceToIntArgs(uint64_t TySize,SmallVectorImpl<llvm::Type * > & ArgList) const7791 void MipsABIInfo::CoerceToIntArgs(
7792 uint64_t TySize, SmallVectorImpl<llvm::Type *> &ArgList) const {
7793 llvm::IntegerType *IntTy =
7794 llvm::IntegerType::get(getVMContext(), MinABIStackAlignInBytes * 8);
7795
7796 // Add (TySize / MinABIStackAlignInBytes) args of IntTy.
7797 for (unsigned N = TySize / (MinABIStackAlignInBytes * 8); N; --N)
7798 ArgList.push_back(IntTy);
7799
7800 // If necessary, add one more integer type to ArgList.
7801 unsigned R = TySize % (MinABIStackAlignInBytes * 8);
7802
7803 if (R)
7804 ArgList.push_back(llvm::IntegerType::get(getVMContext(), R));
7805 }
7806
7807 // In N32/64, an aligned double precision floating point field is passed in
7808 // a register.
HandleAggregates(QualType Ty,uint64_t TySize) const7809 llvm::Type* MipsABIInfo::HandleAggregates(QualType Ty, uint64_t TySize) const {
7810 SmallVector<llvm::Type*, 8> ArgList, IntArgList;
7811
7812 if (IsO32) {
7813 CoerceToIntArgs(TySize, ArgList);
7814 return llvm::StructType::get(getVMContext(), ArgList);
7815 }
7816
7817 if (Ty->isComplexType())
7818 return CGT.ConvertType(Ty);
7819
7820 const RecordType *RT = Ty->getAs<RecordType>();
7821
7822 // Unions/vectors are passed in integer registers.
7823 if (!RT || !RT->isStructureOrClassType()) {
7824 CoerceToIntArgs(TySize, ArgList);
7825 return llvm::StructType::get(getVMContext(), ArgList);
7826 }
7827
7828 const RecordDecl *RD = RT->getDecl();
7829 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
7830 assert(!(TySize % 8) && "Size of structure must be multiple of 8.");
7831
7832 uint64_t LastOffset = 0;
7833 unsigned idx = 0;
7834 llvm::IntegerType *I64 = llvm::IntegerType::get(getVMContext(), 64);
7835
7836 // Iterate over fields in the struct/class and check if there are any aligned
7837 // double fields.
7838 for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
7839 i != e; ++i, ++idx) {
7840 const QualType Ty = i->getType();
7841 const BuiltinType *BT = Ty->getAs<BuiltinType>();
7842
7843 if (!BT || BT->getKind() != BuiltinType::Double)
7844 continue;
7845
7846 uint64_t Offset = Layout.getFieldOffset(idx);
7847 if (Offset % 64) // Ignore doubles that are not aligned.
7848 continue;
7849
7850 // Add ((Offset - LastOffset) / 64) args of type i64.
7851 for (unsigned j = (Offset - LastOffset) / 64; j > 0; --j)
7852 ArgList.push_back(I64);
7853
7854 // Add double type.
7855 ArgList.push_back(llvm::Type::getDoubleTy(getVMContext()));
7856 LastOffset = Offset + 64;
7857 }
7858
7859 CoerceToIntArgs(TySize - LastOffset, IntArgList);
7860 ArgList.append(IntArgList.begin(), IntArgList.end());
7861
7862 return llvm::StructType::get(getVMContext(), ArgList);
7863 }
7864
getPaddingType(uint64_t OrigOffset,uint64_t Offset) const7865 llvm::Type *MipsABIInfo::getPaddingType(uint64_t OrigOffset,
7866 uint64_t Offset) const {
7867 if (OrigOffset + MinABIStackAlignInBytes > Offset)
7868 return nullptr;
7869
7870 return llvm::IntegerType::get(getVMContext(), (Offset - OrigOffset) * 8);
7871 }
7872
7873 ABIArgInfo
classifyArgumentType(QualType Ty,uint64_t & Offset) const7874 MipsABIInfo::classifyArgumentType(QualType Ty, uint64_t &Offset) const {
7875 Ty = useFirstFieldIfTransparentUnion(Ty);
7876
7877 uint64_t OrigOffset = Offset;
7878 uint64_t TySize = getContext().getTypeSize(Ty);
7879 uint64_t Align = getContext().getTypeAlign(Ty) / 8;
7880
7881 Align = std::min(std::max(Align, (uint64_t)MinABIStackAlignInBytes),
7882 (uint64_t)StackAlignInBytes);
7883 unsigned CurrOffset = llvm::alignTo(Offset, Align);
7884 Offset = CurrOffset + llvm::alignTo(TySize, Align * 8) / 8;
7885
7886 if (isAggregateTypeForABI(Ty) || Ty->isVectorType()) {
7887 // Ignore empty aggregates.
7888 if (TySize == 0)
7889 return ABIArgInfo::getIgnore();
7890
7891 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI())) {
7892 Offset = OrigOffset + MinABIStackAlignInBytes;
7893 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
7894 }
7895
7896 // If we have reached here, aggregates are passed directly by coercing to
7897 // another structure type. Padding is inserted if the offset of the
7898 // aggregate is unaligned.
7899 ABIArgInfo ArgInfo =
7900 ABIArgInfo::getDirect(HandleAggregates(Ty, TySize), 0,
7901 getPaddingType(OrigOffset, CurrOffset));
7902 ArgInfo.setInReg(true);
7903 return ArgInfo;
7904 }
7905
7906 // Treat an enum type as its underlying type.
7907 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
7908 Ty = EnumTy->getDecl()->getIntegerType();
7909
7910 // Make sure we pass indirectly things that are too large.
7911 if (const auto *EIT = Ty->getAs<ExtIntType>())
7912 if (EIT->getNumBits() > 128 ||
7913 (EIT->getNumBits() > 64 &&
7914 !getContext().getTargetInfo().hasInt128Type()))
7915 return getNaturalAlignIndirect(Ty);
7916
7917 // All integral types are promoted to the GPR width.
7918 if (Ty->isIntegralOrEnumerationType())
7919 return extendType(Ty);
7920
7921 return ABIArgInfo::getDirect(
7922 nullptr, 0, IsO32 ? nullptr : getPaddingType(OrigOffset, CurrOffset));
7923 }
7924
7925 llvm::Type*
returnAggregateInRegs(QualType RetTy,uint64_t Size) const7926 MipsABIInfo::returnAggregateInRegs(QualType RetTy, uint64_t Size) const {
7927 const RecordType *RT = RetTy->getAs<RecordType>();
7928 SmallVector<llvm::Type*, 8> RTList;
7929
7930 if (RT && RT->isStructureOrClassType()) {
7931 const RecordDecl *RD = RT->getDecl();
7932 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
7933 unsigned FieldCnt = Layout.getFieldCount();
7934
7935 // N32/64 returns struct/classes in floating point registers if the
7936 // following conditions are met:
7937 // 1. The size of the struct/class is no larger than 128-bit.
7938 // 2. The struct/class has one or two fields all of which are floating
7939 // point types.
7940 // 3. The offset of the first field is zero (this follows what gcc does).
7941 //
7942 // Any other composite results are returned in integer registers.
7943 //
7944 if (FieldCnt && (FieldCnt <= 2) && !Layout.getFieldOffset(0)) {
7945 RecordDecl::field_iterator b = RD->field_begin(), e = RD->field_end();
7946 for (; b != e; ++b) {
7947 const BuiltinType *BT = b->getType()->getAs<BuiltinType>();
7948
7949 if (!BT || !BT->isFloatingPoint())
7950 break;
7951
7952 RTList.push_back(CGT.ConvertType(b->getType()));
7953 }
7954
7955 if (b == e)
7956 return llvm::StructType::get(getVMContext(), RTList,
7957 RD->hasAttr<PackedAttr>());
7958
7959 RTList.clear();
7960 }
7961 }
7962
7963 CoerceToIntArgs(Size, RTList);
7964 return llvm::StructType::get(getVMContext(), RTList);
7965 }
7966
classifyReturnType(QualType RetTy) const7967 ABIArgInfo MipsABIInfo::classifyReturnType(QualType RetTy) const {
7968 uint64_t Size = getContext().getTypeSize(RetTy);
7969
7970 if (RetTy->isVoidType())
7971 return ABIArgInfo::getIgnore();
7972
7973 // O32 doesn't treat zero-sized structs differently from other structs.
7974 // However, N32/N64 ignores zero sized return values.
7975 if (!IsO32 && Size == 0)
7976 return ABIArgInfo::getIgnore();
7977
7978 if (isAggregateTypeForABI(RetTy) || RetTy->isVectorType()) {
7979 if (Size <= 128) {
7980 if (RetTy->isAnyComplexType())
7981 return ABIArgInfo::getDirect();
7982
7983 // O32 returns integer vectors in registers and N32/N64 returns all small
7984 // aggregates in registers.
7985 if (!IsO32 ||
7986 (RetTy->isVectorType() && !RetTy->hasFloatingRepresentation())) {
7987 ABIArgInfo ArgInfo =
7988 ABIArgInfo::getDirect(returnAggregateInRegs(RetTy, Size));
7989 ArgInfo.setInReg(true);
7990 return ArgInfo;
7991 }
7992 }
7993
7994 return getNaturalAlignIndirect(RetTy);
7995 }
7996
7997 // Treat an enum type as its underlying type.
7998 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
7999 RetTy = EnumTy->getDecl()->getIntegerType();
8000
8001 // Make sure we pass indirectly things that are too large.
8002 if (const auto *EIT = RetTy->getAs<ExtIntType>())
8003 if (EIT->getNumBits() > 128 ||
8004 (EIT->getNumBits() > 64 &&
8005 !getContext().getTargetInfo().hasInt128Type()))
8006 return getNaturalAlignIndirect(RetTy);
8007
8008 if (isPromotableIntegerTypeForABI(RetTy))
8009 return ABIArgInfo::getExtend(RetTy);
8010
8011 if ((RetTy->isUnsignedIntegerOrEnumerationType() ||
8012 RetTy->isSignedIntegerOrEnumerationType()) && Size == 32 && !IsO32)
8013 return ABIArgInfo::getSignExtend(RetTy);
8014
8015 return ABIArgInfo::getDirect();
8016 }
8017
computeInfo(CGFunctionInfo & FI) const8018 void MipsABIInfo::computeInfo(CGFunctionInfo &FI) const {
8019 ABIArgInfo &RetInfo = FI.getReturnInfo();
8020 if (!getCXXABI().classifyReturnType(FI))
8021 RetInfo = classifyReturnType(FI.getReturnType());
8022
8023 // Check if a pointer to an aggregate is passed as a hidden argument.
8024 uint64_t Offset = RetInfo.isIndirect() ? MinABIStackAlignInBytes : 0;
8025
8026 for (auto &I : FI.arguments())
8027 I.info = classifyArgumentType(I.type, Offset);
8028 }
8029
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType OrigTy) const8030 Address MipsABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
8031 QualType OrigTy) const {
8032 QualType Ty = OrigTy;
8033
8034 // Integer arguments are promoted to 32-bit on O32 and 64-bit on N32/N64.
8035 // Pointers are also promoted in the same way but this only matters for N32.
8036 unsigned SlotSizeInBits = IsO32 ? 32 : 64;
8037 unsigned PtrWidth = getTarget().getPointerWidth(0);
8038 bool DidPromote = false;
8039 if ((Ty->isIntegerType() &&
8040 getContext().getIntWidth(Ty) < SlotSizeInBits) ||
8041 (Ty->isPointerType() && PtrWidth < SlotSizeInBits)) {
8042 DidPromote = true;
8043 Ty = getContext().getIntTypeForBitwidth(SlotSizeInBits,
8044 Ty->isSignedIntegerType());
8045 }
8046
8047 auto TyInfo = getContext().getTypeInfoInChars(Ty);
8048
8049 // The alignment of things in the argument area is never larger than
8050 // StackAlignInBytes.
8051 TyInfo.Align =
8052 std::min(TyInfo.Align, CharUnits::fromQuantity(StackAlignInBytes));
8053
8054 // MinABIStackAlignInBytes is the size of argument slots on the stack.
8055 CharUnits ArgSlotSize = CharUnits::fromQuantity(MinABIStackAlignInBytes);
8056
8057 Address Addr = emitVoidPtrVAArg(CGF, VAListAddr, Ty, /*indirect*/ false,
8058 TyInfo, ArgSlotSize, /*AllowHigherAlign*/ true);
8059
8060
8061 // If there was a promotion, "unpromote" into a temporary.
8062 // TODO: can we just use a pointer into a subset of the original slot?
8063 if (DidPromote) {
8064 Address Temp = CGF.CreateMemTemp(OrigTy, "vaarg.promotion-temp");
8065 llvm::Value *Promoted = CGF.Builder.CreateLoad(Addr);
8066
8067 // Truncate down to the right width.
8068 llvm::Type *IntTy = (OrigTy->isIntegerType() ? Temp.getElementType()
8069 : CGF.IntPtrTy);
8070 llvm::Value *V = CGF.Builder.CreateTrunc(Promoted, IntTy);
8071 if (OrigTy->isPointerType())
8072 V = CGF.Builder.CreateIntToPtr(V, Temp.getElementType());
8073
8074 CGF.Builder.CreateStore(V, Temp);
8075 Addr = Temp;
8076 }
8077
8078 return Addr;
8079 }
8080
extendType(QualType Ty) const8081 ABIArgInfo MipsABIInfo::extendType(QualType Ty) const {
8082 int TySize = getContext().getTypeSize(Ty);
8083
8084 // MIPS64 ABI requires unsigned 32 bit integers to be sign extended.
8085 if (Ty->isUnsignedIntegerOrEnumerationType() && TySize == 32)
8086 return ABIArgInfo::getSignExtend(Ty);
8087
8088 return ABIArgInfo::getExtend(Ty);
8089 }
8090
8091 bool
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const8092 MIPSTargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
8093 llvm::Value *Address) const {
8094 // This information comes from gcc's implementation, which seems to
8095 // as canonical as it gets.
8096
8097 // Everything on MIPS is 4 bytes. Double-precision FP registers
8098 // are aliased to pairs of single-precision FP registers.
8099 llvm::Value *Four8 = llvm::ConstantInt::get(CGF.Int8Ty, 4);
8100
8101 // 0-31 are the general purpose registers, $0 - $31.
8102 // 32-63 are the floating-point registers, $f0 - $f31.
8103 // 64 and 65 are the multiply/divide registers, $hi and $lo.
8104 // 66 is the (notional, I think) register for signal-handler return.
8105 AssignToArrayRange(CGF.Builder, Address, Four8, 0, 65);
8106
8107 // 67-74 are the floating-point status registers, $fcc0 - $fcc7.
8108 // They are one bit wide and ignored here.
8109
8110 // 80-111 are the coprocessor 0 registers, $c0r0 - $c0r31.
8111 // (coprocessor 1 is the FP unit)
8112 // 112-143 are the coprocessor 2 registers, $c2r0 - $c2r31.
8113 // 144-175 are the coprocessor 3 registers, $c3r0 - $c3r31.
8114 // 176-181 are the DSP accumulator registers.
8115 AssignToArrayRange(CGF.Builder, Address, Four8, 80, 181);
8116 return false;
8117 }
8118
8119 //===----------------------------------------------------------------------===//
8120 // M68k ABI Implementation
8121 //===----------------------------------------------------------------------===//
8122
8123 namespace {
8124
8125 class M68kTargetCodeGenInfo : public TargetCodeGenInfo {
8126 public:
M68kTargetCodeGenInfo(CodeGenTypes & CGT)8127 M68kTargetCodeGenInfo(CodeGenTypes &CGT)
8128 : TargetCodeGenInfo(std::make_unique<DefaultABIInfo>(CGT)) {}
8129 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
8130 CodeGen::CodeGenModule &M) const override;
8131 };
8132
8133 } // namespace
8134
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & M) const8135 void M68kTargetCodeGenInfo::setTargetAttributes(
8136 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &M) const {
8137 if (const auto *FD = dyn_cast_or_null<FunctionDecl>(D)) {
8138 if (const auto *attr = FD->getAttr<M68kInterruptAttr>()) {
8139 // Handle 'interrupt' attribute:
8140 llvm::Function *F = cast<llvm::Function>(GV);
8141
8142 // Step 1: Set ISR calling convention.
8143 F->setCallingConv(llvm::CallingConv::M68k_INTR);
8144
8145 // Step 2: Add attributes goodness.
8146 F->addFnAttr(llvm::Attribute::NoInline);
8147
8148 // Step 3: Emit ISR vector alias.
8149 unsigned Num = attr->getNumber() / 2;
8150 llvm::GlobalAlias::create(llvm::Function::ExternalLinkage,
8151 "__isr_" + Twine(Num), F);
8152 }
8153 }
8154 }
8155
8156 //===----------------------------------------------------------------------===//
8157 // AVR ABI Implementation.
8158 //===----------------------------------------------------------------------===//
8159
8160 namespace {
8161 class AVRTargetCodeGenInfo : public TargetCodeGenInfo {
8162 public:
AVRTargetCodeGenInfo(CodeGenTypes & CGT)8163 AVRTargetCodeGenInfo(CodeGenTypes &CGT)
8164 : TargetCodeGenInfo(std::make_unique<DefaultABIInfo>(CGT)) {}
8165
getGlobalVarAddressSpace(CodeGenModule & CGM,const VarDecl * D) const8166 LangAS getGlobalVarAddressSpace(CodeGenModule &CGM,
8167 const VarDecl *D) const override {
8168 // Check if a global/static variable is defined within address space 1
8169 // but not constant.
8170 LangAS AS = D->getType().getAddressSpace();
8171 if (isTargetAddressSpace(AS) && toTargetAddressSpace(AS) == 1 &&
8172 !D->getType().isConstQualified())
8173 CGM.getDiags().Report(D->getLocation(),
8174 diag::err_verify_nonconst_addrspace)
8175 << "__flash";
8176 return TargetCodeGenInfo::getGlobalVarAddressSpace(CGM, D);
8177 }
8178
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const8179 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
8180 CodeGen::CodeGenModule &CGM) const override {
8181 if (GV->isDeclaration())
8182 return;
8183 const auto *FD = dyn_cast_or_null<FunctionDecl>(D);
8184 if (!FD) return;
8185 auto *Fn = cast<llvm::Function>(GV);
8186
8187 if (FD->getAttr<AVRInterruptAttr>())
8188 Fn->addFnAttr("interrupt");
8189
8190 if (FD->getAttr<AVRSignalAttr>())
8191 Fn->addFnAttr("signal");
8192 }
8193 };
8194 }
8195
8196 //===----------------------------------------------------------------------===//
8197 // TCE ABI Implementation (see http://tce.cs.tut.fi). Uses mostly the defaults.
8198 // Currently subclassed only to implement custom OpenCL C function attribute
8199 // handling.
8200 //===----------------------------------------------------------------------===//
8201
8202 namespace {
8203
8204 class TCETargetCodeGenInfo : public DefaultTargetCodeGenInfo {
8205 public:
TCETargetCodeGenInfo(CodeGenTypes & CGT)8206 TCETargetCodeGenInfo(CodeGenTypes &CGT)
8207 : DefaultTargetCodeGenInfo(CGT) {}
8208
8209 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
8210 CodeGen::CodeGenModule &M) const override;
8211 };
8212
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & M) const8213 void TCETargetCodeGenInfo::setTargetAttributes(
8214 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &M) const {
8215 if (GV->isDeclaration())
8216 return;
8217 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
8218 if (!FD) return;
8219
8220 llvm::Function *F = cast<llvm::Function>(GV);
8221
8222 if (M.getLangOpts().OpenCL) {
8223 if (FD->hasAttr<OpenCLKernelAttr>()) {
8224 // OpenCL C Kernel functions are not subject to inlining
8225 F->addFnAttr(llvm::Attribute::NoInline);
8226 const ReqdWorkGroupSizeAttr *Attr = FD->getAttr<ReqdWorkGroupSizeAttr>();
8227 if (Attr) {
8228 // Convert the reqd_work_group_size() attributes to metadata.
8229 llvm::LLVMContext &Context = F->getContext();
8230 llvm::NamedMDNode *OpenCLMetadata =
8231 M.getModule().getOrInsertNamedMetadata(
8232 "opencl.kernel_wg_size_info");
8233
8234 SmallVector<llvm::Metadata *, 5> Operands;
8235 Operands.push_back(llvm::ConstantAsMetadata::get(F));
8236
8237 Operands.push_back(
8238 llvm::ConstantAsMetadata::get(llvm::Constant::getIntegerValue(
8239 M.Int32Ty, llvm::APInt(32, Attr->getXDim()))));
8240 Operands.push_back(
8241 llvm::ConstantAsMetadata::get(llvm::Constant::getIntegerValue(
8242 M.Int32Ty, llvm::APInt(32, Attr->getYDim()))));
8243 Operands.push_back(
8244 llvm::ConstantAsMetadata::get(llvm::Constant::getIntegerValue(
8245 M.Int32Ty, llvm::APInt(32, Attr->getZDim()))));
8246
8247 // Add a boolean constant operand for "required" (true) or "hint"
8248 // (false) for implementing the work_group_size_hint attr later.
8249 // Currently always true as the hint is not yet implemented.
8250 Operands.push_back(
8251 llvm::ConstantAsMetadata::get(llvm::ConstantInt::getTrue(Context)));
8252 OpenCLMetadata->addOperand(llvm::MDNode::get(Context, Operands));
8253 }
8254 }
8255 }
8256 }
8257
8258 }
8259
8260 //===----------------------------------------------------------------------===//
8261 // Hexagon ABI Implementation
8262 //===----------------------------------------------------------------------===//
8263
8264 namespace {
8265
8266 class HexagonABIInfo : public DefaultABIInfo {
8267 public:
HexagonABIInfo(CodeGenTypes & CGT)8268 HexagonABIInfo(CodeGenTypes &CGT) : DefaultABIInfo(CGT) {}
8269
8270 private:
8271 ABIArgInfo classifyReturnType(QualType RetTy) const;
8272 ABIArgInfo classifyArgumentType(QualType RetTy) const;
8273 ABIArgInfo classifyArgumentType(QualType RetTy, unsigned *RegsLeft) const;
8274
8275 void computeInfo(CGFunctionInfo &FI) const override;
8276
8277 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
8278 QualType Ty) const override;
8279 Address EmitVAArgFromMemory(CodeGenFunction &CFG, Address VAListAddr,
8280 QualType Ty) const;
8281 Address EmitVAArgForHexagon(CodeGenFunction &CFG, Address VAListAddr,
8282 QualType Ty) const;
8283 Address EmitVAArgForHexagonLinux(CodeGenFunction &CFG, Address VAListAddr,
8284 QualType Ty) const;
8285 };
8286
8287 class HexagonTargetCodeGenInfo : public TargetCodeGenInfo {
8288 public:
HexagonTargetCodeGenInfo(CodeGenTypes & CGT)8289 HexagonTargetCodeGenInfo(CodeGenTypes &CGT)
8290 : TargetCodeGenInfo(std::make_unique<HexagonABIInfo>(CGT)) {}
8291
getDwarfEHStackPointer(CodeGen::CodeGenModule & M) const8292 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
8293 return 29;
8294 }
8295
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & GCM) const8296 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
8297 CodeGen::CodeGenModule &GCM) const override {
8298 if (GV->isDeclaration())
8299 return;
8300 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
8301 if (!FD)
8302 return;
8303 }
8304 };
8305
8306 } // namespace
8307
computeInfo(CGFunctionInfo & FI) const8308 void HexagonABIInfo::computeInfo(CGFunctionInfo &FI) const {
8309 unsigned RegsLeft = 6;
8310 if (!getCXXABI().classifyReturnType(FI))
8311 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
8312 for (auto &I : FI.arguments())
8313 I.info = classifyArgumentType(I.type, &RegsLeft);
8314 }
8315
HexagonAdjustRegsLeft(uint64_t Size,unsigned * RegsLeft)8316 static bool HexagonAdjustRegsLeft(uint64_t Size, unsigned *RegsLeft) {
8317 assert(Size <= 64 && "Not expecting to pass arguments larger than 64 bits"
8318 " through registers");
8319
8320 if (*RegsLeft == 0)
8321 return false;
8322
8323 if (Size <= 32) {
8324 (*RegsLeft)--;
8325 return true;
8326 }
8327
8328 if (2 <= (*RegsLeft & (~1U))) {
8329 *RegsLeft = (*RegsLeft & (~1U)) - 2;
8330 return true;
8331 }
8332
8333 // Next available register was r5 but candidate was greater than 32-bits so it
8334 // has to go on the stack. However we still consume r5
8335 if (*RegsLeft == 1)
8336 *RegsLeft = 0;
8337
8338 return false;
8339 }
8340
classifyArgumentType(QualType Ty,unsigned * RegsLeft) const8341 ABIArgInfo HexagonABIInfo::classifyArgumentType(QualType Ty,
8342 unsigned *RegsLeft) const {
8343 if (!isAggregateTypeForABI(Ty)) {
8344 // Treat an enum type as its underlying type.
8345 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
8346 Ty = EnumTy->getDecl()->getIntegerType();
8347
8348 uint64_t Size = getContext().getTypeSize(Ty);
8349 if (Size <= 64)
8350 HexagonAdjustRegsLeft(Size, RegsLeft);
8351
8352 if (Size > 64 && Ty->isExtIntType())
8353 return getNaturalAlignIndirect(Ty, /*ByVal=*/true);
8354
8355 return isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
8356 : ABIArgInfo::getDirect();
8357 }
8358
8359 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
8360 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
8361
8362 // Ignore empty records.
8363 if (isEmptyRecord(getContext(), Ty, true))
8364 return ABIArgInfo::getIgnore();
8365
8366 uint64_t Size = getContext().getTypeSize(Ty);
8367 unsigned Align = getContext().getTypeAlign(Ty);
8368
8369 if (Size > 64)
8370 return getNaturalAlignIndirect(Ty, /*ByVal=*/true);
8371
8372 if (HexagonAdjustRegsLeft(Size, RegsLeft))
8373 Align = Size <= 32 ? 32 : 64;
8374 if (Size <= Align) {
8375 // Pass in the smallest viable integer type.
8376 if (!llvm::isPowerOf2_64(Size))
8377 Size = llvm::NextPowerOf2(Size);
8378 return ABIArgInfo::getDirect(llvm::Type::getIntNTy(getVMContext(), Size));
8379 }
8380 return DefaultABIInfo::classifyArgumentType(Ty);
8381 }
8382
classifyReturnType(QualType RetTy) const8383 ABIArgInfo HexagonABIInfo::classifyReturnType(QualType RetTy) const {
8384 if (RetTy->isVoidType())
8385 return ABIArgInfo::getIgnore();
8386
8387 const TargetInfo &T = CGT.getTarget();
8388 uint64_t Size = getContext().getTypeSize(RetTy);
8389
8390 if (RetTy->getAs<VectorType>()) {
8391 // HVX vectors are returned in vector registers or register pairs.
8392 if (T.hasFeature("hvx")) {
8393 assert(T.hasFeature("hvx-length64b") || T.hasFeature("hvx-length128b"));
8394 uint64_t VecSize = T.hasFeature("hvx-length64b") ? 64*8 : 128*8;
8395 if (Size == VecSize || Size == 2*VecSize)
8396 return ABIArgInfo::getDirectInReg();
8397 }
8398 // Large vector types should be returned via memory.
8399 if (Size > 64)
8400 return getNaturalAlignIndirect(RetTy);
8401 }
8402
8403 if (!isAggregateTypeForABI(RetTy)) {
8404 // Treat an enum type as its underlying type.
8405 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
8406 RetTy = EnumTy->getDecl()->getIntegerType();
8407
8408 if (Size > 64 && RetTy->isExtIntType())
8409 return getNaturalAlignIndirect(RetTy, /*ByVal=*/false);
8410
8411 return isPromotableIntegerTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
8412 : ABIArgInfo::getDirect();
8413 }
8414
8415 if (isEmptyRecord(getContext(), RetTy, true))
8416 return ABIArgInfo::getIgnore();
8417
8418 // Aggregates <= 8 bytes are returned in registers, other aggregates
8419 // are returned indirectly.
8420 if (Size <= 64) {
8421 // Return in the smallest viable integer type.
8422 if (!llvm::isPowerOf2_64(Size))
8423 Size = llvm::NextPowerOf2(Size);
8424 return ABIArgInfo::getDirect(llvm::Type::getIntNTy(getVMContext(), Size));
8425 }
8426 return getNaturalAlignIndirect(RetTy, /*ByVal=*/true);
8427 }
8428
EmitVAArgFromMemory(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const8429 Address HexagonABIInfo::EmitVAArgFromMemory(CodeGenFunction &CGF,
8430 Address VAListAddr,
8431 QualType Ty) const {
8432 // Load the overflow area pointer.
8433 Address __overflow_area_pointer_p =
8434 CGF.Builder.CreateStructGEP(VAListAddr, 2, "__overflow_area_pointer_p");
8435 llvm::Value *__overflow_area_pointer = CGF.Builder.CreateLoad(
8436 __overflow_area_pointer_p, "__overflow_area_pointer");
8437
8438 uint64_t Align = CGF.getContext().getTypeAlign(Ty) / 8;
8439 if (Align > 4) {
8440 // Alignment should be a power of 2.
8441 assert((Align & (Align - 1)) == 0 && "Alignment is not power of 2!");
8442
8443 // overflow_arg_area = (overflow_arg_area + align - 1) & -align;
8444 llvm::Value *Offset = llvm::ConstantInt::get(CGF.Int64Ty, Align - 1);
8445
8446 // Add offset to the current pointer to access the argument.
8447 __overflow_area_pointer =
8448 CGF.Builder.CreateGEP(__overflow_area_pointer, Offset);
8449 llvm::Value *AsInt =
8450 CGF.Builder.CreatePtrToInt(__overflow_area_pointer, CGF.Int32Ty);
8451
8452 // Create a mask which should be "AND"ed
8453 // with (overflow_arg_area + align - 1)
8454 llvm::Value *Mask = llvm::ConstantInt::get(CGF.Int32Ty, -(int)Align);
8455 __overflow_area_pointer = CGF.Builder.CreateIntToPtr(
8456 CGF.Builder.CreateAnd(AsInt, Mask), __overflow_area_pointer->getType(),
8457 "__overflow_area_pointer.align");
8458 }
8459
8460 // Get the type of the argument from memory and bitcast
8461 // overflow area pointer to the argument type.
8462 llvm::Type *PTy = CGF.ConvertTypeForMem(Ty);
8463 Address AddrTyped = CGF.Builder.CreateBitCast(
8464 Address(__overflow_area_pointer, CharUnits::fromQuantity(Align)),
8465 llvm::PointerType::getUnqual(PTy));
8466
8467 // Round up to the minimum stack alignment for varargs which is 4 bytes.
8468 uint64_t Offset = llvm::alignTo(CGF.getContext().getTypeSize(Ty) / 8, 4);
8469
8470 __overflow_area_pointer = CGF.Builder.CreateGEP(
8471 __overflow_area_pointer, llvm::ConstantInt::get(CGF.Int32Ty, Offset),
8472 "__overflow_area_pointer.next");
8473 CGF.Builder.CreateStore(__overflow_area_pointer, __overflow_area_pointer_p);
8474
8475 return AddrTyped;
8476 }
8477
EmitVAArgForHexagon(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const8478 Address HexagonABIInfo::EmitVAArgForHexagon(CodeGenFunction &CGF,
8479 Address VAListAddr,
8480 QualType Ty) const {
8481 // FIXME: Need to handle alignment
8482 llvm::Type *BP = CGF.Int8PtrTy;
8483 llvm::Type *BPP = CGF.Int8PtrPtrTy;
8484 CGBuilderTy &Builder = CGF.Builder;
8485 Address VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP, "ap");
8486 llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur");
8487 // Handle address alignment for type alignment > 32 bits
8488 uint64_t TyAlign = CGF.getContext().getTypeAlign(Ty) / 8;
8489 if (TyAlign > 4) {
8490 assert((TyAlign & (TyAlign - 1)) == 0 && "Alignment is not power of 2!");
8491 llvm::Value *AddrAsInt = Builder.CreatePtrToInt(Addr, CGF.Int32Ty);
8492 AddrAsInt = Builder.CreateAdd(AddrAsInt, Builder.getInt32(TyAlign - 1));
8493 AddrAsInt = Builder.CreateAnd(AddrAsInt, Builder.getInt32(~(TyAlign - 1)));
8494 Addr = Builder.CreateIntToPtr(AddrAsInt, BP);
8495 }
8496 llvm::Type *PTy = llvm::PointerType::getUnqual(CGF.ConvertType(Ty));
8497 Address AddrTyped = Builder.CreateBitCast(
8498 Address(Addr, CharUnits::fromQuantity(TyAlign)), PTy);
8499
8500 uint64_t Offset = llvm::alignTo(CGF.getContext().getTypeSize(Ty) / 8, 4);
8501 llvm::Value *NextAddr = Builder.CreateGEP(
8502 Addr, llvm::ConstantInt::get(CGF.Int32Ty, Offset), "ap.next");
8503 Builder.CreateStore(NextAddr, VAListAddrAsBPP);
8504
8505 return AddrTyped;
8506 }
8507
EmitVAArgForHexagonLinux(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const8508 Address HexagonABIInfo::EmitVAArgForHexagonLinux(CodeGenFunction &CGF,
8509 Address VAListAddr,
8510 QualType Ty) const {
8511 int ArgSize = CGF.getContext().getTypeSize(Ty) / 8;
8512
8513 if (ArgSize > 8)
8514 return EmitVAArgFromMemory(CGF, VAListAddr, Ty);
8515
8516 // Here we have check if the argument is in register area or
8517 // in overflow area.
8518 // If the saved register area pointer + argsize rounded up to alignment >
8519 // saved register area end pointer, argument is in overflow area.
8520 unsigned RegsLeft = 6;
8521 Ty = CGF.getContext().getCanonicalType(Ty);
8522 (void)classifyArgumentType(Ty, &RegsLeft);
8523
8524 llvm::BasicBlock *MaybeRegBlock = CGF.createBasicBlock("vaarg.maybe_reg");
8525 llvm::BasicBlock *InRegBlock = CGF.createBasicBlock("vaarg.in_reg");
8526 llvm::BasicBlock *OnStackBlock = CGF.createBasicBlock("vaarg.on_stack");
8527 llvm::BasicBlock *ContBlock = CGF.createBasicBlock("vaarg.end");
8528
8529 // Get rounded size of the argument.GCC does not allow vararg of
8530 // size < 4 bytes. We follow the same logic here.
8531 ArgSize = (CGF.getContext().getTypeSize(Ty) <= 32) ? 4 : 8;
8532 int ArgAlign = (CGF.getContext().getTypeSize(Ty) <= 32) ? 4 : 8;
8533
8534 // Argument may be in saved register area
8535 CGF.EmitBlock(MaybeRegBlock);
8536
8537 // Load the current saved register area pointer.
8538 Address __current_saved_reg_area_pointer_p = CGF.Builder.CreateStructGEP(
8539 VAListAddr, 0, "__current_saved_reg_area_pointer_p");
8540 llvm::Value *__current_saved_reg_area_pointer = CGF.Builder.CreateLoad(
8541 __current_saved_reg_area_pointer_p, "__current_saved_reg_area_pointer");
8542
8543 // Load the saved register area end pointer.
8544 Address __saved_reg_area_end_pointer_p = CGF.Builder.CreateStructGEP(
8545 VAListAddr, 1, "__saved_reg_area_end_pointer_p");
8546 llvm::Value *__saved_reg_area_end_pointer = CGF.Builder.CreateLoad(
8547 __saved_reg_area_end_pointer_p, "__saved_reg_area_end_pointer");
8548
8549 // If the size of argument is > 4 bytes, check if the stack
8550 // location is aligned to 8 bytes
8551 if (ArgAlign > 4) {
8552
8553 llvm::Value *__current_saved_reg_area_pointer_int =
8554 CGF.Builder.CreatePtrToInt(__current_saved_reg_area_pointer,
8555 CGF.Int32Ty);
8556
8557 __current_saved_reg_area_pointer_int = CGF.Builder.CreateAdd(
8558 __current_saved_reg_area_pointer_int,
8559 llvm::ConstantInt::get(CGF.Int32Ty, (ArgAlign - 1)),
8560 "align_current_saved_reg_area_pointer");
8561
8562 __current_saved_reg_area_pointer_int =
8563 CGF.Builder.CreateAnd(__current_saved_reg_area_pointer_int,
8564 llvm::ConstantInt::get(CGF.Int32Ty, -ArgAlign),
8565 "align_current_saved_reg_area_pointer");
8566
8567 __current_saved_reg_area_pointer =
8568 CGF.Builder.CreateIntToPtr(__current_saved_reg_area_pointer_int,
8569 __current_saved_reg_area_pointer->getType(),
8570 "align_current_saved_reg_area_pointer");
8571 }
8572
8573 llvm::Value *__new_saved_reg_area_pointer =
8574 CGF.Builder.CreateGEP(__current_saved_reg_area_pointer,
8575 llvm::ConstantInt::get(CGF.Int32Ty, ArgSize),
8576 "__new_saved_reg_area_pointer");
8577
8578 llvm::Value *UsingStack = 0;
8579 UsingStack = CGF.Builder.CreateICmpSGT(__new_saved_reg_area_pointer,
8580 __saved_reg_area_end_pointer);
8581
8582 CGF.Builder.CreateCondBr(UsingStack, OnStackBlock, InRegBlock);
8583
8584 // Argument in saved register area
8585 // Implement the block where argument is in register saved area
8586 CGF.EmitBlock(InRegBlock);
8587
8588 llvm::Type *PTy = CGF.ConvertType(Ty);
8589 llvm::Value *__saved_reg_area_p = CGF.Builder.CreateBitCast(
8590 __current_saved_reg_area_pointer, llvm::PointerType::getUnqual(PTy));
8591
8592 CGF.Builder.CreateStore(__new_saved_reg_area_pointer,
8593 __current_saved_reg_area_pointer_p);
8594
8595 CGF.EmitBranch(ContBlock);
8596
8597 // Argument in overflow area
8598 // Implement the block where the argument is in overflow area.
8599 CGF.EmitBlock(OnStackBlock);
8600
8601 // Load the overflow area pointer
8602 Address __overflow_area_pointer_p =
8603 CGF.Builder.CreateStructGEP(VAListAddr, 2, "__overflow_area_pointer_p");
8604 llvm::Value *__overflow_area_pointer = CGF.Builder.CreateLoad(
8605 __overflow_area_pointer_p, "__overflow_area_pointer");
8606
8607 // Align the overflow area pointer according to the alignment of the argument
8608 if (ArgAlign > 4) {
8609 llvm::Value *__overflow_area_pointer_int =
8610 CGF.Builder.CreatePtrToInt(__overflow_area_pointer, CGF.Int32Ty);
8611
8612 __overflow_area_pointer_int =
8613 CGF.Builder.CreateAdd(__overflow_area_pointer_int,
8614 llvm::ConstantInt::get(CGF.Int32Ty, ArgAlign - 1),
8615 "align_overflow_area_pointer");
8616
8617 __overflow_area_pointer_int =
8618 CGF.Builder.CreateAnd(__overflow_area_pointer_int,
8619 llvm::ConstantInt::get(CGF.Int32Ty, -ArgAlign),
8620 "align_overflow_area_pointer");
8621
8622 __overflow_area_pointer = CGF.Builder.CreateIntToPtr(
8623 __overflow_area_pointer_int, __overflow_area_pointer->getType(),
8624 "align_overflow_area_pointer");
8625 }
8626
8627 // Get the pointer for next argument in overflow area and store it
8628 // to overflow area pointer.
8629 llvm::Value *__new_overflow_area_pointer = CGF.Builder.CreateGEP(
8630 __overflow_area_pointer, llvm::ConstantInt::get(CGF.Int32Ty, ArgSize),
8631 "__overflow_area_pointer.next");
8632
8633 CGF.Builder.CreateStore(__new_overflow_area_pointer,
8634 __overflow_area_pointer_p);
8635
8636 CGF.Builder.CreateStore(__new_overflow_area_pointer,
8637 __current_saved_reg_area_pointer_p);
8638
8639 // Bitcast the overflow area pointer to the type of argument.
8640 llvm::Type *OverflowPTy = CGF.ConvertTypeForMem(Ty);
8641 llvm::Value *__overflow_area_p = CGF.Builder.CreateBitCast(
8642 __overflow_area_pointer, llvm::PointerType::getUnqual(OverflowPTy));
8643
8644 CGF.EmitBranch(ContBlock);
8645
8646 // Get the correct pointer to load the variable argument
8647 // Implement the ContBlock
8648 CGF.EmitBlock(ContBlock);
8649
8650 llvm::Type *MemPTy = llvm::PointerType::getUnqual(CGF.ConvertTypeForMem(Ty));
8651 llvm::PHINode *ArgAddr = CGF.Builder.CreatePHI(MemPTy, 2, "vaarg.addr");
8652 ArgAddr->addIncoming(__saved_reg_area_p, InRegBlock);
8653 ArgAddr->addIncoming(__overflow_area_p, OnStackBlock);
8654
8655 return Address(ArgAddr, CharUnits::fromQuantity(ArgAlign));
8656 }
8657
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const8658 Address HexagonABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
8659 QualType Ty) const {
8660
8661 if (getTarget().getTriple().isMusl())
8662 return EmitVAArgForHexagonLinux(CGF, VAListAddr, Ty);
8663
8664 return EmitVAArgForHexagon(CGF, VAListAddr, Ty);
8665 }
8666
8667 //===----------------------------------------------------------------------===//
8668 // Lanai ABI Implementation
8669 //===----------------------------------------------------------------------===//
8670
8671 namespace {
8672 class LanaiABIInfo : public DefaultABIInfo {
8673 public:
LanaiABIInfo(CodeGen::CodeGenTypes & CGT)8674 LanaiABIInfo(CodeGen::CodeGenTypes &CGT) : DefaultABIInfo(CGT) {}
8675
8676 bool shouldUseInReg(QualType Ty, CCState &State) const;
8677
computeInfo(CGFunctionInfo & FI) const8678 void computeInfo(CGFunctionInfo &FI) const override {
8679 CCState State(FI);
8680 // Lanai uses 4 registers to pass arguments unless the function has the
8681 // regparm attribute set.
8682 if (FI.getHasRegParm()) {
8683 State.FreeRegs = FI.getRegParm();
8684 } else {
8685 State.FreeRegs = 4;
8686 }
8687
8688 if (!getCXXABI().classifyReturnType(FI))
8689 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
8690 for (auto &I : FI.arguments())
8691 I.info = classifyArgumentType(I.type, State);
8692 }
8693
8694 ABIArgInfo getIndirectResult(QualType Ty, bool ByVal, CCState &State) const;
8695 ABIArgInfo classifyArgumentType(QualType RetTy, CCState &State) const;
8696 };
8697 } // end anonymous namespace
8698
shouldUseInReg(QualType Ty,CCState & State) const8699 bool LanaiABIInfo::shouldUseInReg(QualType Ty, CCState &State) const {
8700 unsigned Size = getContext().getTypeSize(Ty);
8701 unsigned SizeInRegs = llvm::alignTo(Size, 32U) / 32U;
8702
8703 if (SizeInRegs == 0)
8704 return false;
8705
8706 if (SizeInRegs > State.FreeRegs) {
8707 State.FreeRegs = 0;
8708 return false;
8709 }
8710
8711 State.FreeRegs -= SizeInRegs;
8712
8713 return true;
8714 }
8715
getIndirectResult(QualType Ty,bool ByVal,CCState & State) const8716 ABIArgInfo LanaiABIInfo::getIndirectResult(QualType Ty, bool ByVal,
8717 CCState &State) const {
8718 if (!ByVal) {
8719 if (State.FreeRegs) {
8720 --State.FreeRegs; // Non-byval indirects just use one pointer.
8721 return getNaturalAlignIndirectInReg(Ty);
8722 }
8723 return getNaturalAlignIndirect(Ty, false);
8724 }
8725
8726 // Compute the byval alignment.
8727 const unsigned MinABIStackAlignInBytes = 4;
8728 unsigned TypeAlign = getContext().getTypeAlign(Ty) / 8;
8729 return ABIArgInfo::getIndirect(CharUnits::fromQuantity(4), /*ByVal=*/true,
8730 /*Realign=*/TypeAlign >
8731 MinABIStackAlignInBytes);
8732 }
8733
classifyArgumentType(QualType Ty,CCState & State) const8734 ABIArgInfo LanaiABIInfo::classifyArgumentType(QualType Ty,
8735 CCState &State) const {
8736 // Check with the C++ ABI first.
8737 const RecordType *RT = Ty->getAs<RecordType>();
8738 if (RT) {
8739 CGCXXABI::RecordArgABI RAA = getRecordArgABI(RT, getCXXABI());
8740 if (RAA == CGCXXABI::RAA_Indirect) {
8741 return getIndirectResult(Ty, /*ByVal=*/false, State);
8742 } else if (RAA == CGCXXABI::RAA_DirectInMemory) {
8743 return getNaturalAlignIndirect(Ty, /*ByVal=*/true);
8744 }
8745 }
8746
8747 if (isAggregateTypeForABI(Ty)) {
8748 // Structures with flexible arrays are always indirect.
8749 if (RT && RT->getDecl()->hasFlexibleArrayMember())
8750 return getIndirectResult(Ty, /*ByVal=*/true, State);
8751
8752 // Ignore empty structs/unions.
8753 if (isEmptyRecord(getContext(), Ty, true))
8754 return ABIArgInfo::getIgnore();
8755
8756 llvm::LLVMContext &LLVMContext = getVMContext();
8757 unsigned SizeInRegs = (getContext().getTypeSize(Ty) + 31) / 32;
8758 if (SizeInRegs <= State.FreeRegs) {
8759 llvm::IntegerType *Int32 = llvm::Type::getInt32Ty(LLVMContext);
8760 SmallVector<llvm::Type *, 3> Elements(SizeInRegs, Int32);
8761 llvm::Type *Result = llvm::StructType::get(LLVMContext, Elements);
8762 State.FreeRegs -= SizeInRegs;
8763 return ABIArgInfo::getDirectInReg(Result);
8764 } else {
8765 State.FreeRegs = 0;
8766 }
8767 return getIndirectResult(Ty, true, State);
8768 }
8769
8770 // Treat an enum type as its underlying type.
8771 if (const auto *EnumTy = Ty->getAs<EnumType>())
8772 Ty = EnumTy->getDecl()->getIntegerType();
8773
8774 bool InReg = shouldUseInReg(Ty, State);
8775
8776 // Don't pass >64 bit integers in registers.
8777 if (const auto *EIT = Ty->getAs<ExtIntType>())
8778 if (EIT->getNumBits() > 64)
8779 return getIndirectResult(Ty, /*ByVal=*/true, State);
8780
8781 if (isPromotableIntegerTypeForABI(Ty)) {
8782 if (InReg)
8783 return ABIArgInfo::getDirectInReg();
8784 return ABIArgInfo::getExtend(Ty);
8785 }
8786 if (InReg)
8787 return ABIArgInfo::getDirectInReg();
8788 return ABIArgInfo::getDirect();
8789 }
8790
8791 namespace {
8792 class LanaiTargetCodeGenInfo : public TargetCodeGenInfo {
8793 public:
LanaiTargetCodeGenInfo(CodeGen::CodeGenTypes & CGT)8794 LanaiTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT)
8795 : TargetCodeGenInfo(std::make_unique<LanaiABIInfo>(CGT)) {}
8796 };
8797 }
8798
8799 //===----------------------------------------------------------------------===//
8800 // AMDGPU ABI Implementation
8801 //===----------------------------------------------------------------------===//
8802
8803 namespace {
8804
8805 class AMDGPUABIInfo final : public DefaultABIInfo {
8806 private:
8807 static const unsigned MaxNumRegsForArgsRet = 16;
8808
8809 unsigned numRegsForType(QualType Ty) const;
8810
8811 bool isHomogeneousAggregateBaseType(QualType Ty) const override;
8812 bool isHomogeneousAggregateSmallEnough(const Type *Base,
8813 uint64_t Members) const override;
8814
8815 // Coerce HIP scalar pointer arguments from generic pointers to global ones.
coerceKernelArgumentType(llvm::Type * Ty,unsigned FromAS,unsigned ToAS) const8816 llvm::Type *coerceKernelArgumentType(llvm::Type *Ty, unsigned FromAS,
8817 unsigned ToAS) const {
8818 // Single value types.
8819 if (Ty->isPointerTy() && Ty->getPointerAddressSpace() == FromAS)
8820 return llvm::PointerType::get(
8821 cast<llvm::PointerType>(Ty)->getElementType(), ToAS);
8822 return Ty;
8823 }
8824
8825 public:
AMDGPUABIInfo(CodeGen::CodeGenTypes & CGT)8826 explicit AMDGPUABIInfo(CodeGen::CodeGenTypes &CGT) :
8827 DefaultABIInfo(CGT) {}
8828
8829 ABIArgInfo classifyReturnType(QualType RetTy) const;
8830 ABIArgInfo classifyKernelArgumentType(QualType Ty) const;
8831 ABIArgInfo classifyArgumentType(QualType Ty, unsigned &NumRegsLeft) const;
8832
8833 void computeInfo(CGFunctionInfo &FI) const override;
8834 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
8835 QualType Ty) const override;
8836 };
8837
isHomogeneousAggregateBaseType(QualType Ty) const8838 bool AMDGPUABIInfo::isHomogeneousAggregateBaseType(QualType Ty) const {
8839 return true;
8840 }
8841
isHomogeneousAggregateSmallEnough(const Type * Base,uint64_t Members) const8842 bool AMDGPUABIInfo::isHomogeneousAggregateSmallEnough(
8843 const Type *Base, uint64_t Members) const {
8844 uint32_t NumRegs = (getContext().getTypeSize(Base) + 31) / 32;
8845
8846 // Homogeneous Aggregates may occupy at most 16 registers.
8847 return Members * NumRegs <= MaxNumRegsForArgsRet;
8848 }
8849
8850 /// Estimate number of registers the type will use when passed in registers.
numRegsForType(QualType Ty) const8851 unsigned AMDGPUABIInfo::numRegsForType(QualType Ty) const {
8852 unsigned NumRegs = 0;
8853
8854 if (const VectorType *VT = Ty->getAs<VectorType>()) {
8855 // Compute from the number of elements. The reported size is based on the
8856 // in-memory size, which includes the padding 4th element for 3-vectors.
8857 QualType EltTy = VT->getElementType();
8858 unsigned EltSize = getContext().getTypeSize(EltTy);
8859
8860 // 16-bit element vectors should be passed as packed.
8861 if (EltSize == 16)
8862 return (VT->getNumElements() + 1) / 2;
8863
8864 unsigned EltNumRegs = (EltSize + 31) / 32;
8865 return EltNumRegs * VT->getNumElements();
8866 }
8867
8868 if (const RecordType *RT = Ty->getAs<RecordType>()) {
8869 const RecordDecl *RD = RT->getDecl();
8870 assert(!RD->hasFlexibleArrayMember());
8871
8872 for (const FieldDecl *Field : RD->fields()) {
8873 QualType FieldTy = Field->getType();
8874 NumRegs += numRegsForType(FieldTy);
8875 }
8876
8877 return NumRegs;
8878 }
8879
8880 return (getContext().getTypeSize(Ty) + 31) / 32;
8881 }
8882
computeInfo(CGFunctionInfo & FI) const8883 void AMDGPUABIInfo::computeInfo(CGFunctionInfo &FI) const {
8884 llvm::CallingConv::ID CC = FI.getCallingConvention();
8885
8886 if (!getCXXABI().classifyReturnType(FI))
8887 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
8888
8889 unsigned NumRegsLeft = MaxNumRegsForArgsRet;
8890 for (auto &Arg : FI.arguments()) {
8891 if (CC == llvm::CallingConv::AMDGPU_KERNEL) {
8892 Arg.info = classifyKernelArgumentType(Arg.type);
8893 } else {
8894 Arg.info = classifyArgumentType(Arg.type, NumRegsLeft);
8895 }
8896 }
8897 }
8898
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const8899 Address AMDGPUABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
8900 QualType Ty) const {
8901 llvm_unreachable("AMDGPU does not support varargs");
8902 }
8903
classifyReturnType(QualType RetTy) const8904 ABIArgInfo AMDGPUABIInfo::classifyReturnType(QualType RetTy) const {
8905 if (isAggregateTypeForABI(RetTy)) {
8906 // Records with non-trivial destructors/copy-constructors should not be
8907 // returned by value.
8908 if (!getRecordArgABI(RetTy, getCXXABI())) {
8909 // Ignore empty structs/unions.
8910 if (isEmptyRecord(getContext(), RetTy, true))
8911 return ABIArgInfo::getIgnore();
8912
8913 // Lower single-element structs to just return a regular value.
8914 if (const Type *SeltTy = isSingleElementStruct(RetTy, getContext()))
8915 return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0)));
8916
8917 if (const RecordType *RT = RetTy->getAs<RecordType>()) {
8918 const RecordDecl *RD = RT->getDecl();
8919 if (RD->hasFlexibleArrayMember())
8920 return DefaultABIInfo::classifyReturnType(RetTy);
8921 }
8922
8923 // Pack aggregates <= 4 bytes into single VGPR or pair.
8924 uint64_t Size = getContext().getTypeSize(RetTy);
8925 if (Size <= 16)
8926 return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext()));
8927
8928 if (Size <= 32)
8929 return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
8930
8931 if (Size <= 64) {
8932 llvm::Type *I32Ty = llvm::Type::getInt32Ty(getVMContext());
8933 return ABIArgInfo::getDirect(llvm::ArrayType::get(I32Ty, 2));
8934 }
8935
8936 if (numRegsForType(RetTy) <= MaxNumRegsForArgsRet)
8937 return ABIArgInfo::getDirect();
8938 }
8939 }
8940
8941 // Otherwise just do the default thing.
8942 return DefaultABIInfo::classifyReturnType(RetTy);
8943 }
8944
8945 /// For kernels all parameters are really passed in a special buffer. It doesn't
8946 /// make sense to pass anything byval, so everything must be direct.
classifyKernelArgumentType(QualType Ty) const8947 ABIArgInfo AMDGPUABIInfo::classifyKernelArgumentType(QualType Ty) const {
8948 Ty = useFirstFieldIfTransparentUnion(Ty);
8949
8950 // TODO: Can we omit empty structs?
8951
8952 if (const Type *SeltTy = isSingleElementStruct(Ty, getContext()))
8953 Ty = QualType(SeltTy, 0);
8954
8955 llvm::Type *OrigLTy = CGT.ConvertType(Ty);
8956 llvm::Type *LTy = OrigLTy;
8957 if (getContext().getLangOpts().HIP) {
8958 LTy = coerceKernelArgumentType(
8959 OrigLTy, /*FromAS=*/getContext().getTargetAddressSpace(LangAS::Default),
8960 /*ToAS=*/getContext().getTargetAddressSpace(LangAS::cuda_device));
8961 }
8962
8963 // FIXME: Should also use this for OpenCL, but it requires addressing the
8964 // problem of kernels being called.
8965 //
8966 // FIXME: This doesn't apply the optimization of coercing pointers in structs
8967 // to global address space when using byref. This would require implementing a
8968 // new kind of coercion of the in-memory type when for indirect arguments.
8969 if (!getContext().getLangOpts().OpenCL && LTy == OrigLTy &&
8970 isAggregateTypeForABI(Ty)) {
8971 return ABIArgInfo::getIndirectAliased(
8972 getContext().getTypeAlignInChars(Ty),
8973 getContext().getTargetAddressSpace(LangAS::opencl_constant),
8974 false /*Realign*/, nullptr /*Padding*/);
8975 }
8976
8977 // If we set CanBeFlattened to true, CodeGen will expand the struct to its
8978 // individual elements, which confuses the Clover OpenCL backend; therefore we
8979 // have to set it to false here. Other args of getDirect() are just defaults.
8980 return ABIArgInfo::getDirect(LTy, 0, nullptr, false);
8981 }
8982
classifyArgumentType(QualType Ty,unsigned & NumRegsLeft) const8983 ABIArgInfo AMDGPUABIInfo::classifyArgumentType(QualType Ty,
8984 unsigned &NumRegsLeft) const {
8985 assert(NumRegsLeft <= MaxNumRegsForArgsRet && "register estimate underflow");
8986
8987 Ty = useFirstFieldIfTransparentUnion(Ty);
8988
8989 if (isAggregateTypeForABI(Ty)) {
8990 // Records with non-trivial destructors/copy-constructors should not be
8991 // passed by value.
8992 if (auto RAA = getRecordArgABI(Ty, getCXXABI()))
8993 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
8994
8995 // Ignore empty structs/unions.
8996 if (isEmptyRecord(getContext(), Ty, true))
8997 return ABIArgInfo::getIgnore();
8998
8999 // Lower single-element structs to just pass a regular value. TODO: We
9000 // could do reasonable-size multiple-element structs too, using getExpand(),
9001 // though watch out for things like bitfields.
9002 if (const Type *SeltTy = isSingleElementStruct(Ty, getContext()))
9003 return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0)));
9004
9005 if (const RecordType *RT = Ty->getAs<RecordType>()) {
9006 const RecordDecl *RD = RT->getDecl();
9007 if (RD->hasFlexibleArrayMember())
9008 return DefaultABIInfo::classifyArgumentType(Ty);
9009 }
9010
9011 // Pack aggregates <= 8 bytes into single VGPR or pair.
9012 uint64_t Size = getContext().getTypeSize(Ty);
9013 if (Size <= 64) {
9014 unsigned NumRegs = (Size + 31) / 32;
9015 NumRegsLeft -= std::min(NumRegsLeft, NumRegs);
9016
9017 if (Size <= 16)
9018 return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext()));
9019
9020 if (Size <= 32)
9021 return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
9022
9023 // XXX: Should this be i64 instead, and should the limit increase?
9024 llvm::Type *I32Ty = llvm::Type::getInt32Ty(getVMContext());
9025 return ABIArgInfo::getDirect(llvm::ArrayType::get(I32Ty, 2));
9026 }
9027
9028 if (NumRegsLeft > 0) {
9029 unsigned NumRegs = numRegsForType(Ty);
9030 if (NumRegsLeft >= NumRegs) {
9031 NumRegsLeft -= NumRegs;
9032 return ABIArgInfo::getDirect();
9033 }
9034 }
9035 }
9036
9037 // Otherwise just do the default thing.
9038 ABIArgInfo ArgInfo = DefaultABIInfo::classifyArgumentType(Ty);
9039 if (!ArgInfo.isIndirect()) {
9040 unsigned NumRegs = numRegsForType(Ty);
9041 NumRegsLeft -= std::min(NumRegs, NumRegsLeft);
9042 }
9043
9044 return ArgInfo;
9045 }
9046
9047 class AMDGPUTargetCodeGenInfo : public TargetCodeGenInfo {
9048 public:
AMDGPUTargetCodeGenInfo(CodeGenTypes & CGT)9049 AMDGPUTargetCodeGenInfo(CodeGenTypes &CGT)
9050 : TargetCodeGenInfo(std::make_unique<AMDGPUABIInfo>(CGT)) {}
9051 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
9052 CodeGen::CodeGenModule &M) const override;
9053 unsigned getOpenCLKernelCallingConv() const override;
9054
9055 llvm::Constant *getNullPointer(const CodeGen::CodeGenModule &CGM,
9056 llvm::PointerType *T, QualType QT) const override;
9057
getASTAllocaAddressSpace() const9058 LangAS getASTAllocaAddressSpace() const override {
9059 return getLangASFromTargetAS(
9060 getABIInfo().getDataLayout().getAllocaAddrSpace());
9061 }
9062 LangAS getGlobalVarAddressSpace(CodeGenModule &CGM,
9063 const VarDecl *D) const override;
9064 llvm::SyncScope::ID getLLVMSyncScopeID(const LangOptions &LangOpts,
9065 SyncScope Scope,
9066 llvm::AtomicOrdering Ordering,
9067 llvm::LLVMContext &Ctx) const override;
9068 llvm::Function *
9069 createEnqueuedBlockKernel(CodeGenFunction &CGF,
9070 llvm::Function *BlockInvokeFunc,
9071 llvm::Value *BlockLiteral) const override;
9072 bool shouldEmitStaticExternCAliases() const override;
9073 void setCUDAKernelCallingConvention(const FunctionType *&FT) const override;
9074 };
9075 }
9076
requiresAMDGPUProtectedVisibility(const Decl * D,llvm::GlobalValue * GV)9077 static bool requiresAMDGPUProtectedVisibility(const Decl *D,
9078 llvm::GlobalValue *GV) {
9079 if (GV->getVisibility() != llvm::GlobalValue::HiddenVisibility)
9080 return false;
9081
9082 return D->hasAttr<OpenCLKernelAttr>() ||
9083 (isa<FunctionDecl>(D) && D->hasAttr<CUDAGlobalAttr>()) ||
9084 (isa<VarDecl>(D) &&
9085 (D->hasAttr<CUDADeviceAttr>() || D->hasAttr<CUDAConstantAttr>() ||
9086 cast<VarDecl>(D)->getType()->isCUDADeviceBuiltinSurfaceType() ||
9087 cast<VarDecl>(D)->getType()->isCUDADeviceBuiltinTextureType()));
9088 }
9089
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & M) const9090 void AMDGPUTargetCodeGenInfo::setTargetAttributes(
9091 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &M) const {
9092 if (requiresAMDGPUProtectedVisibility(D, GV)) {
9093 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
9094 GV->setDSOLocal(true);
9095 }
9096
9097 if (GV->isDeclaration())
9098 return;
9099 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
9100 if (!FD)
9101 return;
9102
9103 llvm::Function *F = cast<llvm::Function>(GV);
9104
9105 const auto *ReqdWGS = M.getLangOpts().OpenCL ?
9106 FD->getAttr<ReqdWorkGroupSizeAttr>() : nullptr;
9107
9108
9109 const bool IsOpenCLKernel = M.getLangOpts().OpenCL &&
9110 FD->hasAttr<OpenCLKernelAttr>();
9111 const bool IsHIPKernel = M.getLangOpts().HIP &&
9112 FD->hasAttr<CUDAGlobalAttr>();
9113 if ((IsOpenCLKernel || IsHIPKernel) &&
9114 (M.getTriple().getOS() == llvm::Triple::AMDHSA))
9115 F->addFnAttr("amdgpu-implicitarg-num-bytes", "56");
9116
9117 if (IsHIPKernel)
9118 F->addFnAttr("uniform-work-group-size", "true");
9119
9120
9121 const auto *FlatWGS = FD->getAttr<AMDGPUFlatWorkGroupSizeAttr>();
9122 if (ReqdWGS || FlatWGS) {
9123 unsigned Min = 0;
9124 unsigned Max = 0;
9125 if (FlatWGS) {
9126 Min = FlatWGS->getMin()
9127 ->EvaluateKnownConstInt(M.getContext())
9128 .getExtValue();
9129 Max = FlatWGS->getMax()
9130 ->EvaluateKnownConstInt(M.getContext())
9131 .getExtValue();
9132 }
9133 if (ReqdWGS && Min == 0 && Max == 0)
9134 Min = Max = ReqdWGS->getXDim() * ReqdWGS->getYDim() * ReqdWGS->getZDim();
9135
9136 if (Min != 0) {
9137 assert(Min <= Max && "Min must be less than or equal Max");
9138
9139 std::string AttrVal = llvm::utostr(Min) + "," + llvm::utostr(Max);
9140 F->addFnAttr("amdgpu-flat-work-group-size", AttrVal);
9141 } else
9142 assert(Max == 0 && "Max must be zero");
9143 } else if (IsOpenCLKernel || IsHIPKernel) {
9144 // By default, restrict the maximum size to a value specified by
9145 // --gpu-max-threads-per-block=n or its default value for HIP.
9146 const unsigned OpenCLDefaultMaxWorkGroupSize = 256;
9147 const unsigned DefaultMaxWorkGroupSize =
9148 IsOpenCLKernel ? OpenCLDefaultMaxWorkGroupSize
9149 : M.getLangOpts().GPUMaxThreadsPerBlock;
9150 std::string AttrVal =
9151 std::string("1,") + llvm::utostr(DefaultMaxWorkGroupSize);
9152 F->addFnAttr("amdgpu-flat-work-group-size", AttrVal);
9153 }
9154
9155 if (const auto *Attr = FD->getAttr<AMDGPUWavesPerEUAttr>()) {
9156 unsigned Min =
9157 Attr->getMin()->EvaluateKnownConstInt(M.getContext()).getExtValue();
9158 unsigned Max = Attr->getMax() ? Attr->getMax()
9159 ->EvaluateKnownConstInt(M.getContext())
9160 .getExtValue()
9161 : 0;
9162
9163 if (Min != 0) {
9164 assert((Max == 0 || Min <= Max) && "Min must be less than or equal Max");
9165
9166 std::string AttrVal = llvm::utostr(Min);
9167 if (Max != 0)
9168 AttrVal = AttrVal + "," + llvm::utostr(Max);
9169 F->addFnAttr("amdgpu-waves-per-eu", AttrVal);
9170 } else
9171 assert(Max == 0 && "Max must be zero");
9172 }
9173
9174 if (const auto *Attr = FD->getAttr<AMDGPUNumSGPRAttr>()) {
9175 unsigned NumSGPR = Attr->getNumSGPR();
9176
9177 if (NumSGPR != 0)
9178 F->addFnAttr("amdgpu-num-sgpr", llvm::utostr(NumSGPR));
9179 }
9180
9181 if (const auto *Attr = FD->getAttr<AMDGPUNumVGPRAttr>()) {
9182 uint32_t NumVGPR = Attr->getNumVGPR();
9183
9184 if (NumVGPR != 0)
9185 F->addFnAttr("amdgpu-num-vgpr", llvm::utostr(NumVGPR));
9186 }
9187
9188 if (M.getContext().getTargetInfo().allowAMDGPUUnsafeFPAtomics())
9189 F->addFnAttr("amdgpu-unsafe-fp-atomics", "true");
9190
9191 if (!getABIInfo().getCodeGenOpts().EmitIEEENaNCompliantInsts)
9192 F->addFnAttr("amdgpu-ieee", "false");
9193 }
9194
getOpenCLKernelCallingConv() const9195 unsigned AMDGPUTargetCodeGenInfo::getOpenCLKernelCallingConv() const {
9196 return llvm::CallingConv::AMDGPU_KERNEL;
9197 }
9198
9199 // Currently LLVM assumes null pointers always have value 0,
9200 // which results in incorrectly transformed IR. Therefore, instead of
9201 // emitting null pointers in private and local address spaces, a null
9202 // pointer in generic address space is emitted which is casted to a
9203 // pointer in local or private address space.
getNullPointer(const CodeGen::CodeGenModule & CGM,llvm::PointerType * PT,QualType QT) const9204 llvm::Constant *AMDGPUTargetCodeGenInfo::getNullPointer(
9205 const CodeGen::CodeGenModule &CGM, llvm::PointerType *PT,
9206 QualType QT) const {
9207 if (CGM.getContext().getTargetNullPointerValue(QT) == 0)
9208 return llvm::ConstantPointerNull::get(PT);
9209
9210 auto &Ctx = CGM.getContext();
9211 auto NPT = llvm::PointerType::get(PT->getElementType(),
9212 Ctx.getTargetAddressSpace(LangAS::opencl_generic));
9213 return llvm::ConstantExpr::getAddrSpaceCast(
9214 llvm::ConstantPointerNull::get(NPT), PT);
9215 }
9216
9217 LangAS
getGlobalVarAddressSpace(CodeGenModule & CGM,const VarDecl * D) const9218 AMDGPUTargetCodeGenInfo::getGlobalVarAddressSpace(CodeGenModule &CGM,
9219 const VarDecl *D) const {
9220 assert(!CGM.getLangOpts().OpenCL &&
9221 !(CGM.getLangOpts().CUDA && CGM.getLangOpts().CUDAIsDevice) &&
9222 "Address space agnostic languages only");
9223 LangAS DefaultGlobalAS = getLangASFromTargetAS(
9224 CGM.getContext().getTargetAddressSpace(LangAS::opencl_global));
9225 if (!D)
9226 return DefaultGlobalAS;
9227
9228 LangAS AddrSpace = D->getType().getAddressSpace();
9229 assert(AddrSpace == LangAS::Default || isTargetAddressSpace(AddrSpace));
9230 if (AddrSpace != LangAS::Default)
9231 return AddrSpace;
9232
9233 if (CGM.isTypeConstant(D->getType(), false)) {
9234 if (auto ConstAS = CGM.getTarget().getConstantAddressSpace())
9235 return ConstAS.getValue();
9236 }
9237 return DefaultGlobalAS;
9238 }
9239
9240 llvm::SyncScope::ID
getLLVMSyncScopeID(const LangOptions & LangOpts,SyncScope Scope,llvm::AtomicOrdering Ordering,llvm::LLVMContext & Ctx) const9241 AMDGPUTargetCodeGenInfo::getLLVMSyncScopeID(const LangOptions &LangOpts,
9242 SyncScope Scope,
9243 llvm::AtomicOrdering Ordering,
9244 llvm::LLVMContext &Ctx) const {
9245 std::string Name;
9246 switch (Scope) {
9247 case SyncScope::OpenCLWorkGroup:
9248 Name = "workgroup";
9249 break;
9250 case SyncScope::OpenCLDevice:
9251 Name = "agent";
9252 break;
9253 case SyncScope::OpenCLAllSVMDevices:
9254 Name = "";
9255 break;
9256 case SyncScope::OpenCLSubGroup:
9257 Name = "wavefront";
9258 }
9259
9260 if (Ordering != llvm::AtomicOrdering::SequentiallyConsistent) {
9261 if (!Name.empty())
9262 Name = Twine(Twine(Name) + Twine("-")).str();
9263
9264 Name = Twine(Twine(Name) + Twine("one-as")).str();
9265 }
9266
9267 return Ctx.getOrInsertSyncScopeID(Name);
9268 }
9269
shouldEmitStaticExternCAliases() const9270 bool AMDGPUTargetCodeGenInfo::shouldEmitStaticExternCAliases() const {
9271 return false;
9272 }
9273
setCUDAKernelCallingConvention(const FunctionType * & FT) const9274 void AMDGPUTargetCodeGenInfo::setCUDAKernelCallingConvention(
9275 const FunctionType *&FT) const {
9276 FT = getABIInfo().getContext().adjustFunctionType(
9277 FT, FT->getExtInfo().withCallingConv(CC_OpenCLKernel));
9278 }
9279
9280 //===----------------------------------------------------------------------===//
9281 // SPARC v8 ABI Implementation.
9282 // Based on the SPARC Compliance Definition version 2.4.1.
9283 //
9284 // Ensures that complex values are passed in registers.
9285 //
9286 namespace {
9287 class SparcV8ABIInfo : public DefaultABIInfo {
9288 public:
SparcV8ABIInfo(CodeGenTypes & CGT)9289 SparcV8ABIInfo(CodeGenTypes &CGT) : DefaultABIInfo(CGT) {}
9290
9291 private:
9292 ABIArgInfo classifyReturnType(QualType RetTy) const;
9293 void computeInfo(CGFunctionInfo &FI) const override;
9294 };
9295 } // end anonymous namespace
9296
9297
9298 ABIArgInfo
classifyReturnType(QualType Ty) const9299 SparcV8ABIInfo::classifyReturnType(QualType Ty) const {
9300 if (Ty->isAnyComplexType()) {
9301 return ABIArgInfo::getDirect();
9302 }
9303 else {
9304 return DefaultABIInfo::classifyReturnType(Ty);
9305 }
9306 }
9307
computeInfo(CGFunctionInfo & FI) const9308 void SparcV8ABIInfo::computeInfo(CGFunctionInfo &FI) const {
9309
9310 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
9311 for (auto &Arg : FI.arguments())
9312 Arg.info = classifyArgumentType(Arg.type);
9313 }
9314
9315 namespace {
9316 class SparcV8TargetCodeGenInfo : public TargetCodeGenInfo {
9317 public:
SparcV8TargetCodeGenInfo(CodeGenTypes & CGT)9318 SparcV8TargetCodeGenInfo(CodeGenTypes &CGT)
9319 : TargetCodeGenInfo(std::make_unique<SparcV8ABIInfo>(CGT)) {}
9320 };
9321 } // end anonymous namespace
9322
9323 //===----------------------------------------------------------------------===//
9324 // SPARC v9 ABI Implementation.
9325 // Based on the SPARC Compliance Definition version 2.4.1.
9326 //
9327 // Function arguments a mapped to a nominal "parameter array" and promoted to
9328 // registers depending on their type. Each argument occupies 8 or 16 bytes in
9329 // the array, structs larger than 16 bytes are passed indirectly.
9330 //
9331 // One case requires special care:
9332 //
9333 // struct mixed {
9334 // int i;
9335 // float f;
9336 // };
9337 //
9338 // When a struct mixed is passed by value, it only occupies 8 bytes in the
9339 // parameter array, but the int is passed in an integer register, and the float
9340 // is passed in a floating point register. This is represented as two arguments
9341 // with the LLVM IR inreg attribute:
9342 //
9343 // declare void f(i32 inreg %i, float inreg %f)
9344 //
9345 // The code generator will only allocate 4 bytes from the parameter array for
9346 // the inreg arguments. All other arguments are allocated a multiple of 8
9347 // bytes.
9348 //
9349 namespace {
9350 class SparcV9ABIInfo : public ABIInfo {
9351 public:
SparcV9ABIInfo(CodeGenTypes & CGT)9352 SparcV9ABIInfo(CodeGenTypes &CGT) : ABIInfo(CGT) {}
9353
9354 private:
9355 ABIArgInfo classifyType(QualType RetTy, unsigned SizeLimit) const;
9356 void computeInfo(CGFunctionInfo &FI) const override;
9357 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
9358 QualType Ty) const override;
9359
9360 // Coercion type builder for structs passed in registers. The coercion type
9361 // serves two purposes:
9362 //
9363 // 1. Pad structs to a multiple of 64 bits, so they are passed 'left-aligned'
9364 // in registers.
9365 // 2. Expose aligned floating point elements as first-level elements, so the
9366 // code generator knows to pass them in floating point registers.
9367 //
9368 // We also compute the InReg flag which indicates that the struct contains
9369 // aligned 32-bit floats.
9370 //
9371 struct CoerceBuilder {
9372 llvm::LLVMContext &Context;
9373 const llvm::DataLayout &DL;
9374 SmallVector<llvm::Type*, 8> Elems;
9375 uint64_t Size;
9376 bool InReg;
9377
CoerceBuilder__anon6bad40bc1711::SparcV9ABIInfo::CoerceBuilder9378 CoerceBuilder(llvm::LLVMContext &c, const llvm::DataLayout &dl)
9379 : Context(c), DL(dl), Size(0), InReg(false) {}
9380
9381 // Pad Elems with integers until Size is ToSize.
pad__anon6bad40bc1711::SparcV9ABIInfo::CoerceBuilder9382 void pad(uint64_t ToSize) {
9383 assert(ToSize >= Size && "Cannot remove elements");
9384 if (ToSize == Size)
9385 return;
9386
9387 // Finish the current 64-bit word.
9388 uint64_t Aligned = llvm::alignTo(Size, 64);
9389 if (Aligned > Size && Aligned <= ToSize) {
9390 Elems.push_back(llvm::IntegerType::get(Context, Aligned - Size));
9391 Size = Aligned;
9392 }
9393
9394 // Add whole 64-bit words.
9395 while (Size + 64 <= ToSize) {
9396 Elems.push_back(llvm::Type::getInt64Ty(Context));
9397 Size += 64;
9398 }
9399
9400 // Final in-word padding.
9401 if (Size < ToSize) {
9402 Elems.push_back(llvm::IntegerType::get(Context, ToSize - Size));
9403 Size = ToSize;
9404 }
9405 }
9406
9407 // Add a floating point element at Offset.
addFloat__anon6bad40bc1711::SparcV9ABIInfo::CoerceBuilder9408 void addFloat(uint64_t Offset, llvm::Type *Ty, unsigned Bits) {
9409 // Unaligned floats are treated as integers.
9410 if (Offset % Bits)
9411 return;
9412 // The InReg flag is only required if there are any floats < 64 bits.
9413 if (Bits < 64)
9414 InReg = true;
9415 pad(Offset);
9416 Elems.push_back(Ty);
9417 Size = Offset + Bits;
9418 }
9419
9420 // Add a struct type to the coercion type, starting at Offset (in bits).
addStruct__anon6bad40bc1711::SparcV9ABIInfo::CoerceBuilder9421 void addStruct(uint64_t Offset, llvm::StructType *StrTy) {
9422 const llvm::StructLayout *Layout = DL.getStructLayout(StrTy);
9423 for (unsigned i = 0, e = StrTy->getNumElements(); i != e; ++i) {
9424 llvm::Type *ElemTy = StrTy->getElementType(i);
9425 uint64_t ElemOffset = Offset + Layout->getElementOffsetInBits(i);
9426 switch (ElemTy->getTypeID()) {
9427 case llvm::Type::StructTyID:
9428 addStruct(ElemOffset, cast<llvm::StructType>(ElemTy));
9429 break;
9430 case llvm::Type::FloatTyID:
9431 addFloat(ElemOffset, ElemTy, 32);
9432 break;
9433 case llvm::Type::DoubleTyID:
9434 addFloat(ElemOffset, ElemTy, 64);
9435 break;
9436 case llvm::Type::FP128TyID:
9437 addFloat(ElemOffset, ElemTy, 128);
9438 break;
9439 case llvm::Type::PointerTyID:
9440 if (ElemOffset % 64 == 0) {
9441 pad(ElemOffset);
9442 Elems.push_back(ElemTy);
9443 Size += 64;
9444 }
9445 break;
9446 default:
9447 break;
9448 }
9449 }
9450 }
9451
9452 // Check if Ty is a usable substitute for the coercion type.
isUsableType__anon6bad40bc1711::SparcV9ABIInfo::CoerceBuilder9453 bool isUsableType(llvm::StructType *Ty) const {
9454 return llvm::makeArrayRef(Elems) == Ty->elements();
9455 }
9456
9457 // Get the coercion type as a literal struct type.
getType__anon6bad40bc1711::SparcV9ABIInfo::CoerceBuilder9458 llvm::Type *getType() const {
9459 if (Elems.size() == 1)
9460 return Elems.front();
9461 else
9462 return llvm::StructType::get(Context, Elems);
9463 }
9464 };
9465 };
9466 } // end anonymous namespace
9467
9468 ABIArgInfo
classifyType(QualType Ty,unsigned SizeLimit) const9469 SparcV9ABIInfo::classifyType(QualType Ty, unsigned SizeLimit) const {
9470 if (Ty->isVoidType())
9471 return ABIArgInfo::getIgnore();
9472
9473 uint64_t Size = getContext().getTypeSize(Ty);
9474
9475 // Anything too big to fit in registers is passed with an explicit indirect
9476 // pointer / sret pointer.
9477 if (Size > SizeLimit)
9478 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
9479
9480 // Treat an enum type as its underlying type.
9481 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
9482 Ty = EnumTy->getDecl()->getIntegerType();
9483
9484 // Integer types smaller than a register are extended.
9485 if (Size < 64 && Ty->isIntegerType())
9486 return ABIArgInfo::getExtend(Ty);
9487
9488 if (const auto *EIT = Ty->getAs<ExtIntType>())
9489 if (EIT->getNumBits() < 64)
9490 return ABIArgInfo::getExtend(Ty);
9491
9492 // Other non-aggregates go in registers.
9493 if (!isAggregateTypeForABI(Ty))
9494 return ABIArgInfo::getDirect();
9495
9496 // If a C++ object has either a non-trivial copy constructor or a non-trivial
9497 // destructor, it is passed with an explicit indirect pointer / sret pointer.
9498 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
9499 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
9500
9501 // This is a small aggregate type that should be passed in registers.
9502 // Build a coercion type from the LLVM struct type.
9503 llvm::StructType *StrTy = dyn_cast<llvm::StructType>(CGT.ConvertType(Ty));
9504 if (!StrTy)
9505 return ABIArgInfo::getDirect();
9506
9507 CoerceBuilder CB(getVMContext(), getDataLayout());
9508 CB.addStruct(0, StrTy);
9509 CB.pad(llvm::alignTo(CB.DL.getTypeSizeInBits(StrTy), 64));
9510
9511 // Try to use the original type for coercion.
9512 llvm::Type *CoerceTy = CB.isUsableType(StrTy) ? StrTy : CB.getType();
9513
9514 if (CB.InReg)
9515 return ABIArgInfo::getDirectInReg(CoerceTy);
9516 else
9517 return ABIArgInfo::getDirect(CoerceTy);
9518 }
9519
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const9520 Address SparcV9ABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
9521 QualType Ty) const {
9522 ABIArgInfo AI = classifyType(Ty, 16 * 8);
9523 llvm::Type *ArgTy = CGT.ConvertType(Ty);
9524 if (AI.canHaveCoerceToType() && !AI.getCoerceToType())
9525 AI.setCoerceToType(ArgTy);
9526
9527 CharUnits SlotSize = CharUnits::fromQuantity(8);
9528
9529 CGBuilderTy &Builder = CGF.Builder;
9530 Address Addr(Builder.CreateLoad(VAListAddr, "ap.cur"), SlotSize);
9531 llvm::Type *ArgPtrTy = llvm::PointerType::getUnqual(ArgTy);
9532
9533 auto TypeInfo = getContext().getTypeInfoInChars(Ty);
9534
9535 Address ArgAddr = Address::invalid();
9536 CharUnits Stride;
9537 switch (AI.getKind()) {
9538 case ABIArgInfo::Expand:
9539 case ABIArgInfo::CoerceAndExpand:
9540 case ABIArgInfo::InAlloca:
9541 llvm_unreachable("Unsupported ABI kind for va_arg");
9542
9543 case ABIArgInfo::Extend: {
9544 Stride = SlotSize;
9545 CharUnits Offset = SlotSize - TypeInfo.Width;
9546 ArgAddr = Builder.CreateConstInBoundsByteGEP(Addr, Offset, "extend");
9547 break;
9548 }
9549
9550 case ABIArgInfo::Direct: {
9551 auto AllocSize = getDataLayout().getTypeAllocSize(AI.getCoerceToType());
9552 Stride = CharUnits::fromQuantity(AllocSize).alignTo(SlotSize);
9553 ArgAddr = Addr;
9554 break;
9555 }
9556
9557 case ABIArgInfo::Indirect:
9558 case ABIArgInfo::IndirectAliased:
9559 Stride = SlotSize;
9560 ArgAddr = Builder.CreateElementBitCast(Addr, ArgPtrTy, "indirect");
9561 ArgAddr = Address(Builder.CreateLoad(ArgAddr, "indirect.arg"),
9562 TypeInfo.Align);
9563 break;
9564
9565 case ABIArgInfo::Ignore:
9566 return Address(llvm::UndefValue::get(ArgPtrTy), TypeInfo.Align);
9567 }
9568
9569 // Update VAList.
9570 Address NextPtr = Builder.CreateConstInBoundsByteGEP(Addr, Stride, "ap.next");
9571 Builder.CreateStore(NextPtr.getPointer(), VAListAddr);
9572
9573 return Builder.CreateBitCast(ArgAddr, ArgPtrTy, "arg.addr");
9574 }
9575
computeInfo(CGFunctionInfo & FI) const9576 void SparcV9ABIInfo::computeInfo(CGFunctionInfo &FI) const {
9577 FI.getReturnInfo() = classifyType(FI.getReturnType(), 32 * 8);
9578 for (auto &I : FI.arguments())
9579 I.info = classifyType(I.type, 16 * 8);
9580 }
9581
9582 namespace {
9583 class SparcV9TargetCodeGenInfo : public TargetCodeGenInfo {
9584 public:
SparcV9TargetCodeGenInfo(CodeGenTypes & CGT)9585 SparcV9TargetCodeGenInfo(CodeGenTypes &CGT)
9586 : TargetCodeGenInfo(std::make_unique<SparcV9ABIInfo>(CGT)) {}
9587
getDwarfEHStackPointer(CodeGen::CodeGenModule & M) const9588 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
9589 return 14;
9590 }
9591
9592 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
9593 llvm::Value *Address) const override;
9594 };
9595 } // end anonymous namespace
9596
9597 bool
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const9598 SparcV9TargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
9599 llvm::Value *Address) const {
9600 // This is calculated from the LLVM and GCC tables and verified
9601 // against gcc output. AFAIK all ABIs use the same encoding.
9602
9603 CodeGen::CGBuilderTy &Builder = CGF.Builder;
9604
9605 llvm::IntegerType *i8 = CGF.Int8Ty;
9606 llvm::Value *Four8 = llvm::ConstantInt::get(i8, 4);
9607 llvm::Value *Eight8 = llvm::ConstantInt::get(i8, 8);
9608
9609 // 0-31: the 8-byte general-purpose registers
9610 AssignToArrayRange(Builder, Address, Eight8, 0, 31);
9611
9612 // 32-63: f0-31, the 4-byte floating-point registers
9613 AssignToArrayRange(Builder, Address, Four8, 32, 63);
9614
9615 // Y = 64
9616 // PSR = 65
9617 // WIM = 66
9618 // TBR = 67
9619 // PC = 68
9620 // NPC = 69
9621 // FSR = 70
9622 // CSR = 71
9623 AssignToArrayRange(Builder, Address, Eight8, 64, 71);
9624
9625 // 72-87: d0-15, the 8-byte floating-point registers
9626 AssignToArrayRange(Builder, Address, Eight8, 72, 87);
9627
9628 return false;
9629 }
9630
9631 // ARC ABI implementation.
9632 namespace {
9633
9634 class ARCABIInfo : public DefaultABIInfo {
9635 public:
9636 using DefaultABIInfo::DefaultABIInfo;
9637
9638 private:
9639 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
9640 QualType Ty) const override;
9641
updateState(const ABIArgInfo & Info,QualType Ty,CCState & State) const9642 void updateState(const ABIArgInfo &Info, QualType Ty, CCState &State) const {
9643 if (!State.FreeRegs)
9644 return;
9645 if (Info.isIndirect() && Info.getInReg())
9646 State.FreeRegs--;
9647 else if (Info.isDirect() && Info.getInReg()) {
9648 unsigned sz = (getContext().getTypeSize(Ty) + 31) / 32;
9649 if (sz < State.FreeRegs)
9650 State.FreeRegs -= sz;
9651 else
9652 State.FreeRegs = 0;
9653 }
9654 }
9655
computeInfo(CGFunctionInfo & FI) const9656 void computeInfo(CGFunctionInfo &FI) const override {
9657 CCState State(FI);
9658 // ARC uses 8 registers to pass arguments.
9659 State.FreeRegs = 8;
9660
9661 if (!getCXXABI().classifyReturnType(FI))
9662 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
9663 updateState(FI.getReturnInfo(), FI.getReturnType(), State);
9664 for (auto &I : FI.arguments()) {
9665 I.info = classifyArgumentType(I.type, State.FreeRegs);
9666 updateState(I.info, I.type, State);
9667 }
9668 }
9669
9670 ABIArgInfo getIndirectByRef(QualType Ty, bool HasFreeRegs) const;
9671 ABIArgInfo getIndirectByValue(QualType Ty) const;
9672 ABIArgInfo classifyArgumentType(QualType Ty, uint8_t FreeRegs) const;
9673 ABIArgInfo classifyReturnType(QualType RetTy) const;
9674 };
9675
9676 class ARCTargetCodeGenInfo : public TargetCodeGenInfo {
9677 public:
ARCTargetCodeGenInfo(CodeGenTypes & CGT)9678 ARCTargetCodeGenInfo(CodeGenTypes &CGT)
9679 : TargetCodeGenInfo(std::make_unique<ARCABIInfo>(CGT)) {}
9680 };
9681
9682
getIndirectByRef(QualType Ty,bool HasFreeRegs) const9683 ABIArgInfo ARCABIInfo::getIndirectByRef(QualType Ty, bool HasFreeRegs) const {
9684 return HasFreeRegs ? getNaturalAlignIndirectInReg(Ty) :
9685 getNaturalAlignIndirect(Ty, false);
9686 }
9687
getIndirectByValue(QualType Ty) const9688 ABIArgInfo ARCABIInfo::getIndirectByValue(QualType Ty) const {
9689 // Compute the byval alignment.
9690 const unsigned MinABIStackAlignInBytes = 4;
9691 unsigned TypeAlign = getContext().getTypeAlign(Ty) / 8;
9692 return ABIArgInfo::getIndirect(CharUnits::fromQuantity(4), /*ByVal=*/true,
9693 TypeAlign > MinABIStackAlignInBytes);
9694 }
9695
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const9696 Address ARCABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
9697 QualType Ty) const {
9698 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, /*indirect*/ false,
9699 getContext().getTypeInfoInChars(Ty),
9700 CharUnits::fromQuantity(4), true);
9701 }
9702
classifyArgumentType(QualType Ty,uint8_t FreeRegs) const9703 ABIArgInfo ARCABIInfo::classifyArgumentType(QualType Ty,
9704 uint8_t FreeRegs) const {
9705 // Handle the generic C++ ABI.
9706 const RecordType *RT = Ty->getAs<RecordType>();
9707 if (RT) {
9708 CGCXXABI::RecordArgABI RAA = getRecordArgABI(RT, getCXXABI());
9709 if (RAA == CGCXXABI::RAA_Indirect)
9710 return getIndirectByRef(Ty, FreeRegs > 0);
9711
9712 if (RAA == CGCXXABI::RAA_DirectInMemory)
9713 return getIndirectByValue(Ty);
9714 }
9715
9716 // Treat an enum type as its underlying type.
9717 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
9718 Ty = EnumTy->getDecl()->getIntegerType();
9719
9720 auto SizeInRegs = llvm::alignTo(getContext().getTypeSize(Ty), 32) / 32;
9721
9722 if (isAggregateTypeForABI(Ty)) {
9723 // Structures with flexible arrays are always indirect.
9724 if (RT && RT->getDecl()->hasFlexibleArrayMember())
9725 return getIndirectByValue(Ty);
9726
9727 // Ignore empty structs/unions.
9728 if (isEmptyRecord(getContext(), Ty, true))
9729 return ABIArgInfo::getIgnore();
9730
9731 llvm::LLVMContext &LLVMContext = getVMContext();
9732
9733 llvm::IntegerType *Int32 = llvm::Type::getInt32Ty(LLVMContext);
9734 SmallVector<llvm::Type *, 3> Elements(SizeInRegs, Int32);
9735 llvm::Type *Result = llvm::StructType::get(LLVMContext, Elements);
9736
9737 return FreeRegs >= SizeInRegs ?
9738 ABIArgInfo::getDirectInReg(Result) :
9739 ABIArgInfo::getDirect(Result, 0, nullptr, false);
9740 }
9741
9742 if (const auto *EIT = Ty->getAs<ExtIntType>())
9743 if (EIT->getNumBits() > 64)
9744 return getIndirectByValue(Ty);
9745
9746 return isPromotableIntegerTypeForABI(Ty)
9747 ? (FreeRegs >= SizeInRegs ? ABIArgInfo::getExtendInReg(Ty)
9748 : ABIArgInfo::getExtend(Ty))
9749 : (FreeRegs >= SizeInRegs ? ABIArgInfo::getDirectInReg()
9750 : ABIArgInfo::getDirect());
9751 }
9752
classifyReturnType(QualType RetTy) const9753 ABIArgInfo ARCABIInfo::classifyReturnType(QualType RetTy) const {
9754 if (RetTy->isAnyComplexType())
9755 return ABIArgInfo::getDirectInReg();
9756
9757 // Arguments of size > 4 registers are indirect.
9758 auto RetSize = llvm::alignTo(getContext().getTypeSize(RetTy), 32) / 32;
9759 if (RetSize > 4)
9760 return getIndirectByRef(RetTy, /*HasFreeRegs*/ true);
9761
9762 return DefaultABIInfo::classifyReturnType(RetTy);
9763 }
9764
9765 } // End anonymous namespace.
9766
9767 //===----------------------------------------------------------------------===//
9768 // XCore ABI Implementation
9769 //===----------------------------------------------------------------------===//
9770
9771 namespace {
9772
9773 /// A SmallStringEnc instance is used to build up the TypeString by passing
9774 /// it by reference between functions that append to it.
9775 typedef llvm::SmallString<128> SmallStringEnc;
9776
9777 /// TypeStringCache caches the meta encodings of Types.
9778 ///
9779 /// The reason for caching TypeStrings is two fold:
9780 /// 1. To cache a type's encoding for later uses;
9781 /// 2. As a means to break recursive member type inclusion.
9782 ///
9783 /// A cache Entry can have a Status of:
9784 /// NonRecursive: The type encoding is not recursive;
9785 /// Recursive: The type encoding is recursive;
9786 /// Incomplete: An incomplete TypeString;
9787 /// IncompleteUsed: An incomplete TypeString that has been used in a
9788 /// Recursive type encoding.
9789 ///
9790 /// A NonRecursive entry will have all of its sub-members expanded as fully
9791 /// as possible. Whilst it may contain types which are recursive, the type
9792 /// itself is not recursive and thus its encoding may be safely used whenever
9793 /// the type is encountered.
9794 ///
9795 /// A Recursive entry will have all of its sub-members expanded as fully as
9796 /// possible. The type itself is recursive and it may contain other types which
9797 /// are recursive. The Recursive encoding must not be used during the expansion
9798 /// of a recursive type's recursive branch. For simplicity the code uses
9799 /// IncompleteCount to reject all usage of Recursive encodings for member types.
9800 ///
9801 /// An Incomplete entry is always a RecordType and only encodes its
9802 /// identifier e.g. "s(S){}". Incomplete 'StubEnc' entries are ephemeral and
9803 /// are placed into the cache during type expansion as a means to identify and
9804 /// handle recursive inclusion of types as sub-members. If there is recursion
9805 /// the entry becomes IncompleteUsed.
9806 ///
9807 /// During the expansion of a RecordType's members:
9808 ///
9809 /// If the cache contains a NonRecursive encoding for the member type, the
9810 /// cached encoding is used;
9811 ///
9812 /// If the cache contains a Recursive encoding for the member type, the
9813 /// cached encoding is 'Swapped' out, as it may be incorrect, and...
9814 ///
9815 /// If the member is a RecordType, an Incomplete encoding is placed into the
9816 /// cache to break potential recursive inclusion of itself as a sub-member;
9817 ///
9818 /// Once a member RecordType has been expanded, its temporary incomplete
9819 /// entry is removed from the cache. If a Recursive encoding was swapped out
9820 /// it is swapped back in;
9821 ///
9822 /// If an incomplete entry is used to expand a sub-member, the incomplete
9823 /// entry is marked as IncompleteUsed. The cache keeps count of how many
9824 /// IncompleteUsed entries it currently contains in IncompleteUsedCount;
9825 ///
9826 /// If a member's encoding is found to be a NonRecursive or Recursive viz:
9827 /// IncompleteUsedCount==0, the member's encoding is added to the cache.
9828 /// Else the member is part of a recursive type and thus the recursion has
9829 /// been exited too soon for the encoding to be correct for the member.
9830 ///
9831 class TypeStringCache {
9832 enum Status {NonRecursive, Recursive, Incomplete, IncompleteUsed};
9833 struct Entry {
9834 std::string Str; // The encoded TypeString for the type.
9835 enum Status State; // Information about the encoding in 'Str'.
9836 std::string Swapped; // A temporary place holder for a Recursive encoding
9837 // during the expansion of RecordType's members.
9838 };
9839 std::map<const IdentifierInfo *, struct Entry> Map;
9840 unsigned IncompleteCount; // Number of Incomplete entries in the Map.
9841 unsigned IncompleteUsedCount; // Number of IncompleteUsed entries in the Map.
9842 public:
TypeStringCache()9843 TypeStringCache() : IncompleteCount(0), IncompleteUsedCount(0) {}
9844 void addIncomplete(const IdentifierInfo *ID, std::string StubEnc);
9845 bool removeIncomplete(const IdentifierInfo *ID);
9846 void addIfComplete(const IdentifierInfo *ID, StringRef Str,
9847 bool IsRecursive);
9848 StringRef lookupStr(const IdentifierInfo *ID);
9849 };
9850
9851 /// TypeString encodings for enum & union fields must be order.
9852 /// FieldEncoding is a helper for this ordering process.
9853 class FieldEncoding {
9854 bool HasName;
9855 std::string Enc;
9856 public:
FieldEncoding(bool b,SmallStringEnc & e)9857 FieldEncoding(bool b, SmallStringEnc &e) : HasName(b), Enc(e.c_str()) {}
str()9858 StringRef str() { return Enc; }
operator <(const FieldEncoding & rhs) const9859 bool operator<(const FieldEncoding &rhs) const {
9860 if (HasName != rhs.HasName) return HasName;
9861 return Enc < rhs.Enc;
9862 }
9863 };
9864
9865 class XCoreABIInfo : public DefaultABIInfo {
9866 public:
XCoreABIInfo(CodeGen::CodeGenTypes & CGT)9867 XCoreABIInfo(CodeGen::CodeGenTypes &CGT) : DefaultABIInfo(CGT) {}
9868 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
9869 QualType Ty) const override;
9870 };
9871
9872 class XCoreTargetCodeGenInfo : public TargetCodeGenInfo {
9873 mutable TypeStringCache TSC;
9874 void emitTargetMD(const Decl *D, llvm::GlobalValue *GV,
9875 const CodeGen::CodeGenModule &M) const;
9876
9877 public:
XCoreTargetCodeGenInfo(CodeGenTypes & CGT)9878 XCoreTargetCodeGenInfo(CodeGenTypes &CGT)
9879 : TargetCodeGenInfo(std::make_unique<XCoreABIInfo>(CGT)) {}
9880 void emitTargetMetadata(CodeGen::CodeGenModule &CGM,
9881 const llvm::MapVector<GlobalDecl, StringRef>
9882 &MangledDeclNames) const override;
9883 };
9884
9885 } // End anonymous namespace.
9886
9887 // TODO: this implementation is likely now redundant with the default
9888 // EmitVAArg.
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const9889 Address XCoreABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
9890 QualType Ty) const {
9891 CGBuilderTy &Builder = CGF.Builder;
9892
9893 // Get the VAList.
9894 CharUnits SlotSize = CharUnits::fromQuantity(4);
9895 Address AP(Builder.CreateLoad(VAListAddr), SlotSize);
9896
9897 // Handle the argument.
9898 ABIArgInfo AI = classifyArgumentType(Ty);
9899 CharUnits TypeAlign = getContext().getTypeAlignInChars(Ty);
9900 llvm::Type *ArgTy = CGT.ConvertType(Ty);
9901 if (AI.canHaveCoerceToType() && !AI.getCoerceToType())
9902 AI.setCoerceToType(ArgTy);
9903 llvm::Type *ArgPtrTy = llvm::PointerType::getUnqual(ArgTy);
9904
9905 Address Val = Address::invalid();
9906 CharUnits ArgSize = CharUnits::Zero();
9907 switch (AI.getKind()) {
9908 case ABIArgInfo::Expand:
9909 case ABIArgInfo::CoerceAndExpand:
9910 case ABIArgInfo::InAlloca:
9911 llvm_unreachable("Unsupported ABI kind for va_arg");
9912 case ABIArgInfo::Ignore:
9913 Val = Address(llvm::UndefValue::get(ArgPtrTy), TypeAlign);
9914 ArgSize = CharUnits::Zero();
9915 break;
9916 case ABIArgInfo::Extend:
9917 case ABIArgInfo::Direct:
9918 Val = Builder.CreateBitCast(AP, ArgPtrTy);
9919 ArgSize = CharUnits::fromQuantity(
9920 getDataLayout().getTypeAllocSize(AI.getCoerceToType()));
9921 ArgSize = ArgSize.alignTo(SlotSize);
9922 break;
9923 case ABIArgInfo::Indirect:
9924 case ABIArgInfo::IndirectAliased:
9925 Val = Builder.CreateElementBitCast(AP, ArgPtrTy);
9926 Val = Address(Builder.CreateLoad(Val), TypeAlign);
9927 ArgSize = SlotSize;
9928 break;
9929 }
9930
9931 // Increment the VAList.
9932 if (!ArgSize.isZero()) {
9933 Address APN = Builder.CreateConstInBoundsByteGEP(AP, ArgSize);
9934 Builder.CreateStore(APN.getPointer(), VAListAddr);
9935 }
9936
9937 return Val;
9938 }
9939
9940 /// During the expansion of a RecordType, an incomplete TypeString is placed
9941 /// into the cache as a means to identify and break recursion.
9942 /// If there is a Recursive encoding in the cache, it is swapped out and will
9943 /// be reinserted by removeIncomplete().
9944 /// All other types of encoding should have been used rather than arriving here.
addIncomplete(const IdentifierInfo * ID,std::string StubEnc)9945 void TypeStringCache::addIncomplete(const IdentifierInfo *ID,
9946 std::string StubEnc) {
9947 if (!ID)
9948 return;
9949 Entry &E = Map[ID];
9950 assert( (E.Str.empty() || E.State == Recursive) &&
9951 "Incorrectly use of addIncomplete");
9952 assert(!StubEnc.empty() && "Passing an empty string to addIncomplete()");
9953 E.Swapped.swap(E.Str); // swap out the Recursive
9954 E.Str.swap(StubEnc);
9955 E.State = Incomplete;
9956 ++IncompleteCount;
9957 }
9958
9959 /// Once the RecordType has been expanded, the temporary incomplete TypeString
9960 /// must be removed from the cache.
9961 /// If a Recursive was swapped out by addIncomplete(), it will be replaced.
9962 /// Returns true if the RecordType was defined recursively.
removeIncomplete(const IdentifierInfo * ID)9963 bool TypeStringCache::removeIncomplete(const IdentifierInfo *ID) {
9964 if (!ID)
9965 return false;
9966 auto I = Map.find(ID);
9967 assert(I != Map.end() && "Entry not present");
9968 Entry &E = I->second;
9969 assert( (E.State == Incomplete ||
9970 E.State == IncompleteUsed) &&
9971 "Entry must be an incomplete type");
9972 bool IsRecursive = false;
9973 if (E.State == IncompleteUsed) {
9974 // We made use of our Incomplete encoding, thus we are recursive.
9975 IsRecursive = true;
9976 --IncompleteUsedCount;
9977 }
9978 if (E.Swapped.empty())
9979 Map.erase(I);
9980 else {
9981 // Swap the Recursive back.
9982 E.Swapped.swap(E.Str);
9983 E.Swapped.clear();
9984 E.State = Recursive;
9985 }
9986 --IncompleteCount;
9987 return IsRecursive;
9988 }
9989
9990 /// Add the encoded TypeString to the cache only if it is NonRecursive or
9991 /// Recursive (viz: all sub-members were expanded as fully as possible).
addIfComplete(const IdentifierInfo * ID,StringRef Str,bool IsRecursive)9992 void TypeStringCache::addIfComplete(const IdentifierInfo *ID, StringRef Str,
9993 bool IsRecursive) {
9994 if (!ID || IncompleteUsedCount)
9995 return; // No key or it is is an incomplete sub-type so don't add.
9996 Entry &E = Map[ID];
9997 if (IsRecursive && !E.Str.empty()) {
9998 assert(E.State==Recursive && E.Str.size() == Str.size() &&
9999 "This is not the same Recursive entry");
10000 // The parent container was not recursive after all, so we could have used
10001 // this Recursive sub-member entry after all, but we assumed the worse when
10002 // we started viz: IncompleteCount!=0.
10003 return;
10004 }
10005 assert(E.Str.empty() && "Entry already present");
10006 E.Str = Str.str();
10007 E.State = IsRecursive? Recursive : NonRecursive;
10008 }
10009
10010 /// Return a cached TypeString encoding for the ID. If there isn't one, or we
10011 /// are recursively expanding a type (IncompleteCount != 0) and the cached
10012 /// encoding is Recursive, return an empty StringRef.
lookupStr(const IdentifierInfo * ID)10013 StringRef TypeStringCache::lookupStr(const IdentifierInfo *ID) {
10014 if (!ID)
10015 return StringRef(); // We have no key.
10016 auto I = Map.find(ID);
10017 if (I == Map.end())
10018 return StringRef(); // We have no encoding.
10019 Entry &E = I->second;
10020 if (E.State == Recursive && IncompleteCount)
10021 return StringRef(); // We don't use Recursive encodings for member types.
10022
10023 if (E.State == Incomplete) {
10024 // The incomplete type is being used to break out of recursion.
10025 E.State = IncompleteUsed;
10026 ++IncompleteUsedCount;
10027 }
10028 return E.Str;
10029 }
10030
10031 /// The XCore ABI includes a type information section that communicates symbol
10032 /// type information to the linker. The linker uses this information to verify
10033 /// safety/correctness of things such as array bound and pointers et al.
10034 /// The ABI only requires C (and XC) language modules to emit TypeStrings.
10035 /// This type information (TypeString) is emitted into meta data for all global
10036 /// symbols: definitions, declarations, functions & variables.
10037 ///
10038 /// The TypeString carries type, qualifier, name, size & value details.
10039 /// Please see 'Tools Development Guide' section 2.16.2 for format details:
10040 /// https://www.xmos.com/download/public/Tools-Development-Guide%28X9114A%29.pdf
10041 /// The output is tested by test/CodeGen/xcore-stringtype.c.
10042 ///
10043 static bool getTypeString(SmallStringEnc &Enc, const Decl *D,
10044 const CodeGen::CodeGenModule &CGM,
10045 TypeStringCache &TSC);
10046
10047 /// XCore uses emitTargetMD to emit TypeString metadata for global symbols.
emitTargetMD(const Decl * D,llvm::GlobalValue * GV,const CodeGen::CodeGenModule & CGM) const10048 void XCoreTargetCodeGenInfo::emitTargetMD(
10049 const Decl *D, llvm::GlobalValue *GV,
10050 const CodeGen::CodeGenModule &CGM) const {
10051 SmallStringEnc Enc;
10052 if (getTypeString(Enc, D, CGM, TSC)) {
10053 llvm::LLVMContext &Ctx = CGM.getModule().getContext();
10054 llvm::Metadata *MDVals[] = {llvm::ConstantAsMetadata::get(GV),
10055 llvm::MDString::get(Ctx, Enc.str())};
10056 llvm::NamedMDNode *MD =
10057 CGM.getModule().getOrInsertNamedMetadata("xcore.typestrings");
10058 MD->addOperand(llvm::MDNode::get(Ctx, MDVals));
10059 }
10060 }
10061
emitTargetMetadata(CodeGen::CodeGenModule & CGM,const llvm::MapVector<GlobalDecl,StringRef> & MangledDeclNames) const10062 void XCoreTargetCodeGenInfo::emitTargetMetadata(
10063 CodeGen::CodeGenModule &CGM,
10064 const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames) const {
10065 // Warning, new MangledDeclNames may be appended within this loop.
10066 // We rely on MapVector insertions adding new elements to the end
10067 // of the container.
10068 for (unsigned I = 0; I != MangledDeclNames.size(); ++I) {
10069 auto Val = *(MangledDeclNames.begin() + I);
10070 llvm::GlobalValue *GV = CGM.GetGlobalValue(Val.second);
10071 if (GV) {
10072 const Decl *D = Val.first.getDecl()->getMostRecentDecl();
10073 emitTargetMD(D, GV, CGM);
10074 }
10075 }
10076 }
10077 //===----------------------------------------------------------------------===//
10078 // SPIR ABI Implementation
10079 //===----------------------------------------------------------------------===//
10080
10081 namespace {
10082 class SPIRABIInfo : public DefaultABIInfo {
10083 public:
SPIRABIInfo(CodeGenTypes & CGT)10084 SPIRABIInfo(CodeGenTypes &CGT) : DefaultABIInfo(CGT) { setCCs(); }
10085
10086 private:
10087 void setCCs();
10088 };
10089 } // end anonymous namespace
10090 namespace {
10091 class SPIRTargetCodeGenInfo : public TargetCodeGenInfo {
10092 public:
SPIRTargetCodeGenInfo(CodeGen::CodeGenTypes & CGT)10093 SPIRTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT)
10094 : TargetCodeGenInfo(std::make_unique<SPIRABIInfo>(CGT)) {}
10095
getASTAllocaAddressSpace() const10096 LangAS getASTAllocaAddressSpace() const override {
10097 return getLangASFromTargetAS(
10098 getABIInfo().getDataLayout().getAllocaAddrSpace());
10099 }
10100
10101 unsigned getOpenCLKernelCallingConv() const override;
10102 };
10103
10104 } // End anonymous namespace.
setCCs()10105 void SPIRABIInfo::setCCs() {
10106 assert(getRuntimeCC() == llvm::CallingConv::C);
10107 RuntimeCC = llvm::CallingConv::SPIR_FUNC;
10108 }
10109
10110 namespace clang {
10111 namespace CodeGen {
computeSPIRKernelABIInfo(CodeGenModule & CGM,CGFunctionInfo & FI)10112 void computeSPIRKernelABIInfo(CodeGenModule &CGM, CGFunctionInfo &FI) {
10113 DefaultABIInfo SPIRABI(CGM.getTypes());
10114 SPIRABI.computeInfo(FI);
10115 }
10116 }
10117 }
10118
getOpenCLKernelCallingConv() const10119 unsigned SPIRTargetCodeGenInfo::getOpenCLKernelCallingConv() const {
10120 return llvm::CallingConv::SPIR_KERNEL;
10121 }
10122
10123 static bool appendType(SmallStringEnc &Enc, QualType QType,
10124 const CodeGen::CodeGenModule &CGM,
10125 TypeStringCache &TSC);
10126
10127 /// Helper function for appendRecordType().
10128 /// Builds a SmallVector containing the encoded field types in declaration
10129 /// order.
extractFieldType(SmallVectorImpl<FieldEncoding> & FE,const RecordDecl * RD,const CodeGen::CodeGenModule & CGM,TypeStringCache & TSC)10130 static bool extractFieldType(SmallVectorImpl<FieldEncoding> &FE,
10131 const RecordDecl *RD,
10132 const CodeGen::CodeGenModule &CGM,
10133 TypeStringCache &TSC) {
10134 for (const auto *Field : RD->fields()) {
10135 SmallStringEnc Enc;
10136 Enc += "m(";
10137 Enc += Field->getName();
10138 Enc += "){";
10139 if (Field->isBitField()) {
10140 Enc += "b(";
10141 llvm::raw_svector_ostream OS(Enc);
10142 OS << Field->getBitWidthValue(CGM.getContext());
10143 Enc += ':';
10144 }
10145 if (!appendType(Enc, Field->getType(), CGM, TSC))
10146 return false;
10147 if (Field->isBitField())
10148 Enc += ')';
10149 Enc += '}';
10150 FE.emplace_back(!Field->getName().empty(), Enc);
10151 }
10152 return true;
10153 }
10154
10155 /// Appends structure and union types to Enc and adds encoding to cache.
10156 /// Recursively calls appendType (via extractFieldType) for each field.
10157 /// Union types have their fields ordered according to the ABI.
appendRecordType(SmallStringEnc & Enc,const RecordType * RT,const CodeGen::CodeGenModule & CGM,TypeStringCache & TSC,const IdentifierInfo * ID)10158 static bool appendRecordType(SmallStringEnc &Enc, const RecordType *RT,
10159 const CodeGen::CodeGenModule &CGM,
10160 TypeStringCache &TSC, const IdentifierInfo *ID) {
10161 // Append the cached TypeString if we have one.
10162 StringRef TypeString = TSC.lookupStr(ID);
10163 if (!TypeString.empty()) {
10164 Enc += TypeString;
10165 return true;
10166 }
10167
10168 // Start to emit an incomplete TypeString.
10169 size_t Start = Enc.size();
10170 Enc += (RT->isUnionType()? 'u' : 's');
10171 Enc += '(';
10172 if (ID)
10173 Enc += ID->getName();
10174 Enc += "){";
10175
10176 // We collect all encoded fields and order as necessary.
10177 bool IsRecursive = false;
10178 const RecordDecl *RD = RT->getDecl()->getDefinition();
10179 if (RD && !RD->field_empty()) {
10180 // An incomplete TypeString stub is placed in the cache for this RecordType
10181 // so that recursive calls to this RecordType will use it whilst building a
10182 // complete TypeString for this RecordType.
10183 SmallVector<FieldEncoding, 16> FE;
10184 std::string StubEnc(Enc.substr(Start).str());
10185 StubEnc += '}'; // StubEnc now holds a valid incomplete TypeString.
10186 TSC.addIncomplete(ID, std::move(StubEnc));
10187 if (!extractFieldType(FE, RD, CGM, TSC)) {
10188 (void) TSC.removeIncomplete(ID);
10189 return false;
10190 }
10191 IsRecursive = TSC.removeIncomplete(ID);
10192 // The ABI requires unions to be sorted but not structures.
10193 // See FieldEncoding::operator< for sort algorithm.
10194 if (RT->isUnionType())
10195 llvm::sort(FE);
10196 // We can now complete the TypeString.
10197 unsigned E = FE.size();
10198 for (unsigned I = 0; I != E; ++I) {
10199 if (I)
10200 Enc += ',';
10201 Enc += FE[I].str();
10202 }
10203 }
10204 Enc += '}';
10205 TSC.addIfComplete(ID, Enc.substr(Start), IsRecursive);
10206 return true;
10207 }
10208
10209 /// Appends enum types to Enc and adds the encoding to the cache.
appendEnumType(SmallStringEnc & Enc,const EnumType * ET,TypeStringCache & TSC,const IdentifierInfo * ID)10210 static bool appendEnumType(SmallStringEnc &Enc, const EnumType *ET,
10211 TypeStringCache &TSC,
10212 const IdentifierInfo *ID) {
10213 // Append the cached TypeString if we have one.
10214 StringRef TypeString = TSC.lookupStr(ID);
10215 if (!TypeString.empty()) {
10216 Enc += TypeString;
10217 return true;
10218 }
10219
10220 size_t Start = Enc.size();
10221 Enc += "e(";
10222 if (ID)
10223 Enc += ID->getName();
10224 Enc += "){";
10225
10226 // We collect all encoded enumerations and order them alphanumerically.
10227 if (const EnumDecl *ED = ET->getDecl()->getDefinition()) {
10228 SmallVector<FieldEncoding, 16> FE;
10229 for (auto I = ED->enumerator_begin(), E = ED->enumerator_end(); I != E;
10230 ++I) {
10231 SmallStringEnc EnumEnc;
10232 EnumEnc += "m(";
10233 EnumEnc += I->getName();
10234 EnumEnc += "){";
10235 I->getInitVal().toString(EnumEnc);
10236 EnumEnc += '}';
10237 FE.push_back(FieldEncoding(!I->getName().empty(), EnumEnc));
10238 }
10239 llvm::sort(FE);
10240 unsigned E = FE.size();
10241 for (unsigned I = 0; I != E; ++I) {
10242 if (I)
10243 Enc += ',';
10244 Enc += FE[I].str();
10245 }
10246 }
10247 Enc += '}';
10248 TSC.addIfComplete(ID, Enc.substr(Start), false);
10249 return true;
10250 }
10251
10252 /// Appends type's qualifier to Enc.
10253 /// This is done prior to appending the type's encoding.
appendQualifier(SmallStringEnc & Enc,QualType QT)10254 static void appendQualifier(SmallStringEnc &Enc, QualType QT) {
10255 // Qualifiers are emitted in alphabetical order.
10256 static const char *const Table[]={"","c:","r:","cr:","v:","cv:","rv:","crv:"};
10257 int Lookup = 0;
10258 if (QT.isConstQualified())
10259 Lookup += 1<<0;
10260 if (QT.isRestrictQualified())
10261 Lookup += 1<<1;
10262 if (QT.isVolatileQualified())
10263 Lookup += 1<<2;
10264 Enc += Table[Lookup];
10265 }
10266
10267 /// Appends built-in types to Enc.
appendBuiltinType(SmallStringEnc & Enc,const BuiltinType * BT)10268 static bool appendBuiltinType(SmallStringEnc &Enc, const BuiltinType *BT) {
10269 const char *EncType;
10270 switch (BT->getKind()) {
10271 case BuiltinType::Void:
10272 EncType = "0";
10273 break;
10274 case BuiltinType::Bool:
10275 EncType = "b";
10276 break;
10277 case BuiltinType::Char_U:
10278 EncType = "uc";
10279 break;
10280 case BuiltinType::UChar:
10281 EncType = "uc";
10282 break;
10283 case BuiltinType::SChar:
10284 EncType = "sc";
10285 break;
10286 case BuiltinType::UShort:
10287 EncType = "us";
10288 break;
10289 case BuiltinType::Short:
10290 EncType = "ss";
10291 break;
10292 case BuiltinType::UInt:
10293 EncType = "ui";
10294 break;
10295 case BuiltinType::Int:
10296 EncType = "si";
10297 break;
10298 case BuiltinType::ULong:
10299 EncType = "ul";
10300 break;
10301 case BuiltinType::Long:
10302 EncType = "sl";
10303 break;
10304 case BuiltinType::ULongLong:
10305 EncType = "ull";
10306 break;
10307 case BuiltinType::LongLong:
10308 EncType = "sll";
10309 break;
10310 case BuiltinType::Float:
10311 EncType = "ft";
10312 break;
10313 case BuiltinType::Double:
10314 EncType = "d";
10315 break;
10316 case BuiltinType::LongDouble:
10317 EncType = "ld";
10318 break;
10319 default:
10320 return false;
10321 }
10322 Enc += EncType;
10323 return true;
10324 }
10325
10326 /// Appends a pointer encoding to Enc before calling appendType for the pointee.
appendPointerType(SmallStringEnc & Enc,const PointerType * PT,const CodeGen::CodeGenModule & CGM,TypeStringCache & TSC)10327 static bool appendPointerType(SmallStringEnc &Enc, const PointerType *PT,
10328 const CodeGen::CodeGenModule &CGM,
10329 TypeStringCache &TSC) {
10330 Enc += "p(";
10331 if (!appendType(Enc, PT->getPointeeType(), CGM, TSC))
10332 return false;
10333 Enc += ')';
10334 return true;
10335 }
10336
10337 /// Appends array encoding to Enc before calling appendType for the element.
appendArrayType(SmallStringEnc & Enc,QualType QT,const ArrayType * AT,const CodeGen::CodeGenModule & CGM,TypeStringCache & TSC,StringRef NoSizeEnc)10338 static bool appendArrayType(SmallStringEnc &Enc, QualType QT,
10339 const ArrayType *AT,
10340 const CodeGen::CodeGenModule &CGM,
10341 TypeStringCache &TSC, StringRef NoSizeEnc) {
10342 if (AT->getSizeModifier() != ArrayType::Normal)
10343 return false;
10344 Enc += "a(";
10345 if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT))
10346 CAT->getSize().toStringUnsigned(Enc);
10347 else
10348 Enc += NoSizeEnc; // Global arrays use "*", otherwise it is "".
10349 Enc += ':';
10350 // The Qualifiers should be attached to the type rather than the array.
10351 appendQualifier(Enc, QT);
10352 if (!appendType(Enc, AT->getElementType(), CGM, TSC))
10353 return false;
10354 Enc += ')';
10355 return true;
10356 }
10357
10358 /// Appends a function encoding to Enc, calling appendType for the return type
10359 /// and the arguments.
appendFunctionType(SmallStringEnc & Enc,const FunctionType * FT,const CodeGen::CodeGenModule & CGM,TypeStringCache & TSC)10360 static bool appendFunctionType(SmallStringEnc &Enc, const FunctionType *FT,
10361 const CodeGen::CodeGenModule &CGM,
10362 TypeStringCache &TSC) {
10363 Enc += "f{";
10364 if (!appendType(Enc, FT->getReturnType(), CGM, TSC))
10365 return false;
10366 Enc += "}(";
10367 if (const FunctionProtoType *FPT = FT->getAs<FunctionProtoType>()) {
10368 // N.B. we are only interested in the adjusted param types.
10369 auto I = FPT->param_type_begin();
10370 auto E = FPT->param_type_end();
10371 if (I != E) {
10372 do {
10373 if (!appendType(Enc, *I, CGM, TSC))
10374 return false;
10375 ++I;
10376 if (I != E)
10377 Enc += ',';
10378 } while (I != E);
10379 if (FPT->isVariadic())
10380 Enc += ",va";
10381 } else {
10382 if (FPT->isVariadic())
10383 Enc += "va";
10384 else
10385 Enc += '0';
10386 }
10387 }
10388 Enc += ')';
10389 return true;
10390 }
10391
10392 /// Handles the type's qualifier before dispatching a call to handle specific
10393 /// type encodings.
appendType(SmallStringEnc & Enc,QualType QType,const CodeGen::CodeGenModule & CGM,TypeStringCache & TSC)10394 static bool appendType(SmallStringEnc &Enc, QualType QType,
10395 const CodeGen::CodeGenModule &CGM,
10396 TypeStringCache &TSC) {
10397
10398 QualType QT = QType.getCanonicalType();
10399
10400 if (const ArrayType *AT = QT->getAsArrayTypeUnsafe())
10401 // The Qualifiers should be attached to the type rather than the array.
10402 // Thus we don't call appendQualifier() here.
10403 return appendArrayType(Enc, QT, AT, CGM, TSC, "");
10404
10405 appendQualifier(Enc, QT);
10406
10407 if (const BuiltinType *BT = QT->getAs<BuiltinType>())
10408 return appendBuiltinType(Enc, BT);
10409
10410 if (const PointerType *PT = QT->getAs<PointerType>())
10411 return appendPointerType(Enc, PT, CGM, TSC);
10412
10413 if (const EnumType *ET = QT->getAs<EnumType>())
10414 return appendEnumType(Enc, ET, TSC, QT.getBaseTypeIdentifier());
10415
10416 if (const RecordType *RT = QT->getAsStructureType())
10417 return appendRecordType(Enc, RT, CGM, TSC, QT.getBaseTypeIdentifier());
10418
10419 if (const RecordType *RT = QT->getAsUnionType())
10420 return appendRecordType(Enc, RT, CGM, TSC, QT.getBaseTypeIdentifier());
10421
10422 if (const FunctionType *FT = QT->getAs<FunctionType>())
10423 return appendFunctionType(Enc, FT, CGM, TSC);
10424
10425 return false;
10426 }
10427
getTypeString(SmallStringEnc & Enc,const Decl * D,const CodeGen::CodeGenModule & CGM,TypeStringCache & TSC)10428 static bool getTypeString(SmallStringEnc &Enc, const Decl *D,
10429 const CodeGen::CodeGenModule &CGM,
10430 TypeStringCache &TSC) {
10431 if (!D)
10432 return false;
10433
10434 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
10435 if (FD->getLanguageLinkage() != CLanguageLinkage)
10436 return false;
10437 return appendType(Enc, FD->getType(), CGM, TSC);
10438 }
10439
10440 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
10441 if (VD->getLanguageLinkage() != CLanguageLinkage)
10442 return false;
10443 QualType QT = VD->getType().getCanonicalType();
10444 if (const ArrayType *AT = QT->getAsArrayTypeUnsafe()) {
10445 // Global ArrayTypes are given a size of '*' if the size is unknown.
10446 // The Qualifiers should be attached to the type rather than the array.
10447 // Thus we don't call appendQualifier() here.
10448 return appendArrayType(Enc, QT, AT, CGM, TSC, "*");
10449 }
10450 return appendType(Enc, QT, CGM, TSC);
10451 }
10452 return false;
10453 }
10454
10455 //===----------------------------------------------------------------------===//
10456 // RISCV ABI Implementation
10457 //===----------------------------------------------------------------------===//
10458
10459 namespace {
10460 class RISCVABIInfo : public DefaultABIInfo {
10461 private:
10462 // Size of the integer ('x') registers in bits.
10463 unsigned XLen;
10464 // Size of the floating point ('f') registers in bits. Note that the target
10465 // ISA might have a wider FLen than the selected ABI (e.g. an RV32IF target
10466 // with soft float ABI has FLen==0).
10467 unsigned FLen;
10468 static const int NumArgGPRs = 8;
10469 static const int NumArgFPRs = 8;
10470 bool detectFPCCEligibleStructHelper(QualType Ty, CharUnits CurOff,
10471 llvm::Type *&Field1Ty,
10472 CharUnits &Field1Off,
10473 llvm::Type *&Field2Ty,
10474 CharUnits &Field2Off) const;
10475
10476 public:
RISCVABIInfo(CodeGen::CodeGenTypes & CGT,unsigned XLen,unsigned FLen)10477 RISCVABIInfo(CodeGen::CodeGenTypes &CGT, unsigned XLen, unsigned FLen)
10478 : DefaultABIInfo(CGT), XLen(XLen), FLen(FLen) {}
10479
10480 // DefaultABIInfo's classifyReturnType and classifyArgumentType are
10481 // non-virtual, but computeInfo is virtual, so we overload it.
10482 void computeInfo(CGFunctionInfo &FI) const override;
10483
10484 ABIArgInfo classifyArgumentType(QualType Ty, bool IsFixed, int &ArgGPRsLeft,
10485 int &ArgFPRsLeft) const;
10486 ABIArgInfo classifyReturnType(QualType RetTy) const;
10487
10488 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
10489 QualType Ty) const override;
10490
10491 ABIArgInfo extendType(QualType Ty) const;
10492
10493 bool detectFPCCEligibleStruct(QualType Ty, llvm::Type *&Field1Ty,
10494 CharUnits &Field1Off, llvm::Type *&Field2Ty,
10495 CharUnits &Field2Off, int &NeededArgGPRs,
10496 int &NeededArgFPRs) const;
10497 ABIArgInfo coerceAndExpandFPCCEligibleStruct(llvm::Type *Field1Ty,
10498 CharUnits Field1Off,
10499 llvm::Type *Field2Ty,
10500 CharUnits Field2Off) const;
10501 };
10502 } // end anonymous namespace
10503
computeInfo(CGFunctionInfo & FI) const10504 void RISCVABIInfo::computeInfo(CGFunctionInfo &FI) const {
10505 QualType RetTy = FI.getReturnType();
10506 if (!getCXXABI().classifyReturnType(FI))
10507 FI.getReturnInfo() = classifyReturnType(RetTy);
10508
10509 // IsRetIndirect is true if classifyArgumentType indicated the value should
10510 // be passed indirect, or if the type size is a scalar greater than 2*XLen
10511 // and not a complex type with elements <= FLen. e.g. fp128 is passed direct
10512 // in LLVM IR, relying on the backend lowering code to rewrite the argument
10513 // list and pass indirectly on RV32.
10514 bool IsRetIndirect = FI.getReturnInfo().getKind() == ABIArgInfo::Indirect;
10515 if (!IsRetIndirect && RetTy->isScalarType() &&
10516 getContext().getTypeSize(RetTy) > (2 * XLen)) {
10517 if (RetTy->isComplexType() && FLen) {
10518 QualType EltTy = RetTy->castAs<ComplexType>()->getElementType();
10519 IsRetIndirect = getContext().getTypeSize(EltTy) > FLen;
10520 } else {
10521 // This is a normal scalar > 2*XLen, such as fp128 on RV32.
10522 IsRetIndirect = true;
10523 }
10524 }
10525
10526 // We must track the number of GPRs used in order to conform to the RISC-V
10527 // ABI, as integer scalars passed in registers should have signext/zeroext
10528 // when promoted, but are anyext if passed on the stack. As GPR usage is
10529 // different for variadic arguments, we must also track whether we are
10530 // examining a vararg or not.
10531 int ArgGPRsLeft = IsRetIndirect ? NumArgGPRs - 1 : NumArgGPRs;
10532 int ArgFPRsLeft = FLen ? NumArgFPRs : 0;
10533 int NumFixedArgs = FI.getNumRequiredArgs();
10534
10535 int ArgNum = 0;
10536 for (auto &ArgInfo : FI.arguments()) {
10537 bool IsFixed = ArgNum < NumFixedArgs;
10538 ArgInfo.info =
10539 classifyArgumentType(ArgInfo.type, IsFixed, ArgGPRsLeft, ArgFPRsLeft);
10540 ArgNum++;
10541 }
10542 }
10543
10544 // Returns true if the struct is a potential candidate for the floating point
10545 // calling convention. If this function returns true, the caller is
10546 // responsible for checking that if there is only a single field then that
10547 // field is a float.
detectFPCCEligibleStructHelper(QualType Ty,CharUnits CurOff,llvm::Type * & Field1Ty,CharUnits & Field1Off,llvm::Type * & Field2Ty,CharUnits & Field2Off) const10548 bool RISCVABIInfo::detectFPCCEligibleStructHelper(QualType Ty, CharUnits CurOff,
10549 llvm::Type *&Field1Ty,
10550 CharUnits &Field1Off,
10551 llvm::Type *&Field2Ty,
10552 CharUnits &Field2Off) const {
10553 bool IsInt = Ty->isIntegralOrEnumerationType();
10554 bool IsFloat = Ty->isRealFloatingType();
10555
10556 if (IsInt || IsFloat) {
10557 uint64_t Size = getContext().getTypeSize(Ty);
10558 if (IsInt && Size > XLen)
10559 return false;
10560 // Can't be eligible if larger than the FP registers. Half precision isn't
10561 // currently supported on RISC-V and the ABI hasn't been confirmed, so
10562 // default to the integer ABI in that case.
10563 if (IsFloat && (Size > FLen || Size < 32))
10564 return false;
10565 // Can't be eligible if an integer type was already found (int+int pairs
10566 // are not eligible).
10567 if (IsInt && Field1Ty && Field1Ty->isIntegerTy())
10568 return false;
10569 if (!Field1Ty) {
10570 Field1Ty = CGT.ConvertType(Ty);
10571 Field1Off = CurOff;
10572 return true;
10573 }
10574 if (!Field2Ty) {
10575 Field2Ty = CGT.ConvertType(Ty);
10576 Field2Off = CurOff;
10577 return true;
10578 }
10579 return false;
10580 }
10581
10582 if (auto CTy = Ty->getAs<ComplexType>()) {
10583 if (Field1Ty)
10584 return false;
10585 QualType EltTy = CTy->getElementType();
10586 if (getContext().getTypeSize(EltTy) > FLen)
10587 return false;
10588 Field1Ty = CGT.ConvertType(EltTy);
10589 Field1Off = CurOff;
10590 Field2Ty = Field1Ty;
10591 Field2Off = Field1Off + getContext().getTypeSizeInChars(EltTy);
10592 return true;
10593 }
10594
10595 if (const ConstantArrayType *ATy = getContext().getAsConstantArrayType(Ty)) {
10596 uint64_t ArraySize = ATy->getSize().getZExtValue();
10597 QualType EltTy = ATy->getElementType();
10598 CharUnits EltSize = getContext().getTypeSizeInChars(EltTy);
10599 for (uint64_t i = 0; i < ArraySize; ++i) {
10600 bool Ret = detectFPCCEligibleStructHelper(EltTy, CurOff, Field1Ty,
10601 Field1Off, Field2Ty, Field2Off);
10602 if (!Ret)
10603 return false;
10604 CurOff += EltSize;
10605 }
10606 return true;
10607 }
10608
10609 if (const auto *RTy = Ty->getAs<RecordType>()) {
10610 // Structures with either a non-trivial destructor or a non-trivial
10611 // copy constructor are not eligible for the FP calling convention.
10612 if (getRecordArgABI(Ty, CGT.getCXXABI()))
10613 return false;
10614 if (isEmptyRecord(getContext(), Ty, true))
10615 return true;
10616 const RecordDecl *RD = RTy->getDecl();
10617 // Unions aren't eligible unless they're empty (which is caught above).
10618 if (RD->isUnion())
10619 return false;
10620 int ZeroWidthBitFieldCount = 0;
10621 for (const FieldDecl *FD : RD->fields()) {
10622 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
10623 uint64_t FieldOffInBits = Layout.getFieldOffset(FD->getFieldIndex());
10624 QualType QTy = FD->getType();
10625 if (FD->isBitField()) {
10626 unsigned BitWidth = FD->getBitWidthValue(getContext());
10627 // Allow a bitfield with a type greater than XLen as long as the
10628 // bitwidth is XLen or less.
10629 if (getContext().getTypeSize(QTy) > XLen && BitWidth <= XLen)
10630 QTy = getContext().getIntTypeForBitwidth(XLen, false);
10631 if (BitWidth == 0) {
10632 ZeroWidthBitFieldCount++;
10633 continue;
10634 }
10635 }
10636
10637 bool Ret = detectFPCCEligibleStructHelper(
10638 QTy, CurOff + getContext().toCharUnitsFromBits(FieldOffInBits),
10639 Field1Ty, Field1Off, Field2Ty, Field2Off);
10640 if (!Ret)
10641 return false;
10642
10643 // As a quirk of the ABI, zero-width bitfields aren't ignored for fp+fp
10644 // or int+fp structs, but are ignored for a struct with an fp field and
10645 // any number of zero-width bitfields.
10646 if (Field2Ty && ZeroWidthBitFieldCount > 0)
10647 return false;
10648 }
10649 return Field1Ty != nullptr;
10650 }
10651
10652 return false;
10653 }
10654
10655 // Determine if a struct is eligible for passing according to the floating
10656 // point calling convention (i.e., when flattened it contains a single fp
10657 // value, fp+fp, or int+fp of appropriate size). If so, NeededArgFPRs and
10658 // NeededArgGPRs are incremented appropriately.
detectFPCCEligibleStruct(QualType Ty,llvm::Type * & Field1Ty,CharUnits & Field1Off,llvm::Type * & Field2Ty,CharUnits & Field2Off,int & NeededArgGPRs,int & NeededArgFPRs) const10659 bool RISCVABIInfo::detectFPCCEligibleStruct(QualType Ty, llvm::Type *&Field1Ty,
10660 CharUnits &Field1Off,
10661 llvm::Type *&Field2Ty,
10662 CharUnits &Field2Off,
10663 int &NeededArgGPRs,
10664 int &NeededArgFPRs) const {
10665 Field1Ty = nullptr;
10666 Field2Ty = nullptr;
10667 NeededArgGPRs = 0;
10668 NeededArgFPRs = 0;
10669 bool IsCandidate = detectFPCCEligibleStructHelper(
10670 Ty, CharUnits::Zero(), Field1Ty, Field1Off, Field2Ty, Field2Off);
10671 // Not really a candidate if we have a single int but no float.
10672 if (Field1Ty && !Field2Ty && !Field1Ty->isFloatingPointTy())
10673 return false;
10674 if (!IsCandidate)
10675 return false;
10676 if (Field1Ty && Field1Ty->isFloatingPointTy())
10677 NeededArgFPRs++;
10678 else if (Field1Ty)
10679 NeededArgGPRs++;
10680 if (Field2Ty && Field2Ty->isFloatingPointTy())
10681 NeededArgFPRs++;
10682 else if (Field2Ty)
10683 NeededArgGPRs++;
10684 return true;
10685 }
10686
10687 // Call getCoerceAndExpand for the two-element flattened struct described by
10688 // Field1Ty, Field1Off, Field2Ty, Field2Off. This method will create an
10689 // appropriate coerceToType and unpaddedCoerceToType.
coerceAndExpandFPCCEligibleStruct(llvm::Type * Field1Ty,CharUnits Field1Off,llvm::Type * Field2Ty,CharUnits Field2Off) const10690 ABIArgInfo RISCVABIInfo::coerceAndExpandFPCCEligibleStruct(
10691 llvm::Type *Field1Ty, CharUnits Field1Off, llvm::Type *Field2Ty,
10692 CharUnits Field2Off) const {
10693 SmallVector<llvm::Type *, 3> CoerceElts;
10694 SmallVector<llvm::Type *, 2> UnpaddedCoerceElts;
10695 if (!Field1Off.isZero())
10696 CoerceElts.push_back(llvm::ArrayType::get(
10697 llvm::Type::getInt8Ty(getVMContext()), Field1Off.getQuantity()));
10698
10699 CoerceElts.push_back(Field1Ty);
10700 UnpaddedCoerceElts.push_back(Field1Ty);
10701
10702 if (!Field2Ty) {
10703 return ABIArgInfo::getCoerceAndExpand(
10704 llvm::StructType::get(getVMContext(), CoerceElts, !Field1Off.isZero()),
10705 UnpaddedCoerceElts[0]);
10706 }
10707
10708 CharUnits Field2Align =
10709 CharUnits::fromQuantity(getDataLayout().getABITypeAlignment(Field2Ty));
10710 CharUnits Field1End = Field1Off +
10711 CharUnits::fromQuantity(getDataLayout().getTypeStoreSize(Field1Ty));
10712 CharUnits Field2OffNoPadNoPack = Field1End.alignTo(Field2Align);
10713
10714 CharUnits Padding = CharUnits::Zero();
10715 if (Field2Off > Field2OffNoPadNoPack)
10716 Padding = Field2Off - Field2OffNoPadNoPack;
10717 else if (Field2Off != Field2Align && Field2Off > Field1End)
10718 Padding = Field2Off - Field1End;
10719
10720 bool IsPacked = !Field2Off.isMultipleOf(Field2Align);
10721
10722 if (!Padding.isZero())
10723 CoerceElts.push_back(llvm::ArrayType::get(
10724 llvm::Type::getInt8Ty(getVMContext()), Padding.getQuantity()));
10725
10726 CoerceElts.push_back(Field2Ty);
10727 UnpaddedCoerceElts.push_back(Field2Ty);
10728
10729 auto CoerceToType =
10730 llvm::StructType::get(getVMContext(), CoerceElts, IsPacked);
10731 auto UnpaddedCoerceToType =
10732 llvm::StructType::get(getVMContext(), UnpaddedCoerceElts, IsPacked);
10733
10734 return ABIArgInfo::getCoerceAndExpand(CoerceToType, UnpaddedCoerceToType);
10735 }
10736
classifyArgumentType(QualType Ty,bool IsFixed,int & ArgGPRsLeft,int & ArgFPRsLeft) const10737 ABIArgInfo RISCVABIInfo::classifyArgumentType(QualType Ty, bool IsFixed,
10738 int &ArgGPRsLeft,
10739 int &ArgFPRsLeft) const {
10740 assert(ArgGPRsLeft <= NumArgGPRs && "Arg GPR tracking underflow");
10741 Ty = useFirstFieldIfTransparentUnion(Ty);
10742
10743 // Structures with either a non-trivial destructor or a non-trivial
10744 // copy constructor are always passed indirectly.
10745 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI())) {
10746 if (ArgGPRsLeft)
10747 ArgGPRsLeft -= 1;
10748 return getNaturalAlignIndirect(Ty, /*ByVal=*/RAA ==
10749 CGCXXABI::RAA_DirectInMemory);
10750 }
10751
10752 // Ignore empty structs/unions.
10753 if (isEmptyRecord(getContext(), Ty, true))
10754 return ABIArgInfo::getIgnore();
10755
10756 uint64_t Size = getContext().getTypeSize(Ty);
10757
10758 // Pass floating point values via FPRs if possible.
10759 if (IsFixed && Ty->isFloatingType() && !Ty->isComplexType() &&
10760 FLen >= Size && ArgFPRsLeft) {
10761 ArgFPRsLeft--;
10762 return ABIArgInfo::getDirect();
10763 }
10764
10765 // Complex types for the hard float ABI must be passed direct rather than
10766 // using CoerceAndExpand.
10767 if (IsFixed && Ty->isComplexType() && FLen && ArgFPRsLeft >= 2) {
10768 QualType EltTy = Ty->castAs<ComplexType>()->getElementType();
10769 if (getContext().getTypeSize(EltTy) <= FLen) {
10770 ArgFPRsLeft -= 2;
10771 return ABIArgInfo::getDirect();
10772 }
10773 }
10774
10775 if (IsFixed && FLen && Ty->isStructureOrClassType()) {
10776 llvm::Type *Field1Ty = nullptr;
10777 llvm::Type *Field2Ty = nullptr;
10778 CharUnits Field1Off = CharUnits::Zero();
10779 CharUnits Field2Off = CharUnits::Zero();
10780 int NeededArgGPRs = 0;
10781 int NeededArgFPRs = 0;
10782 bool IsCandidate =
10783 detectFPCCEligibleStruct(Ty, Field1Ty, Field1Off, Field2Ty, Field2Off,
10784 NeededArgGPRs, NeededArgFPRs);
10785 if (IsCandidate && NeededArgGPRs <= ArgGPRsLeft &&
10786 NeededArgFPRs <= ArgFPRsLeft) {
10787 ArgGPRsLeft -= NeededArgGPRs;
10788 ArgFPRsLeft -= NeededArgFPRs;
10789 return coerceAndExpandFPCCEligibleStruct(Field1Ty, Field1Off, Field2Ty,
10790 Field2Off);
10791 }
10792 }
10793
10794 uint64_t NeededAlign = getContext().getTypeAlign(Ty);
10795 bool MustUseStack = false;
10796 // Determine the number of GPRs needed to pass the current argument
10797 // according to the ABI. 2*XLen-aligned varargs are passed in "aligned"
10798 // register pairs, so may consume 3 registers.
10799 int NeededArgGPRs = 1;
10800 if (!IsFixed && NeededAlign == 2 * XLen)
10801 NeededArgGPRs = 2 + (ArgGPRsLeft % 2);
10802 else if (Size > XLen && Size <= 2 * XLen)
10803 NeededArgGPRs = 2;
10804
10805 if (NeededArgGPRs > ArgGPRsLeft) {
10806 MustUseStack = true;
10807 NeededArgGPRs = ArgGPRsLeft;
10808 }
10809
10810 ArgGPRsLeft -= NeededArgGPRs;
10811
10812 if (!isAggregateTypeForABI(Ty) && !Ty->isVectorType()) {
10813 // Treat an enum type as its underlying type.
10814 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
10815 Ty = EnumTy->getDecl()->getIntegerType();
10816
10817 // All integral types are promoted to XLen width, unless passed on the
10818 // stack.
10819 if (Size < XLen && Ty->isIntegralOrEnumerationType() && !MustUseStack) {
10820 return extendType(Ty);
10821 }
10822
10823 if (const auto *EIT = Ty->getAs<ExtIntType>()) {
10824 if (EIT->getNumBits() < XLen && !MustUseStack)
10825 return extendType(Ty);
10826 if (EIT->getNumBits() > 128 ||
10827 (!getContext().getTargetInfo().hasInt128Type() &&
10828 EIT->getNumBits() > 64))
10829 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
10830 }
10831
10832 return ABIArgInfo::getDirect();
10833 }
10834
10835 // Aggregates which are <= 2*XLen will be passed in registers if possible,
10836 // so coerce to integers.
10837 if (Size <= 2 * XLen) {
10838 unsigned Alignment = getContext().getTypeAlign(Ty);
10839
10840 // Use a single XLen int if possible, 2*XLen if 2*XLen alignment is
10841 // required, and a 2-element XLen array if only XLen alignment is required.
10842 if (Size <= XLen) {
10843 return ABIArgInfo::getDirect(
10844 llvm::IntegerType::get(getVMContext(), XLen));
10845 } else if (Alignment == 2 * XLen) {
10846 return ABIArgInfo::getDirect(
10847 llvm::IntegerType::get(getVMContext(), 2 * XLen));
10848 } else {
10849 return ABIArgInfo::getDirect(llvm::ArrayType::get(
10850 llvm::IntegerType::get(getVMContext(), XLen), 2));
10851 }
10852 }
10853 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
10854 }
10855
classifyReturnType(QualType RetTy) const10856 ABIArgInfo RISCVABIInfo::classifyReturnType(QualType RetTy) const {
10857 if (RetTy->isVoidType())
10858 return ABIArgInfo::getIgnore();
10859
10860 int ArgGPRsLeft = 2;
10861 int ArgFPRsLeft = FLen ? 2 : 0;
10862
10863 // The rules for return and argument types are the same, so defer to
10864 // classifyArgumentType.
10865 return classifyArgumentType(RetTy, /*IsFixed=*/true, ArgGPRsLeft,
10866 ArgFPRsLeft);
10867 }
10868
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const10869 Address RISCVABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
10870 QualType Ty) const {
10871 CharUnits SlotSize = CharUnits::fromQuantity(XLen / 8);
10872
10873 // Empty records are ignored for parameter passing purposes.
10874 if (isEmptyRecord(getContext(), Ty, true)) {
10875 Address Addr(CGF.Builder.CreateLoad(VAListAddr), SlotSize);
10876 Addr = CGF.Builder.CreateElementBitCast(Addr, CGF.ConvertTypeForMem(Ty));
10877 return Addr;
10878 }
10879
10880 auto TInfo = getContext().getTypeInfoInChars(Ty);
10881
10882 // Arguments bigger than 2*Xlen bytes are passed indirectly.
10883 bool IsIndirect = TInfo.Width > 2 * SlotSize;
10884
10885 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, IsIndirect, TInfo,
10886 SlotSize, /*AllowHigherAlign=*/true);
10887 }
10888
extendType(QualType Ty) const10889 ABIArgInfo RISCVABIInfo::extendType(QualType Ty) const {
10890 int TySize = getContext().getTypeSize(Ty);
10891 // RV64 ABI requires unsigned 32 bit integers to be sign extended.
10892 if (XLen == 64 && Ty->isUnsignedIntegerOrEnumerationType() && TySize == 32)
10893 return ABIArgInfo::getSignExtend(Ty);
10894 return ABIArgInfo::getExtend(Ty);
10895 }
10896
10897 namespace {
10898 class RISCVTargetCodeGenInfo : public TargetCodeGenInfo {
10899 public:
RISCVTargetCodeGenInfo(CodeGen::CodeGenTypes & CGT,unsigned XLen,unsigned FLen)10900 RISCVTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, unsigned XLen,
10901 unsigned FLen)
10902 : TargetCodeGenInfo(std::make_unique<RISCVABIInfo>(CGT, XLen, FLen)) {}
10903
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const10904 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
10905 CodeGen::CodeGenModule &CGM) const override {
10906 const auto *FD = dyn_cast_or_null<FunctionDecl>(D);
10907 if (!FD) return;
10908
10909 const auto *Attr = FD->getAttr<RISCVInterruptAttr>();
10910 if (!Attr)
10911 return;
10912
10913 const char *Kind;
10914 switch (Attr->getInterrupt()) {
10915 case RISCVInterruptAttr::user: Kind = "user"; break;
10916 case RISCVInterruptAttr::supervisor: Kind = "supervisor"; break;
10917 case RISCVInterruptAttr::machine: Kind = "machine"; break;
10918 }
10919
10920 auto *Fn = cast<llvm::Function>(GV);
10921
10922 Fn->addFnAttr("interrupt", Kind);
10923 }
10924 };
10925 } // namespace
10926
10927 //===----------------------------------------------------------------------===//
10928 // VE ABI Implementation.
10929 //
10930 namespace {
10931 class VEABIInfo : public DefaultABIInfo {
10932 public:
VEABIInfo(CodeGenTypes & CGT)10933 VEABIInfo(CodeGenTypes &CGT) : DefaultABIInfo(CGT) {}
10934
10935 private:
10936 ABIArgInfo classifyReturnType(QualType RetTy) const;
10937 ABIArgInfo classifyArgumentType(QualType RetTy) const;
10938 void computeInfo(CGFunctionInfo &FI) const override;
10939 };
10940 } // end anonymous namespace
10941
classifyReturnType(QualType Ty) const10942 ABIArgInfo VEABIInfo::classifyReturnType(QualType Ty) const {
10943 if (Ty->isAnyComplexType())
10944 return ABIArgInfo::getDirect();
10945 uint64_t Size = getContext().getTypeSize(Ty);
10946 if (Size < 64 && Ty->isIntegerType())
10947 return ABIArgInfo::getExtend(Ty);
10948 return DefaultABIInfo::classifyReturnType(Ty);
10949 }
10950
classifyArgumentType(QualType Ty) const10951 ABIArgInfo VEABIInfo::classifyArgumentType(QualType Ty) const {
10952 if (Ty->isAnyComplexType())
10953 return ABIArgInfo::getDirect();
10954 uint64_t Size = getContext().getTypeSize(Ty);
10955 if (Size < 64 && Ty->isIntegerType())
10956 return ABIArgInfo::getExtend(Ty);
10957 return DefaultABIInfo::classifyArgumentType(Ty);
10958 }
10959
computeInfo(CGFunctionInfo & FI) const10960 void VEABIInfo::computeInfo(CGFunctionInfo &FI) const {
10961 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
10962 for (auto &Arg : FI.arguments())
10963 Arg.info = classifyArgumentType(Arg.type);
10964 }
10965
10966 namespace {
10967 class VETargetCodeGenInfo : public TargetCodeGenInfo {
10968 public:
VETargetCodeGenInfo(CodeGenTypes & CGT)10969 VETargetCodeGenInfo(CodeGenTypes &CGT)
10970 : TargetCodeGenInfo(std::make_unique<VEABIInfo>(CGT)) {}
10971 // VE ABI requires the arguments of variadic and prototype-less functions
10972 // are passed in both registers and memory.
isNoProtoCallVariadic(const CallArgList & args,const FunctionNoProtoType * fnType) const10973 bool isNoProtoCallVariadic(const CallArgList &args,
10974 const FunctionNoProtoType *fnType) const override {
10975 return true;
10976 }
10977 };
10978 } // end anonymous namespace
10979
10980 //===----------------------------------------------------------------------===//
10981 // Driver code
10982 //===----------------------------------------------------------------------===//
10983
supportsCOMDAT() const10984 bool CodeGenModule::supportsCOMDAT() const {
10985 return getTriple().supportsCOMDAT();
10986 }
10987
getTargetCodeGenInfo()10988 const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() {
10989 if (TheTargetCodeGenInfo)
10990 return *TheTargetCodeGenInfo;
10991
10992 // Helper to set the unique_ptr while still keeping the return value.
10993 auto SetCGInfo = [&](TargetCodeGenInfo *P) -> const TargetCodeGenInfo & {
10994 this->TheTargetCodeGenInfo.reset(P);
10995 return *P;
10996 };
10997
10998 const llvm::Triple &Triple = getTarget().getTriple();
10999 switch (Triple.getArch()) {
11000 default:
11001 return SetCGInfo(new DefaultTargetCodeGenInfo(Types));
11002
11003 case llvm::Triple::le32:
11004 return SetCGInfo(new PNaClTargetCodeGenInfo(Types));
11005 case llvm::Triple::m68k:
11006 return SetCGInfo(new M68kTargetCodeGenInfo(Types));
11007 case llvm::Triple::mips:
11008 case llvm::Triple::mipsel:
11009 if (Triple.getOS() == llvm::Triple::NaCl)
11010 return SetCGInfo(new PNaClTargetCodeGenInfo(Types));
11011 return SetCGInfo(new MIPSTargetCodeGenInfo(Types, true));
11012
11013 case llvm::Triple::mips64:
11014 case llvm::Triple::mips64el:
11015 return SetCGInfo(new MIPSTargetCodeGenInfo(Types, false));
11016
11017 case llvm::Triple::avr:
11018 return SetCGInfo(new AVRTargetCodeGenInfo(Types));
11019
11020 case llvm::Triple::aarch64:
11021 case llvm::Triple::aarch64_32:
11022 case llvm::Triple::aarch64_be: {
11023 AArch64ABIInfo::ABIKind Kind = AArch64ABIInfo::AAPCS;
11024 if (getTarget().getABI() == "darwinpcs")
11025 Kind = AArch64ABIInfo::DarwinPCS;
11026 else if (Triple.isOSWindows())
11027 return SetCGInfo(
11028 new WindowsAArch64TargetCodeGenInfo(Types, AArch64ABIInfo::Win64));
11029
11030 return SetCGInfo(new AArch64TargetCodeGenInfo(Types, Kind));
11031 }
11032
11033 case llvm::Triple::wasm32:
11034 case llvm::Triple::wasm64: {
11035 WebAssemblyABIInfo::ABIKind Kind = WebAssemblyABIInfo::MVP;
11036 if (getTarget().getABI() == "experimental-mv")
11037 Kind = WebAssemblyABIInfo::ExperimentalMV;
11038 return SetCGInfo(new WebAssemblyTargetCodeGenInfo(Types, Kind));
11039 }
11040
11041 case llvm::Triple::arm:
11042 case llvm::Triple::armeb:
11043 case llvm::Triple::thumb:
11044 case llvm::Triple::thumbeb: {
11045 if (Triple.getOS() == llvm::Triple::Win32) {
11046 return SetCGInfo(
11047 new WindowsARMTargetCodeGenInfo(Types, ARMABIInfo::AAPCS_VFP));
11048 }
11049
11050 ARMABIInfo::ABIKind Kind = ARMABIInfo::AAPCS;
11051 StringRef ABIStr = getTarget().getABI();
11052 if (ABIStr == "apcs-gnu")
11053 Kind = ARMABIInfo::APCS;
11054 else if (ABIStr == "aapcs16")
11055 Kind = ARMABIInfo::AAPCS16_VFP;
11056 else if (CodeGenOpts.FloatABI == "hard" ||
11057 (CodeGenOpts.FloatABI != "soft" &&
11058 (Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
11059 Triple.getEnvironment() == llvm::Triple::MuslEABIHF ||
11060 Triple.getEnvironment() == llvm::Triple::EABIHF)))
11061 Kind = ARMABIInfo::AAPCS_VFP;
11062
11063 return SetCGInfo(new ARMTargetCodeGenInfo(Types, Kind));
11064 }
11065
11066 case llvm::Triple::ppc: {
11067 if (Triple.isOSAIX())
11068 return SetCGInfo(new AIXTargetCodeGenInfo(Types, /*Is64Bit*/ false));
11069
11070 bool IsSoftFloat =
11071 CodeGenOpts.FloatABI == "soft" || getTarget().hasFeature("spe");
11072 bool RetSmallStructInRegABI =
11073 PPC32TargetCodeGenInfo::isStructReturnInRegABI(Triple, CodeGenOpts);
11074 return SetCGInfo(
11075 new PPC32TargetCodeGenInfo(Types, IsSoftFloat, RetSmallStructInRegABI));
11076 }
11077 case llvm::Triple::ppcle: {
11078 bool IsSoftFloat = CodeGenOpts.FloatABI == "soft";
11079 bool RetSmallStructInRegABI =
11080 PPC32TargetCodeGenInfo::isStructReturnInRegABI(Triple, CodeGenOpts);
11081 return SetCGInfo(
11082 new PPC32TargetCodeGenInfo(Types, IsSoftFloat, RetSmallStructInRegABI));
11083 }
11084 case llvm::Triple::ppc64:
11085 if (Triple.isOSAIX())
11086 return SetCGInfo(new AIXTargetCodeGenInfo(Types, /*Is64Bit*/ true));
11087
11088 if (Triple.isOSBinFormatELF()) {
11089 PPC64_SVR4_ABIInfo::ABIKind Kind = PPC64_SVR4_ABIInfo::ELFv1;
11090 if (getTarget().getABI() == "elfv2")
11091 Kind = PPC64_SVR4_ABIInfo::ELFv2;
11092 bool IsSoftFloat = CodeGenOpts.FloatABI == "soft";
11093
11094 return SetCGInfo(
11095 new PPC64_SVR4_TargetCodeGenInfo(Types, Kind, IsSoftFloat));
11096 }
11097 return SetCGInfo(new PPC64TargetCodeGenInfo(Types));
11098 case llvm::Triple::ppc64le: {
11099 assert(Triple.isOSBinFormatELF() && "PPC64 LE non-ELF not supported!");
11100 PPC64_SVR4_ABIInfo::ABIKind Kind = PPC64_SVR4_ABIInfo::ELFv2;
11101 if (getTarget().getABI() == "elfv1")
11102 Kind = PPC64_SVR4_ABIInfo::ELFv1;
11103 bool IsSoftFloat = CodeGenOpts.FloatABI == "soft";
11104
11105 return SetCGInfo(
11106 new PPC64_SVR4_TargetCodeGenInfo(Types, Kind, IsSoftFloat));
11107 }
11108
11109 case llvm::Triple::nvptx:
11110 case llvm::Triple::nvptx64:
11111 return SetCGInfo(new NVPTXTargetCodeGenInfo(Types));
11112
11113 case llvm::Triple::msp430:
11114 return SetCGInfo(new MSP430TargetCodeGenInfo(Types));
11115
11116 case llvm::Triple::riscv32:
11117 case llvm::Triple::riscv64: {
11118 StringRef ABIStr = getTarget().getABI();
11119 unsigned XLen = getTarget().getPointerWidth(0);
11120 unsigned ABIFLen = 0;
11121 if (ABIStr.endswith("f"))
11122 ABIFLen = 32;
11123 else if (ABIStr.endswith("d"))
11124 ABIFLen = 64;
11125 return SetCGInfo(new RISCVTargetCodeGenInfo(Types, XLen, ABIFLen));
11126 }
11127
11128 case llvm::Triple::systemz: {
11129 bool SoftFloat = CodeGenOpts.FloatABI == "soft";
11130 bool HasVector = !SoftFloat && getTarget().getABI() == "vector";
11131 return SetCGInfo(new SystemZTargetCodeGenInfo(Types, HasVector, SoftFloat));
11132 }
11133
11134 case llvm::Triple::tce:
11135 case llvm::Triple::tcele:
11136 return SetCGInfo(new TCETargetCodeGenInfo(Types));
11137
11138 case llvm::Triple::x86: {
11139 bool IsDarwinVectorABI = Triple.isOSDarwin();
11140 bool RetSmallStructInRegABI =
11141 X86_32TargetCodeGenInfo::isStructReturnInRegABI(Triple, CodeGenOpts);
11142 bool IsWin32FloatStructABI = Triple.isOSWindows() && !Triple.isOSCygMing();
11143
11144 if (Triple.getOS() == llvm::Triple::Win32) {
11145 return SetCGInfo(new WinX86_32TargetCodeGenInfo(
11146 Types, IsDarwinVectorABI, RetSmallStructInRegABI,
11147 IsWin32FloatStructABI, CodeGenOpts.NumRegisterParameters));
11148 } else {
11149 return SetCGInfo(new X86_32TargetCodeGenInfo(
11150 Types, IsDarwinVectorABI, RetSmallStructInRegABI,
11151 IsWin32FloatStructABI, CodeGenOpts.NumRegisterParameters,
11152 CodeGenOpts.FloatABI == "soft"));
11153 }
11154 }
11155
11156 case llvm::Triple::x86_64: {
11157 StringRef ABI = getTarget().getABI();
11158 X86AVXABILevel AVXLevel =
11159 (ABI == "avx512"
11160 ? X86AVXABILevel::AVX512
11161 : ABI == "avx" ? X86AVXABILevel::AVX : X86AVXABILevel::None);
11162
11163 switch (Triple.getOS()) {
11164 case llvm::Triple::Win32:
11165 return SetCGInfo(new WinX86_64TargetCodeGenInfo(Types, AVXLevel));
11166 default:
11167 return SetCGInfo(new X86_64TargetCodeGenInfo(Types, AVXLevel));
11168 }
11169 }
11170 case llvm::Triple::hexagon:
11171 return SetCGInfo(new HexagonTargetCodeGenInfo(Types));
11172 case llvm::Triple::lanai:
11173 return SetCGInfo(new LanaiTargetCodeGenInfo(Types));
11174 case llvm::Triple::r600:
11175 return SetCGInfo(new AMDGPUTargetCodeGenInfo(Types));
11176 case llvm::Triple::amdgcn:
11177 return SetCGInfo(new AMDGPUTargetCodeGenInfo(Types));
11178 case llvm::Triple::sparc:
11179 return SetCGInfo(new SparcV8TargetCodeGenInfo(Types));
11180 case llvm::Triple::sparcv9:
11181 return SetCGInfo(new SparcV9TargetCodeGenInfo(Types));
11182 case llvm::Triple::xcore:
11183 return SetCGInfo(new XCoreTargetCodeGenInfo(Types));
11184 case llvm::Triple::arc:
11185 return SetCGInfo(new ARCTargetCodeGenInfo(Types));
11186 case llvm::Triple::spir:
11187 case llvm::Triple::spir64:
11188 return SetCGInfo(new SPIRTargetCodeGenInfo(Types));
11189 case llvm::Triple::ve:
11190 return SetCGInfo(new VETargetCodeGenInfo(Types));
11191 }
11192 }
11193
11194 /// Create an OpenCL kernel for an enqueued block.
11195 ///
11196 /// The kernel has the same function type as the block invoke function. Its
11197 /// name is the name of the block invoke function postfixed with "_kernel".
11198 /// It simply calls the block invoke function then returns.
11199 llvm::Function *
createEnqueuedBlockKernel(CodeGenFunction & CGF,llvm::Function * Invoke,llvm::Value * BlockLiteral) const11200 TargetCodeGenInfo::createEnqueuedBlockKernel(CodeGenFunction &CGF,
11201 llvm::Function *Invoke,
11202 llvm::Value *BlockLiteral) const {
11203 auto *InvokeFT = Invoke->getFunctionType();
11204 llvm::SmallVector<llvm::Type *, 2> ArgTys;
11205 for (auto &P : InvokeFT->params())
11206 ArgTys.push_back(P);
11207 auto &C = CGF.getLLVMContext();
11208 std::string Name = Invoke->getName().str() + "_kernel";
11209 auto *FT = llvm::FunctionType::get(llvm::Type::getVoidTy(C), ArgTys, false);
11210 auto *F = llvm::Function::Create(FT, llvm::GlobalValue::InternalLinkage, Name,
11211 &CGF.CGM.getModule());
11212 auto IP = CGF.Builder.saveIP();
11213 auto *BB = llvm::BasicBlock::Create(C, "entry", F);
11214 auto &Builder = CGF.Builder;
11215 Builder.SetInsertPoint(BB);
11216 llvm::SmallVector<llvm::Value *, 2> Args;
11217 for (auto &A : F->args())
11218 Args.push_back(&A);
11219 llvm::CallInst *call = Builder.CreateCall(Invoke, Args);
11220 call->setCallingConv(Invoke->getCallingConv());
11221 Builder.CreateRetVoid();
11222 Builder.restoreIP(IP);
11223 return F;
11224 }
11225
11226 /// Create an OpenCL kernel for an enqueued block.
11227 ///
11228 /// The type of the first argument (the block literal) is the struct type
11229 /// of the block literal instead of a pointer type. The first argument
11230 /// (block literal) is passed directly by value to the kernel. The kernel
11231 /// allocates the same type of struct on stack and stores the block literal
11232 /// to it and passes its pointer to the block invoke function. The kernel
11233 /// has "enqueued-block" function attribute and kernel argument metadata.
createEnqueuedBlockKernel(CodeGenFunction & CGF,llvm::Function * Invoke,llvm::Value * BlockLiteral) const11234 llvm::Function *AMDGPUTargetCodeGenInfo::createEnqueuedBlockKernel(
11235 CodeGenFunction &CGF, llvm::Function *Invoke,
11236 llvm::Value *BlockLiteral) const {
11237 auto &Builder = CGF.Builder;
11238 auto &C = CGF.getLLVMContext();
11239
11240 auto *BlockTy = BlockLiteral->getType()->getPointerElementType();
11241 auto *InvokeFT = Invoke->getFunctionType();
11242 llvm::SmallVector<llvm::Type *, 2> ArgTys;
11243 llvm::SmallVector<llvm::Metadata *, 8> AddressQuals;
11244 llvm::SmallVector<llvm::Metadata *, 8> AccessQuals;
11245 llvm::SmallVector<llvm::Metadata *, 8> ArgTypeNames;
11246 llvm::SmallVector<llvm::Metadata *, 8> ArgBaseTypeNames;
11247 llvm::SmallVector<llvm::Metadata *, 8> ArgTypeQuals;
11248 llvm::SmallVector<llvm::Metadata *, 8> ArgNames;
11249
11250 ArgTys.push_back(BlockTy);
11251 ArgTypeNames.push_back(llvm::MDString::get(C, "__block_literal"));
11252 AddressQuals.push_back(llvm::ConstantAsMetadata::get(Builder.getInt32(0)));
11253 ArgBaseTypeNames.push_back(llvm::MDString::get(C, "__block_literal"));
11254 ArgTypeQuals.push_back(llvm::MDString::get(C, ""));
11255 AccessQuals.push_back(llvm::MDString::get(C, "none"));
11256 ArgNames.push_back(llvm::MDString::get(C, "block_literal"));
11257 for (unsigned I = 1, E = InvokeFT->getNumParams(); I < E; ++I) {
11258 ArgTys.push_back(InvokeFT->getParamType(I));
11259 ArgTypeNames.push_back(llvm::MDString::get(C, "void*"));
11260 AddressQuals.push_back(llvm::ConstantAsMetadata::get(Builder.getInt32(3)));
11261 AccessQuals.push_back(llvm::MDString::get(C, "none"));
11262 ArgBaseTypeNames.push_back(llvm::MDString::get(C, "void*"));
11263 ArgTypeQuals.push_back(llvm::MDString::get(C, ""));
11264 ArgNames.push_back(
11265 llvm::MDString::get(C, (Twine("local_arg") + Twine(I)).str()));
11266 }
11267 std::string Name = Invoke->getName().str() + "_kernel";
11268 auto *FT = llvm::FunctionType::get(llvm::Type::getVoidTy(C), ArgTys, false);
11269 auto *F = llvm::Function::Create(FT, llvm::GlobalValue::InternalLinkage, Name,
11270 &CGF.CGM.getModule());
11271 F->addFnAttr("enqueued-block");
11272 auto IP = CGF.Builder.saveIP();
11273 auto *BB = llvm::BasicBlock::Create(C, "entry", F);
11274 Builder.SetInsertPoint(BB);
11275 const auto BlockAlign = CGF.CGM.getDataLayout().getPrefTypeAlign(BlockTy);
11276 auto *BlockPtr = Builder.CreateAlloca(BlockTy, nullptr);
11277 BlockPtr->setAlignment(BlockAlign);
11278 Builder.CreateAlignedStore(F->arg_begin(), BlockPtr, BlockAlign);
11279 auto *Cast = Builder.CreatePointerCast(BlockPtr, InvokeFT->getParamType(0));
11280 llvm::SmallVector<llvm::Value *, 2> Args;
11281 Args.push_back(Cast);
11282 for (auto I = F->arg_begin() + 1, E = F->arg_end(); I != E; ++I)
11283 Args.push_back(I);
11284 llvm::CallInst *call = Builder.CreateCall(Invoke, Args);
11285 call->setCallingConv(Invoke->getCallingConv());
11286 Builder.CreateRetVoid();
11287 Builder.restoreIP(IP);
11288
11289 F->setMetadata("kernel_arg_addr_space", llvm::MDNode::get(C, AddressQuals));
11290 F->setMetadata("kernel_arg_access_qual", llvm::MDNode::get(C, AccessQuals));
11291 F->setMetadata("kernel_arg_type", llvm::MDNode::get(C, ArgTypeNames));
11292 F->setMetadata("kernel_arg_base_type",
11293 llvm::MDNode::get(C, ArgBaseTypeNames));
11294 F->setMetadata("kernel_arg_type_qual", llvm::MDNode::get(C, ArgTypeQuals));
11295 if (CGF.CGM.getCodeGenOpts().EmitOpenCLArgMetadata)
11296 F->setMetadata("kernel_arg_name", llvm::MDNode::get(C, ArgNames));
11297
11298 return F;
11299 }
11300