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/CodeGen/CGFunctionInfo.h"
25 #include "clang/CodeGen/SwiftCallingConv.h"
26 #include "llvm/ADT/SmallBitVector.h"
27 #include "llvm/ADT/StringExtras.h"
28 #include "llvm/ADT/StringSwitch.h"
29 #include "llvm/ADT/Triple.h"
30 #include "llvm/ADT/Twine.h"
31 #include "llvm/IR/DataLayout.h"
32 #include "llvm/IR/IntrinsicsNVPTX.h"
33 #include "llvm/IR/Type.h"
34 #include "llvm/Support/raw_ostream.h"
35 #include <algorithm> // std::sort
36
37 using namespace clang;
38 using namespace CodeGen;
39
40 // Helper for coercing an aggregate argument or return value into an integer
41 // array of the same size (including padding) and alignment. This alternate
42 // coercion happens only for the RenderScript ABI and can be removed after
43 // runtimes that rely on it are no longer supported.
44 //
45 // RenderScript assumes that the size of the argument / return value in the IR
46 // is the same as the size of the corresponding qualified type. This helper
47 // coerces the aggregate type into an array of the same size (including
48 // padding). This coercion is used in lieu of expansion of struct members or
49 // other canonical coercions that return a coerced-type of larger size.
50 //
51 // Ty - The argument / return value type
52 // Context - The associated ASTContext
53 // LLVMContext - The associated LLVMContext
coerceToIntArray(QualType Ty,ASTContext & Context,llvm::LLVMContext & LLVMContext)54 static ABIArgInfo coerceToIntArray(QualType Ty,
55 ASTContext &Context,
56 llvm::LLVMContext &LLVMContext) {
57 // Alignment and Size are measured in bits.
58 const uint64_t Size = Context.getTypeSize(Ty);
59 const uint64_t Alignment = Context.getTypeAlign(Ty);
60 llvm::Type *IntType = llvm::Type::getIntNTy(LLVMContext, Alignment);
61 const uint64_t NumElements = (Size + Alignment - 1) / Alignment;
62 return ABIArgInfo::getDirect(llvm::ArrayType::get(IntType, NumElements));
63 }
64
AssignToArrayRange(CodeGen::CGBuilderTy & Builder,llvm::Value * Array,llvm::Value * Value,unsigned FirstIndex,unsigned LastIndex)65 static void AssignToArrayRange(CodeGen::CGBuilderTy &Builder,
66 llvm::Value *Array,
67 llvm::Value *Value,
68 unsigned FirstIndex,
69 unsigned LastIndex) {
70 // Alternatively, we could emit this as a loop in the source.
71 for (unsigned I = FirstIndex; I <= LastIndex; ++I) {
72 llvm::Value *Cell =
73 Builder.CreateConstInBoundsGEP1_32(Builder.getInt8Ty(), Array, I);
74 Builder.CreateAlignedStore(Value, Cell, CharUnits::One());
75 }
76 }
77
isAggregateTypeForABI(QualType T)78 static bool isAggregateTypeForABI(QualType T) {
79 return !CodeGenFunction::hasScalarEvaluationKind(T) ||
80 T->isMemberFunctionPointerType();
81 }
82
getNaturalAlignIndirect(QualType Ty,bool ByVal,bool Realign,llvm::Type * Padding) const83 ABIArgInfo ABIInfo::getNaturalAlignIndirect(QualType Ty, bool ByVal,
84 bool Realign,
85 llvm::Type *Padding) const {
86 return ABIArgInfo::getIndirect(getContext().getTypeAlignInChars(Ty), ByVal,
87 Realign, Padding);
88 }
89
90 ABIArgInfo
getNaturalAlignIndirectInReg(QualType Ty,bool Realign) const91 ABIInfo::getNaturalAlignIndirectInReg(QualType Ty, bool Realign) const {
92 return ABIArgInfo::getIndirectInReg(getContext().getTypeAlignInChars(Ty),
93 /*ByVal*/ false, Realign);
94 }
95
EmitMSVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const96 Address ABIInfo::EmitMSVAArg(CodeGenFunction &CGF, Address VAListAddr,
97 QualType Ty) const {
98 return Address::invalid();
99 }
100
isPromotableIntegerTypeForABI(QualType Ty) const101 bool ABIInfo::isPromotableIntegerTypeForABI(QualType Ty) const {
102 if (Ty->isPromotableIntegerType())
103 return true;
104
105 if (const auto *EIT = Ty->getAs<ExtIntType>())
106 if (EIT->getNumBits() < getContext().getTypeSize(getContext().IntTy))
107 return true;
108
109 return false;
110 }
111
~ABIInfo()112 ABIInfo::~ABIInfo() {}
113
114 /// Does the given lowering require more than the given number of
115 /// registers when expanded?
116 ///
117 /// This is intended to be the basis of a reasonable basic implementation
118 /// of should{Pass,Return}IndirectlyForSwift.
119 ///
120 /// For most targets, a limit of four total registers is reasonable; this
121 /// limits the amount of code required in order to move around the value
122 /// in case it wasn't produced immediately prior to the call by the caller
123 /// (or wasn't produced in exactly the right registers) or isn't used
124 /// immediately within the callee. But some targets may need to further
125 /// limit the register count due to an inability to support that many
126 /// return registers.
occupiesMoreThan(CodeGenTypes & cgt,ArrayRef<llvm::Type * > scalarTypes,unsigned maxAllRegisters)127 static bool occupiesMoreThan(CodeGenTypes &cgt,
128 ArrayRef<llvm::Type*> scalarTypes,
129 unsigned maxAllRegisters) {
130 unsigned intCount = 0, fpCount = 0;
131 for (llvm::Type *type : scalarTypes) {
132 if (type->isPointerTy()) {
133 intCount++;
134 } else if (auto intTy = dyn_cast<llvm::IntegerType>(type)) {
135 auto ptrWidth = cgt.getTarget().getPointerWidth(0);
136 intCount += (intTy->getBitWidth() + ptrWidth - 1) / ptrWidth;
137 } else {
138 assert(type->isVectorTy() || type->isFloatingPointTy());
139 fpCount++;
140 }
141 }
142
143 return (intCount + fpCount > maxAllRegisters);
144 }
145
isLegalVectorTypeForSwift(CharUnits vectorSize,llvm::Type * eltTy,unsigned numElts) const146 bool SwiftABIInfo::isLegalVectorTypeForSwift(CharUnits vectorSize,
147 llvm::Type *eltTy,
148 unsigned numElts) const {
149 // The default implementation of this assumes that the target guarantees
150 // 128-bit SIMD support but nothing more.
151 return (vectorSize.getQuantity() > 8 && vectorSize.getQuantity() <= 16);
152 }
153
getRecordArgABI(const RecordType * RT,CGCXXABI & CXXABI)154 static CGCXXABI::RecordArgABI getRecordArgABI(const RecordType *RT,
155 CGCXXABI &CXXABI) {
156 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl());
157 if (!RD) {
158 if (!RT->getDecl()->canPassInRegisters())
159 return CGCXXABI::RAA_Indirect;
160 return CGCXXABI::RAA_Default;
161 }
162 return CXXABI.getRecordArgABI(RD);
163 }
164
getRecordArgABI(QualType T,CGCXXABI & CXXABI)165 static CGCXXABI::RecordArgABI getRecordArgABI(QualType T,
166 CGCXXABI &CXXABI) {
167 const RecordType *RT = T->getAs<RecordType>();
168 if (!RT)
169 return CGCXXABI::RAA_Default;
170 return getRecordArgABI(RT, CXXABI);
171 }
172
classifyReturnType(const CGCXXABI & CXXABI,CGFunctionInfo & FI,const ABIInfo & Info)173 static bool classifyReturnType(const CGCXXABI &CXXABI, CGFunctionInfo &FI,
174 const ABIInfo &Info) {
175 QualType Ty = FI.getReturnType();
176
177 if (const auto *RT = Ty->getAs<RecordType>())
178 if (!isa<CXXRecordDecl>(RT->getDecl()) &&
179 !RT->getDecl()->canPassInRegisters()) {
180 FI.getReturnInfo() = Info.getNaturalAlignIndirect(Ty);
181 return true;
182 }
183
184 return CXXABI.classifyReturnType(FI);
185 }
186
187 /// Pass transparent unions as if they were the type of the first element. Sema
188 /// should ensure that all elements of the union have the same "machine type".
useFirstFieldIfTransparentUnion(QualType Ty)189 static QualType useFirstFieldIfTransparentUnion(QualType Ty) {
190 if (const RecordType *UT = Ty->getAsUnionType()) {
191 const RecordDecl *UD = UT->getDecl();
192 if (UD->hasAttr<TransparentUnionAttr>()) {
193 assert(!UD->field_empty() && "sema created an empty transparent union");
194 return UD->field_begin()->getType();
195 }
196 }
197 return Ty;
198 }
199
getCXXABI() const200 CGCXXABI &ABIInfo::getCXXABI() const {
201 return CGT.getCXXABI();
202 }
203
getContext() const204 ASTContext &ABIInfo::getContext() const {
205 return CGT.getContext();
206 }
207
getVMContext() const208 llvm::LLVMContext &ABIInfo::getVMContext() const {
209 return CGT.getLLVMContext();
210 }
211
getDataLayout() const212 const llvm::DataLayout &ABIInfo::getDataLayout() const {
213 return CGT.getDataLayout();
214 }
215
getTarget() const216 const TargetInfo &ABIInfo::getTarget() const {
217 return CGT.getTarget();
218 }
219
getCodeGenOpts() const220 const CodeGenOptions &ABIInfo::getCodeGenOpts() const {
221 return CGT.getCodeGenOpts();
222 }
223
isAndroid() const224 bool ABIInfo::isAndroid() const { return getTarget().getTriple().isAndroid(); }
225
isHomogeneousAggregateBaseType(QualType Ty) const226 bool ABIInfo::isHomogeneousAggregateBaseType(QualType Ty) const {
227 return false;
228 }
229
isHomogeneousAggregateSmallEnough(const Type * Base,uint64_t Members) const230 bool ABIInfo::isHomogeneousAggregateSmallEnough(const Type *Base,
231 uint64_t Members) const {
232 return false;
233 }
234
dump() const235 LLVM_DUMP_METHOD void ABIArgInfo::dump() const {
236 raw_ostream &OS = llvm::errs();
237 OS << "(ABIArgInfo Kind=";
238 switch (TheKind) {
239 case Direct:
240 OS << "Direct Type=";
241 if (llvm::Type *Ty = getCoerceToType())
242 Ty->print(OS);
243 else
244 OS << "null";
245 break;
246 case Extend:
247 OS << "Extend";
248 break;
249 case Ignore:
250 OS << "Ignore";
251 break;
252 case InAlloca:
253 OS << "InAlloca Offset=" << getInAllocaFieldIndex();
254 break;
255 case Indirect:
256 OS << "Indirect Align=" << getIndirectAlign().getQuantity()
257 << " ByVal=" << getIndirectByVal()
258 << " Realign=" << getIndirectRealign();
259 break;
260 case IndirectAliased:
261 OS << "Indirect Align=" << getIndirectAlign().getQuantity()
262 << " AadrSpace=" << getIndirectAddrSpace()
263 << " Realign=" << getIndirectRealign();
264 break;
265 case Expand:
266 OS << "Expand";
267 break;
268 case CoerceAndExpand:
269 OS << "CoerceAndExpand Type=";
270 getCoerceAndExpandType()->print(OS);
271 break;
272 }
273 OS << ")\n";
274 }
275
276 // Dynamically round a pointer up to a multiple of the given alignment.
emitRoundPointerUpToAlignment(CodeGenFunction & CGF,llvm::Value * Ptr,CharUnits Align)277 static llvm::Value *emitRoundPointerUpToAlignment(CodeGenFunction &CGF,
278 llvm::Value *Ptr,
279 CharUnits Align) {
280 llvm::Value *PtrAsInt = Ptr;
281 // OverflowArgArea = (OverflowArgArea + Align - 1) & -Align;
282 PtrAsInt = CGF.Builder.CreatePtrToInt(PtrAsInt, CGF.IntPtrTy);
283 PtrAsInt = CGF.Builder.CreateAdd(PtrAsInt,
284 llvm::ConstantInt::get(CGF.IntPtrTy, Align.getQuantity() - 1));
285 PtrAsInt = CGF.Builder.CreateAnd(PtrAsInt,
286 llvm::ConstantInt::get(CGF.IntPtrTy, -Align.getQuantity()));
287 PtrAsInt = CGF.Builder.CreateIntToPtr(PtrAsInt,
288 Ptr->getType(),
289 Ptr->getName() + ".aligned");
290 return PtrAsInt;
291 }
292
293 /// Emit va_arg for a platform using the common void* representation,
294 /// where arguments are simply emitted in an array of slots on the stack.
295 ///
296 /// This version implements the core direct-value passing rules.
297 ///
298 /// \param SlotSize - The size and alignment of a stack slot.
299 /// Each argument will be allocated to a multiple of this number of
300 /// slots, and all the slots will be aligned to this value.
301 /// \param AllowHigherAlign - The slot alignment is not a cap;
302 /// an argument type with an alignment greater than the slot size
303 /// will be emitted on a higher-alignment address, potentially
304 /// leaving one or more empty slots behind as padding. If this
305 /// is false, the returned address might be less-aligned than
306 /// DirectAlign.
emitVoidPtrDirectVAArg(CodeGenFunction & CGF,Address VAListAddr,llvm::Type * DirectTy,CharUnits DirectSize,CharUnits DirectAlign,CharUnits SlotSize,bool AllowHigherAlign)307 static Address emitVoidPtrDirectVAArg(CodeGenFunction &CGF,
308 Address VAListAddr,
309 llvm::Type *DirectTy,
310 CharUnits DirectSize,
311 CharUnits DirectAlign,
312 CharUnits SlotSize,
313 bool AllowHigherAlign) {
314 // Cast the element type to i8* if necessary. Some platforms define
315 // va_list as a struct containing an i8* instead of just an i8*.
316 if (VAListAddr.getElementType() != CGF.Int8PtrTy)
317 VAListAddr = CGF.Builder.CreateElementBitCast(VAListAddr, CGF.Int8PtrTy);
318
319 llvm::Value *Ptr = CGF.Builder.CreateLoad(VAListAddr, "argp.cur");
320
321 // If the CC aligns values higher than the slot size, do so if needed.
322 Address Addr = Address::invalid();
323 if (AllowHigherAlign && DirectAlign > SlotSize) {
324 Addr = Address(emitRoundPointerUpToAlignment(CGF, Ptr, DirectAlign),
325 DirectAlign);
326 } else {
327 Addr = Address(Ptr, SlotSize);
328 }
329
330 // Advance the pointer past the argument, then store that back.
331 CharUnits FullDirectSize = DirectSize.alignTo(SlotSize);
332 Address NextPtr =
333 CGF.Builder.CreateConstInBoundsByteGEP(Addr, FullDirectSize, "argp.next");
334 CGF.Builder.CreateStore(NextPtr.getPointer(), VAListAddr);
335
336 // If the argument is smaller than a slot, and this is a big-endian
337 // target, the argument will be right-adjusted in its slot.
338 if (DirectSize < SlotSize && CGF.CGM.getDataLayout().isBigEndian() &&
339 !DirectTy->isStructTy()) {
340 Addr = CGF.Builder.CreateConstInBoundsByteGEP(Addr, SlotSize - DirectSize);
341 }
342
343 Addr = CGF.Builder.CreateElementBitCast(Addr, DirectTy);
344 return Addr;
345 }
346
347 /// Emit va_arg for a platform using the common void* representation,
348 /// where arguments are simply emitted in an array of slots on the stack.
349 ///
350 /// \param IsIndirect - Values of this type are passed indirectly.
351 /// \param ValueInfo - The size and alignment of this type, generally
352 /// computed with getContext().getTypeInfoInChars(ValueTy).
353 /// \param SlotSizeAndAlign - The size and alignment of a stack slot.
354 /// Each argument will be allocated to a multiple of this number of
355 /// slots, and all the slots will be aligned to this value.
356 /// \param AllowHigherAlign - The slot alignment is not a cap;
357 /// an argument type with an alignment greater than the slot size
358 /// will be emitted on a higher-alignment address, potentially
359 /// leaving one or more empty slots behind as padding.
emitVoidPtrVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType ValueTy,bool IsIndirect,TypeInfoChars ValueInfo,CharUnits SlotSizeAndAlign,bool AllowHigherAlign)360 static Address emitVoidPtrVAArg(CodeGenFunction &CGF, Address VAListAddr,
361 QualType ValueTy, bool IsIndirect,
362 TypeInfoChars ValueInfo,
363 CharUnits SlotSizeAndAlign,
364 bool AllowHigherAlign) {
365 // The size and alignment of the value that was passed directly.
366 CharUnits DirectSize, DirectAlign;
367 if (IsIndirect) {
368 DirectSize = CGF.getPointerSize();
369 DirectAlign = CGF.getPointerAlign();
370 } else {
371 DirectSize = ValueInfo.Width;
372 DirectAlign = ValueInfo.Align;
373 }
374
375 // Cast the address we've calculated to the right type.
376 llvm::Type *DirectTy = CGF.ConvertTypeForMem(ValueTy);
377 if (IsIndirect)
378 DirectTy = DirectTy->getPointerTo(0);
379
380 Address Addr = emitVoidPtrDirectVAArg(CGF, VAListAddr, DirectTy,
381 DirectSize, DirectAlign,
382 SlotSizeAndAlign,
383 AllowHigherAlign);
384
385 if (IsIndirect) {
386 Addr = Address(CGF.Builder.CreateLoad(Addr), ValueInfo.Align);
387 }
388
389 return Addr;
390
391 }
392
emitMergePHI(CodeGenFunction & CGF,Address Addr1,llvm::BasicBlock * Block1,Address Addr2,llvm::BasicBlock * Block2,const llvm::Twine & Name="")393 static Address emitMergePHI(CodeGenFunction &CGF,
394 Address Addr1, llvm::BasicBlock *Block1,
395 Address Addr2, llvm::BasicBlock *Block2,
396 const llvm::Twine &Name = "") {
397 assert(Addr1.getType() == Addr2.getType());
398 llvm::PHINode *PHI = CGF.Builder.CreatePHI(Addr1.getType(), 2, Name);
399 PHI->addIncoming(Addr1.getPointer(), Block1);
400 PHI->addIncoming(Addr2.getPointer(), Block2);
401 CharUnits Align = std::min(Addr1.getAlignment(), Addr2.getAlignment());
402 return Address(PHI, Align);
403 }
404
405 TargetCodeGenInfo::~TargetCodeGenInfo() = default;
406
407 // If someone can figure out a general rule for this, that would be great.
408 // It's probably just doomed to be platform-dependent, though.
getSizeOfUnwindException() const409 unsigned TargetCodeGenInfo::getSizeOfUnwindException() const {
410 // Verified for:
411 // x86-64 FreeBSD, Linux, Darwin
412 // x86-32 FreeBSD, Linux, Darwin
413 // PowerPC Linux, Darwin
414 // ARM Darwin (*not* EABI)
415 // AArch64 Linux
416 return 32;
417 }
418
isNoProtoCallVariadic(const CallArgList & args,const FunctionNoProtoType * fnType) const419 bool TargetCodeGenInfo::isNoProtoCallVariadic(const CallArgList &args,
420 const FunctionNoProtoType *fnType) const {
421 // The following conventions are known to require this to be false:
422 // x86_stdcall
423 // MIPS
424 // For everything else, we just prefer false unless we opt out.
425 return false;
426 }
427
428 void
getDependentLibraryOption(llvm::StringRef Lib,llvm::SmallString<24> & Opt) const429 TargetCodeGenInfo::getDependentLibraryOption(llvm::StringRef Lib,
430 llvm::SmallString<24> &Opt) const {
431 // This assumes the user is passing a library name like "rt" instead of a
432 // filename like "librt.a/so", and that they don't care whether it's static or
433 // dynamic.
434 Opt = "-l";
435 Opt += Lib;
436 }
437
getOpenCLKernelCallingConv() const438 unsigned TargetCodeGenInfo::getOpenCLKernelCallingConv() const {
439 // OpenCL kernels are called via an explicit runtime API with arguments
440 // set with clSetKernelArg(), not as normal sub-functions.
441 // Return SPIR_KERNEL by default as the kernel calling convention to
442 // ensure the fingerprint is fixed such way that each OpenCL argument
443 // gets one matching argument in the produced kernel function argument
444 // list to enable feasible implementation of clSetKernelArg() with
445 // aggregates etc. In case we would use the default C calling conv here,
446 // clSetKernelArg() might break depending on the target-specific
447 // conventions; different targets might split structs passed as values
448 // to multiple function arguments etc.
449 return llvm::CallingConv::SPIR_KERNEL;
450 }
451
getNullPointer(const CodeGen::CodeGenModule & CGM,llvm::PointerType * T,QualType QT) const452 llvm::Constant *TargetCodeGenInfo::getNullPointer(const CodeGen::CodeGenModule &CGM,
453 llvm::PointerType *T, QualType QT) const {
454 return llvm::ConstantPointerNull::get(T);
455 }
456
getGlobalVarAddressSpace(CodeGenModule & CGM,const VarDecl * D) const457 LangAS TargetCodeGenInfo::getGlobalVarAddressSpace(CodeGenModule &CGM,
458 const VarDecl *D) const {
459 assert(!CGM.getLangOpts().OpenCL &&
460 !(CGM.getLangOpts().CUDA && CGM.getLangOpts().CUDAIsDevice) &&
461 "Address space agnostic languages only");
462 return D ? D->getType().getAddressSpace() : LangAS::Default;
463 }
464
performAddrSpaceCast(CodeGen::CodeGenFunction & CGF,llvm::Value * Src,LangAS SrcAddr,LangAS DestAddr,llvm::Type * DestTy,bool isNonNull) const465 llvm::Value *TargetCodeGenInfo::performAddrSpaceCast(
466 CodeGen::CodeGenFunction &CGF, llvm::Value *Src, LangAS SrcAddr,
467 LangAS DestAddr, llvm::Type *DestTy, bool isNonNull) const {
468 // Since target may map different address spaces in AST to the same address
469 // space, an address space conversion may end up as a bitcast.
470 if (auto *C = dyn_cast<llvm::Constant>(Src))
471 return performAddrSpaceCast(CGF.CGM, C, SrcAddr, DestAddr, DestTy);
472 // Try to preserve the source's name to make IR more readable.
473 return CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(
474 Src, DestTy, Src->hasName() ? Src->getName() + ".ascast" : "");
475 }
476
477 llvm::Constant *
performAddrSpaceCast(CodeGenModule & CGM,llvm::Constant * Src,LangAS SrcAddr,LangAS DestAddr,llvm::Type * DestTy) const478 TargetCodeGenInfo::performAddrSpaceCast(CodeGenModule &CGM, llvm::Constant *Src,
479 LangAS SrcAddr, LangAS DestAddr,
480 llvm::Type *DestTy) const {
481 // Since target may map different address spaces in AST to the same address
482 // space, an address space conversion may end up as a bitcast.
483 return llvm::ConstantExpr::getPointerCast(Src, DestTy);
484 }
485
486 llvm::SyncScope::ID
getLLVMSyncScopeID(const LangOptions & LangOpts,SyncScope Scope,llvm::AtomicOrdering Ordering,llvm::LLVMContext & Ctx) const487 TargetCodeGenInfo::getLLVMSyncScopeID(const LangOptions &LangOpts,
488 SyncScope Scope,
489 llvm::AtomicOrdering Ordering,
490 llvm::LLVMContext &Ctx) const {
491 return Ctx.getOrInsertSyncScopeID(""); /* default sync scope */
492 }
493
494 static bool isEmptyRecord(ASTContext &Context, QualType T, bool AllowArrays);
495
496 /// isEmptyField - Return true iff a the field is "empty", that is it
497 /// is an unnamed bit-field or an (array of) empty record(s).
isEmptyField(ASTContext & Context,const FieldDecl * FD,bool AllowArrays)498 static bool isEmptyField(ASTContext &Context, const FieldDecl *FD,
499 bool AllowArrays) {
500 if (FD->isUnnamedBitfield())
501 return true;
502
503 QualType FT = FD->getType();
504
505 // Constant arrays of empty records count as empty, strip them off.
506 // Constant arrays of zero length always count as empty.
507 bool WasArray = false;
508 if (AllowArrays)
509 while (const ConstantArrayType *AT = Context.getAsConstantArrayType(FT)) {
510 if (AT->getSize() == 0)
511 return true;
512 FT = AT->getElementType();
513 // The [[no_unique_address]] special case below does not apply to
514 // arrays of C++ empty records, so we need to remember this fact.
515 WasArray = true;
516 }
517
518 const RecordType *RT = FT->getAs<RecordType>();
519 if (!RT)
520 return false;
521
522 // C++ record fields are never empty, at least in the Itanium ABI.
523 //
524 // FIXME: We should use a predicate for whether this behavior is true in the
525 // current ABI.
526 //
527 // The exception to the above rule are fields marked with the
528 // [[no_unique_address]] attribute (since C++20). Those do count as empty
529 // according to the Itanium ABI. The exception applies only to records,
530 // not arrays of records, so we must also check whether we stripped off an
531 // array type above.
532 if (isa<CXXRecordDecl>(RT->getDecl()) &&
533 (WasArray || !FD->hasAttr<NoUniqueAddressAttr>()))
534 return false;
535
536 return isEmptyRecord(Context, FT, AllowArrays);
537 }
538
539 /// isEmptyRecord - Return true iff a structure contains only empty
540 /// fields. Note that a structure with a flexible array member is not
541 /// considered empty.
isEmptyRecord(ASTContext & Context,QualType T,bool AllowArrays)542 static bool isEmptyRecord(ASTContext &Context, QualType T, bool AllowArrays) {
543 const RecordType *RT = T->getAs<RecordType>();
544 if (!RT)
545 return false;
546 const RecordDecl *RD = RT->getDecl();
547 if (RD->hasFlexibleArrayMember())
548 return false;
549
550 // If this is a C++ record, check the bases first.
551 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
552 for (const auto &I : CXXRD->bases())
553 if (!isEmptyRecord(Context, I.getType(), true))
554 return false;
555
556 for (const auto *I : RD->fields())
557 if (!isEmptyField(Context, I, AllowArrays))
558 return false;
559 return true;
560 }
561
562 /// isSingleElementStruct - Determine if a structure is a "single
563 /// element struct", i.e. it has exactly one non-empty field or
564 /// exactly one field which is itself a single element
565 /// struct. Structures with flexible array members are never
566 /// considered single element structs.
567 ///
568 /// \return The field declaration for the single non-empty field, if
569 /// it exists.
isSingleElementStruct(QualType T,ASTContext & Context)570 static const Type *isSingleElementStruct(QualType T, ASTContext &Context) {
571 const RecordType *RT = T->getAs<RecordType>();
572 if (!RT)
573 return nullptr;
574
575 const RecordDecl *RD = RT->getDecl();
576 if (RD->hasFlexibleArrayMember())
577 return nullptr;
578
579 const Type *Found = nullptr;
580
581 // If this is a C++ record, check the bases first.
582 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
583 for (const auto &I : CXXRD->bases()) {
584 // Ignore empty records.
585 if (isEmptyRecord(Context, I.getType(), true))
586 continue;
587
588 // If we already found an element then this isn't a single-element struct.
589 if (Found)
590 return nullptr;
591
592 // If this is non-empty and not a single element struct, the composite
593 // cannot be a single element struct.
594 Found = isSingleElementStruct(I.getType(), Context);
595 if (!Found)
596 return nullptr;
597 }
598 }
599
600 // Check for single element.
601 for (const auto *FD : RD->fields()) {
602 QualType FT = FD->getType();
603
604 // Ignore empty fields.
605 if (isEmptyField(Context, FD, true))
606 continue;
607
608 // If we already found an element then this isn't a single-element
609 // struct.
610 if (Found)
611 return nullptr;
612
613 // Treat single element arrays as the element.
614 while (const ConstantArrayType *AT = Context.getAsConstantArrayType(FT)) {
615 if (AT->getSize().getZExtValue() != 1)
616 break;
617 FT = AT->getElementType();
618 }
619
620 if (!isAggregateTypeForABI(FT)) {
621 Found = FT.getTypePtr();
622 } else {
623 Found = isSingleElementStruct(FT, Context);
624 if (!Found)
625 return nullptr;
626 }
627 }
628
629 // We don't consider a struct a single-element struct if it has
630 // padding beyond the element type.
631 if (Found && Context.getTypeSize(Found) != Context.getTypeSize(T))
632 return nullptr;
633
634 return Found;
635 }
636
637 namespace {
EmitVAArgInstr(CodeGenFunction & CGF,Address VAListAddr,QualType Ty,const ABIArgInfo & AI)638 Address EmitVAArgInstr(CodeGenFunction &CGF, Address VAListAddr, QualType Ty,
639 const ABIArgInfo &AI) {
640 // This default implementation defers to the llvm backend's va_arg
641 // instruction. It can handle only passing arguments directly
642 // (typically only handled in the backend for primitive types), or
643 // aggregates passed indirectly by pointer (NOTE: if the "byval"
644 // flag has ABI impact in the callee, this implementation cannot
645 // work.)
646
647 // Only a few cases are covered here at the moment -- those needed
648 // by the default abi.
649 llvm::Value *Val;
650
651 if (AI.isIndirect()) {
652 assert(!AI.getPaddingType() &&
653 "Unexpected PaddingType seen in arginfo in generic VAArg emitter!");
654 assert(
655 !AI.getIndirectRealign() &&
656 "Unexpected IndirectRealign seen in arginfo in generic VAArg emitter!");
657
658 auto TyInfo = CGF.getContext().getTypeInfoInChars(Ty);
659 CharUnits TyAlignForABI = TyInfo.Align;
660
661 llvm::Type *BaseTy =
662 llvm::PointerType::getUnqual(CGF.ConvertTypeForMem(Ty));
663 llvm::Value *Addr =
664 CGF.Builder.CreateVAArg(VAListAddr.getPointer(), BaseTy);
665 return Address(Addr, TyAlignForABI);
666 } else {
667 assert((AI.isDirect() || AI.isExtend()) &&
668 "Unexpected ArgInfo Kind in generic VAArg emitter!");
669
670 assert(!AI.getInReg() &&
671 "Unexpected InReg seen in arginfo in generic VAArg emitter!");
672 assert(!AI.getPaddingType() &&
673 "Unexpected PaddingType seen in arginfo in generic VAArg emitter!");
674 assert(!AI.getDirectOffset() &&
675 "Unexpected DirectOffset seen in arginfo in generic VAArg emitter!");
676 assert(!AI.getCoerceToType() &&
677 "Unexpected CoerceToType seen in arginfo in generic VAArg emitter!");
678
679 Address Temp = CGF.CreateMemTemp(Ty, "varet");
680 Val = CGF.Builder.CreateVAArg(VAListAddr.getPointer(), CGF.ConvertType(Ty));
681 CGF.Builder.CreateStore(Val, Temp);
682 return Temp;
683 }
684 }
685
686 /// DefaultABIInfo - The default implementation for ABI specific
687 /// details. This implementation provides information which results in
688 /// self-consistent and sensible LLVM IR generation, but does not
689 /// conform to any particular ABI.
690 class DefaultABIInfo : public ABIInfo {
691 public:
DefaultABIInfo(CodeGen::CodeGenTypes & CGT)692 DefaultABIInfo(CodeGen::CodeGenTypes &CGT) : ABIInfo(CGT) {}
693
694 ABIArgInfo classifyReturnType(QualType RetTy) const;
695 ABIArgInfo classifyArgumentType(QualType RetTy) const;
696
computeInfo(CGFunctionInfo & FI) const697 void computeInfo(CGFunctionInfo &FI) const override {
698 if (!getCXXABI().classifyReturnType(FI))
699 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
700 for (auto &I : FI.arguments())
701 I.info = classifyArgumentType(I.type);
702 }
703
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const704 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
705 QualType Ty) const override {
706 return EmitVAArgInstr(CGF, VAListAddr, Ty, classifyArgumentType(Ty));
707 }
708 };
709
710 class DefaultTargetCodeGenInfo : public TargetCodeGenInfo {
711 public:
DefaultTargetCodeGenInfo(CodeGen::CodeGenTypes & CGT)712 DefaultTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT)
713 : TargetCodeGenInfo(std::make_unique<DefaultABIInfo>(CGT)) {}
714 };
715
classifyArgumentType(QualType Ty) const716 ABIArgInfo DefaultABIInfo::classifyArgumentType(QualType Ty) const {
717 Ty = useFirstFieldIfTransparentUnion(Ty);
718
719 if (isAggregateTypeForABI(Ty)) {
720 // Records with non-trivial destructors/copy-constructors should not be
721 // passed by value.
722 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
723 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
724
725 return getNaturalAlignIndirect(Ty);
726 }
727
728 // Treat an enum type as its underlying type.
729 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
730 Ty = EnumTy->getDecl()->getIntegerType();
731
732 ASTContext &Context = getContext();
733 if (const auto *EIT = Ty->getAs<ExtIntType>())
734 if (EIT->getNumBits() >
735 Context.getTypeSize(Context.getTargetInfo().hasInt128Type()
736 ? Context.Int128Ty
737 : Context.LongLongTy))
738 return getNaturalAlignIndirect(Ty);
739
740 return (isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
741 : ABIArgInfo::getDirect());
742 }
743
classifyReturnType(QualType RetTy) const744 ABIArgInfo DefaultABIInfo::classifyReturnType(QualType RetTy) const {
745 if (RetTy->isVoidType())
746 return ABIArgInfo::getIgnore();
747
748 if (isAggregateTypeForABI(RetTy))
749 return getNaturalAlignIndirect(RetTy);
750
751 // Treat an enum type as its underlying type.
752 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
753 RetTy = EnumTy->getDecl()->getIntegerType();
754
755 if (const auto *EIT = RetTy->getAs<ExtIntType>())
756 if (EIT->getNumBits() >
757 getContext().getTypeSize(getContext().getTargetInfo().hasInt128Type()
758 ? getContext().Int128Ty
759 : getContext().LongLongTy))
760 return getNaturalAlignIndirect(RetTy);
761
762 return (isPromotableIntegerTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
763 : ABIArgInfo::getDirect());
764 }
765
766 //===----------------------------------------------------------------------===//
767 // WebAssembly ABI Implementation
768 //
769 // This is a very simple ABI that relies a lot on DefaultABIInfo.
770 //===----------------------------------------------------------------------===//
771
772 class WebAssemblyABIInfo final : public SwiftABIInfo {
773 public:
774 enum ABIKind {
775 MVP = 0,
776 ExperimentalMV = 1,
777 };
778
779 private:
780 DefaultABIInfo defaultInfo;
781 ABIKind Kind;
782
783 public:
WebAssemblyABIInfo(CodeGen::CodeGenTypes & CGT,ABIKind Kind)784 explicit WebAssemblyABIInfo(CodeGen::CodeGenTypes &CGT, ABIKind Kind)
785 : SwiftABIInfo(CGT), defaultInfo(CGT), Kind(Kind) {}
786
787 private:
788 ABIArgInfo classifyReturnType(QualType RetTy) const;
789 ABIArgInfo classifyArgumentType(QualType Ty) const;
790
791 // DefaultABIInfo's classifyReturnType and classifyArgumentType are
792 // non-virtual, but computeInfo and EmitVAArg are virtual, so we
793 // overload them.
computeInfo(CGFunctionInfo & FI) const794 void computeInfo(CGFunctionInfo &FI) const override {
795 if (!getCXXABI().classifyReturnType(FI))
796 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
797 for (auto &Arg : FI.arguments())
798 Arg.info = classifyArgumentType(Arg.type);
799 }
800
801 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
802 QualType Ty) const override;
803
shouldPassIndirectlyForSwift(ArrayRef<llvm::Type * > scalars,bool asReturnValue) const804 bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars,
805 bool asReturnValue) const override {
806 return occupiesMoreThan(CGT, scalars, /*total*/ 4);
807 }
808
isSwiftErrorInRegister() const809 bool isSwiftErrorInRegister() const override {
810 return false;
811 }
812 };
813
814 class WebAssemblyTargetCodeGenInfo final : public TargetCodeGenInfo {
815 public:
WebAssemblyTargetCodeGenInfo(CodeGen::CodeGenTypes & CGT,WebAssemblyABIInfo::ABIKind K)816 explicit WebAssemblyTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT,
817 WebAssemblyABIInfo::ABIKind K)
818 : TargetCodeGenInfo(std::make_unique<WebAssemblyABIInfo>(CGT, K)) {}
819
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const820 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
821 CodeGen::CodeGenModule &CGM) const override {
822 TargetCodeGenInfo::setTargetAttributes(D, GV, CGM);
823 if (const auto *FD = dyn_cast_or_null<FunctionDecl>(D)) {
824 if (const auto *Attr = FD->getAttr<WebAssemblyImportModuleAttr>()) {
825 llvm::Function *Fn = cast<llvm::Function>(GV);
826 llvm::AttrBuilder B;
827 B.addAttribute("wasm-import-module", Attr->getImportModule());
828 Fn->addAttributes(llvm::AttributeList::FunctionIndex, B);
829 }
830 if (const auto *Attr = FD->getAttr<WebAssemblyImportNameAttr>()) {
831 llvm::Function *Fn = cast<llvm::Function>(GV);
832 llvm::AttrBuilder B;
833 B.addAttribute("wasm-import-name", Attr->getImportName());
834 Fn->addAttributes(llvm::AttributeList::FunctionIndex, B);
835 }
836 if (const auto *Attr = FD->getAttr<WebAssemblyExportNameAttr>()) {
837 llvm::Function *Fn = cast<llvm::Function>(GV);
838 llvm::AttrBuilder B;
839 B.addAttribute("wasm-export-name", Attr->getExportName());
840 Fn->addAttributes(llvm::AttributeList::FunctionIndex, B);
841 }
842 }
843
844 if (auto *FD = dyn_cast_or_null<FunctionDecl>(D)) {
845 llvm::Function *Fn = cast<llvm::Function>(GV);
846 if (!FD->doesThisDeclarationHaveABody() && !FD->hasPrototype())
847 Fn->addFnAttr("no-prototype");
848 }
849 }
850 };
851
852 /// Classify argument of given type \p Ty.
classifyArgumentType(QualType Ty) const853 ABIArgInfo WebAssemblyABIInfo::classifyArgumentType(QualType Ty) const {
854 Ty = useFirstFieldIfTransparentUnion(Ty);
855
856 if (isAggregateTypeForABI(Ty)) {
857 // Records with non-trivial destructors/copy-constructors should not be
858 // passed by value.
859 if (auto RAA = getRecordArgABI(Ty, getCXXABI()))
860 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
861 // Ignore empty structs/unions.
862 if (isEmptyRecord(getContext(), Ty, true))
863 return ABIArgInfo::getIgnore();
864 // Lower single-element structs to just pass a regular value. TODO: We
865 // could do reasonable-size multiple-element structs too, using getExpand(),
866 // though watch out for things like bitfields.
867 if (const Type *SeltTy = isSingleElementStruct(Ty, getContext()))
868 return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0)));
869 // For the experimental multivalue ABI, fully expand all other aggregates
870 if (Kind == ABIKind::ExperimentalMV) {
871 const RecordType *RT = Ty->getAs<RecordType>();
872 assert(RT);
873 bool HasBitField = false;
874 for (auto *Field : RT->getDecl()->fields()) {
875 if (Field->isBitField()) {
876 HasBitField = true;
877 break;
878 }
879 }
880 if (!HasBitField)
881 return ABIArgInfo::getExpand();
882 }
883 }
884
885 // Otherwise just do the default thing.
886 return defaultInfo.classifyArgumentType(Ty);
887 }
888
classifyReturnType(QualType RetTy) const889 ABIArgInfo WebAssemblyABIInfo::classifyReturnType(QualType RetTy) const {
890 if (isAggregateTypeForABI(RetTy)) {
891 // Records with non-trivial destructors/copy-constructors should not be
892 // returned by value.
893 if (!getRecordArgABI(RetTy, getCXXABI())) {
894 // Ignore empty structs/unions.
895 if (isEmptyRecord(getContext(), RetTy, true))
896 return ABIArgInfo::getIgnore();
897 // Lower single-element structs to just return a regular value. TODO: We
898 // could do reasonable-size multiple-element structs too, using
899 // ABIArgInfo::getDirect().
900 if (const Type *SeltTy = isSingleElementStruct(RetTy, getContext()))
901 return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0)));
902 // For the experimental multivalue ABI, return all other aggregates
903 if (Kind == ABIKind::ExperimentalMV)
904 return ABIArgInfo::getDirect();
905 }
906 }
907
908 // Otherwise just do the default thing.
909 return defaultInfo.classifyReturnType(RetTy);
910 }
911
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const912 Address WebAssemblyABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
913 QualType Ty) const {
914 bool IsIndirect = isAggregateTypeForABI(Ty) &&
915 !isEmptyRecord(getContext(), Ty, true) &&
916 !isSingleElementStruct(Ty, getContext());
917 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, IsIndirect,
918 getContext().getTypeInfoInChars(Ty),
919 CharUnits::fromQuantity(4),
920 /*AllowHigherAlign=*/true);
921 }
922
923 //===----------------------------------------------------------------------===//
924 // le32/PNaCl bitcode ABI Implementation
925 //
926 // This is a simplified version of the x86_32 ABI. Arguments and return values
927 // are always passed on the stack.
928 //===----------------------------------------------------------------------===//
929
930 class PNaClABIInfo : public ABIInfo {
931 public:
PNaClABIInfo(CodeGen::CodeGenTypes & CGT)932 PNaClABIInfo(CodeGen::CodeGenTypes &CGT) : ABIInfo(CGT) {}
933
934 ABIArgInfo classifyReturnType(QualType RetTy) const;
935 ABIArgInfo classifyArgumentType(QualType RetTy) const;
936
937 void computeInfo(CGFunctionInfo &FI) const override;
938 Address EmitVAArg(CodeGenFunction &CGF,
939 Address VAListAddr, QualType Ty) const override;
940 };
941
942 class PNaClTargetCodeGenInfo : public TargetCodeGenInfo {
943 public:
PNaClTargetCodeGenInfo(CodeGen::CodeGenTypes & CGT)944 PNaClTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT)
945 : TargetCodeGenInfo(std::make_unique<PNaClABIInfo>(CGT)) {}
946 };
947
computeInfo(CGFunctionInfo & FI) const948 void PNaClABIInfo::computeInfo(CGFunctionInfo &FI) const {
949 if (!getCXXABI().classifyReturnType(FI))
950 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
951
952 for (auto &I : FI.arguments())
953 I.info = classifyArgumentType(I.type);
954 }
955
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const956 Address PNaClABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
957 QualType Ty) const {
958 // The PNaCL ABI is a bit odd, in that varargs don't use normal
959 // function classification. Structs get passed directly for varargs
960 // functions, through a rewriting transform in
961 // pnacl-llvm/lib/Transforms/NaCl/ExpandVarArgs.cpp, which allows
962 // this target to actually support a va_arg instructions with an
963 // aggregate type, unlike other targets.
964 return EmitVAArgInstr(CGF, VAListAddr, Ty, ABIArgInfo::getDirect());
965 }
966
967 /// Classify argument of given type \p Ty.
classifyArgumentType(QualType Ty) const968 ABIArgInfo PNaClABIInfo::classifyArgumentType(QualType Ty) const {
969 if (isAggregateTypeForABI(Ty)) {
970 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
971 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
972 return getNaturalAlignIndirect(Ty);
973 } else if (const EnumType *EnumTy = Ty->getAs<EnumType>()) {
974 // Treat an enum type as its underlying type.
975 Ty = EnumTy->getDecl()->getIntegerType();
976 } else if (Ty->isFloatingType()) {
977 // Floating-point types don't go inreg.
978 return ABIArgInfo::getDirect();
979 } else if (const auto *EIT = Ty->getAs<ExtIntType>()) {
980 // Treat extended integers as integers if <=64, otherwise pass indirectly.
981 if (EIT->getNumBits() > 64)
982 return getNaturalAlignIndirect(Ty);
983 return ABIArgInfo::getDirect();
984 }
985
986 return (isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
987 : ABIArgInfo::getDirect());
988 }
989
classifyReturnType(QualType RetTy) const990 ABIArgInfo PNaClABIInfo::classifyReturnType(QualType RetTy) const {
991 if (RetTy->isVoidType())
992 return ABIArgInfo::getIgnore();
993
994 // In the PNaCl ABI we always return records/structures on the stack.
995 if (isAggregateTypeForABI(RetTy))
996 return getNaturalAlignIndirect(RetTy);
997
998 // Treat extended integers as integers if <=64, otherwise pass indirectly.
999 if (const auto *EIT = RetTy->getAs<ExtIntType>()) {
1000 if (EIT->getNumBits() > 64)
1001 return getNaturalAlignIndirect(RetTy);
1002 return ABIArgInfo::getDirect();
1003 }
1004
1005 // Treat an enum type as its underlying type.
1006 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
1007 RetTy = EnumTy->getDecl()->getIntegerType();
1008
1009 return (isPromotableIntegerTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
1010 : ABIArgInfo::getDirect());
1011 }
1012
1013 /// IsX86_MMXType - Return true if this is an MMX type.
IsX86_MMXType(llvm::Type * IRType)1014 bool IsX86_MMXType(llvm::Type *IRType) {
1015 // Return true if the type is an MMX type <2 x i32>, <4 x i16>, or <8 x i8>.
1016 return IRType->isVectorTy() && IRType->getPrimitiveSizeInBits() == 64 &&
1017 cast<llvm::VectorType>(IRType)->getElementType()->isIntegerTy() &&
1018 IRType->getScalarSizeInBits() != 64;
1019 }
1020
X86AdjustInlineAsmType(CodeGen::CodeGenFunction & CGF,StringRef Constraint,llvm::Type * Ty)1021 static llvm::Type* X86AdjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
1022 StringRef Constraint,
1023 llvm::Type* Ty) {
1024 bool IsMMXCons = llvm::StringSwitch<bool>(Constraint)
1025 .Cases("y", "&y", "^Ym", true)
1026 .Default(false);
1027 if (IsMMXCons && Ty->isVectorTy()) {
1028 if (cast<llvm::VectorType>(Ty)->getPrimitiveSizeInBits().getFixedSize() !=
1029 64) {
1030 // Invalid MMX constraint
1031 return nullptr;
1032 }
1033
1034 return llvm::Type::getX86_MMXTy(CGF.getLLVMContext());
1035 }
1036
1037 // No operation needed
1038 return Ty;
1039 }
1040
1041 /// Returns true if this type can be passed in SSE registers with the
1042 /// X86_VectorCall calling convention. Shared between x86_32 and x86_64.
isX86VectorTypeForVectorCall(ASTContext & Context,QualType Ty)1043 static bool isX86VectorTypeForVectorCall(ASTContext &Context, QualType Ty) {
1044 if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
1045 if (BT->isFloatingPoint() && BT->getKind() != BuiltinType::Half) {
1046 if (BT->getKind() == BuiltinType::LongDouble) {
1047 if (&Context.getTargetInfo().getLongDoubleFormat() ==
1048 &llvm::APFloat::x87DoubleExtended())
1049 return false;
1050 }
1051 return true;
1052 }
1053 } else if (const VectorType *VT = Ty->getAs<VectorType>()) {
1054 // vectorcall can pass XMM, YMM, and ZMM vectors. We don't pass SSE1 MMX
1055 // registers specially.
1056 unsigned VecSize = Context.getTypeSize(VT);
1057 if (VecSize == 128 || VecSize == 256 || VecSize == 512)
1058 return true;
1059 }
1060 return false;
1061 }
1062
1063 /// Returns true if this aggregate is small enough to be passed in SSE registers
1064 /// in the X86_VectorCall calling convention. Shared between x86_32 and x86_64.
isX86VectorCallAggregateSmallEnough(uint64_t NumMembers)1065 static bool isX86VectorCallAggregateSmallEnough(uint64_t NumMembers) {
1066 return NumMembers <= 4;
1067 }
1068
1069 /// Returns a Homogeneous Vector Aggregate ABIArgInfo, used in X86.
getDirectX86Hva(llvm::Type * T=nullptr)1070 static ABIArgInfo getDirectX86Hva(llvm::Type* T = nullptr) {
1071 auto AI = ABIArgInfo::getDirect(T);
1072 AI.setInReg(true);
1073 AI.setCanBeFlattened(false);
1074 return AI;
1075 }
1076
1077 //===----------------------------------------------------------------------===//
1078 // X86-32 ABI Implementation
1079 //===----------------------------------------------------------------------===//
1080
1081 /// Similar to llvm::CCState, but for Clang.
1082 struct CCState {
CCState__anon57a50d410111::CCState1083 CCState(CGFunctionInfo &FI)
1084 : IsPreassigned(FI.arg_size()), CC(FI.getCallingConvention()) {}
1085
1086 llvm::SmallBitVector IsPreassigned;
1087 unsigned CC = CallingConv::CC_C;
1088 unsigned FreeRegs = 0;
1089 unsigned FreeSSERegs = 0;
1090 };
1091
1092 enum {
1093 // Vectorcall only allows the first 6 parameters to be passed in registers.
1094 VectorcallMaxParamNumAsReg = 6
1095 };
1096
1097 /// X86_32ABIInfo - The X86-32 ABI information.
1098 class X86_32ABIInfo : public SwiftABIInfo {
1099 enum Class {
1100 Integer,
1101 Float
1102 };
1103
1104 static const unsigned MinABIStackAlignInBytes = 4;
1105
1106 bool IsDarwinVectorABI;
1107 bool IsRetSmallStructInRegABI;
1108 bool IsWin32StructABI;
1109 bool IsSoftFloatABI;
1110 bool IsMCUABI;
1111 unsigned DefaultNumRegisterParameters;
1112
isRegisterSize(unsigned Size)1113 static bool isRegisterSize(unsigned Size) {
1114 return (Size == 8 || Size == 16 || Size == 32 || Size == 64);
1115 }
1116
isHomogeneousAggregateBaseType(QualType Ty) const1117 bool isHomogeneousAggregateBaseType(QualType Ty) const override {
1118 // FIXME: Assumes vectorcall is in use.
1119 return isX86VectorTypeForVectorCall(getContext(), Ty);
1120 }
1121
isHomogeneousAggregateSmallEnough(const Type * Ty,uint64_t NumMembers) const1122 bool isHomogeneousAggregateSmallEnough(const Type *Ty,
1123 uint64_t NumMembers) const override {
1124 // FIXME: Assumes vectorcall is in use.
1125 return isX86VectorCallAggregateSmallEnough(NumMembers);
1126 }
1127
1128 bool shouldReturnTypeInRegister(QualType Ty, ASTContext &Context) const;
1129
1130 /// getIndirectResult - Give a source type \arg Ty, return a suitable result
1131 /// such that the argument will be passed in memory.
1132 ABIArgInfo getIndirectResult(QualType Ty, bool ByVal, CCState &State) const;
1133
1134 ABIArgInfo getIndirectReturnResult(QualType Ty, CCState &State) const;
1135
1136 /// Return the alignment to use for the given type on the stack.
1137 unsigned getTypeStackAlignInBytes(QualType Ty, unsigned Align) const;
1138
1139 Class classify(QualType Ty) const;
1140 ABIArgInfo classifyReturnType(QualType RetTy, CCState &State) const;
1141 ABIArgInfo classifyArgumentType(QualType RetTy, CCState &State) const;
1142
1143 /// Updates the number of available free registers, returns
1144 /// true if any registers were allocated.
1145 bool updateFreeRegs(QualType Ty, CCState &State) const;
1146
1147 bool shouldAggregateUseDirect(QualType Ty, CCState &State, bool &InReg,
1148 bool &NeedsPadding) const;
1149 bool shouldPrimitiveUseInReg(QualType Ty, CCState &State) const;
1150
1151 bool canExpandIndirectArgument(QualType Ty) const;
1152
1153 /// Rewrite the function info so that all memory arguments use
1154 /// inalloca.
1155 void rewriteWithInAlloca(CGFunctionInfo &FI) const;
1156
1157 void addFieldToArgStruct(SmallVector<llvm::Type *, 6> &FrameFields,
1158 CharUnits &StackOffset, ABIArgInfo &Info,
1159 QualType Type) const;
1160 void runVectorCallFirstPass(CGFunctionInfo &FI, CCState &State) const;
1161
1162 public:
1163
1164 void computeInfo(CGFunctionInfo &FI) const override;
1165 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
1166 QualType Ty) const override;
1167
X86_32ABIInfo(CodeGen::CodeGenTypes & CGT,bool DarwinVectorABI,bool RetSmallStructInRegABI,bool Win32StructABI,unsigned NumRegisterParameters,bool SoftFloatABI)1168 X86_32ABIInfo(CodeGen::CodeGenTypes &CGT, bool DarwinVectorABI,
1169 bool RetSmallStructInRegABI, bool Win32StructABI,
1170 unsigned NumRegisterParameters, bool SoftFloatABI)
1171 : SwiftABIInfo(CGT), IsDarwinVectorABI(DarwinVectorABI),
1172 IsRetSmallStructInRegABI(RetSmallStructInRegABI),
1173 IsWin32StructABI(Win32StructABI),
1174 IsSoftFloatABI(SoftFloatABI),
1175 IsMCUABI(CGT.getTarget().getTriple().isOSIAMCU()),
1176 DefaultNumRegisterParameters(NumRegisterParameters) {}
1177
shouldPassIndirectlyForSwift(ArrayRef<llvm::Type * > scalars,bool asReturnValue) const1178 bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars,
1179 bool asReturnValue) const override {
1180 // LLVM's x86-32 lowering currently only assigns up to three
1181 // integer registers and three fp registers. Oddly, it'll use up to
1182 // four vector registers for vectors, but those can overlap with the
1183 // scalar registers.
1184 return occupiesMoreThan(CGT, scalars, /*total*/ 3);
1185 }
1186
isSwiftErrorInRegister() const1187 bool isSwiftErrorInRegister() const override {
1188 // x86-32 lowering does not support passing swifterror in a register.
1189 return false;
1190 }
1191 };
1192
1193 class X86_32TargetCodeGenInfo : public TargetCodeGenInfo {
1194 public:
X86_32TargetCodeGenInfo(CodeGen::CodeGenTypes & CGT,bool DarwinVectorABI,bool RetSmallStructInRegABI,bool Win32StructABI,unsigned NumRegisterParameters,bool SoftFloatABI)1195 X86_32TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, bool DarwinVectorABI,
1196 bool RetSmallStructInRegABI, bool Win32StructABI,
1197 unsigned NumRegisterParameters, bool SoftFloatABI)
1198 : TargetCodeGenInfo(std::make_unique<X86_32ABIInfo>(
1199 CGT, DarwinVectorABI, RetSmallStructInRegABI, Win32StructABI,
1200 NumRegisterParameters, SoftFloatABI)) {}
1201
1202 static bool isStructReturnInRegABI(
1203 const llvm::Triple &Triple, const CodeGenOptions &Opts);
1204
1205 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
1206 CodeGen::CodeGenModule &CGM) const override;
1207
getDwarfEHStackPointer(CodeGen::CodeGenModule & CGM) const1208 int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const override {
1209 // Darwin uses different dwarf register numbers for EH.
1210 if (CGM.getTarget().getTriple().isOSDarwin()) return 5;
1211 return 4;
1212 }
1213
1214 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
1215 llvm::Value *Address) const override;
1216
adjustInlineAsmType(CodeGen::CodeGenFunction & CGF,StringRef Constraint,llvm::Type * Ty) const1217 llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
1218 StringRef Constraint,
1219 llvm::Type* Ty) const override {
1220 return X86AdjustInlineAsmType(CGF, Constraint, Ty);
1221 }
1222
1223 void addReturnRegisterOutputs(CodeGenFunction &CGF, LValue ReturnValue,
1224 std::string &Constraints,
1225 std::vector<llvm::Type *> &ResultRegTypes,
1226 std::vector<llvm::Type *> &ResultTruncRegTypes,
1227 std::vector<LValue> &ResultRegDests,
1228 std::string &AsmString,
1229 unsigned NumOutputs) const override;
1230
1231 llvm::Constant *
getUBSanFunctionSignature(CodeGen::CodeGenModule & CGM) const1232 getUBSanFunctionSignature(CodeGen::CodeGenModule &CGM) const override {
1233 unsigned Sig = (0xeb << 0) | // jmp rel8
1234 (0x06 << 8) | // .+0x08
1235 ('v' << 16) |
1236 ('2' << 24);
1237 return llvm::ConstantInt::get(CGM.Int32Ty, Sig);
1238 }
1239
getARCRetainAutoreleasedReturnValueMarker() const1240 StringRef getARCRetainAutoreleasedReturnValueMarker() const override {
1241 return "movl\t%ebp, %ebp"
1242 "\t\t// marker for objc_retainAutoreleaseReturnValue";
1243 }
1244 };
1245
1246 }
1247
1248 /// Rewrite input constraint references after adding some output constraints.
1249 /// In the case where there is one output and one input and we add one output,
1250 /// we need to replace all operand references greater than or equal to 1:
1251 /// mov $0, $1
1252 /// mov eax, $1
1253 /// The result will be:
1254 /// mov $0, $2
1255 /// mov eax, $2
rewriteInputConstraintReferences(unsigned FirstIn,unsigned NumNewOuts,std::string & AsmString)1256 static void rewriteInputConstraintReferences(unsigned FirstIn,
1257 unsigned NumNewOuts,
1258 std::string &AsmString) {
1259 std::string Buf;
1260 llvm::raw_string_ostream OS(Buf);
1261 size_t Pos = 0;
1262 while (Pos < AsmString.size()) {
1263 size_t DollarStart = AsmString.find('$', Pos);
1264 if (DollarStart == std::string::npos)
1265 DollarStart = AsmString.size();
1266 size_t DollarEnd = AsmString.find_first_not_of('$', DollarStart);
1267 if (DollarEnd == std::string::npos)
1268 DollarEnd = AsmString.size();
1269 OS << StringRef(&AsmString[Pos], DollarEnd - Pos);
1270 Pos = DollarEnd;
1271 size_t NumDollars = DollarEnd - DollarStart;
1272 if (NumDollars % 2 != 0 && Pos < AsmString.size()) {
1273 // We have an operand reference.
1274 size_t DigitStart = Pos;
1275 if (AsmString[DigitStart] == '{') {
1276 OS << '{';
1277 ++DigitStart;
1278 }
1279 size_t DigitEnd = AsmString.find_first_not_of("0123456789", DigitStart);
1280 if (DigitEnd == std::string::npos)
1281 DigitEnd = AsmString.size();
1282 StringRef OperandStr(&AsmString[DigitStart], DigitEnd - DigitStart);
1283 unsigned OperandIndex;
1284 if (!OperandStr.getAsInteger(10, OperandIndex)) {
1285 if (OperandIndex >= FirstIn)
1286 OperandIndex += NumNewOuts;
1287 OS << OperandIndex;
1288 } else {
1289 OS << OperandStr;
1290 }
1291 Pos = DigitEnd;
1292 }
1293 }
1294 AsmString = std::move(OS.str());
1295 }
1296
1297 /// 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) const1298 void X86_32TargetCodeGenInfo::addReturnRegisterOutputs(
1299 CodeGenFunction &CGF, LValue ReturnSlot, std::string &Constraints,
1300 std::vector<llvm::Type *> &ResultRegTypes,
1301 std::vector<llvm::Type *> &ResultTruncRegTypes,
1302 std::vector<LValue> &ResultRegDests, std::string &AsmString,
1303 unsigned NumOutputs) const {
1304 uint64_t RetWidth = CGF.getContext().getTypeSize(ReturnSlot.getType());
1305
1306 // Use the EAX constraint if the width is 32 or smaller and EAX:EDX if it is
1307 // larger.
1308 if (!Constraints.empty())
1309 Constraints += ',';
1310 if (RetWidth <= 32) {
1311 Constraints += "={eax}";
1312 ResultRegTypes.push_back(CGF.Int32Ty);
1313 } else {
1314 // Use the 'A' constraint for EAX:EDX.
1315 Constraints += "=A";
1316 ResultRegTypes.push_back(CGF.Int64Ty);
1317 }
1318
1319 // Truncate EAX or EAX:EDX to an integer of the appropriate size.
1320 llvm::Type *CoerceTy = llvm::IntegerType::get(CGF.getLLVMContext(), RetWidth);
1321 ResultTruncRegTypes.push_back(CoerceTy);
1322
1323 // Coerce the integer by bitcasting the return slot pointer.
1324 ReturnSlot.setAddress(CGF.Builder.CreateBitCast(ReturnSlot.getAddress(CGF),
1325 CoerceTy->getPointerTo()));
1326 ResultRegDests.push_back(ReturnSlot);
1327
1328 rewriteInputConstraintReferences(NumOutputs, 1, AsmString);
1329 }
1330
1331 /// shouldReturnTypeInRegister - Determine if the given type should be
1332 /// returned in a register (for the Darwin and MCU ABI).
shouldReturnTypeInRegister(QualType Ty,ASTContext & Context) const1333 bool X86_32ABIInfo::shouldReturnTypeInRegister(QualType Ty,
1334 ASTContext &Context) const {
1335 uint64_t Size = Context.getTypeSize(Ty);
1336
1337 // For i386, type must be register sized.
1338 // For the MCU ABI, it only needs to be <= 8-byte
1339 if ((IsMCUABI && Size > 64) || (!IsMCUABI && !isRegisterSize(Size)))
1340 return false;
1341
1342 if (Ty->isVectorType()) {
1343 // 64- and 128- bit vectors inside structures are not returned in
1344 // registers.
1345 if (Size == 64 || Size == 128)
1346 return false;
1347
1348 return true;
1349 }
1350
1351 // If this is a builtin, pointer, enum, complex type, member pointer, or
1352 // member function pointer it is ok.
1353 if (Ty->getAs<BuiltinType>() || Ty->hasPointerRepresentation() ||
1354 Ty->isAnyComplexType() || Ty->isEnumeralType() ||
1355 Ty->isBlockPointerType() || Ty->isMemberPointerType())
1356 return true;
1357
1358 // Arrays are treated like records.
1359 if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty))
1360 return shouldReturnTypeInRegister(AT->getElementType(), Context);
1361
1362 // Otherwise, it must be a record type.
1363 const RecordType *RT = Ty->getAs<RecordType>();
1364 if (!RT) return false;
1365
1366 // FIXME: Traverse bases here too.
1367
1368 // Structure types are passed in register if all fields would be
1369 // passed in a register.
1370 for (const auto *FD : RT->getDecl()->fields()) {
1371 // Empty fields are ignored.
1372 if (isEmptyField(Context, FD, true))
1373 continue;
1374
1375 // Check fields recursively.
1376 if (!shouldReturnTypeInRegister(FD->getType(), Context))
1377 return false;
1378 }
1379 return true;
1380 }
1381
is32Or64BitBasicType(QualType Ty,ASTContext & Context)1382 static bool is32Or64BitBasicType(QualType Ty, ASTContext &Context) {
1383 // Treat complex types as the element type.
1384 if (const ComplexType *CTy = Ty->getAs<ComplexType>())
1385 Ty = CTy->getElementType();
1386
1387 // Check for a type which we know has a simple scalar argument-passing
1388 // convention without any padding. (We're specifically looking for 32
1389 // and 64-bit integer and integer-equivalents, float, and double.)
1390 if (!Ty->getAs<BuiltinType>() && !Ty->hasPointerRepresentation() &&
1391 !Ty->isEnumeralType() && !Ty->isBlockPointerType())
1392 return false;
1393
1394 uint64_t Size = Context.getTypeSize(Ty);
1395 return Size == 32 || Size == 64;
1396 }
1397
addFieldSizes(ASTContext & Context,const RecordDecl * RD,uint64_t & Size)1398 static bool addFieldSizes(ASTContext &Context, const RecordDecl *RD,
1399 uint64_t &Size) {
1400 for (const auto *FD : RD->fields()) {
1401 // Scalar arguments on the stack get 4 byte alignment on x86. If the
1402 // argument is smaller than 32-bits, expanding the struct will create
1403 // alignment padding.
1404 if (!is32Or64BitBasicType(FD->getType(), Context))
1405 return false;
1406
1407 // FIXME: Reject bit-fields wholesale; there are two problems, we don't know
1408 // how to expand them yet, and the predicate for telling if a bitfield still
1409 // counts as "basic" is more complicated than what we were doing previously.
1410 if (FD->isBitField())
1411 return false;
1412
1413 Size += Context.getTypeSize(FD->getType());
1414 }
1415 return true;
1416 }
1417
addBaseAndFieldSizes(ASTContext & Context,const CXXRecordDecl * RD,uint64_t & Size)1418 static bool addBaseAndFieldSizes(ASTContext &Context, const CXXRecordDecl *RD,
1419 uint64_t &Size) {
1420 // Don't do this if there are any non-empty bases.
1421 for (const CXXBaseSpecifier &Base : RD->bases()) {
1422 if (!addBaseAndFieldSizes(Context, Base.getType()->getAsCXXRecordDecl(),
1423 Size))
1424 return false;
1425 }
1426 if (!addFieldSizes(Context, RD, Size))
1427 return false;
1428 return true;
1429 }
1430
1431 /// Test whether an argument type which is to be passed indirectly (on the
1432 /// stack) would have the equivalent layout if it was expanded into separate
1433 /// arguments. If so, we prefer to do the latter to avoid inhibiting
1434 /// optimizations.
canExpandIndirectArgument(QualType Ty) const1435 bool X86_32ABIInfo::canExpandIndirectArgument(QualType Ty) const {
1436 // We can only expand structure types.
1437 const RecordType *RT = Ty->getAs<RecordType>();
1438 if (!RT)
1439 return false;
1440 const RecordDecl *RD = RT->getDecl();
1441 uint64_t Size = 0;
1442 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
1443 if (!IsWin32StructABI) {
1444 // On non-Windows, we have to conservatively match our old bitcode
1445 // prototypes in order to be ABI-compatible at the bitcode level.
1446 if (!CXXRD->isCLike())
1447 return false;
1448 } else {
1449 // Don't do this for dynamic classes.
1450 if (CXXRD->isDynamicClass())
1451 return false;
1452 }
1453 if (!addBaseAndFieldSizes(getContext(), CXXRD, Size))
1454 return false;
1455 } else {
1456 if (!addFieldSizes(getContext(), RD, Size))
1457 return false;
1458 }
1459
1460 // We can do this if there was no alignment padding.
1461 return Size == getContext().getTypeSize(Ty);
1462 }
1463
getIndirectReturnResult(QualType RetTy,CCState & State) const1464 ABIArgInfo X86_32ABIInfo::getIndirectReturnResult(QualType RetTy, CCState &State) const {
1465 // If the return value is indirect, then the hidden argument is consuming one
1466 // integer register.
1467 if (State.FreeRegs) {
1468 --State.FreeRegs;
1469 if (!IsMCUABI)
1470 return getNaturalAlignIndirectInReg(RetTy);
1471 }
1472 return getNaturalAlignIndirect(RetTy, /*ByVal=*/false);
1473 }
1474
classifyReturnType(QualType RetTy,CCState & State) const1475 ABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy,
1476 CCState &State) const {
1477 if (RetTy->isVoidType())
1478 return ABIArgInfo::getIgnore();
1479
1480 const Type *Base = nullptr;
1481 uint64_t NumElts = 0;
1482 if ((State.CC == llvm::CallingConv::X86_VectorCall ||
1483 State.CC == llvm::CallingConv::X86_RegCall) &&
1484 isHomogeneousAggregate(RetTy, Base, NumElts)) {
1485 // The LLVM struct type for such an aggregate should lower properly.
1486 return ABIArgInfo::getDirect();
1487 }
1488
1489 if (const VectorType *VT = RetTy->getAs<VectorType>()) {
1490 // On Darwin, some vectors are returned in registers.
1491 if (IsDarwinVectorABI) {
1492 uint64_t Size = getContext().getTypeSize(RetTy);
1493
1494 // 128-bit vectors are a special case; they are returned in
1495 // registers and we need to make sure to pick a type the LLVM
1496 // backend will like.
1497 if (Size == 128)
1498 return ABIArgInfo::getDirect(llvm::FixedVectorType::get(
1499 llvm::Type::getInt64Ty(getVMContext()), 2));
1500
1501 // Always return in register if it fits in a general purpose
1502 // register, or if it is 64 bits and has a single element.
1503 if ((Size == 8 || Size == 16 || Size == 32) ||
1504 (Size == 64 && VT->getNumElements() == 1))
1505 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),
1506 Size));
1507
1508 return getIndirectReturnResult(RetTy, State);
1509 }
1510
1511 return ABIArgInfo::getDirect();
1512 }
1513
1514 if (isAggregateTypeForABI(RetTy)) {
1515 if (const RecordType *RT = RetTy->getAs<RecordType>()) {
1516 // Structures with flexible arrays are always indirect.
1517 if (RT->getDecl()->hasFlexibleArrayMember())
1518 return getIndirectReturnResult(RetTy, State);
1519 }
1520
1521 // If specified, structs and unions are always indirect.
1522 if (!IsRetSmallStructInRegABI && !RetTy->isAnyComplexType())
1523 return getIndirectReturnResult(RetTy, State);
1524
1525 // Ignore empty structs/unions.
1526 if (isEmptyRecord(getContext(), RetTy, true))
1527 return ABIArgInfo::getIgnore();
1528
1529 // Small structures which are register sized are generally returned
1530 // in a register.
1531 if (shouldReturnTypeInRegister(RetTy, getContext())) {
1532 uint64_t Size = getContext().getTypeSize(RetTy);
1533
1534 // As a special-case, if the struct is a "single-element" struct, and
1535 // the field is of type "float" or "double", return it in a
1536 // floating-point register. (MSVC does not apply this special case.)
1537 // We apply a similar transformation for pointer types to improve the
1538 // quality of the generated IR.
1539 if (const Type *SeltTy = isSingleElementStruct(RetTy, getContext()))
1540 if ((!IsWin32StructABI && SeltTy->isRealFloatingType())
1541 || SeltTy->hasPointerRepresentation())
1542 return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0)));
1543
1544 // FIXME: We should be able to narrow this integer in cases with dead
1545 // padding.
1546 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),Size));
1547 }
1548
1549 return getIndirectReturnResult(RetTy, State);
1550 }
1551
1552 // Treat an enum type as its underlying type.
1553 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
1554 RetTy = EnumTy->getDecl()->getIntegerType();
1555
1556 if (const auto *EIT = RetTy->getAs<ExtIntType>())
1557 if (EIT->getNumBits() > 64)
1558 return getIndirectReturnResult(RetTy, State);
1559
1560 return (isPromotableIntegerTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
1561 : ABIArgInfo::getDirect());
1562 }
1563
isSIMDVectorType(ASTContext & Context,QualType Ty)1564 static bool isSIMDVectorType(ASTContext &Context, QualType Ty) {
1565 return Ty->getAs<VectorType>() && Context.getTypeSize(Ty) == 128;
1566 }
1567
isRecordWithSIMDVectorType(ASTContext & Context,QualType Ty)1568 static bool isRecordWithSIMDVectorType(ASTContext &Context, QualType Ty) {
1569 const RecordType *RT = Ty->getAs<RecordType>();
1570 if (!RT)
1571 return 0;
1572 const RecordDecl *RD = RT->getDecl();
1573
1574 // If this is a C++ record, check the bases first.
1575 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
1576 for (const auto &I : CXXRD->bases())
1577 if (!isRecordWithSIMDVectorType(Context, I.getType()))
1578 return false;
1579
1580 for (const auto *i : RD->fields()) {
1581 QualType FT = i->getType();
1582
1583 if (isSIMDVectorType(Context, FT))
1584 return true;
1585
1586 if (isRecordWithSIMDVectorType(Context, FT))
1587 return true;
1588 }
1589
1590 return false;
1591 }
1592
getTypeStackAlignInBytes(QualType Ty,unsigned Align) const1593 unsigned X86_32ABIInfo::getTypeStackAlignInBytes(QualType Ty,
1594 unsigned Align) const {
1595 // Otherwise, if the alignment is less than or equal to the minimum ABI
1596 // alignment, just use the default; the backend will handle this.
1597 if (Align <= MinABIStackAlignInBytes)
1598 return 0; // Use default alignment.
1599
1600 // On non-Darwin, the stack type alignment is always 4.
1601 if (!IsDarwinVectorABI) {
1602 // Set explicit alignment, since we may need to realign the top.
1603 return MinABIStackAlignInBytes;
1604 }
1605
1606 // Otherwise, if the type contains an SSE vector type, the alignment is 16.
1607 if (Align >= 16 && (isSIMDVectorType(getContext(), Ty) ||
1608 isRecordWithSIMDVectorType(getContext(), Ty)))
1609 return 16;
1610
1611 return MinABIStackAlignInBytes;
1612 }
1613
getIndirectResult(QualType Ty,bool ByVal,CCState & State) const1614 ABIArgInfo X86_32ABIInfo::getIndirectResult(QualType Ty, bool ByVal,
1615 CCState &State) const {
1616 if (!ByVal) {
1617 if (State.FreeRegs) {
1618 --State.FreeRegs; // Non-byval indirects just use one pointer.
1619 if (!IsMCUABI)
1620 return getNaturalAlignIndirectInReg(Ty);
1621 }
1622 return getNaturalAlignIndirect(Ty, false);
1623 }
1624
1625 // Compute the byval alignment.
1626 unsigned TypeAlign = getContext().getTypeAlign(Ty) / 8;
1627 unsigned StackAlign = getTypeStackAlignInBytes(Ty, TypeAlign);
1628 if (StackAlign == 0)
1629 return ABIArgInfo::getIndirect(CharUnits::fromQuantity(4), /*ByVal=*/true);
1630
1631 // If the stack alignment is less than the type alignment, realign the
1632 // argument.
1633 bool Realign = TypeAlign > StackAlign;
1634 return ABIArgInfo::getIndirect(CharUnits::fromQuantity(StackAlign),
1635 /*ByVal=*/true, Realign);
1636 }
1637
classify(QualType Ty) const1638 X86_32ABIInfo::Class X86_32ABIInfo::classify(QualType Ty) const {
1639 const Type *T = isSingleElementStruct(Ty, getContext());
1640 if (!T)
1641 T = Ty.getTypePtr();
1642
1643 if (const BuiltinType *BT = T->getAs<BuiltinType>()) {
1644 BuiltinType::Kind K = BT->getKind();
1645 if (K == BuiltinType::Float || K == BuiltinType::Double)
1646 return Float;
1647 }
1648 return Integer;
1649 }
1650
updateFreeRegs(QualType Ty,CCState & State) const1651 bool X86_32ABIInfo::updateFreeRegs(QualType Ty, CCState &State) const {
1652 if (!IsSoftFloatABI) {
1653 Class C = classify(Ty);
1654 if (C == Float)
1655 return false;
1656 }
1657
1658 unsigned Size = getContext().getTypeSize(Ty);
1659 unsigned SizeInRegs = (Size + 31) / 32;
1660
1661 if (SizeInRegs == 0)
1662 return false;
1663
1664 if (!IsMCUABI) {
1665 if (SizeInRegs > State.FreeRegs) {
1666 State.FreeRegs = 0;
1667 return false;
1668 }
1669 } else {
1670 // The MCU psABI allows passing parameters in-reg even if there are
1671 // earlier parameters that are passed on the stack. Also,
1672 // it does not allow passing >8-byte structs in-register,
1673 // even if there are 3 free registers available.
1674 if (SizeInRegs > State.FreeRegs || SizeInRegs > 2)
1675 return false;
1676 }
1677
1678 State.FreeRegs -= SizeInRegs;
1679 return true;
1680 }
1681
shouldAggregateUseDirect(QualType Ty,CCState & State,bool & InReg,bool & NeedsPadding) const1682 bool X86_32ABIInfo::shouldAggregateUseDirect(QualType Ty, CCState &State,
1683 bool &InReg,
1684 bool &NeedsPadding) const {
1685 // On Windows, aggregates other than HFAs are never passed in registers, and
1686 // they do not consume register slots. Homogenous floating-point aggregates
1687 // (HFAs) have already been dealt with at this point.
1688 if (IsWin32StructABI && isAggregateTypeForABI(Ty))
1689 return false;
1690
1691 NeedsPadding = false;
1692 InReg = !IsMCUABI;
1693
1694 if (!updateFreeRegs(Ty, State))
1695 return false;
1696
1697 if (IsMCUABI)
1698 return true;
1699
1700 if (State.CC == llvm::CallingConv::X86_FastCall ||
1701 State.CC == llvm::CallingConv::X86_VectorCall ||
1702 State.CC == llvm::CallingConv::X86_RegCall) {
1703 if (getContext().getTypeSize(Ty) <= 32 && State.FreeRegs)
1704 NeedsPadding = true;
1705
1706 return false;
1707 }
1708
1709 return true;
1710 }
1711
shouldPrimitiveUseInReg(QualType Ty,CCState & State) const1712 bool X86_32ABIInfo::shouldPrimitiveUseInReg(QualType Ty, CCState &State) const {
1713 if (!updateFreeRegs(Ty, State))
1714 return false;
1715
1716 if (IsMCUABI)
1717 return false;
1718
1719 if (State.CC == llvm::CallingConv::X86_FastCall ||
1720 State.CC == llvm::CallingConv::X86_VectorCall ||
1721 State.CC == llvm::CallingConv::X86_RegCall) {
1722 if (getContext().getTypeSize(Ty) > 32)
1723 return false;
1724
1725 return (Ty->isIntegralOrEnumerationType() || Ty->isPointerType() ||
1726 Ty->isReferenceType());
1727 }
1728
1729 return true;
1730 }
1731
runVectorCallFirstPass(CGFunctionInfo & FI,CCState & State) const1732 void X86_32ABIInfo::runVectorCallFirstPass(CGFunctionInfo &FI, CCState &State) const {
1733 // Vectorcall x86 works subtly different than in x64, so the format is
1734 // a bit different than the x64 version. First, all vector types (not HVAs)
1735 // are assigned, with the first 6 ending up in the [XYZ]MM0-5 registers.
1736 // This differs from the x64 implementation, where the first 6 by INDEX get
1737 // registers.
1738 // In the second pass over the arguments, HVAs are passed in the remaining
1739 // vector registers if possible, or indirectly by address. The address will be
1740 // passed in ECX/EDX if available. Any other arguments are passed according to
1741 // the usual fastcall rules.
1742 MutableArrayRef<CGFunctionInfoArgInfo> Args = FI.arguments();
1743 for (int I = 0, E = Args.size(); I < E; ++I) {
1744 const Type *Base = nullptr;
1745 uint64_t NumElts = 0;
1746 const QualType &Ty = Args[I].type;
1747 if ((Ty->isVectorType() || Ty->isBuiltinType()) &&
1748 isHomogeneousAggregate(Ty, Base, NumElts)) {
1749 if (State.FreeSSERegs >= NumElts) {
1750 State.FreeSSERegs -= NumElts;
1751 Args[I].info = ABIArgInfo::getDirectInReg();
1752 State.IsPreassigned.set(I);
1753 }
1754 }
1755 }
1756 }
1757
classifyArgumentType(QualType Ty,CCState & State) const1758 ABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty,
1759 CCState &State) const {
1760 // FIXME: Set alignment on indirect arguments.
1761 bool IsFastCall = State.CC == llvm::CallingConv::X86_FastCall;
1762 bool IsRegCall = State.CC == llvm::CallingConv::X86_RegCall;
1763 bool IsVectorCall = State.CC == llvm::CallingConv::X86_VectorCall;
1764
1765 Ty = useFirstFieldIfTransparentUnion(Ty);
1766 TypeInfo TI = getContext().getTypeInfo(Ty);
1767
1768 // Check with the C++ ABI first.
1769 const RecordType *RT = Ty->getAs<RecordType>();
1770 if (RT) {
1771 CGCXXABI::RecordArgABI RAA = getRecordArgABI(RT, getCXXABI());
1772 if (RAA == CGCXXABI::RAA_Indirect) {
1773 return getIndirectResult(Ty, false, State);
1774 } else if (RAA == CGCXXABI::RAA_DirectInMemory) {
1775 // The field index doesn't matter, we'll fix it up later.
1776 return ABIArgInfo::getInAlloca(/*FieldIndex=*/0);
1777 }
1778 }
1779
1780 // Regcall uses the concept of a homogenous vector aggregate, similar
1781 // to other targets.
1782 const Type *Base = nullptr;
1783 uint64_t NumElts = 0;
1784 if ((IsRegCall || IsVectorCall) &&
1785 isHomogeneousAggregate(Ty, Base, NumElts)) {
1786 if (State.FreeSSERegs >= NumElts) {
1787 State.FreeSSERegs -= NumElts;
1788
1789 // Vectorcall passes HVAs directly and does not flatten them, but regcall
1790 // does.
1791 if (IsVectorCall)
1792 return getDirectX86Hva();
1793
1794 if (Ty->isBuiltinType() || Ty->isVectorType())
1795 return ABIArgInfo::getDirect();
1796 return ABIArgInfo::getExpand();
1797 }
1798 return getIndirectResult(Ty, /*ByVal=*/false, State);
1799 }
1800
1801 if (isAggregateTypeForABI(Ty)) {
1802 // Structures with flexible arrays are always indirect.
1803 // FIXME: This should not be byval!
1804 if (RT && RT->getDecl()->hasFlexibleArrayMember())
1805 return getIndirectResult(Ty, true, State);
1806
1807 // Ignore empty structs/unions on non-Windows.
1808 if (!IsWin32StructABI && isEmptyRecord(getContext(), Ty, true))
1809 return ABIArgInfo::getIgnore();
1810
1811 llvm::LLVMContext &LLVMContext = getVMContext();
1812 llvm::IntegerType *Int32 = llvm::Type::getInt32Ty(LLVMContext);
1813 bool NeedsPadding = false;
1814 bool InReg;
1815 if (shouldAggregateUseDirect(Ty, State, InReg, NeedsPadding)) {
1816 unsigned SizeInRegs = (TI.Width + 31) / 32;
1817 SmallVector<llvm::Type*, 3> Elements(SizeInRegs, Int32);
1818 llvm::Type *Result = llvm::StructType::get(LLVMContext, Elements);
1819 if (InReg)
1820 return ABIArgInfo::getDirectInReg(Result);
1821 else
1822 return ABIArgInfo::getDirect(Result);
1823 }
1824 llvm::IntegerType *PaddingType = NeedsPadding ? Int32 : nullptr;
1825
1826 // Pass over-aligned aggregates on Windows indirectly. This behavior was
1827 // added in MSVC 2015.
1828 if (IsWin32StructABI && TI.AlignIsRequired && TI.Align > 32)
1829 return getIndirectResult(Ty, /*ByVal=*/false, State);
1830
1831 // Expand small (<= 128-bit) record types when we know that the stack layout
1832 // of those arguments will match the struct. This is important because the
1833 // LLVM backend isn't smart enough to remove byval, which inhibits many
1834 // optimizations.
1835 // Don't do this for the MCU if there are still free integer registers
1836 // (see X86_64 ABI for full explanation).
1837 if (TI.Width <= 4 * 32 && (!IsMCUABI || State.FreeRegs == 0) &&
1838 canExpandIndirectArgument(Ty))
1839 return ABIArgInfo::getExpandWithPadding(
1840 IsFastCall || IsVectorCall || IsRegCall, PaddingType);
1841
1842 return getIndirectResult(Ty, true, State);
1843 }
1844
1845 if (const VectorType *VT = Ty->getAs<VectorType>()) {
1846 // On Windows, vectors are passed directly if registers are available, or
1847 // indirectly if not. This avoids the need to align argument memory. Pass
1848 // user-defined vector types larger than 512 bits indirectly for simplicity.
1849 if (IsWin32StructABI) {
1850 if (TI.Width <= 512 && State.FreeSSERegs > 0) {
1851 --State.FreeSSERegs;
1852 return ABIArgInfo::getDirectInReg();
1853 }
1854 return getIndirectResult(Ty, /*ByVal=*/false, State);
1855 }
1856
1857 // On Darwin, some vectors are passed in memory, we handle this by passing
1858 // it as an i8/i16/i32/i64.
1859 if (IsDarwinVectorABI) {
1860 if ((TI.Width == 8 || TI.Width == 16 || TI.Width == 32) ||
1861 (TI.Width == 64 && VT->getNumElements() == 1))
1862 return ABIArgInfo::getDirect(
1863 llvm::IntegerType::get(getVMContext(), TI.Width));
1864 }
1865
1866 if (IsX86_MMXType(CGT.ConvertType(Ty)))
1867 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), 64));
1868
1869 return ABIArgInfo::getDirect();
1870 }
1871
1872
1873 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
1874 Ty = EnumTy->getDecl()->getIntegerType();
1875
1876 bool InReg = shouldPrimitiveUseInReg(Ty, State);
1877
1878 if (isPromotableIntegerTypeForABI(Ty)) {
1879 if (InReg)
1880 return ABIArgInfo::getExtendInReg(Ty);
1881 return ABIArgInfo::getExtend(Ty);
1882 }
1883
1884 if (const auto * EIT = Ty->getAs<ExtIntType>()) {
1885 if (EIT->getNumBits() <= 64) {
1886 if (InReg)
1887 return ABIArgInfo::getDirectInReg();
1888 return ABIArgInfo::getDirect();
1889 }
1890 return getIndirectResult(Ty, /*ByVal=*/false, State);
1891 }
1892
1893 if (InReg)
1894 return ABIArgInfo::getDirectInReg();
1895 return ABIArgInfo::getDirect();
1896 }
1897
computeInfo(CGFunctionInfo & FI) const1898 void X86_32ABIInfo::computeInfo(CGFunctionInfo &FI) const {
1899 CCState State(FI);
1900 if (IsMCUABI)
1901 State.FreeRegs = 3;
1902 else if (State.CC == llvm::CallingConv::X86_FastCall) {
1903 State.FreeRegs = 2;
1904 State.FreeSSERegs = 3;
1905 } else if (State.CC == llvm::CallingConv::X86_VectorCall) {
1906 State.FreeRegs = 2;
1907 State.FreeSSERegs = 6;
1908 } else if (FI.getHasRegParm())
1909 State.FreeRegs = FI.getRegParm();
1910 else if (State.CC == llvm::CallingConv::X86_RegCall) {
1911 State.FreeRegs = 5;
1912 State.FreeSSERegs = 8;
1913 } else if (IsWin32StructABI) {
1914 // Since MSVC 2015, the first three SSE vectors have been passed in
1915 // registers. The rest are passed indirectly.
1916 State.FreeRegs = DefaultNumRegisterParameters;
1917 State.FreeSSERegs = 3;
1918 } else
1919 State.FreeRegs = DefaultNumRegisterParameters;
1920
1921 if (!::classifyReturnType(getCXXABI(), FI, *this)) {
1922 FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), State);
1923 } else if (FI.getReturnInfo().isIndirect()) {
1924 // The C++ ABI is not aware of register usage, so we have to check if the
1925 // return value was sret and put it in a register ourselves if appropriate.
1926 if (State.FreeRegs) {
1927 --State.FreeRegs; // The sret parameter consumes a register.
1928 if (!IsMCUABI)
1929 FI.getReturnInfo().setInReg(true);
1930 }
1931 }
1932
1933 // The chain argument effectively gives us another free register.
1934 if (FI.isChainCall())
1935 ++State.FreeRegs;
1936
1937 // For vectorcall, do a first pass over the arguments, assigning FP and vector
1938 // arguments to XMM registers as available.
1939 if (State.CC == llvm::CallingConv::X86_VectorCall)
1940 runVectorCallFirstPass(FI, State);
1941
1942 bool UsedInAlloca = false;
1943 MutableArrayRef<CGFunctionInfoArgInfo> Args = FI.arguments();
1944 for (int I = 0, E = Args.size(); I < E; ++I) {
1945 // Skip arguments that have already been assigned.
1946 if (State.IsPreassigned.test(I))
1947 continue;
1948
1949 Args[I].info = classifyArgumentType(Args[I].type, State);
1950 UsedInAlloca |= (Args[I].info.getKind() == ABIArgInfo::InAlloca);
1951 }
1952
1953 // If we needed to use inalloca for any argument, do a second pass and rewrite
1954 // all the memory arguments to use inalloca.
1955 if (UsedInAlloca)
1956 rewriteWithInAlloca(FI);
1957 }
1958
1959 void
addFieldToArgStruct(SmallVector<llvm::Type *,6> & FrameFields,CharUnits & StackOffset,ABIArgInfo & Info,QualType Type) const1960 X86_32ABIInfo::addFieldToArgStruct(SmallVector<llvm::Type *, 6> &FrameFields,
1961 CharUnits &StackOffset, ABIArgInfo &Info,
1962 QualType Type) const {
1963 // Arguments are always 4-byte-aligned.
1964 CharUnits WordSize = CharUnits::fromQuantity(4);
1965 assert(StackOffset.isMultipleOf(WordSize) && "unaligned inalloca struct");
1966
1967 // sret pointers and indirect things will require an extra pointer
1968 // indirection, unless they are byval. Most things are byval, and will not
1969 // require this indirection.
1970 bool IsIndirect = false;
1971 if (Info.isIndirect() && !Info.getIndirectByVal())
1972 IsIndirect = true;
1973 Info = ABIArgInfo::getInAlloca(FrameFields.size(), IsIndirect);
1974 llvm::Type *LLTy = CGT.ConvertTypeForMem(Type);
1975 if (IsIndirect)
1976 LLTy = LLTy->getPointerTo(0);
1977 FrameFields.push_back(LLTy);
1978 StackOffset += IsIndirect ? WordSize : getContext().getTypeSizeInChars(Type);
1979
1980 // Insert padding bytes to respect alignment.
1981 CharUnits FieldEnd = StackOffset;
1982 StackOffset = FieldEnd.alignTo(WordSize);
1983 if (StackOffset != FieldEnd) {
1984 CharUnits NumBytes = StackOffset - FieldEnd;
1985 llvm::Type *Ty = llvm::Type::getInt8Ty(getVMContext());
1986 Ty = llvm::ArrayType::get(Ty, NumBytes.getQuantity());
1987 FrameFields.push_back(Ty);
1988 }
1989 }
1990
isArgInAlloca(const ABIArgInfo & Info)1991 static bool isArgInAlloca(const ABIArgInfo &Info) {
1992 // Leave ignored and inreg arguments alone.
1993 switch (Info.getKind()) {
1994 case ABIArgInfo::InAlloca:
1995 return true;
1996 case ABIArgInfo::Ignore:
1997 case ABIArgInfo::IndirectAliased:
1998 return false;
1999 case ABIArgInfo::Indirect:
2000 case ABIArgInfo::Direct:
2001 case ABIArgInfo::Extend:
2002 return !Info.getInReg();
2003 case ABIArgInfo::Expand:
2004 case ABIArgInfo::CoerceAndExpand:
2005 // These are aggregate types which are never passed in registers when
2006 // inalloca is involved.
2007 return true;
2008 }
2009 llvm_unreachable("invalid enum");
2010 }
2011
rewriteWithInAlloca(CGFunctionInfo & FI) const2012 void X86_32ABIInfo::rewriteWithInAlloca(CGFunctionInfo &FI) const {
2013 assert(IsWin32StructABI && "inalloca only supported on win32");
2014
2015 // Build a packed struct type for all of the arguments in memory.
2016 SmallVector<llvm::Type *, 6> FrameFields;
2017
2018 // The stack alignment is always 4.
2019 CharUnits StackAlign = CharUnits::fromQuantity(4);
2020
2021 CharUnits StackOffset;
2022 CGFunctionInfo::arg_iterator I = FI.arg_begin(), E = FI.arg_end();
2023
2024 // Put 'this' into the struct before 'sret', if necessary.
2025 bool IsThisCall =
2026 FI.getCallingConvention() == llvm::CallingConv::X86_ThisCall;
2027 ABIArgInfo &Ret = FI.getReturnInfo();
2028 if (Ret.isIndirect() && Ret.isSRetAfterThis() && !IsThisCall &&
2029 isArgInAlloca(I->info)) {
2030 addFieldToArgStruct(FrameFields, StackOffset, I->info, I->type);
2031 ++I;
2032 }
2033
2034 // Put the sret parameter into the inalloca struct if it's in memory.
2035 if (Ret.isIndirect() && !Ret.getInReg()) {
2036 addFieldToArgStruct(FrameFields, StackOffset, Ret, FI.getReturnType());
2037 // On Windows, the hidden sret parameter is always returned in eax.
2038 Ret.setInAllocaSRet(IsWin32StructABI);
2039 }
2040
2041 // Skip the 'this' parameter in ecx.
2042 if (IsThisCall)
2043 ++I;
2044
2045 // Put arguments passed in memory into the struct.
2046 for (; I != E; ++I) {
2047 if (isArgInAlloca(I->info))
2048 addFieldToArgStruct(FrameFields, StackOffset, I->info, I->type);
2049 }
2050
2051 FI.setArgStruct(llvm::StructType::get(getVMContext(), FrameFields,
2052 /*isPacked=*/true),
2053 StackAlign);
2054 }
2055
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const2056 Address X86_32ABIInfo::EmitVAArg(CodeGenFunction &CGF,
2057 Address VAListAddr, QualType Ty) const {
2058
2059 auto TypeInfo = getContext().getTypeInfoInChars(Ty);
2060
2061 // x86-32 changes the alignment of certain arguments on the stack.
2062 //
2063 // Just messing with TypeInfo like this works because we never pass
2064 // anything indirectly.
2065 TypeInfo.Align = CharUnits::fromQuantity(
2066 getTypeStackAlignInBytes(Ty, TypeInfo.Align.getQuantity()));
2067
2068 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, /*Indirect*/ false,
2069 TypeInfo, CharUnits::fromQuantity(4),
2070 /*AllowHigherAlign*/ true);
2071 }
2072
isStructReturnInRegABI(const llvm::Triple & Triple,const CodeGenOptions & Opts)2073 bool X86_32TargetCodeGenInfo::isStructReturnInRegABI(
2074 const llvm::Triple &Triple, const CodeGenOptions &Opts) {
2075 assert(Triple.getArch() == llvm::Triple::x86);
2076
2077 switch (Opts.getStructReturnConvention()) {
2078 case CodeGenOptions::SRCK_Default:
2079 break;
2080 case CodeGenOptions::SRCK_OnStack: // -fpcc-struct-return
2081 return false;
2082 case CodeGenOptions::SRCK_InRegs: // -freg-struct-return
2083 return true;
2084 }
2085
2086 if (Triple.isOSDarwin() || Triple.isOSIAMCU())
2087 return true;
2088
2089 switch (Triple.getOS()) {
2090 case llvm::Triple::DragonFly:
2091 case llvm::Triple::FreeBSD:
2092 case llvm::Triple::OpenBSD:
2093 case llvm::Triple::Win32:
2094 return true;
2095 default:
2096 return false;
2097 }
2098 }
2099
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const2100 void X86_32TargetCodeGenInfo::setTargetAttributes(
2101 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const {
2102 if (GV->isDeclaration())
2103 return;
2104 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
2105 if (FD->hasAttr<X86ForceAlignArgPointerAttr>()) {
2106 llvm::Function *Fn = cast<llvm::Function>(GV);
2107 Fn->addFnAttr("stackrealign");
2108 }
2109 if (FD->hasAttr<AnyX86InterruptAttr>()) {
2110 llvm::Function *Fn = cast<llvm::Function>(GV);
2111 Fn->setCallingConv(llvm::CallingConv::X86_INTR);
2112 }
2113 }
2114 }
2115
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const2116 bool X86_32TargetCodeGenInfo::initDwarfEHRegSizeTable(
2117 CodeGen::CodeGenFunction &CGF,
2118 llvm::Value *Address) const {
2119 CodeGen::CGBuilderTy &Builder = CGF.Builder;
2120
2121 llvm::Value *Four8 = llvm::ConstantInt::get(CGF.Int8Ty, 4);
2122
2123 // 0-7 are the eight integer registers; the order is different
2124 // on Darwin (for EH), but the range is the same.
2125 // 8 is %eip.
2126 AssignToArrayRange(Builder, Address, Four8, 0, 8);
2127
2128 if (CGF.CGM.getTarget().getTriple().isOSDarwin()) {
2129 // 12-16 are st(0..4). Not sure why we stop at 4.
2130 // These have size 16, which is sizeof(long double) on
2131 // platforms with 8-byte alignment for that type.
2132 llvm::Value *Sixteen8 = llvm::ConstantInt::get(CGF.Int8Ty, 16);
2133 AssignToArrayRange(Builder, Address, Sixteen8, 12, 16);
2134
2135 } else {
2136 // 9 is %eflags, which doesn't get a size on Darwin for some
2137 // reason.
2138 Builder.CreateAlignedStore(
2139 Four8, Builder.CreateConstInBoundsGEP1_32(CGF.Int8Ty, Address, 9),
2140 CharUnits::One());
2141
2142 // 11-16 are st(0..5). Not sure why we stop at 5.
2143 // These have size 12, which is sizeof(long double) on
2144 // platforms with 4-byte alignment for that type.
2145 llvm::Value *Twelve8 = llvm::ConstantInt::get(CGF.Int8Ty, 12);
2146 AssignToArrayRange(Builder, Address, Twelve8, 11, 16);
2147 }
2148
2149 return false;
2150 }
2151
2152 //===----------------------------------------------------------------------===//
2153 // X86-64 ABI Implementation
2154 //===----------------------------------------------------------------------===//
2155
2156
2157 namespace {
2158 /// The AVX ABI level for X86 targets.
2159 enum class X86AVXABILevel {
2160 None,
2161 AVX,
2162 AVX512
2163 };
2164
2165 /// \p returns the size in bits of the largest (native) vector for \p AVXLevel.
getNativeVectorSizeForAVXABI(X86AVXABILevel AVXLevel)2166 static unsigned getNativeVectorSizeForAVXABI(X86AVXABILevel AVXLevel) {
2167 switch (AVXLevel) {
2168 case X86AVXABILevel::AVX512:
2169 return 512;
2170 case X86AVXABILevel::AVX:
2171 return 256;
2172 case X86AVXABILevel::None:
2173 return 128;
2174 }
2175 llvm_unreachable("Unknown AVXLevel");
2176 }
2177
2178 /// X86_64ABIInfo - The X86_64 ABI information.
2179 class X86_64ABIInfo : public SwiftABIInfo {
2180 enum Class {
2181 Integer = 0,
2182 SSE,
2183 SSEUp,
2184 X87,
2185 X87Up,
2186 ComplexX87,
2187 NoClass,
2188 Memory
2189 };
2190
2191 /// merge - Implement the X86_64 ABI merging algorithm.
2192 ///
2193 /// Merge an accumulating classification \arg Accum with a field
2194 /// classification \arg Field.
2195 ///
2196 /// \param Accum - The accumulating classification. This should
2197 /// always be either NoClass or the result of a previous merge
2198 /// call. In addition, this should never be Memory (the caller
2199 /// should just return Memory for the aggregate).
2200 static Class merge(Class Accum, Class Field);
2201
2202 /// postMerge - Implement the X86_64 ABI post merging algorithm.
2203 ///
2204 /// Post merger cleanup, reduces a malformed Hi and Lo pair to
2205 /// final MEMORY or SSE classes when necessary.
2206 ///
2207 /// \param AggregateSize - The size of the current aggregate in
2208 /// the classification process.
2209 ///
2210 /// \param Lo - The classification for the parts of the type
2211 /// residing in the low word of the containing object.
2212 ///
2213 /// \param Hi - The classification for the parts of the type
2214 /// residing in the higher words of the containing object.
2215 ///
2216 void postMerge(unsigned AggregateSize, Class &Lo, Class &Hi) const;
2217
2218 /// classify - Determine the x86_64 register classes in which the
2219 /// given type T should be passed.
2220 ///
2221 /// \param Lo - The classification for the parts of the type
2222 /// residing in the low word of the containing object.
2223 ///
2224 /// \param Hi - The classification for the parts of the type
2225 /// residing in the high word of the containing object.
2226 ///
2227 /// \param OffsetBase - The bit offset of this type in the
2228 /// containing object. Some parameters are classified different
2229 /// depending on whether they straddle an eightbyte boundary.
2230 ///
2231 /// \param isNamedArg - Whether the argument in question is a "named"
2232 /// argument, as used in AMD64-ABI 3.5.7.
2233 ///
2234 /// If a word is unused its result will be NoClass; if a type should
2235 /// be passed in Memory then at least the classification of \arg Lo
2236 /// will be Memory.
2237 ///
2238 /// The \arg Lo class will be NoClass iff the argument is ignored.
2239 ///
2240 /// If the \arg Lo class is ComplexX87, then the \arg Hi class will
2241 /// also be ComplexX87.
2242 void classify(QualType T, uint64_t OffsetBase, Class &Lo, Class &Hi,
2243 bool isNamedArg) const;
2244
2245 llvm::Type *GetByteVectorType(QualType Ty) const;
2246 llvm::Type *GetSSETypeAtOffset(llvm::Type *IRType,
2247 unsigned IROffset, QualType SourceTy,
2248 unsigned SourceOffset) const;
2249 llvm::Type *GetINTEGERTypeAtOffset(llvm::Type *IRType,
2250 unsigned IROffset, QualType SourceTy,
2251 unsigned SourceOffset) const;
2252
2253 /// getIndirectResult - Give a source type \arg Ty, return a suitable result
2254 /// such that the argument will be returned in memory.
2255 ABIArgInfo getIndirectReturnResult(QualType Ty) const;
2256
2257 /// getIndirectResult - Give a source type \arg Ty, return a suitable result
2258 /// such that the argument will be passed in memory.
2259 ///
2260 /// \param freeIntRegs - The number of free integer registers remaining
2261 /// available.
2262 ABIArgInfo getIndirectResult(QualType Ty, unsigned freeIntRegs) const;
2263
2264 ABIArgInfo classifyReturnType(QualType RetTy) const;
2265
2266 ABIArgInfo classifyArgumentType(QualType Ty, unsigned freeIntRegs,
2267 unsigned &neededInt, unsigned &neededSSE,
2268 bool isNamedArg) const;
2269
2270 ABIArgInfo classifyRegCallStructType(QualType Ty, unsigned &NeededInt,
2271 unsigned &NeededSSE) const;
2272
2273 ABIArgInfo classifyRegCallStructTypeImpl(QualType Ty, unsigned &NeededInt,
2274 unsigned &NeededSSE) const;
2275
2276 bool IsIllegalVectorType(QualType Ty) const;
2277
2278 /// The 0.98 ABI revision clarified a lot of ambiguities,
2279 /// unfortunately in ways that were not always consistent with
2280 /// certain previous compilers. In particular, platforms which
2281 /// required strict binary compatibility with older versions of GCC
2282 /// may need to exempt themselves.
honorsRevision0_98() const2283 bool honorsRevision0_98() const {
2284 return !getTarget().getTriple().isOSDarwin();
2285 }
2286
2287 /// GCC classifies <1 x long long> as SSE but some platform ABIs choose to
2288 /// classify it as INTEGER (for compatibility with older clang compilers).
classifyIntegerMMXAsSSE() const2289 bool classifyIntegerMMXAsSSE() const {
2290 // Clang <= 3.8 did not do this.
2291 if (getContext().getLangOpts().getClangABICompat() <=
2292 LangOptions::ClangABI::Ver3_8)
2293 return false;
2294
2295 const llvm::Triple &Triple = getTarget().getTriple();
2296 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::PS4)
2297 return false;
2298 if (Triple.isOSFreeBSD() && Triple.getOSMajorVersion() >= 10)
2299 return false;
2300 return true;
2301 }
2302
2303 // GCC classifies vectors of __int128 as memory.
passInt128VectorsInMem() const2304 bool passInt128VectorsInMem() const {
2305 // Clang <= 9.0 did not do this.
2306 if (getContext().getLangOpts().getClangABICompat() <=
2307 LangOptions::ClangABI::Ver9)
2308 return false;
2309
2310 const llvm::Triple &T = getTarget().getTriple();
2311 return T.isOSLinux() || T.isOSNetBSD();
2312 }
2313
2314 X86AVXABILevel AVXLevel;
2315 // Some ABIs (e.g. X32 ABI and Native Client OS) use 32 bit pointers on
2316 // 64-bit hardware.
2317 bool Has64BitPointers;
2318
2319 public:
X86_64ABIInfo(CodeGen::CodeGenTypes & CGT,X86AVXABILevel AVXLevel)2320 X86_64ABIInfo(CodeGen::CodeGenTypes &CGT, X86AVXABILevel AVXLevel) :
2321 SwiftABIInfo(CGT), AVXLevel(AVXLevel),
2322 Has64BitPointers(CGT.getDataLayout().getPointerSize(0) == 8) {
2323 }
2324
isPassedUsingAVXType(QualType type) const2325 bool isPassedUsingAVXType(QualType type) const {
2326 unsigned neededInt, neededSSE;
2327 // The freeIntRegs argument doesn't matter here.
2328 ABIArgInfo info = classifyArgumentType(type, 0, neededInt, neededSSE,
2329 /*isNamedArg*/true);
2330 if (info.isDirect()) {
2331 llvm::Type *ty = info.getCoerceToType();
2332 if (llvm::VectorType *vectorTy = dyn_cast_or_null<llvm::VectorType>(ty))
2333 return vectorTy->getPrimitiveSizeInBits().getFixedSize() > 128;
2334 }
2335 return false;
2336 }
2337
2338 void computeInfo(CGFunctionInfo &FI) const override;
2339
2340 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
2341 QualType Ty) const override;
2342 Address EmitMSVAArg(CodeGenFunction &CGF, Address VAListAddr,
2343 QualType Ty) const override;
2344
has64BitPointers() const2345 bool has64BitPointers() const {
2346 return Has64BitPointers;
2347 }
2348
shouldPassIndirectlyForSwift(ArrayRef<llvm::Type * > scalars,bool asReturnValue) const2349 bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars,
2350 bool asReturnValue) const override {
2351 return occupiesMoreThan(CGT, scalars, /*total*/ 4);
2352 }
isSwiftErrorInRegister() const2353 bool isSwiftErrorInRegister() const override {
2354 return true;
2355 }
2356 };
2357
2358 /// WinX86_64ABIInfo - The Windows X86_64 ABI information.
2359 class WinX86_64ABIInfo : public SwiftABIInfo {
2360 public:
WinX86_64ABIInfo(CodeGen::CodeGenTypes & CGT,X86AVXABILevel AVXLevel)2361 WinX86_64ABIInfo(CodeGen::CodeGenTypes &CGT, X86AVXABILevel AVXLevel)
2362 : SwiftABIInfo(CGT), AVXLevel(AVXLevel),
2363 IsMingw64(getTarget().getTriple().isWindowsGNUEnvironment()) {}
2364
2365 void computeInfo(CGFunctionInfo &FI) const override;
2366
2367 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
2368 QualType Ty) const override;
2369
isHomogeneousAggregateBaseType(QualType Ty) const2370 bool isHomogeneousAggregateBaseType(QualType Ty) const override {
2371 // FIXME: Assumes vectorcall is in use.
2372 return isX86VectorTypeForVectorCall(getContext(), Ty);
2373 }
2374
isHomogeneousAggregateSmallEnough(const Type * Ty,uint64_t NumMembers) const2375 bool isHomogeneousAggregateSmallEnough(const Type *Ty,
2376 uint64_t NumMembers) const override {
2377 // FIXME: Assumes vectorcall is in use.
2378 return isX86VectorCallAggregateSmallEnough(NumMembers);
2379 }
2380
shouldPassIndirectlyForSwift(ArrayRef<llvm::Type * > scalars,bool asReturnValue) const2381 bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type *> scalars,
2382 bool asReturnValue) const override {
2383 return occupiesMoreThan(CGT, scalars, /*total*/ 4);
2384 }
2385
isSwiftErrorInRegister() const2386 bool isSwiftErrorInRegister() const override {
2387 return true;
2388 }
2389
2390 private:
2391 ABIArgInfo classify(QualType Ty, unsigned &FreeSSERegs, bool IsReturnType,
2392 bool IsVectorCall, bool IsRegCall) const;
2393 ABIArgInfo reclassifyHvaArgType(QualType Ty, unsigned &FreeSSERegs,
2394 const ABIArgInfo ¤t) const;
2395 void computeVectorCallArgs(CGFunctionInfo &FI, unsigned FreeSSERegs,
2396 bool IsVectorCall, bool IsRegCall) const;
2397
2398 X86AVXABILevel AVXLevel;
2399
2400 bool IsMingw64;
2401 };
2402
2403 class X86_64TargetCodeGenInfo : public TargetCodeGenInfo {
2404 public:
X86_64TargetCodeGenInfo(CodeGen::CodeGenTypes & CGT,X86AVXABILevel AVXLevel)2405 X86_64TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, X86AVXABILevel AVXLevel)
2406 : TargetCodeGenInfo(std::make_unique<X86_64ABIInfo>(CGT, AVXLevel)) {}
2407
getABIInfo() const2408 const X86_64ABIInfo &getABIInfo() const {
2409 return static_cast<const X86_64ABIInfo&>(TargetCodeGenInfo::getABIInfo());
2410 }
2411
2412 /// Disable tail call on x86-64. The epilogue code before the tail jump blocks
2413 /// autoreleaseRV/retainRV and autoreleaseRV/unsafeClaimRV optimizations.
markARCOptimizedReturnCallsAsNoTail() const2414 bool markARCOptimizedReturnCallsAsNoTail() const override { return true; }
2415
getDwarfEHStackPointer(CodeGen::CodeGenModule & CGM) const2416 int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const override {
2417 return 7;
2418 }
2419
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const2420 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
2421 llvm::Value *Address) const override {
2422 llvm::Value *Eight8 = llvm::ConstantInt::get(CGF.Int8Ty, 8);
2423
2424 // 0-15 are the 16 integer registers.
2425 // 16 is %rip.
2426 AssignToArrayRange(CGF.Builder, Address, Eight8, 0, 16);
2427 return false;
2428 }
2429
adjustInlineAsmType(CodeGen::CodeGenFunction & CGF,StringRef Constraint,llvm::Type * Ty) const2430 llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF,
2431 StringRef Constraint,
2432 llvm::Type* Ty) const override {
2433 return X86AdjustInlineAsmType(CGF, Constraint, Ty);
2434 }
2435
isNoProtoCallVariadic(const CallArgList & args,const FunctionNoProtoType * fnType) const2436 bool isNoProtoCallVariadic(const CallArgList &args,
2437 const FunctionNoProtoType *fnType) const override {
2438 // The default CC on x86-64 sets %al to the number of SSA
2439 // registers used, and GCC sets this when calling an unprototyped
2440 // function, so we override the default behavior. However, don't do
2441 // that when AVX types are involved: the ABI explicitly states it is
2442 // undefined, and it doesn't work in practice because of how the ABI
2443 // defines varargs anyway.
2444 if (fnType->getCallConv() == CC_C) {
2445 bool HasAVXType = false;
2446 for (CallArgList::const_iterator
2447 it = args.begin(), ie = args.end(); it != ie; ++it) {
2448 if (getABIInfo().isPassedUsingAVXType(it->Ty)) {
2449 HasAVXType = true;
2450 break;
2451 }
2452 }
2453
2454 if (!HasAVXType)
2455 return true;
2456 }
2457
2458 return TargetCodeGenInfo::isNoProtoCallVariadic(args, fnType);
2459 }
2460
2461 llvm::Constant *
getUBSanFunctionSignature(CodeGen::CodeGenModule & CGM) const2462 getUBSanFunctionSignature(CodeGen::CodeGenModule &CGM) const override {
2463 unsigned Sig = (0xeb << 0) | // jmp rel8
2464 (0x06 << 8) | // .+0x08
2465 ('v' << 16) |
2466 ('2' << 24);
2467 return llvm::ConstantInt::get(CGM.Int32Ty, Sig);
2468 }
2469
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const2470 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
2471 CodeGen::CodeGenModule &CGM) const override {
2472 if (GV->isDeclaration())
2473 return;
2474 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
2475 if (FD->hasAttr<X86ForceAlignArgPointerAttr>()) {
2476 llvm::Function *Fn = cast<llvm::Function>(GV);
2477 Fn->addFnAttr("stackrealign");
2478 }
2479 if (FD->hasAttr<AnyX86InterruptAttr>()) {
2480 llvm::Function *Fn = cast<llvm::Function>(GV);
2481 Fn->setCallingConv(llvm::CallingConv::X86_INTR);
2482 }
2483 }
2484 }
2485
2486 void checkFunctionCallABI(CodeGenModule &CGM, SourceLocation CallLoc,
2487 const FunctionDecl *Caller,
2488 const FunctionDecl *Callee,
2489 const CallArgList &Args) const override;
2490 };
2491
initFeatureMaps(const ASTContext & Ctx,llvm::StringMap<bool> & CallerMap,const FunctionDecl * Caller,llvm::StringMap<bool> & CalleeMap,const FunctionDecl * Callee)2492 static void initFeatureMaps(const ASTContext &Ctx,
2493 llvm::StringMap<bool> &CallerMap,
2494 const FunctionDecl *Caller,
2495 llvm::StringMap<bool> &CalleeMap,
2496 const FunctionDecl *Callee) {
2497 if (CalleeMap.empty() && CallerMap.empty()) {
2498 // The caller is potentially nullptr in the case where the call isn't in a
2499 // function. In this case, the getFunctionFeatureMap ensures we just get
2500 // the TU level setting (since it cannot be modified by 'target'..
2501 Ctx.getFunctionFeatureMap(CallerMap, Caller);
2502 Ctx.getFunctionFeatureMap(CalleeMap, Callee);
2503 }
2504 }
2505
checkAVXParamFeature(DiagnosticsEngine & Diag,SourceLocation CallLoc,const llvm::StringMap<bool> & CallerMap,const llvm::StringMap<bool> & CalleeMap,QualType Ty,StringRef Feature,bool IsArgument)2506 static bool checkAVXParamFeature(DiagnosticsEngine &Diag,
2507 SourceLocation CallLoc,
2508 const llvm::StringMap<bool> &CallerMap,
2509 const llvm::StringMap<bool> &CalleeMap,
2510 QualType Ty, StringRef Feature,
2511 bool IsArgument) {
2512 bool CallerHasFeat = CallerMap.lookup(Feature);
2513 bool CalleeHasFeat = CalleeMap.lookup(Feature);
2514 if (!CallerHasFeat && !CalleeHasFeat)
2515 return Diag.Report(CallLoc, diag::warn_avx_calling_convention)
2516 << IsArgument << Ty << Feature;
2517
2518 // Mixing calling conventions here is very clearly an error.
2519 if (!CallerHasFeat || !CalleeHasFeat)
2520 return Diag.Report(CallLoc, diag::err_avx_calling_convention)
2521 << IsArgument << Ty << Feature;
2522
2523 // Else, both caller and callee have the required feature, so there is no need
2524 // to diagnose.
2525 return false;
2526 }
2527
checkAVXParam(DiagnosticsEngine & Diag,ASTContext & Ctx,SourceLocation CallLoc,const llvm::StringMap<bool> & CallerMap,const llvm::StringMap<bool> & CalleeMap,QualType Ty,bool IsArgument)2528 static bool checkAVXParam(DiagnosticsEngine &Diag, ASTContext &Ctx,
2529 SourceLocation CallLoc,
2530 const llvm::StringMap<bool> &CallerMap,
2531 const llvm::StringMap<bool> &CalleeMap, QualType Ty,
2532 bool IsArgument) {
2533 uint64_t Size = Ctx.getTypeSize(Ty);
2534 if (Size > 256)
2535 return checkAVXParamFeature(Diag, CallLoc, CallerMap, CalleeMap, Ty,
2536 "avx512f", IsArgument);
2537
2538 if (Size > 128)
2539 return checkAVXParamFeature(Diag, CallLoc, CallerMap, CalleeMap, Ty, "avx",
2540 IsArgument);
2541
2542 return false;
2543 }
2544
checkFunctionCallABI(CodeGenModule & CGM,SourceLocation CallLoc,const FunctionDecl * Caller,const FunctionDecl * Callee,const CallArgList & Args) const2545 void X86_64TargetCodeGenInfo::checkFunctionCallABI(
2546 CodeGenModule &CGM, SourceLocation CallLoc, const FunctionDecl *Caller,
2547 const FunctionDecl *Callee, const CallArgList &Args) const {
2548 llvm::StringMap<bool> CallerMap;
2549 llvm::StringMap<bool> CalleeMap;
2550 unsigned ArgIndex = 0;
2551
2552 // We need to loop through the actual call arguments rather than the the
2553 // function's parameters, in case this variadic.
2554 for (const CallArg &Arg : Args) {
2555 // The "avx" feature changes how vectors >128 in size are passed. "avx512f"
2556 // additionally changes how vectors >256 in size are passed. Like GCC, we
2557 // warn when a function is called with an argument where this will change.
2558 // Unlike GCC, we also error when it is an obvious ABI mismatch, that is,
2559 // the caller and callee features are mismatched.
2560 // Unfortunately, we cannot do this diagnostic in SEMA, since the callee can
2561 // change its ABI with attribute-target after this call.
2562 if (Arg.getType()->isVectorType() &&
2563 CGM.getContext().getTypeSize(Arg.getType()) > 128) {
2564 initFeatureMaps(CGM.getContext(), CallerMap, Caller, CalleeMap, Callee);
2565 QualType Ty = Arg.getType();
2566 // The CallArg seems to have desugared the type already, so for clearer
2567 // diagnostics, replace it with the type in the FunctionDecl if possible.
2568 if (ArgIndex < Callee->getNumParams())
2569 Ty = Callee->getParamDecl(ArgIndex)->getType();
2570
2571 if (checkAVXParam(CGM.getDiags(), CGM.getContext(), CallLoc, CallerMap,
2572 CalleeMap, Ty, /*IsArgument*/ true))
2573 return;
2574 }
2575 ++ArgIndex;
2576 }
2577
2578 // Check return always, as we don't have a good way of knowing in codegen
2579 // whether this value is used, tail-called, etc.
2580 if (Callee->getReturnType()->isVectorType() &&
2581 CGM.getContext().getTypeSize(Callee->getReturnType()) > 128) {
2582 initFeatureMaps(CGM.getContext(), CallerMap, Caller, CalleeMap, Callee);
2583 checkAVXParam(CGM.getDiags(), CGM.getContext(), CallLoc, CallerMap,
2584 CalleeMap, Callee->getReturnType(),
2585 /*IsArgument*/ false);
2586 }
2587 }
2588
qualifyWindowsLibrary(llvm::StringRef Lib)2589 static std::string qualifyWindowsLibrary(llvm::StringRef Lib) {
2590 // If the argument does not end in .lib, automatically add the suffix.
2591 // If the argument contains a space, enclose it in quotes.
2592 // This matches the behavior of MSVC.
2593 bool Quote = (Lib.find(" ") != StringRef::npos);
2594 std::string ArgStr = Quote ? "\"" : "";
2595 ArgStr += Lib;
2596 if (!Lib.endswith_lower(".lib") && !Lib.endswith_lower(".a"))
2597 ArgStr += ".lib";
2598 ArgStr += Quote ? "\"" : "";
2599 return ArgStr;
2600 }
2601
2602 class WinX86_32TargetCodeGenInfo : public X86_32TargetCodeGenInfo {
2603 public:
WinX86_32TargetCodeGenInfo(CodeGen::CodeGenTypes & CGT,bool DarwinVectorABI,bool RetSmallStructInRegABI,bool Win32StructABI,unsigned NumRegisterParameters)2604 WinX86_32TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT,
2605 bool DarwinVectorABI, bool RetSmallStructInRegABI, bool Win32StructABI,
2606 unsigned NumRegisterParameters)
2607 : X86_32TargetCodeGenInfo(CGT, DarwinVectorABI, RetSmallStructInRegABI,
2608 Win32StructABI, NumRegisterParameters, false) {}
2609
2610 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
2611 CodeGen::CodeGenModule &CGM) const override;
2612
getDependentLibraryOption(llvm::StringRef Lib,llvm::SmallString<24> & Opt) const2613 void getDependentLibraryOption(llvm::StringRef Lib,
2614 llvm::SmallString<24> &Opt) const override {
2615 Opt = "/DEFAULTLIB:";
2616 Opt += qualifyWindowsLibrary(Lib);
2617 }
2618
getDetectMismatchOption(llvm::StringRef Name,llvm::StringRef Value,llvm::SmallString<32> & Opt) const2619 void getDetectMismatchOption(llvm::StringRef Name,
2620 llvm::StringRef Value,
2621 llvm::SmallString<32> &Opt) const override {
2622 Opt = "/FAILIFMISMATCH:\"" + Name.str() + "=" + Value.str() + "\"";
2623 }
2624 };
2625
addStackProbeTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM)2626 static void addStackProbeTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
2627 CodeGen::CodeGenModule &CGM) {
2628 if (llvm::Function *Fn = dyn_cast_or_null<llvm::Function>(GV)) {
2629
2630 if (CGM.getCodeGenOpts().StackProbeSize != 4096)
2631 Fn->addFnAttr("stack-probe-size",
2632 llvm::utostr(CGM.getCodeGenOpts().StackProbeSize));
2633 if (CGM.getCodeGenOpts().NoStackArgProbe)
2634 Fn->addFnAttr("no-stack-arg-probe");
2635 }
2636 }
2637
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const2638 void WinX86_32TargetCodeGenInfo::setTargetAttributes(
2639 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const {
2640 X86_32TargetCodeGenInfo::setTargetAttributes(D, GV, CGM);
2641 if (GV->isDeclaration())
2642 return;
2643 addStackProbeTargetAttributes(D, GV, CGM);
2644 }
2645
2646 class WinX86_64TargetCodeGenInfo : public TargetCodeGenInfo {
2647 public:
WinX86_64TargetCodeGenInfo(CodeGen::CodeGenTypes & CGT,X86AVXABILevel AVXLevel)2648 WinX86_64TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT,
2649 X86AVXABILevel AVXLevel)
2650 : TargetCodeGenInfo(std::make_unique<WinX86_64ABIInfo>(CGT, AVXLevel)) {}
2651
2652 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
2653 CodeGen::CodeGenModule &CGM) const override;
2654
getDwarfEHStackPointer(CodeGen::CodeGenModule & CGM) const2655 int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const override {
2656 return 7;
2657 }
2658
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const2659 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
2660 llvm::Value *Address) const override {
2661 llvm::Value *Eight8 = llvm::ConstantInt::get(CGF.Int8Ty, 8);
2662
2663 // 0-15 are the 16 integer registers.
2664 // 16 is %rip.
2665 AssignToArrayRange(CGF.Builder, Address, Eight8, 0, 16);
2666 return false;
2667 }
2668
getDependentLibraryOption(llvm::StringRef Lib,llvm::SmallString<24> & Opt) const2669 void getDependentLibraryOption(llvm::StringRef Lib,
2670 llvm::SmallString<24> &Opt) const override {
2671 Opt = "/DEFAULTLIB:";
2672 Opt += qualifyWindowsLibrary(Lib);
2673 }
2674
getDetectMismatchOption(llvm::StringRef Name,llvm::StringRef Value,llvm::SmallString<32> & Opt) const2675 void getDetectMismatchOption(llvm::StringRef Name,
2676 llvm::StringRef Value,
2677 llvm::SmallString<32> &Opt) const override {
2678 Opt = "/FAILIFMISMATCH:\"" + Name.str() + "=" + Value.str() + "\"";
2679 }
2680 };
2681
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const2682 void WinX86_64TargetCodeGenInfo::setTargetAttributes(
2683 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const {
2684 TargetCodeGenInfo::setTargetAttributes(D, GV, CGM);
2685 if (GV->isDeclaration())
2686 return;
2687 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
2688 if (FD->hasAttr<X86ForceAlignArgPointerAttr>()) {
2689 llvm::Function *Fn = cast<llvm::Function>(GV);
2690 Fn->addFnAttr("stackrealign");
2691 }
2692 if (FD->hasAttr<AnyX86InterruptAttr>()) {
2693 llvm::Function *Fn = cast<llvm::Function>(GV);
2694 Fn->setCallingConv(llvm::CallingConv::X86_INTR);
2695 }
2696 }
2697
2698 addStackProbeTargetAttributes(D, GV, CGM);
2699 }
2700 }
2701
postMerge(unsigned AggregateSize,Class & Lo,Class & Hi) const2702 void X86_64ABIInfo::postMerge(unsigned AggregateSize, Class &Lo,
2703 Class &Hi) const {
2704 // AMD64-ABI 3.2.3p2: Rule 5. Then a post merger cleanup is done:
2705 //
2706 // (a) If one of the classes is Memory, the whole argument is passed in
2707 // memory.
2708 //
2709 // (b) If X87UP is not preceded by X87, the whole argument is passed in
2710 // memory.
2711 //
2712 // (c) If the size of the aggregate exceeds two eightbytes and the first
2713 // eightbyte isn't SSE or any other eightbyte isn't SSEUP, the whole
2714 // argument is passed in memory. NOTE: This is necessary to keep the
2715 // ABI working for processors that don't support the __m256 type.
2716 //
2717 // (d) If SSEUP is not preceded by SSE or SSEUP, it is converted to SSE.
2718 //
2719 // Some of these are enforced by the merging logic. Others can arise
2720 // only with unions; for example:
2721 // union { _Complex double; unsigned; }
2722 //
2723 // Note that clauses (b) and (c) were added in 0.98.
2724 //
2725 if (Hi == Memory)
2726 Lo = Memory;
2727 if (Hi == X87Up && Lo != X87 && honorsRevision0_98())
2728 Lo = Memory;
2729 if (AggregateSize > 128 && (Lo != SSE || Hi != SSEUp))
2730 Lo = Memory;
2731 if (Hi == SSEUp && Lo != SSE)
2732 Hi = SSE;
2733 }
2734
merge(Class Accum,Class Field)2735 X86_64ABIInfo::Class X86_64ABIInfo::merge(Class Accum, Class Field) {
2736 // AMD64-ABI 3.2.3p2: Rule 4. Each field of an object is
2737 // classified recursively so that always two fields are
2738 // considered. The resulting class is calculated according to
2739 // the classes of the fields in the eightbyte:
2740 //
2741 // (a) If both classes are equal, this is the resulting class.
2742 //
2743 // (b) If one of the classes is NO_CLASS, the resulting class is
2744 // the other class.
2745 //
2746 // (c) If one of the classes is MEMORY, the result is the MEMORY
2747 // class.
2748 //
2749 // (d) If one of the classes is INTEGER, the result is the
2750 // INTEGER.
2751 //
2752 // (e) If one of the classes is X87, X87UP, COMPLEX_X87 class,
2753 // MEMORY is used as class.
2754 //
2755 // (f) Otherwise class SSE is used.
2756
2757 // Accum should never be memory (we should have returned) or
2758 // ComplexX87 (because this cannot be passed in a structure).
2759 assert((Accum != Memory && Accum != ComplexX87) &&
2760 "Invalid accumulated classification during merge.");
2761 if (Accum == Field || Field == NoClass)
2762 return Accum;
2763 if (Field == Memory)
2764 return Memory;
2765 if (Accum == NoClass)
2766 return Field;
2767 if (Accum == Integer || Field == Integer)
2768 return Integer;
2769 if (Field == X87 || Field == X87Up || Field == ComplexX87 ||
2770 Accum == X87 || Accum == X87Up)
2771 return Memory;
2772 return SSE;
2773 }
2774
classify(QualType Ty,uint64_t OffsetBase,Class & Lo,Class & Hi,bool isNamedArg) const2775 void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase,
2776 Class &Lo, Class &Hi, bool isNamedArg) const {
2777 // FIXME: This code can be simplified by introducing a simple value class for
2778 // Class pairs with appropriate constructor methods for the various
2779 // situations.
2780
2781 // FIXME: Some of the split computations are wrong; unaligned vectors
2782 // shouldn't be passed in registers for example, so there is no chance they
2783 // can straddle an eightbyte. Verify & simplify.
2784
2785 Lo = Hi = NoClass;
2786
2787 Class &Current = OffsetBase < 64 ? Lo : Hi;
2788 Current = Memory;
2789
2790 if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
2791 BuiltinType::Kind k = BT->getKind();
2792
2793 if (k == BuiltinType::Void) {
2794 Current = NoClass;
2795 } else if (k == BuiltinType::Int128 || k == BuiltinType::UInt128) {
2796 Lo = Integer;
2797 Hi = Integer;
2798 } else if (k >= BuiltinType::Bool && k <= BuiltinType::LongLong) {
2799 Current = Integer;
2800 } else if (k == BuiltinType::Float || k == BuiltinType::Double) {
2801 Current = SSE;
2802 } else if (k == BuiltinType::LongDouble) {
2803 const llvm::fltSemantics *LDF = &getTarget().getLongDoubleFormat();
2804 if (LDF == &llvm::APFloat::IEEEquad()) {
2805 Lo = SSE;
2806 Hi = SSEUp;
2807 } else if (LDF == &llvm::APFloat::x87DoubleExtended()) {
2808 Lo = X87;
2809 Hi = X87Up;
2810 } else if (LDF == &llvm::APFloat::IEEEdouble()) {
2811 Current = SSE;
2812 } else
2813 llvm_unreachable("unexpected long double representation!");
2814 }
2815 // FIXME: _Decimal32 and _Decimal64 are SSE.
2816 // FIXME: _float128 and _Decimal128 are (SSE, SSEUp).
2817 return;
2818 }
2819
2820 if (const EnumType *ET = Ty->getAs<EnumType>()) {
2821 // Classify the underlying integer type.
2822 classify(ET->getDecl()->getIntegerType(), OffsetBase, Lo, Hi, isNamedArg);
2823 return;
2824 }
2825
2826 if (Ty->hasPointerRepresentation()) {
2827 Current = Integer;
2828 return;
2829 }
2830
2831 if (Ty->isMemberPointerType()) {
2832 if (Ty->isMemberFunctionPointerType()) {
2833 if (Has64BitPointers) {
2834 // If Has64BitPointers, this is an {i64, i64}, so classify both
2835 // Lo and Hi now.
2836 Lo = Hi = Integer;
2837 } else {
2838 // Otherwise, with 32-bit pointers, this is an {i32, i32}. If that
2839 // straddles an eightbyte boundary, Hi should be classified as well.
2840 uint64_t EB_FuncPtr = (OffsetBase) / 64;
2841 uint64_t EB_ThisAdj = (OffsetBase + 64 - 1) / 64;
2842 if (EB_FuncPtr != EB_ThisAdj) {
2843 Lo = Hi = Integer;
2844 } else {
2845 Current = Integer;
2846 }
2847 }
2848 } else {
2849 Current = Integer;
2850 }
2851 return;
2852 }
2853
2854 if (const VectorType *VT = Ty->getAs<VectorType>()) {
2855 uint64_t Size = getContext().getTypeSize(VT);
2856 if (Size == 1 || Size == 8 || Size == 16 || Size == 32) {
2857 // gcc passes the following as integer:
2858 // 4 bytes - <4 x char>, <2 x short>, <1 x int>, <1 x float>
2859 // 2 bytes - <2 x char>, <1 x short>
2860 // 1 byte - <1 x char>
2861 Current = Integer;
2862
2863 // If this type crosses an eightbyte boundary, it should be
2864 // split.
2865 uint64_t EB_Lo = (OffsetBase) / 64;
2866 uint64_t EB_Hi = (OffsetBase + Size - 1) / 64;
2867 if (EB_Lo != EB_Hi)
2868 Hi = Lo;
2869 } else if (Size == 64) {
2870 QualType ElementType = VT->getElementType();
2871
2872 // gcc passes <1 x double> in memory. :(
2873 if (ElementType->isSpecificBuiltinType(BuiltinType::Double))
2874 return;
2875
2876 // gcc passes <1 x long long> as SSE but clang used to unconditionally
2877 // pass them as integer. For platforms where clang is the de facto
2878 // platform compiler, we must continue to use integer.
2879 if (!classifyIntegerMMXAsSSE() &&
2880 (ElementType->isSpecificBuiltinType(BuiltinType::LongLong) ||
2881 ElementType->isSpecificBuiltinType(BuiltinType::ULongLong) ||
2882 ElementType->isSpecificBuiltinType(BuiltinType::Long) ||
2883 ElementType->isSpecificBuiltinType(BuiltinType::ULong)))
2884 Current = Integer;
2885 else
2886 Current = SSE;
2887
2888 // If this type crosses an eightbyte boundary, it should be
2889 // split.
2890 if (OffsetBase && OffsetBase != 64)
2891 Hi = Lo;
2892 } else if (Size == 128 ||
2893 (isNamedArg && Size <= getNativeVectorSizeForAVXABI(AVXLevel))) {
2894 QualType ElementType = VT->getElementType();
2895
2896 // gcc passes 256 and 512 bit <X x __int128> vectors in memory. :(
2897 if (passInt128VectorsInMem() && Size != 128 &&
2898 (ElementType->isSpecificBuiltinType(BuiltinType::Int128) ||
2899 ElementType->isSpecificBuiltinType(BuiltinType::UInt128)))
2900 return;
2901
2902 // Arguments of 256-bits are split into four eightbyte chunks. The
2903 // least significant one belongs to class SSE and all the others to class
2904 // SSEUP. The original Lo and Hi design considers that types can't be
2905 // greater than 128-bits, so a 64-bit split in Hi and Lo makes sense.
2906 // This design isn't correct for 256-bits, but since there're no cases
2907 // where the upper parts would need to be inspected, avoid adding
2908 // complexity and just consider Hi to match the 64-256 part.
2909 //
2910 // Note that per 3.5.7 of AMD64-ABI, 256-bit args are only passed in
2911 // registers if they are "named", i.e. not part of the "..." of a
2912 // variadic function.
2913 //
2914 // Similarly, per 3.2.3. of the AVX512 draft, 512-bits ("named") args are
2915 // split into eight eightbyte chunks, one SSE and seven SSEUP.
2916 Lo = SSE;
2917 Hi = SSEUp;
2918 }
2919 return;
2920 }
2921
2922 if (const ComplexType *CT = Ty->getAs<ComplexType>()) {
2923 QualType ET = getContext().getCanonicalType(CT->getElementType());
2924
2925 uint64_t Size = getContext().getTypeSize(Ty);
2926 if (ET->isIntegralOrEnumerationType()) {
2927 if (Size <= 64)
2928 Current = Integer;
2929 else if (Size <= 128)
2930 Lo = Hi = Integer;
2931 } else if (ET == getContext().FloatTy) {
2932 Current = SSE;
2933 } else if (ET == getContext().DoubleTy) {
2934 Lo = Hi = SSE;
2935 } else if (ET == getContext().LongDoubleTy) {
2936 const llvm::fltSemantics *LDF = &getTarget().getLongDoubleFormat();
2937 if (LDF == &llvm::APFloat::IEEEquad())
2938 Current = Memory;
2939 else if (LDF == &llvm::APFloat::x87DoubleExtended())
2940 Current = ComplexX87;
2941 else if (LDF == &llvm::APFloat::IEEEdouble())
2942 Lo = Hi = SSE;
2943 else
2944 llvm_unreachable("unexpected long double representation!");
2945 }
2946
2947 // If this complex type crosses an eightbyte boundary then it
2948 // should be split.
2949 uint64_t EB_Real = (OffsetBase) / 64;
2950 uint64_t EB_Imag = (OffsetBase + getContext().getTypeSize(ET)) / 64;
2951 if (Hi == NoClass && EB_Real != EB_Imag)
2952 Hi = Lo;
2953
2954 return;
2955 }
2956
2957 if (const auto *EITy = Ty->getAs<ExtIntType>()) {
2958 if (EITy->getNumBits() <= 64)
2959 Current = Integer;
2960 else if (EITy->getNumBits() <= 128)
2961 Lo = Hi = Integer;
2962 // Larger values need to get passed in memory.
2963 return;
2964 }
2965
2966 if (const ConstantArrayType *AT = getContext().getAsConstantArrayType(Ty)) {
2967 // Arrays are treated like structures.
2968
2969 uint64_t Size = getContext().getTypeSize(Ty);
2970
2971 // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
2972 // than eight eightbytes, ..., it has class MEMORY.
2973 if (Size > 512)
2974 return;
2975
2976 // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned
2977 // fields, it has class MEMORY.
2978 //
2979 // Only need to check alignment of array base.
2980 if (OffsetBase % getContext().getTypeAlign(AT->getElementType()))
2981 return;
2982
2983 // Otherwise implement simplified merge. We could be smarter about
2984 // this, but it isn't worth it and would be harder to verify.
2985 Current = NoClass;
2986 uint64_t EltSize = getContext().getTypeSize(AT->getElementType());
2987 uint64_t ArraySize = AT->getSize().getZExtValue();
2988
2989 // The only case a 256-bit wide vector could be used is when the array
2990 // contains a single 256-bit element. Since Lo and Hi logic isn't extended
2991 // to work for sizes wider than 128, early check and fallback to memory.
2992 //
2993 if (Size > 128 &&
2994 (Size != EltSize || Size > getNativeVectorSizeForAVXABI(AVXLevel)))
2995 return;
2996
2997 for (uint64_t i=0, Offset=OffsetBase; i<ArraySize; ++i, Offset += EltSize) {
2998 Class FieldLo, FieldHi;
2999 classify(AT->getElementType(), Offset, FieldLo, FieldHi, isNamedArg);
3000 Lo = merge(Lo, FieldLo);
3001 Hi = merge(Hi, FieldHi);
3002 if (Lo == Memory || Hi == Memory)
3003 break;
3004 }
3005
3006 postMerge(Size, Lo, Hi);
3007 assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp array classification.");
3008 return;
3009 }
3010
3011 if (const RecordType *RT = Ty->getAs<RecordType>()) {
3012 uint64_t Size = getContext().getTypeSize(Ty);
3013
3014 // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger
3015 // than eight eightbytes, ..., it has class MEMORY.
3016 if (Size > 512)
3017 return;
3018
3019 // AMD64-ABI 3.2.3p2: Rule 2. If a C++ object has either a non-trivial
3020 // copy constructor or a non-trivial destructor, it is passed by invisible
3021 // reference.
3022 if (getRecordArgABI(RT, getCXXABI()))
3023 return;
3024
3025 const RecordDecl *RD = RT->getDecl();
3026
3027 // Assume variable sized types are passed in memory.
3028 if (RD->hasFlexibleArrayMember())
3029 return;
3030
3031 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
3032
3033 // Reset Lo class, this will be recomputed.
3034 Current = NoClass;
3035
3036 // If this is a C++ record, classify the bases first.
3037 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
3038 for (const auto &I : CXXRD->bases()) {
3039 assert(!I.isVirtual() && !I.getType()->isDependentType() &&
3040 "Unexpected base class!");
3041 const auto *Base =
3042 cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
3043
3044 // Classify this field.
3045 //
3046 // AMD64-ABI 3.2.3p2: Rule 3. If the size of the aggregate exceeds a
3047 // single eightbyte, each is classified separately. Each eightbyte gets
3048 // initialized to class NO_CLASS.
3049 Class FieldLo, FieldHi;
3050 uint64_t Offset =
3051 OffsetBase + getContext().toBits(Layout.getBaseClassOffset(Base));
3052 classify(I.getType(), Offset, FieldLo, FieldHi, isNamedArg);
3053 Lo = merge(Lo, FieldLo);
3054 Hi = merge(Hi, FieldHi);
3055 if (Lo == Memory || Hi == Memory) {
3056 postMerge(Size, Lo, Hi);
3057 return;
3058 }
3059 }
3060 }
3061
3062 // Classify the fields one at a time, merging the results.
3063 unsigned idx = 0;
3064 bool UseClang11Compat = getContext().getLangOpts().getClangABICompat() <=
3065 LangOptions::ClangABI::Ver11 ||
3066 getContext().getTargetInfo().getTriple().isPS4();
3067 bool IsUnion = RT->isUnionType() && !UseClang11Compat;
3068
3069 for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
3070 i != e; ++i, ++idx) {
3071 uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx);
3072 bool BitField = i->isBitField();
3073
3074 // Ignore padding bit-fields.
3075 if (BitField && i->isUnnamedBitfield())
3076 continue;
3077
3078 // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger than
3079 // eight eightbytes, or it contains unaligned fields, it has class MEMORY.
3080 //
3081 // The only case a 256-bit or a 512-bit wide vector could be used is when
3082 // the struct contains a single 256-bit or 512-bit element. Early check
3083 // and fallback to memory.
3084 //
3085 // FIXME: Extended the Lo and Hi logic properly to work for size wider
3086 // than 128.
3087 if (Size > 128 &&
3088 ((!IsUnion && Size != getContext().getTypeSize(i->getType())) ||
3089 Size > getNativeVectorSizeForAVXABI(AVXLevel))) {
3090 Lo = Memory;
3091 postMerge(Size, Lo, Hi);
3092 return;
3093 }
3094 // Note, skip this test for bit-fields, see below.
3095 if (!BitField && Offset % getContext().getTypeAlign(i->getType())) {
3096 Lo = Memory;
3097 postMerge(Size, Lo, Hi);
3098 return;
3099 }
3100
3101 // Classify this field.
3102 //
3103 // AMD64-ABI 3.2.3p2: Rule 3. If the size of the aggregate
3104 // exceeds a single eightbyte, each is classified
3105 // separately. Each eightbyte gets initialized to class
3106 // NO_CLASS.
3107 Class FieldLo, FieldHi;
3108
3109 // Bit-fields require special handling, they do not force the
3110 // structure to be passed in memory even if unaligned, and
3111 // therefore they can straddle an eightbyte.
3112 if (BitField) {
3113 assert(!i->isUnnamedBitfield());
3114 uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx);
3115 uint64_t Size = i->getBitWidthValue(getContext());
3116
3117 uint64_t EB_Lo = Offset / 64;
3118 uint64_t EB_Hi = (Offset + Size - 1) / 64;
3119
3120 if (EB_Lo) {
3121 assert(EB_Hi == EB_Lo && "Invalid classification, type > 16 bytes.");
3122 FieldLo = NoClass;
3123 FieldHi = Integer;
3124 } else {
3125 FieldLo = Integer;
3126 FieldHi = EB_Hi ? Integer : NoClass;
3127 }
3128 } else
3129 classify(i->getType(), Offset, FieldLo, FieldHi, isNamedArg);
3130 Lo = merge(Lo, FieldLo);
3131 Hi = merge(Hi, FieldHi);
3132 if (Lo == Memory || Hi == Memory)
3133 break;
3134 }
3135
3136 postMerge(Size, Lo, Hi);
3137 }
3138 }
3139
getIndirectReturnResult(QualType Ty) const3140 ABIArgInfo X86_64ABIInfo::getIndirectReturnResult(QualType Ty) const {
3141 // If this is a scalar LLVM value then assume LLVM will pass it in the right
3142 // place naturally.
3143 if (!isAggregateTypeForABI(Ty)) {
3144 // Treat an enum type as its underlying type.
3145 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
3146 Ty = EnumTy->getDecl()->getIntegerType();
3147
3148 if (Ty->isExtIntType())
3149 return getNaturalAlignIndirect(Ty);
3150
3151 return (isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
3152 : ABIArgInfo::getDirect());
3153 }
3154
3155 return getNaturalAlignIndirect(Ty);
3156 }
3157
IsIllegalVectorType(QualType Ty) const3158 bool X86_64ABIInfo::IsIllegalVectorType(QualType Ty) const {
3159 if (const VectorType *VecTy = Ty->getAs<VectorType>()) {
3160 uint64_t Size = getContext().getTypeSize(VecTy);
3161 unsigned LargestVector = getNativeVectorSizeForAVXABI(AVXLevel);
3162 if (Size <= 64 || Size > LargestVector)
3163 return true;
3164 QualType EltTy = VecTy->getElementType();
3165 if (passInt128VectorsInMem() &&
3166 (EltTy->isSpecificBuiltinType(BuiltinType::Int128) ||
3167 EltTy->isSpecificBuiltinType(BuiltinType::UInt128)))
3168 return true;
3169 }
3170
3171 return false;
3172 }
3173
getIndirectResult(QualType Ty,unsigned freeIntRegs) const3174 ABIArgInfo X86_64ABIInfo::getIndirectResult(QualType Ty,
3175 unsigned freeIntRegs) const {
3176 // If this is a scalar LLVM value then assume LLVM will pass it in the right
3177 // place naturally.
3178 //
3179 // This assumption is optimistic, as there could be free registers available
3180 // when we need to pass this argument in memory, and LLVM could try to pass
3181 // the argument in the free register. This does not seem to happen currently,
3182 // but this code would be much safer if we could mark the argument with
3183 // 'onstack'. See PR12193.
3184 if (!isAggregateTypeForABI(Ty) && !IsIllegalVectorType(Ty) &&
3185 !Ty->isExtIntType()) {
3186 // Treat an enum type as its underlying type.
3187 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
3188 Ty = EnumTy->getDecl()->getIntegerType();
3189
3190 return (isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
3191 : ABIArgInfo::getDirect());
3192 }
3193
3194 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
3195 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
3196
3197 // Compute the byval alignment. We specify the alignment of the byval in all
3198 // cases so that the mid-level optimizer knows the alignment of the byval.
3199 unsigned Align = std::max(getContext().getTypeAlign(Ty) / 8, 8U);
3200
3201 // Attempt to avoid passing indirect results using byval when possible. This
3202 // is important for good codegen.
3203 //
3204 // We do this by coercing the value into a scalar type which the backend can
3205 // handle naturally (i.e., without using byval).
3206 //
3207 // For simplicity, we currently only do this when we have exhausted all of the
3208 // free integer registers. Doing this when there are free integer registers
3209 // would require more care, as we would have to ensure that the coerced value
3210 // did not claim the unused register. That would require either reording the
3211 // arguments to the function (so that any subsequent inreg values came first),
3212 // or only doing this optimization when there were no following arguments that
3213 // might be inreg.
3214 //
3215 // We currently expect it to be rare (particularly in well written code) for
3216 // arguments to be passed on the stack when there are still free integer
3217 // registers available (this would typically imply large structs being passed
3218 // by value), so this seems like a fair tradeoff for now.
3219 //
3220 // We can revisit this if the backend grows support for 'onstack' parameter
3221 // attributes. See PR12193.
3222 if (freeIntRegs == 0) {
3223 uint64_t Size = getContext().getTypeSize(Ty);
3224
3225 // If this type fits in an eightbyte, coerce it into the matching integral
3226 // type, which will end up on the stack (with alignment 8).
3227 if (Align == 8 && Size <= 64)
3228 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),
3229 Size));
3230 }
3231
3232 return ABIArgInfo::getIndirect(CharUnits::fromQuantity(Align));
3233 }
3234
3235 /// The ABI specifies that a value should be passed in a full vector XMM/YMM
3236 /// register. Pick an LLVM IR type that will be passed as a vector register.
GetByteVectorType(QualType Ty) const3237 llvm::Type *X86_64ABIInfo::GetByteVectorType(QualType Ty) const {
3238 // Wrapper structs/arrays that only contain vectors are passed just like
3239 // vectors; strip them off if present.
3240 if (const Type *InnerTy = isSingleElementStruct(Ty, getContext()))
3241 Ty = QualType(InnerTy, 0);
3242
3243 llvm::Type *IRType = CGT.ConvertType(Ty);
3244 if (isa<llvm::VectorType>(IRType)) {
3245 // Don't pass vXi128 vectors in their native type, the backend can't
3246 // legalize them.
3247 if (passInt128VectorsInMem() &&
3248 cast<llvm::VectorType>(IRType)->getElementType()->isIntegerTy(128)) {
3249 // Use a vXi64 vector.
3250 uint64_t Size = getContext().getTypeSize(Ty);
3251 return llvm::FixedVectorType::get(llvm::Type::getInt64Ty(getVMContext()),
3252 Size / 64);
3253 }
3254
3255 return IRType;
3256 }
3257
3258 if (IRType->getTypeID() == llvm::Type::FP128TyID)
3259 return IRType;
3260
3261 // We couldn't find the preferred IR vector type for 'Ty'.
3262 uint64_t Size = getContext().getTypeSize(Ty);
3263 assert((Size == 128 || Size == 256 || Size == 512) && "Invalid type found!");
3264
3265
3266 // Return a LLVM IR vector type based on the size of 'Ty'.
3267 return llvm::FixedVectorType::get(llvm::Type::getDoubleTy(getVMContext()),
3268 Size / 64);
3269 }
3270
3271 /// BitsContainNoUserData - Return true if the specified [start,end) bit range
3272 /// is known to either be off the end of the specified type or being in
3273 /// alignment padding. The user type specified is known to be at most 128 bits
3274 /// in size, and have passed through X86_64ABIInfo::classify with a successful
3275 /// classification that put one of the two halves in the INTEGER class.
3276 ///
3277 /// It is conservatively correct to return false.
BitsContainNoUserData(QualType Ty,unsigned StartBit,unsigned EndBit,ASTContext & Context)3278 static bool BitsContainNoUserData(QualType Ty, unsigned StartBit,
3279 unsigned EndBit, ASTContext &Context) {
3280 // If the bytes being queried are off the end of the type, there is no user
3281 // data hiding here. This handles analysis of builtins, vectors and other
3282 // types that don't contain interesting padding.
3283 unsigned TySize = (unsigned)Context.getTypeSize(Ty);
3284 if (TySize <= StartBit)
3285 return true;
3286
3287 if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty)) {
3288 unsigned EltSize = (unsigned)Context.getTypeSize(AT->getElementType());
3289 unsigned NumElts = (unsigned)AT->getSize().getZExtValue();
3290
3291 // Check each element to see if the element overlaps with the queried range.
3292 for (unsigned i = 0; i != NumElts; ++i) {
3293 // If the element is after the span we care about, then we're done..
3294 unsigned EltOffset = i*EltSize;
3295 if (EltOffset >= EndBit) break;
3296
3297 unsigned EltStart = EltOffset < StartBit ? StartBit-EltOffset :0;
3298 if (!BitsContainNoUserData(AT->getElementType(), EltStart,
3299 EndBit-EltOffset, Context))
3300 return false;
3301 }
3302 // If it overlaps no elements, then it is safe to process as padding.
3303 return true;
3304 }
3305
3306 if (const RecordType *RT = Ty->getAs<RecordType>()) {
3307 const RecordDecl *RD = RT->getDecl();
3308 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
3309
3310 // If this is a C++ record, check the bases first.
3311 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
3312 for (const auto &I : CXXRD->bases()) {
3313 assert(!I.isVirtual() && !I.getType()->isDependentType() &&
3314 "Unexpected base class!");
3315 const auto *Base =
3316 cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
3317
3318 // If the base is after the span we care about, ignore it.
3319 unsigned BaseOffset = Context.toBits(Layout.getBaseClassOffset(Base));
3320 if (BaseOffset >= EndBit) continue;
3321
3322 unsigned BaseStart = BaseOffset < StartBit ? StartBit-BaseOffset :0;
3323 if (!BitsContainNoUserData(I.getType(), BaseStart,
3324 EndBit-BaseOffset, Context))
3325 return false;
3326 }
3327 }
3328
3329 // Verify that no field has data that overlaps the region of interest. Yes
3330 // this could be sped up a lot by being smarter about queried fields,
3331 // however we're only looking at structs up to 16 bytes, so we don't care
3332 // much.
3333 unsigned idx = 0;
3334 for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
3335 i != e; ++i, ++idx) {
3336 unsigned FieldOffset = (unsigned)Layout.getFieldOffset(idx);
3337
3338 // If we found a field after the region we care about, then we're done.
3339 if (FieldOffset >= EndBit) break;
3340
3341 unsigned FieldStart = FieldOffset < StartBit ? StartBit-FieldOffset :0;
3342 if (!BitsContainNoUserData(i->getType(), FieldStart, EndBit-FieldOffset,
3343 Context))
3344 return false;
3345 }
3346
3347 // If nothing in this record overlapped the area of interest, then we're
3348 // clean.
3349 return true;
3350 }
3351
3352 return false;
3353 }
3354
3355 /// ContainsFloatAtOffset - Return true if the specified LLVM IR type has a
3356 /// float member at the specified offset. For example, {int,{float}} has a
3357 /// float at offset 4. It is conservatively correct for this routine to return
3358 /// false.
ContainsFloatAtOffset(llvm::Type * IRType,unsigned IROffset,const llvm::DataLayout & TD)3359 static bool ContainsFloatAtOffset(llvm::Type *IRType, unsigned IROffset,
3360 const llvm::DataLayout &TD) {
3361 // Base case if we find a float.
3362 if (IROffset == 0 && IRType->isFloatTy())
3363 return true;
3364
3365 // If this is a struct, recurse into the field at the specified offset.
3366 if (llvm::StructType *STy = dyn_cast<llvm::StructType>(IRType)) {
3367 const llvm::StructLayout *SL = TD.getStructLayout(STy);
3368 unsigned Elt = SL->getElementContainingOffset(IROffset);
3369 IROffset -= SL->getElementOffset(Elt);
3370 return ContainsFloatAtOffset(STy->getElementType(Elt), IROffset, TD);
3371 }
3372
3373 // If this is an array, recurse into the field at the specified offset.
3374 if (llvm::ArrayType *ATy = dyn_cast<llvm::ArrayType>(IRType)) {
3375 llvm::Type *EltTy = ATy->getElementType();
3376 unsigned EltSize = TD.getTypeAllocSize(EltTy);
3377 IROffset -= IROffset/EltSize*EltSize;
3378 return ContainsFloatAtOffset(EltTy, IROffset, TD);
3379 }
3380
3381 return false;
3382 }
3383
3384
3385 /// GetSSETypeAtOffset - Return a type that will be passed by the backend in the
3386 /// low 8 bytes of an XMM register, corresponding to the SSE class.
3387 llvm::Type *X86_64ABIInfo::
GetSSETypeAtOffset(llvm::Type * IRType,unsigned IROffset,QualType SourceTy,unsigned SourceOffset) const3388 GetSSETypeAtOffset(llvm::Type *IRType, unsigned IROffset,
3389 QualType SourceTy, unsigned SourceOffset) const {
3390 // The only three choices we have are either double, <2 x float>, or float. We
3391 // pass as float if the last 4 bytes is just padding. This happens for
3392 // structs that contain 3 floats.
3393 if (BitsContainNoUserData(SourceTy, SourceOffset*8+32,
3394 SourceOffset*8+64, getContext()))
3395 return llvm::Type::getFloatTy(getVMContext());
3396
3397 // We want to pass as <2 x float> if the LLVM IR type contains a float at
3398 // offset+0 and offset+4. Walk the LLVM IR type to find out if this is the
3399 // case.
3400 if (ContainsFloatAtOffset(IRType, IROffset, getDataLayout()) &&
3401 ContainsFloatAtOffset(IRType, IROffset+4, getDataLayout()))
3402 return llvm::FixedVectorType::get(llvm::Type::getFloatTy(getVMContext()),
3403 2);
3404
3405 return llvm::Type::getDoubleTy(getVMContext());
3406 }
3407
3408
3409 /// GetINTEGERTypeAtOffset - The ABI specifies that a value should be passed in
3410 /// an 8-byte GPR. This means that we either have a scalar or we are talking
3411 /// about the high or low part of an up-to-16-byte struct. This routine picks
3412 /// the best LLVM IR type to represent this, which may be i64 or may be anything
3413 /// else that the backend will pass in a GPR that works better (e.g. i8, %foo*,
3414 /// etc).
3415 ///
3416 /// PrefType is an LLVM IR type that corresponds to (part of) the IR type for
3417 /// the source type. IROffset is an offset in bytes into the LLVM IR type that
3418 /// the 8-byte value references. PrefType may be null.
3419 ///
3420 /// SourceTy is the source-level type for the entire argument. SourceOffset is
3421 /// an offset into this that we're processing (which is always either 0 or 8).
3422 ///
3423 llvm::Type *X86_64ABIInfo::
GetINTEGERTypeAtOffset(llvm::Type * IRType,unsigned IROffset,QualType SourceTy,unsigned SourceOffset) const3424 GetINTEGERTypeAtOffset(llvm::Type *IRType, unsigned IROffset,
3425 QualType SourceTy, unsigned SourceOffset) const {
3426 // If we're dealing with an un-offset LLVM IR type, then it means that we're
3427 // returning an 8-byte unit starting with it. See if we can safely use it.
3428 if (IROffset == 0) {
3429 // Pointers and int64's always fill the 8-byte unit.
3430 if ((isa<llvm::PointerType>(IRType) && Has64BitPointers) ||
3431 IRType->isIntegerTy(64))
3432 return IRType;
3433
3434 // If we have a 1/2/4-byte integer, we can use it only if the rest of the
3435 // goodness in the source type is just tail padding. This is allowed to
3436 // kick in for struct {double,int} on the int, but not on
3437 // struct{double,int,int} because we wouldn't return the second int. We
3438 // have to do this analysis on the source type because we can't depend on
3439 // unions being lowered a specific way etc.
3440 if (IRType->isIntegerTy(8) || IRType->isIntegerTy(16) ||
3441 IRType->isIntegerTy(32) ||
3442 (isa<llvm::PointerType>(IRType) && !Has64BitPointers)) {
3443 unsigned BitWidth = isa<llvm::PointerType>(IRType) ? 32 :
3444 cast<llvm::IntegerType>(IRType)->getBitWidth();
3445
3446 if (BitsContainNoUserData(SourceTy, SourceOffset*8+BitWidth,
3447 SourceOffset*8+64, getContext()))
3448 return IRType;
3449 }
3450 }
3451
3452 if (llvm::StructType *STy = dyn_cast<llvm::StructType>(IRType)) {
3453 // If this is a struct, recurse into the field at the specified offset.
3454 const llvm::StructLayout *SL = getDataLayout().getStructLayout(STy);
3455 if (IROffset < SL->getSizeInBytes()) {
3456 unsigned FieldIdx = SL->getElementContainingOffset(IROffset);
3457 IROffset -= SL->getElementOffset(FieldIdx);
3458
3459 return GetINTEGERTypeAtOffset(STy->getElementType(FieldIdx), IROffset,
3460 SourceTy, SourceOffset);
3461 }
3462 }
3463
3464 if (llvm::ArrayType *ATy = dyn_cast<llvm::ArrayType>(IRType)) {
3465 llvm::Type *EltTy = ATy->getElementType();
3466 unsigned EltSize = getDataLayout().getTypeAllocSize(EltTy);
3467 unsigned EltOffset = IROffset/EltSize*EltSize;
3468 return GetINTEGERTypeAtOffset(EltTy, IROffset-EltOffset, SourceTy,
3469 SourceOffset);
3470 }
3471
3472 // Okay, we don't have any better idea of what to pass, so we pass this in an
3473 // integer register that isn't too big to fit the rest of the struct.
3474 unsigned TySizeInBytes =
3475 (unsigned)getContext().getTypeSizeInChars(SourceTy).getQuantity();
3476
3477 assert(TySizeInBytes != SourceOffset && "Empty field?");
3478
3479 // It is always safe to classify this as an integer type up to i64 that
3480 // isn't larger than the structure.
3481 return llvm::IntegerType::get(getVMContext(),
3482 std::min(TySizeInBytes-SourceOffset, 8U)*8);
3483 }
3484
3485
3486 /// GetX86_64ByValArgumentPair - Given a high and low type that can ideally
3487 /// be used as elements of a two register pair to pass or return, return a
3488 /// first class aggregate to represent them. For example, if the low part of
3489 /// a by-value argument should be passed as i32* and the high part as float,
3490 /// return {i32*, float}.
3491 static llvm::Type *
GetX86_64ByValArgumentPair(llvm::Type * Lo,llvm::Type * Hi,const llvm::DataLayout & TD)3492 GetX86_64ByValArgumentPair(llvm::Type *Lo, llvm::Type *Hi,
3493 const llvm::DataLayout &TD) {
3494 // In order to correctly satisfy the ABI, we need to the high part to start
3495 // at offset 8. If the high and low parts we inferred are both 4-byte types
3496 // (e.g. i32 and i32) then the resultant struct type ({i32,i32}) won't have
3497 // the second element at offset 8. Check for this:
3498 unsigned LoSize = (unsigned)TD.getTypeAllocSize(Lo);
3499 unsigned HiAlign = TD.getABITypeAlignment(Hi);
3500 unsigned HiStart = llvm::alignTo(LoSize, HiAlign);
3501 assert(HiStart != 0 && HiStart <= 8 && "Invalid x86-64 argument pair!");
3502
3503 // To handle this, we have to increase the size of the low part so that the
3504 // second element will start at an 8 byte offset. We can't increase the size
3505 // of the second element because it might make us access off the end of the
3506 // struct.
3507 if (HiStart != 8) {
3508 // There are usually two sorts of types the ABI generation code can produce
3509 // for the low part of a pair that aren't 8 bytes in size: float or
3510 // i8/i16/i32. This can also include pointers when they are 32-bit (X32 and
3511 // NaCl).
3512 // Promote these to a larger type.
3513 if (Lo->isFloatTy())
3514 Lo = llvm::Type::getDoubleTy(Lo->getContext());
3515 else {
3516 assert((Lo->isIntegerTy() || Lo->isPointerTy())
3517 && "Invalid/unknown lo type");
3518 Lo = llvm::Type::getInt64Ty(Lo->getContext());
3519 }
3520 }
3521
3522 llvm::StructType *Result = llvm::StructType::get(Lo, Hi);
3523
3524 // Verify that the second element is at an 8-byte offset.
3525 assert(TD.getStructLayout(Result)->getElementOffset(1) == 8 &&
3526 "Invalid x86-64 argument pair!");
3527 return Result;
3528 }
3529
3530 ABIArgInfo X86_64ABIInfo::
classifyReturnType(QualType RetTy) const3531 classifyReturnType(QualType RetTy) const {
3532 // AMD64-ABI 3.2.3p4: Rule 1. Classify the return type with the
3533 // classification algorithm.
3534 X86_64ABIInfo::Class Lo, Hi;
3535 classify(RetTy, 0, Lo, Hi, /*isNamedArg*/ true);
3536
3537 // Check some invariants.
3538 assert((Hi != Memory || Lo == Memory) && "Invalid memory classification.");
3539 assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification.");
3540
3541 llvm::Type *ResType = nullptr;
3542 switch (Lo) {
3543 case NoClass:
3544 if (Hi == NoClass)
3545 return ABIArgInfo::getIgnore();
3546 // If the low part is just padding, it takes no register, leave ResType
3547 // null.
3548 assert((Hi == SSE || Hi == Integer || Hi == X87Up) &&
3549 "Unknown missing lo part");
3550 break;
3551
3552 case SSEUp:
3553 case X87Up:
3554 llvm_unreachable("Invalid classification for lo word.");
3555
3556 // AMD64-ABI 3.2.3p4: Rule 2. Types of class memory are returned via
3557 // hidden argument.
3558 case Memory:
3559 return getIndirectReturnResult(RetTy);
3560
3561 // AMD64-ABI 3.2.3p4: Rule 3. If the class is INTEGER, the next
3562 // available register of the sequence %rax, %rdx is used.
3563 case Integer:
3564 ResType = GetINTEGERTypeAtOffset(CGT.ConvertType(RetTy), 0, RetTy, 0);
3565
3566 // If we have a sign or zero extended integer, make sure to return Extend
3567 // so that the parameter gets the right LLVM IR attributes.
3568 if (Hi == NoClass && isa<llvm::IntegerType>(ResType)) {
3569 // Treat an enum type as its underlying type.
3570 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
3571 RetTy = EnumTy->getDecl()->getIntegerType();
3572
3573 if (RetTy->isIntegralOrEnumerationType() &&
3574 isPromotableIntegerTypeForABI(RetTy))
3575 return ABIArgInfo::getExtend(RetTy);
3576 }
3577 break;
3578
3579 // AMD64-ABI 3.2.3p4: Rule 4. If the class is SSE, the next
3580 // available SSE register of the sequence %xmm0, %xmm1 is used.
3581 case SSE:
3582 ResType = GetSSETypeAtOffset(CGT.ConvertType(RetTy), 0, RetTy, 0);
3583 break;
3584
3585 // AMD64-ABI 3.2.3p4: Rule 6. If the class is X87, the value is
3586 // returned on the X87 stack in %st0 as 80-bit x87 number.
3587 case X87:
3588 ResType = llvm::Type::getX86_FP80Ty(getVMContext());
3589 break;
3590
3591 // AMD64-ABI 3.2.3p4: Rule 8. If the class is COMPLEX_X87, the real
3592 // part of the value is returned in %st0 and the imaginary part in
3593 // %st1.
3594 case ComplexX87:
3595 assert(Hi == ComplexX87 && "Unexpected ComplexX87 classification.");
3596 ResType = llvm::StructType::get(llvm::Type::getX86_FP80Ty(getVMContext()),
3597 llvm::Type::getX86_FP80Ty(getVMContext()));
3598 break;
3599 }
3600
3601 llvm::Type *HighPart = nullptr;
3602 switch (Hi) {
3603 // Memory was handled previously and X87 should
3604 // never occur as a hi class.
3605 case Memory:
3606 case X87:
3607 llvm_unreachable("Invalid classification for hi word.");
3608
3609 case ComplexX87: // Previously handled.
3610 case NoClass:
3611 break;
3612
3613 case Integer:
3614 HighPart = GetINTEGERTypeAtOffset(CGT.ConvertType(RetTy), 8, RetTy, 8);
3615 if (Lo == NoClass) // Return HighPart at offset 8 in memory.
3616 return ABIArgInfo::getDirect(HighPart, 8);
3617 break;
3618 case SSE:
3619 HighPart = GetSSETypeAtOffset(CGT.ConvertType(RetTy), 8, RetTy, 8);
3620 if (Lo == NoClass) // Return HighPart at offset 8 in memory.
3621 return ABIArgInfo::getDirect(HighPart, 8);
3622 break;
3623
3624 // AMD64-ABI 3.2.3p4: Rule 5. If the class is SSEUP, the eightbyte
3625 // is passed in the next available eightbyte chunk if the last used
3626 // vector register.
3627 //
3628 // SSEUP should always be preceded by SSE, just widen.
3629 case SSEUp:
3630 assert(Lo == SSE && "Unexpected SSEUp classification.");
3631 ResType = GetByteVectorType(RetTy);
3632 break;
3633
3634 // AMD64-ABI 3.2.3p4: Rule 7. If the class is X87UP, the value is
3635 // returned together with the previous X87 value in %st0.
3636 case X87Up:
3637 // If X87Up is preceded by X87, we don't need to do
3638 // anything. However, in some cases with unions it may not be
3639 // preceded by X87. In such situations we follow gcc and pass the
3640 // extra bits in an SSE reg.
3641 if (Lo != X87) {
3642 HighPart = GetSSETypeAtOffset(CGT.ConvertType(RetTy), 8, RetTy, 8);
3643 if (Lo == NoClass) // Return HighPart at offset 8 in memory.
3644 return ABIArgInfo::getDirect(HighPart, 8);
3645 }
3646 break;
3647 }
3648
3649 // If a high part was specified, merge it together with the low part. It is
3650 // known to pass in the high eightbyte of the result. We do this by forming a
3651 // first class struct aggregate with the high and low part: {low, high}
3652 if (HighPart)
3653 ResType = GetX86_64ByValArgumentPair(ResType, HighPart, getDataLayout());
3654
3655 return ABIArgInfo::getDirect(ResType);
3656 }
3657
classifyArgumentType(QualType Ty,unsigned freeIntRegs,unsigned & neededInt,unsigned & neededSSE,bool isNamedArg) const3658 ABIArgInfo X86_64ABIInfo::classifyArgumentType(
3659 QualType Ty, unsigned freeIntRegs, unsigned &neededInt, unsigned &neededSSE,
3660 bool isNamedArg)
3661 const
3662 {
3663 Ty = useFirstFieldIfTransparentUnion(Ty);
3664
3665 X86_64ABIInfo::Class Lo, Hi;
3666 classify(Ty, 0, Lo, Hi, isNamedArg);
3667
3668 // Check some invariants.
3669 // FIXME: Enforce these by construction.
3670 assert((Hi != Memory || Lo == Memory) && "Invalid memory classification.");
3671 assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification.");
3672
3673 neededInt = 0;
3674 neededSSE = 0;
3675 llvm::Type *ResType = nullptr;
3676 switch (Lo) {
3677 case NoClass:
3678 if (Hi == NoClass)
3679 return ABIArgInfo::getIgnore();
3680 // If the low part is just padding, it takes no register, leave ResType
3681 // null.
3682 assert((Hi == SSE || Hi == Integer || Hi == X87Up) &&
3683 "Unknown missing lo part");
3684 break;
3685
3686 // AMD64-ABI 3.2.3p3: Rule 1. If the class is MEMORY, pass the argument
3687 // on the stack.
3688 case Memory:
3689
3690 // AMD64-ABI 3.2.3p3: Rule 5. If the class is X87, X87UP or
3691 // COMPLEX_X87, it is passed in memory.
3692 case X87:
3693 case ComplexX87:
3694 if (getRecordArgABI(Ty, getCXXABI()) == CGCXXABI::RAA_Indirect)
3695 ++neededInt;
3696 return getIndirectResult(Ty, freeIntRegs);
3697
3698 case SSEUp:
3699 case X87Up:
3700 llvm_unreachable("Invalid classification for lo word.");
3701
3702 // AMD64-ABI 3.2.3p3: Rule 2. If the class is INTEGER, the next
3703 // available register of the sequence %rdi, %rsi, %rdx, %rcx, %r8
3704 // and %r9 is used.
3705 case Integer:
3706 ++neededInt;
3707
3708 // Pick an 8-byte type based on the preferred type.
3709 ResType = GetINTEGERTypeAtOffset(CGT.ConvertType(Ty), 0, Ty, 0);
3710
3711 // If we have a sign or zero extended integer, make sure to return Extend
3712 // so that the parameter gets the right LLVM IR attributes.
3713 if (Hi == NoClass && isa<llvm::IntegerType>(ResType)) {
3714 // Treat an enum type as its underlying type.
3715 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
3716 Ty = EnumTy->getDecl()->getIntegerType();
3717
3718 if (Ty->isIntegralOrEnumerationType() &&
3719 isPromotableIntegerTypeForABI(Ty))
3720 return ABIArgInfo::getExtend(Ty);
3721 }
3722
3723 break;
3724
3725 // AMD64-ABI 3.2.3p3: Rule 3. If the class is SSE, the next
3726 // available SSE register is used, the registers are taken in the
3727 // order from %xmm0 to %xmm7.
3728 case SSE: {
3729 llvm::Type *IRType = CGT.ConvertType(Ty);
3730 ResType = GetSSETypeAtOffset(IRType, 0, Ty, 0);
3731 ++neededSSE;
3732 break;
3733 }
3734 }
3735
3736 llvm::Type *HighPart = nullptr;
3737 switch (Hi) {
3738 // Memory was handled previously, ComplexX87 and X87 should
3739 // never occur as hi classes, and X87Up must be preceded by X87,
3740 // which is passed in memory.
3741 case Memory:
3742 case X87:
3743 case ComplexX87:
3744 llvm_unreachable("Invalid classification for hi word.");
3745
3746 case NoClass: break;
3747
3748 case Integer:
3749 ++neededInt;
3750 // Pick an 8-byte type based on the preferred type.
3751 HighPart = GetINTEGERTypeAtOffset(CGT.ConvertType(Ty), 8, Ty, 8);
3752
3753 if (Lo == NoClass) // Pass HighPart at offset 8 in memory.
3754 return ABIArgInfo::getDirect(HighPart, 8);
3755 break;
3756
3757 // X87Up generally doesn't occur here (long double is passed in
3758 // memory), except in situations involving unions.
3759 case X87Up:
3760 case SSE:
3761 HighPart = GetSSETypeAtOffset(CGT.ConvertType(Ty), 8, Ty, 8);
3762
3763 if (Lo == NoClass) // Pass HighPart at offset 8 in memory.
3764 return ABIArgInfo::getDirect(HighPart, 8);
3765
3766 ++neededSSE;
3767 break;
3768
3769 // AMD64-ABI 3.2.3p3: Rule 4. If the class is SSEUP, the
3770 // eightbyte is passed in the upper half of the last used SSE
3771 // register. This only happens when 128-bit vectors are passed.
3772 case SSEUp:
3773 assert(Lo == SSE && "Unexpected SSEUp classification");
3774 ResType = GetByteVectorType(Ty);
3775 break;
3776 }
3777
3778 // If a high part was specified, merge it together with the low part. It is
3779 // known to pass in the high eightbyte of the result. We do this by forming a
3780 // first class struct aggregate with the high and low part: {low, high}
3781 if (HighPart)
3782 ResType = GetX86_64ByValArgumentPair(ResType, HighPart, getDataLayout());
3783
3784 return ABIArgInfo::getDirect(ResType);
3785 }
3786
3787 ABIArgInfo
classifyRegCallStructTypeImpl(QualType Ty,unsigned & NeededInt,unsigned & NeededSSE) const3788 X86_64ABIInfo::classifyRegCallStructTypeImpl(QualType Ty, unsigned &NeededInt,
3789 unsigned &NeededSSE) const {
3790 auto RT = Ty->getAs<RecordType>();
3791 assert(RT && "classifyRegCallStructType only valid with struct types");
3792
3793 if (RT->getDecl()->hasFlexibleArrayMember())
3794 return getIndirectReturnResult(Ty);
3795
3796 // Sum up bases
3797 if (auto CXXRD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
3798 if (CXXRD->isDynamicClass()) {
3799 NeededInt = NeededSSE = 0;
3800 return getIndirectReturnResult(Ty);
3801 }
3802
3803 for (const auto &I : CXXRD->bases())
3804 if (classifyRegCallStructTypeImpl(I.getType(), NeededInt, NeededSSE)
3805 .isIndirect()) {
3806 NeededInt = NeededSSE = 0;
3807 return getIndirectReturnResult(Ty);
3808 }
3809 }
3810
3811 // Sum up members
3812 for (const auto *FD : RT->getDecl()->fields()) {
3813 if (FD->getType()->isRecordType() && !FD->getType()->isUnionType()) {
3814 if (classifyRegCallStructTypeImpl(FD->getType(), NeededInt, NeededSSE)
3815 .isIndirect()) {
3816 NeededInt = NeededSSE = 0;
3817 return getIndirectReturnResult(Ty);
3818 }
3819 } else {
3820 unsigned LocalNeededInt, LocalNeededSSE;
3821 if (classifyArgumentType(FD->getType(), UINT_MAX, LocalNeededInt,
3822 LocalNeededSSE, true)
3823 .isIndirect()) {
3824 NeededInt = NeededSSE = 0;
3825 return getIndirectReturnResult(Ty);
3826 }
3827 NeededInt += LocalNeededInt;
3828 NeededSSE += LocalNeededSSE;
3829 }
3830 }
3831
3832 return ABIArgInfo::getDirect();
3833 }
3834
classifyRegCallStructType(QualType Ty,unsigned & NeededInt,unsigned & NeededSSE) const3835 ABIArgInfo X86_64ABIInfo::classifyRegCallStructType(QualType Ty,
3836 unsigned &NeededInt,
3837 unsigned &NeededSSE) const {
3838
3839 NeededInt = 0;
3840 NeededSSE = 0;
3841
3842 return classifyRegCallStructTypeImpl(Ty, NeededInt, NeededSSE);
3843 }
3844
computeInfo(CGFunctionInfo & FI) const3845 void X86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const {
3846
3847 const unsigned CallingConv = FI.getCallingConvention();
3848 // It is possible to force Win64 calling convention on any x86_64 target by
3849 // using __attribute__((ms_abi)). In such case to correctly emit Win64
3850 // compatible code delegate this call to WinX86_64ABIInfo::computeInfo.
3851 if (CallingConv == llvm::CallingConv::Win64) {
3852 WinX86_64ABIInfo Win64ABIInfo(CGT, AVXLevel);
3853 Win64ABIInfo.computeInfo(FI);
3854 return;
3855 }
3856
3857 bool IsRegCall = CallingConv == llvm::CallingConv::X86_RegCall;
3858
3859 // Keep track of the number of assigned registers.
3860 unsigned FreeIntRegs = IsRegCall ? 11 : 6;
3861 unsigned FreeSSERegs = IsRegCall ? 16 : 8;
3862 unsigned NeededInt, NeededSSE;
3863
3864 if (!::classifyReturnType(getCXXABI(), FI, *this)) {
3865 if (IsRegCall && FI.getReturnType()->getTypePtr()->isRecordType() &&
3866 !FI.getReturnType()->getTypePtr()->isUnionType()) {
3867 FI.getReturnInfo() =
3868 classifyRegCallStructType(FI.getReturnType(), NeededInt, NeededSSE);
3869 if (FreeIntRegs >= NeededInt && FreeSSERegs >= NeededSSE) {
3870 FreeIntRegs -= NeededInt;
3871 FreeSSERegs -= NeededSSE;
3872 } else {
3873 FI.getReturnInfo() = getIndirectReturnResult(FI.getReturnType());
3874 }
3875 } else if (IsRegCall && FI.getReturnType()->getAs<ComplexType>() &&
3876 getContext().getCanonicalType(FI.getReturnType()
3877 ->getAs<ComplexType>()
3878 ->getElementType()) ==
3879 getContext().LongDoubleTy)
3880 // Complex Long Double Type is passed in Memory when Regcall
3881 // calling convention is used.
3882 FI.getReturnInfo() = getIndirectReturnResult(FI.getReturnType());
3883 else
3884 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
3885 }
3886
3887 // If the return value is indirect, then the hidden argument is consuming one
3888 // integer register.
3889 if (FI.getReturnInfo().isIndirect())
3890 --FreeIntRegs;
3891
3892 // The chain argument effectively gives us another free register.
3893 if (FI.isChainCall())
3894 ++FreeIntRegs;
3895
3896 unsigned NumRequiredArgs = FI.getNumRequiredArgs();
3897 // AMD64-ABI 3.2.3p3: Once arguments are classified, the registers
3898 // get assigned (in left-to-right order) for passing as follows...
3899 unsigned ArgNo = 0;
3900 for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
3901 it != ie; ++it, ++ArgNo) {
3902 bool IsNamedArg = ArgNo < NumRequiredArgs;
3903
3904 if (IsRegCall && it->type->isStructureOrClassType())
3905 it->info = classifyRegCallStructType(it->type, NeededInt, NeededSSE);
3906 else
3907 it->info = classifyArgumentType(it->type, FreeIntRegs, NeededInt,
3908 NeededSSE, IsNamedArg);
3909
3910 // AMD64-ABI 3.2.3p3: If there are no registers available for any
3911 // eightbyte of an argument, the whole argument is passed on the
3912 // stack. If registers have already been assigned for some
3913 // eightbytes of such an argument, the assignments get reverted.
3914 if (FreeIntRegs >= NeededInt && FreeSSERegs >= NeededSSE) {
3915 FreeIntRegs -= NeededInt;
3916 FreeSSERegs -= NeededSSE;
3917 } else {
3918 it->info = getIndirectResult(it->type, FreeIntRegs);
3919 }
3920 }
3921 }
3922
EmitX86_64VAArgFromMemory(CodeGenFunction & CGF,Address VAListAddr,QualType Ty)3923 static Address EmitX86_64VAArgFromMemory(CodeGenFunction &CGF,
3924 Address VAListAddr, QualType Ty) {
3925 Address overflow_arg_area_p =
3926 CGF.Builder.CreateStructGEP(VAListAddr, 2, "overflow_arg_area_p");
3927 llvm::Value *overflow_arg_area =
3928 CGF.Builder.CreateLoad(overflow_arg_area_p, "overflow_arg_area");
3929
3930 // AMD64-ABI 3.5.7p5: Step 7. Align l->overflow_arg_area upwards to a 16
3931 // byte boundary if alignment needed by type exceeds 8 byte boundary.
3932 // It isn't stated explicitly in the standard, but in practice we use
3933 // alignment greater than 16 where necessary.
3934 CharUnits Align = CGF.getContext().getTypeAlignInChars(Ty);
3935 if (Align > CharUnits::fromQuantity(8)) {
3936 overflow_arg_area = emitRoundPointerUpToAlignment(CGF, overflow_arg_area,
3937 Align);
3938 }
3939
3940 // AMD64-ABI 3.5.7p5: Step 8. Fetch type from l->overflow_arg_area.
3941 llvm::Type *LTy = CGF.ConvertTypeForMem(Ty);
3942 llvm::Value *Res =
3943 CGF.Builder.CreateBitCast(overflow_arg_area,
3944 llvm::PointerType::getUnqual(LTy));
3945
3946 // AMD64-ABI 3.5.7p5: Step 9. Set l->overflow_arg_area to:
3947 // l->overflow_arg_area + sizeof(type).
3948 // AMD64-ABI 3.5.7p5: Step 10. Align l->overflow_arg_area upwards to
3949 // an 8 byte boundary.
3950
3951 uint64_t SizeInBytes = (CGF.getContext().getTypeSize(Ty) + 7) / 8;
3952 llvm::Value *Offset =
3953 llvm::ConstantInt::get(CGF.Int32Ty, (SizeInBytes + 7) & ~7);
3954 overflow_arg_area = CGF.Builder.CreateGEP(overflow_arg_area, Offset,
3955 "overflow_arg_area.next");
3956 CGF.Builder.CreateStore(overflow_arg_area, overflow_arg_area_p);
3957
3958 // AMD64-ABI 3.5.7p5: Step 11. Return the fetched type.
3959 return Address(Res, Align);
3960 }
3961
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const3962 Address X86_64ABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
3963 QualType Ty) const {
3964 // Assume that va_list type is correct; should be pointer to LLVM type:
3965 // struct {
3966 // i32 gp_offset;
3967 // i32 fp_offset;
3968 // i8* overflow_arg_area;
3969 // i8* reg_save_area;
3970 // };
3971 unsigned neededInt, neededSSE;
3972
3973 Ty = getContext().getCanonicalType(Ty);
3974 ABIArgInfo AI = classifyArgumentType(Ty, 0, neededInt, neededSSE,
3975 /*isNamedArg*/false);
3976
3977 // AMD64-ABI 3.5.7p5: Step 1. Determine whether type may be passed
3978 // in the registers. If not go to step 7.
3979 if (!neededInt && !neededSSE)
3980 return EmitX86_64VAArgFromMemory(CGF, VAListAddr, Ty);
3981
3982 // AMD64-ABI 3.5.7p5: Step 2. Compute num_gp to hold the number of
3983 // general purpose registers needed to pass type and num_fp to hold
3984 // the number of floating point registers needed.
3985
3986 // AMD64-ABI 3.5.7p5: Step 3. Verify whether arguments fit into
3987 // registers. In the case: l->gp_offset > 48 - num_gp * 8 or
3988 // l->fp_offset > 304 - num_fp * 16 go to step 7.
3989 //
3990 // NOTE: 304 is a typo, there are (6 * 8 + 8 * 16) = 176 bytes of
3991 // register save space).
3992
3993 llvm::Value *InRegs = nullptr;
3994 Address gp_offset_p = Address::invalid(), fp_offset_p = Address::invalid();
3995 llvm::Value *gp_offset = nullptr, *fp_offset = nullptr;
3996 if (neededInt) {
3997 gp_offset_p = CGF.Builder.CreateStructGEP(VAListAddr, 0, "gp_offset_p");
3998 gp_offset = CGF.Builder.CreateLoad(gp_offset_p, "gp_offset");
3999 InRegs = llvm::ConstantInt::get(CGF.Int32Ty, 48 - neededInt * 8);
4000 InRegs = CGF.Builder.CreateICmpULE(gp_offset, InRegs, "fits_in_gp");
4001 }
4002
4003 if (neededSSE) {
4004 fp_offset_p = CGF.Builder.CreateStructGEP(VAListAddr, 1, "fp_offset_p");
4005 fp_offset = CGF.Builder.CreateLoad(fp_offset_p, "fp_offset");
4006 llvm::Value *FitsInFP =
4007 llvm::ConstantInt::get(CGF.Int32Ty, 176 - neededSSE * 16);
4008 FitsInFP = CGF.Builder.CreateICmpULE(fp_offset, FitsInFP, "fits_in_fp");
4009 InRegs = InRegs ? CGF.Builder.CreateAnd(InRegs, FitsInFP) : FitsInFP;
4010 }
4011
4012 llvm::BasicBlock *InRegBlock = CGF.createBasicBlock("vaarg.in_reg");
4013 llvm::BasicBlock *InMemBlock = CGF.createBasicBlock("vaarg.in_mem");
4014 llvm::BasicBlock *ContBlock = CGF.createBasicBlock("vaarg.end");
4015 CGF.Builder.CreateCondBr(InRegs, InRegBlock, InMemBlock);
4016
4017 // Emit code to load the value if it was passed in registers.
4018
4019 CGF.EmitBlock(InRegBlock);
4020
4021 // AMD64-ABI 3.5.7p5: Step 4. Fetch type from l->reg_save_area with
4022 // an offset of l->gp_offset and/or l->fp_offset. This may require
4023 // copying to a temporary location in case the parameter is passed
4024 // in different register classes or requires an alignment greater
4025 // than 8 for general purpose registers and 16 for XMM registers.
4026 //
4027 // FIXME: This really results in shameful code when we end up needing to
4028 // collect arguments from different places; often what should result in a
4029 // simple assembling of a structure from scattered addresses has many more
4030 // loads than necessary. Can we clean this up?
4031 llvm::Type *LTy = CGF.ConvertTypeForMem(Ty);
4032 llvm::Value *RegSaveArea = CGF.Builder.CreateLoad(
4033 CGF.Builder.CreateStructGEP(VAListAddr, 3), "reg_save_area");
4034
4035 Address RegAddr = Address::invalid();
4036 if (neededInt && neededSSE) {
4037 // FIXME: Cleanup.
4038 assert(AI.isDirect() && "Unexpected ABI info for mixed regs");
4039 llvm::StructType *ST = cast<llvm::StructType>(AI.getCoerceToType());
4040 Address Tmp = CGF.CreateMemTemp(Ty);
4041 Tmp = CGF.Builder.CreateElementBitCast(Tmp, ST);
4042 assert(ST->getNumElements() == 2 && "Unexpected ABI info for mixed regs");
4043 llvm::Type *TyLo = ST->getElementType(0);
4044 llvm::Type *TyHi = ST->getElementType(1);
4045 assert((TyLo->isFPOrFPVectorTy() ^ TyHi->isFPOrFPVectorTy()) &&
4046 "Unexpected ABI info for mixed regs");
4047 llvm::Type *PTyLo = llvm::PointerType::getUnqual(TyLo);
4048 llvm::Type *PTyHi = llvm::PointerType::getUnqual(TyHi);
4049 llvm::Value *GPAddr = CGF.Builder.CreateGEP(RegSaveArea, gp_offset);
4050 llvm::Value *FPAddr = CGF.Builder.CreateGEP(RegSaveArea, fp_offset);
4051 llvm::Value *RegLoAddr = TyLo->isFPOrFPVectorTy() ? FPAddr : GPAddr;
4052 llvm::Value *RegHiAddr = TyLo->isFPOrFPVectorTy() ? GPAddr : FPAddr;
4053
4054 // Copy the first element.
4055 // FIXME: Our choice of alignment here and below is probably pessimistic.
4056 llvm::Value *V = CGF.Builder.CreateAlignedLoad(
4057 TyLo, CGF.Builder.CreateBitCast(RegLoAddr, PTyLo),
4058 CharUnits::fromQuantity(getDataLayout().getABITypeAlignment(TyLo)));
4059 CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 0));
4060
4061 // Copy the second element.
4062 V = CGF.Builder.CreateAlignedLoad(
4063 TyHi, CGF.Builder.CreateBitCast(RegHiAddr, PTyHi),
4064 CharUnits::fromQuantity(getDataLayout().getABITypeAlignment(TyHi)));
4065 CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 1));
4066
4067 RegAddr = CGF.Builder.CreateElementBitCast(Tmp, LTy);
4068 } else if (neededInt) {
4069 RegAddr = Address(CGF.Builder.CreateGEP(RegSaveArea, gp_offset),
4070 CharUnits::fromQuantity(8));
4071 RegAddr = CGF.Builder.CreateElementBitCast(RegAddr, LTy);
4072
4073 // Copy to a temporary if necessary to ensure the appropriate alignment.
4074 auto TInfo = getContext().getTypeInfoInChars(Ty);
4075 uint64_t TySize = TInfo.Width.getQuantity();
4076 CharUnits TyAlign = TInfo.Align;
4077
4078 // Copy into a temporary if the type is more aligned than the
4079 // register save area.
4080 if (TyAlign.getQuantity() > 8) {
4081 Address Tmp = CGF.CreateMemTemp(Ty);
4082 CGF.Builder.CreateMemCpy(Tmp, RegAddr, TySize, false);
4083 RegAddr = Tmp;
4084 }
4085
4086 } else if (neededSSE == 1) {
4087 RegAddr = Address(CGF.Builder.CreateGEP(RegSaveArea, fp_offset),
4088 CharUnits::fromQuantity(16));
4089 RegAddr = CGF.Builder.CreateElementBitCast(RegAddr, LTy);
4090 } else {
4091 assert(neededSSE == 2 && "Invalid number of needed registers!");
4092 // SSE registers are spaced 16 bytes apart in the register save
4093 // area, we need to collect the two eightbytes together.
4094 // The ABI isn't explicit about this, but it seems reasonable
4095 // to assume that the slots are 16-byte aligned, since the stack is
4096 // naturally 16-byte aligned and the prologue is expected to store
4097 // all the SSE registers to the RSA.
4098 Address RegAddrLo = Address(CGF.Builder.CreateGEP(RegSaveArea, fp_offset),
4099 CharUnits::fromQuantity(16));
4100 Address RegAddrHi =
4101 CGF.Builder.CreateConstInBoundsByteGEP(RegAddrLo,
4102 CharUnits::fromQuantity(16));
4103 llvm::Type *ST = AI.canHaveCoerceToType()
4104 ? AI.getCoerceToType()
4105 : llvm::StructType::get(CGF.DoubleTy, CGF.DoubleTy);
4106 llvm::Value *V;
4107 Address Tmp = CGF.CreateMemTemp(Ty);
4108 Tmp = CGF.Builder.CreateElementBitCast(Tmp, ST);
4109 V = CGF.Builder.CreateLoad(CGF.Builder.CreateElementBitCast(
4110 RegAddrLo, ST->getStructElementType(0)));
4111 CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 0));
4112 V = CGF.Builder.CreateLoad(CGF.Builder.CreateElementBitCast(
4113 RegAddrHi, ST->getStructElementType(1)));
4114 CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 1));
4115
4116 RegAddr = CGF.Builder.CreateElementBitCast(Tmp, LTy);
4117 }
4118
4119 // AMD64-ABI 3.5.7p5: Step 5. Set:
4120 // l->gp_offset = l->gp_offset + num_gp * 8
4121 // l->fp_offset = l->fp_offset + num_fp * 16.
4122 if (neededInt) {
4123 llvm::Value *Offset = llvm::ConstantInt::get(CGF.Int32Ty, neededInt * 8);
4124 CGF.Builder.CreateStore(CGF.Builder.CreateAdd(gp_offset, Offset),
4125 gp_offset_p);
4126 }
4127 if (neededSSE) {
4128 llvm::Value *Offset = llvm::ConstantInt::get(CGF.Int32Ty, neededSSE * 16);
4129 CGF.Builder.CreateStore(CGF.Builder.CreateAdd(fp_offset, Offset),
4130 fp_offset_p);
4131 }
4132 CGF.EmitBranch(ContBlock);
4133
4134 // Emit code to load the value if it was passed in memory.
4135
4136 CGF.EmitBlock(InMemBlock);
4137 Address MemAddr = EmitX86_64VAArgFromMemory(CGF, VAListAddr, Ty);
4138
4139 // Return the appropriate result.
4140
4141 CGF.EmitBlock(ContBlock);
4142 Address ResAddr = emitMergePHI(CGF, RegAddr, InRegBlock, MemAddr, InMemBlock,
4143 "vaarg.addr");
4144 return ResAddr;
4145 }
4146
EmitMSVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const4147 Address X86_64ABIInfo::EmitMSVAArg(CodeGenFunction &CGF, Address VAListAddr,
4148 QualType Ty) const {
4149 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, /*indirect*/ false,
4150 CGF.getContext().getTypeInfoInChars(Ty),
4151 CharUnits::fromQuantity(8),
4152 /*allowHigherAlign*/ false);
4153 }
4154
4155 ABIArgInfo
reclassifyHvaArgType(QualType Ty,unsigned & FreeSSERegs,const ABIArgInfo & current) const4156 WinX86_64ABIInfo::reclassifyHvaArgType(QualType Ty, unsigned &FreeSSERegs,
4157 const ABIArgInfo ¤t) const {
4158 // Assumes vectorCall calling convention.
4159 const Type *Base = nullptr;
4160 uint64_t NumElts = 0;
4161
4162 if (!Ty->isBuiltinType() && !Ty->isVectorType() &&
4163 isHomogeneousAggregate(Ty, Base, NumElts) && FreeSSERegs >= NumElts) {
4164 FreeSSERegs -= NumElts;
4165 return getDirectX86Hva();
4166 }
4167 return current;
4168 }
4169
classify(QualType Ty,unsigned & FreeSSERegs,bool IsReturnType,bool IsVectorCall,bool IsRegCall) const4170 ABIArgInfo WinX86_64ABIInfo::classify(QualType Ty, unsigned &FreeSSERegs,
4171 bool IsReturnType, bool IsVectorCall,
4172 bool IsRegCall) const {
4173
4174 if (Ty->isVoidType())
4175 return ABIArgInfo::getIgnore();
4176
4177 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
4178 Ty = EnumTy->getDecl()->getIntegerType();
4179
4180 TypeInfo Info = getContext().getTypeInfo(Ty);
4181 uint64_t Width = Info.Width;
4182 CharUnits Align = getContext().toCharUnitsFromBits(Info.Align);
4183
4184 const RecordType *RT = Ty->getAs<RecordType>();
4185 if (RT) {
4186 if (!IsReturnType) {
4187 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(RT, getCXXABI()))
4188 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
4189 }
4190
4191 if (RT->getDecl()->hasFlexibleArrayMember())
4192 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
4193
4194 }
4195
4196 const Type *Base = nullptr;
4197 uint64_t NumElts = 0;
4198 // vectorcall adds the concept of a homogenous vector aggregate, similar to
4199 // other targets.
4200 if ((IsVectorCall || IsRegCall) &&
4201 isHomogeneousAggregate(Ty, Base, NumElts)) {
4202 if (IsRegCall) {
4203 if (FreeSSERegs >= NumElts) {
4204 FreeSSERegs -= NumElts;
4205 if (IsReturnType || Ty->isBuiltinType() || Ty->isVectorType())
4206 return ABIArgInfo::getDirect();
4207 return ABIArgInfo::getExpand();
4208 }
4209 return ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
4210 } else if (IsVectorCall) {
4211 if (FreeSSERegs >= NumElts &&
4212 (IsReturnType || Ty->isBuiltinType() || Ty->isVectorType())) {
4213 FreeSSERegs -= NumElts;
4214 return ABIArgInfo::getDirect();
4215 } else if (IsReturnType) {
4216 return ABIArgInfo::getExpand();
4217 } else if (!Ty->isBuiltinType() && !Ty->isVectorType()) {
4218 // HVAs are delayed and reclassified in the 2nd step.
4219 return ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
4220 }
4221 }
4222 }
4223
4224 if (Ty->isMemberPointerType()) {
4225 // If the member pointer is represented by an LLVM int or ptr, pass it
4226 // directly.
4227 llvm::Type *LLTy = CGT.ConvertType(Ty);
4228 if (LLTy->isPointerTy() || LLTy->isIntegerTy())
4229 return ABIArgInfo::getDirect();
4230 }
4231
4232 if (RT || Ty->isAnyComplexType() || Ty->isMemberPointerType()) {
4233 // MS x64 ABI requirement: "Any argument that doesn't fit in 8 bytes, or is
4234 // not 1, 2, 4, or 8 bytes, must be passed by reference."
4235 if (Width > 64 || !llvm::isPowerOf2_64(Width))
4236 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
4237
4238 // Otherwise, coerce it to a small integer.
4239 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), Width));
4240 }
4241
4242 if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
4243 switch (BT->getKind()) {
4244 case BuiltinType::Bool:
4245 // Bool type is always extended to the ABI, other builtin types are not
4246 // extended.
4247 return ABIArgInfo::getExtend(Ty);
4248
4249 case BuiltinType::LongDouble:
4250 // Mingw64 GCC uses the old 80 bit extended precision floating point
4251 // unit. It passes them indirectly through memory.
4252 if (IsMingw64) {
4253 const llvm::fltSemantics *LDF = &getTarget().getLongDoubleFormat();
4254 if (LDF == &llvm::APFloat::x87DoubleExtended())
4255 return ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
4256 }
4257 break;
4258
4259 case BuiltinType::Int128:
4260 case BuiltinType::UInt128:
4261 // If it's a parameter type, the normal ABI rule is that arguments larger
4262 // than 8 bytes are passed indirectly. GCC follows it. We follow it too,
4263 // even though it isn't particularly efficient.
4264 if (!IsReturnType)
4265 return ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
4266
4267 // Mingw64 GCC returns i128 in XMM0. Coerce to v2i64 to handle that.
4268 // Clang matches them for compatibility.
4269 return ABIArgInfo::getDirect(llvm::FixedVectorType::get(
4270 llvm::Type::getInt64Ty(getVMContext()), 2));
4271
4272 default:
4273 break;
4274 }
4275 }
4276
4277 if (Ty->isExtIntType()) {
4278 // MS x64 ABI requirement: "Any argument that doesn't fit in 8 bytes, or is
4279 // not 1, 2, 4, or 8 bytes, must be passed by reference."
4280 // However, non-power-of-two _ExtInts will be passed as 1,2,4 or 8 bytes
4281 // anyway as long is it fits in them, so we don't have to check the power of
4282 // 2.
4283 if (Width <= 64)
4284 return ABIArgInfo::getDirect();
4285 return ABIArgInfo::getIndirect(Align, /*ByVal=*/false);
4286 }
4287
4288 return ABIArgInfo::getDirect();
4289 }
4290
computeVectorCallArgs(CGFunctionInfo & FI,unsigned FreeSSERegs,bool IsVectorCall,bool IsRegCall) const4291 void WinX86_64ABIInfo::computeVectorCallArgs(CGFunctionInfo &FI,
4292 unsigned FreeSSERegs,
4293 bool IsVectorCall,
4294 bool IsRegCall) const {
4295 unsigned Count = 0;
4296 for (auto &I : FI.arguments()) {
4297 // Vectorcall in x64 only permits the first 6 arguments to be passed
4298 // as XMM/YMM registers.
4299 if (Count < VectorcallMaxParamNumAsReg)
4300 I.info = classify(I.type, FreeSSERegs, false, IsVectorCall, IsRegCall);
4301 else {
4302 // Since these cannot be passed in registers, pretend no registers
4303 // are left.
4304 unsigned ZeroSSERegsAvail = 0;
4305 I.info = classify(I.type, /*FreeSSERegs=*/ZeroSSERegsAvail, false,
4306 IsVectorCall, IsRegCall);
4307 }
4308 ++Count;
4309 }
4310
4311 for (auto &I : FI.arguments()) {
4312 I.info = reclassifyHvaArgType(I.type, FreeSSERegs, I.info);
4313 }
4314 }
4315
computeInfo(CGFunctionInfo & FI) const4316 void WinX86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const {
4317 const unsigned CC = FI.getCallingConvention();
4318 bool IsVectorCall = CC == llvm::CallingConv::X86_VectorCall;
4319 bool IsRegCall = CC == llvm::CallingConv::X86_RegCall;
4320
4321 // If __attribute__((sysv_abi)) is in use, use the SysV argument
4322 // classification rules.
4323 if (CC == llvm::CallingConv::X86_64_SysV) {
4324 X86_64ABIInfo SysVABIInfo(CGT, AVXLevel);
4325 SysVABIInfo.computeInfo(FI);
4326 return;
4327 }
4328
4329 unsigned FreeSSERegs = 0;
4330 if (IsVectorCall) {
4331 // We can use up to 4 SSE return registers with vectorcall.
4332 FreeSSERegs = 4;
4333 } else if (IsRegCall) {
4334 // RegCall gives us 16 SSE registers.
4335 FreeSSERegs = 16;
4336 }
4337
4338 if (!getCXXABI().classifyReturnType(FI))
4339 FI.getReturnInfo() = classify(FI.getReturnType(), FreeSSERegs, true,
4340 IsVectorCall, IsRegCall);
4341
4342 if (IsVectorCall) {
4343 // We can use up to 6 SSE register parameters with vectorcall.
4344 FreeSSERegs = 6;
4345 } else if (IsRegCall) {
4346 // RegCall gives us 16 SSE registers, we can reuse the return registers.
4347 FreeSSERegs = 16;
4348 }
4349
4350 if (IsVectorCall) {
4351 computeVectorCallArgs(FI, FreeSSERegs, IsVectorCall, IsRegCall);
4352 } else {
4353 for (auto &I : FI.arguments())
4354 I.info = classify(I.type, FreeSSERegs, false, IsVectorCall, IsRegCall);
4355 }
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 if (Ty->isVectorType())
4576 llvm::report_fatal_error(
4577 "vector types are not yet supported for variadic functions on AIX");
4578
4579 auto TypeInfo = getContext().getTypeInfoInChars(Ty);
4580 TypeInfo.Align = getParamTypeAlignment(Ty);
4581
4582 CharUnits SlotSize = CharUnits::fromQuantity(PtrByteSize);
4583
4584 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, /*Indirect*/ false, TypeInfo,
4585 SlotSize, /*AllowHigher*/ true);
4586 }
4587
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const4588 bool AIXTargetCodeGenInfo::initDwarfEHRegSizeTable(
4589 CodeGen::CodeGenFunction &CGF, llvm::Value *Address) const {
4590 return PPC_initDwarfEHRegSizeTable(CGF, Address, Is64Bit, /*IsAIX*/ true);
4591 }
4592
4593 // PowerPC-32
4594 namespace {
4595 /// PPC32_SVR4_ABIInfo - The 32-bit PowerPC ELF (SVR4) ABI information.
4596 class PPC32_SVR4_ABIInfo : public DefaultABIInfo {
4597 bool IsSoftFloatABI;
4598 bool IsRetSmallStructInRegABI;
4599
4600 CharUnits getParamTypeAlignment(QualType Ty) const;
4601
4602 public:
PPC32_SVR4_ABIInfo(CodeGen::CodeGenTypes & CGT,bool SoftFloatABI,bool RetSmallStructInRegABI)4603 PPC32_SVR4_ABIInfo(CodeGen::CodeGenTypes &CGT, bool SoftFloatABI,
4604 bool RetSmallStructInRegABI)
4605 : DefaultABIInfo(CGT), IsSoftFloatABI(SoftFloatABI),
4606 IsRetSmallStructInRegABI(RetSmallStructInRegABI) {}
4607
4608 ABIArgInfo classifyReturnType(QualType RetTy) const;
4609
computeInfo(CGFunctionInfo & FI) const4610 void computeInfo(CGFunctionInfo &FI) const override {
4611 if (!getCXXABI().classifyReturnType(FI))
4612 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
4613 for (auto &I : FI.arguments())
4614 I.info = classifyArgumentType(I.type);
4615 }
4616
4617 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
4618 QualType Ty) const override;
4619 };
4620
4621 class PPC32TargetCodeGenInfo : public TargetCodeGenInfo {
4622 public:
PPC32TargetCodeGenInfo(CodeGenTypes & CGT,bool SoftFloatABI,bool RetSmallStructInRegABI)4623 PPC32TargetCodeGenInfo(CodeGenTypes &CGT, bool SoftFloatABI,
4624 bool RetSmallStructInRegABI)
4625 : TargetCodeGenInfo(std::make_unique<PPC32_SVR4_ABIInfo>(
4626 CGT, SoftFloatABI, RetSmallStructInRegABI)) {}
4627
4628 static bool isStructReturnInRegABI(const llvm::Triple &Triple,
4629 const CodeGenOptions &Opts);
4630
getDwarfEHStackPointer(CodeGen::CodeGenModule & M) const4631 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
4632 // This is recovered from gcc output.
4633 return 1; // r1 is the dedicated stack pointer
4634 }
4635
4636 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
4637 llvm::Value *Address) const override;
4638 };
4639 }
4640
getParamTypeAlignment(QualType Ty) const4641 CharUnits PPC32_SVR4_ABIInfo::getParamTypeAlignment(QualType Ty) const {
4642 // Complex types are passed just like their elements.
4643 if (const ComplexType *CTy = Ty->getAs<ComplexType>())
4644 Ty = CTy->getElementType();
4645
4646 if (Ty->isVectorType())
4647 return CharUnits::fromQuantity(getContext().getTypeSize(Ty) == 128 ? 16
4648 : 4);
4649
4650 // For single-element float/vector structs, we consider the whole type
4651 // to have the same alignment requirements as its single element.
4652 const Type *AlignTy = nullptr;
4653 if (const Type *EltType = isSingleElementStruct(Ty, getContext())) {
4654 const BuiltinType *BT = EltType->getAs<BuiltinType>();
4655 if ((EltType->isVectorType() && getContext().getTypeSize(EltType) == 128) ||
4656 (BT && BT->isFloatingPoint()))
4657 AlignTy = EltType;
4658 }
4659
4660 if (AlignTy)
4661 return CharUnits::fromQuantity(AlignTy->isVectorType() ? 16 : 4);
4662 return CharUnits::fromQuantity(4);
4663 }
4664
classifyReturnType(QualType RetTy) const4665 ABIArgInfo PPC32_SVR4_ABIInfo::classifyReturnType(QualType RetTy) const {
4666 uint64_t Size;
4667
4668 // -msvr4-struct-return puts small aggregates in GPR3 and GPR4.
4669 if (isAggregateTypeForABI(RetTy) && IsRetSmallStructInRegABI &&
4670 (Size = getContext().getTypeSize(RetTy)) <= 64) {
4671 // System V ABI (1995), page 3-22, specified:
4672 // > A structure or union whose size is less than or equal to 8 bytes
4673 // > shall be returned in r3 and r4, as if it were first stored in the
4674 // > 8-byte aligned memory area and then the low addressed word were
4675 // > loaded into r3 and the high-addressed word into r4. Bits beyond
4676 // > the last member of the structure or union are not defined.
4677 //
4678 // GCC for big-endian PPC32 inserts the pad before the first member,
4679 // not "beyond the last member" of the struct. To stay compatible
4680 // with GCC, we coerce the struct to an integer of the same size.
4681 // LLVM will extend it and return i32 in r3, or i64 in r3:r4.
4682 if (Size == 0)
4683 return ABIArgInfo::getIgnore();
4684 else {
4685 llvm::Type *CoerceTy = llvm::Type::getIntNTy(getVMContext(), Size);
4686 return ABIArgInfo::getDirect(CoerceTy);
4687 }
4688 }
4689
4690 return DefaultABIInfo::classifyReturnType(RetTy);
4691 }
4692
4693 // TODO: this implementation is now likely redundant with
4694 // DefaultABIInfo::EmitVAArg.
EmitVAArg(CodeGenFunction & CGF,Address VAList,QualType Ty) const4695 Address PPC32_SVR4_ABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAList,
4696 QualType Ty) const {
4697 if (getTarget().getTriple().isOSDarwin()) {
4698 auto TI = getContext().getTypeInfoInChars(Ty);
4699 TI.Align = getParamTypeAlignment(Ty);
4700
4701 CharUnits SlotSize = CharUnits::fromQuantity(4);
4702 return emitVoidPtrVAArg(CGF, VAList, Ty,
4703 classifyArgumentType(Ty).isIndirect(), TI, SlotSize,
4704 /*AllowHigherAlign=*/true);
4705 }
4706
4707 const unsigned OverflowLimit = 8;
4708 if (const ComplexType *CTy = Ty->getAs<ComplexType>()) {
4709 // TODO: Implement this. For now ignore.
4710 (void)CTy;
4711 return Address::invalid(); // FIXME?
4712 }
4713
4714 // struct __va_list_tag {
4715 // unsigned char gpr;
4716 // unsigned char fpr;
4717 // unsigned short reserved;
4718 // void *overflow_arg_area;
4719 // void *reg_save_area;
4720 // };
4721
4722 bool isI64 = Ty->isIntegerType() && getContext().getTypeSize(Ty) == 64;
4723 bool isInt =
4724 Ty->isIntegerType() || Ty->isPointerType() || Ty->isAggregateType();
4725 bool isF64 = Ty->isFloatingType() && getContext().getTypeSize(Ty) == 64;
4726
4727 // All aggregates are passed indirectly? That doesn't seem consistent
4728 // with the argument-lowering code.
4729 bool isIndirect = Ty->isAggregateType();
4730
4731 CGBuilderTy &Builder = CGF.Builder;
4732
4733 // The calling convention either uses 1-2 GPRs or 1 FPR.
4734 Address NumRegsAddr = Address::invalid();
4735 if (isInt || IsSoftFloatABI) {
4736 NumRegsAddr = Builder.CreateStructGEP(VAList, 0, "gpr");
4737 } else {
4738 NumRegsAddr = Builder.CreateStructGEP(VAList, 1, "fpr");
4739 }
4740
4741 llvm::Value *NumRegs = Builder.CreateLoad(NumRegsAddr, "numUsedRegs");
4742
4743 // "Align" the register count when TY is i64.
4744 if (isI64 || (isF64 && IsSoftFloatABI)) {
4745 NumRegs = Builder.CreateAdd(NumRegs, Builder.getInt8(1));
4746 NumRegs = Builder.CreateAnd(NumRegs, Builder.getInt8((uint8_t) ~1U));
4747 }
4748
4749 llvm::Value *CC =
4750 Builder.CreateICmpULT(NumRegs, Builder.getInt8(OverflowLimit), "cond");
4751
4752 llvm::BasicBlock *UsingRegs = CGF.createBasicBlock("using_regs");
4753 llvm::BasicBlock *UsingOverflow = CGF.createBasicBlock("using_overflow");
4754 llvm::BasicBlock *Cont = CGF.createBasicBlock("cont");
4755
4756 Builder.CreateCondBr(CC, UsingRegs, UsingOverflow);
4757
4758 llvm::Type *DirectTy = CGF.ConvertType(Ty);
4759 if (isIndirect) DirectTy = DirectTy->getPointerTo(0);
4760
4761 // Case 1: consume registers.
4762 Address RegAddr = Address::invalid();
4763 {
4764 CGF.EmitBlock(UsingRegs);
4765
4766 Address RegSaveAreaPtr = Builder.CreateStructGEP(VAList, 4);
4767 RegAddr = Address(Builder.CreateLoad(RegSaveAreaPtr),
4768 CharUnits::fromQuantity(8));
4769 assert(RegAddr.getElementType() == CGF.Int8Ty);
4770
4771 // Floating-point registers start after the general-purpose registers.
4772 if (!(isInt || IsSoftFloatABI)) {
4773 RegAddr = Builder.CreateConstInBoundsByteGEP(RegAddr,
4774 CharUnits::fromQuantity(32));
4775 }
4776
4777 // Get the address of the saved value by scaling the number of
4778 // registers we've used by the number of
4779 CharUnits RegSize = CharUnits::fromQuantity((isInt || IsSoftFloatABI) ? 4 : 8);
4780 llvm::Value *RegOffset =
4781 Builder.CreateMul(NumRegs, Builder.getInt8(RegSize.getQuantity()));
4782 RegAddr = Address(Builder.CreateInBoundsGEP(CGF.Int8Ty,
4783 RegAddr.getPointer(), RegOffset),
4784 RegAddr.getAlignment().alignmentOfArrayElement(RegSize));
4785 RegAddr = Builder.CreateElementBitCast(RegAddr, DirectTy);
4786
4787 // Increase the used-register count.
4788 NumRegs =
4789 Builder.CreateAdd(NumRegs,
4790 Builder.getInt8((isI64 || (isF64 && IsSoftFloatABI)) ? 2 : 1));
4791 Builder.CreateStore(NumRegs, NumRegsAddr);
4792
4793 CGF.EmitBranch(Cont);
4794 }
4795
4796 // Case 2: consume space in the overflow area.
4797 Address MemAddr = Address::invalid();
4798 {
4799 CGF.EmitBlock(UsingOverflow);
4800
4801 Builder.CreateStore(Builder.getInt8(OverflowLimit), NumRegsAddr);
4802
4803 // Everything in the overflow area is rounded up to a size of at least 4.
4804 CharUnits OverflowAreaAlign = CharUnits::fromQuantity(4);
4805
4806 CharUnits Size;
4807 if (!isIndirect) {
4808 auto TypeInfo = CGF.getContext().getTypeInfoInChars(Ty);
4809 Size = TypeInfo.Width.alignTo(OverflowAreaAlign);
4810 } else {
4811 Size = CGF.getPointerSize();
4812 }
4813
4814 Address OverflowAreaAddr = Builder.CreateStructGEP(VAList, 3);
4815 Address OverflowArea(Builder.CreateLoad(OverflowAreaAddr, "argp.cur"),
4816 OverflowAreaAlign);
4817 // Round up address of argument to alignment
4818 CharUnits Align = CGF.getContext().getTypeAlignInChars(Ty);
4819 if (Align > OverflowAreaAlign) {
4820 llvm::Value *Ptr = OverflowArea.getPointer();
4821 OverflowArea = Address(emitRoundPointerUpToAlignment(CGF, Ptr, Align),
4822 Align);
4823 }
4824
4825 MemAddr = Builder.CreateElementBitCast(OverflowArea, DirectTy);
4826
4827 // Increase the overflow area.
4828 OverflowArea = Builder.CreateConstInBoundsByteGEP(OverflowArea, Size);
4829 Builder.CreateStore(OverflowArea.getPointer(), OverflowAreaAddr);
4830 CGF.EmitBranch(Cont);
4831 }
4832
4833 CGF.EmitBlock(Cont);
4834
4835 // Merge the cases with a phi.
4836 Address Result = emitMergePHI(CGF, RegAddr, UsingRegs, MemAddr, UsingOverflow,
4837 "vaarg.addr");
4838
4839 // Load the pointer if the argument was passed indirectly.
4840 if (isIndirect) {
4841 Result = Address(Builder.CreateLoad(Result, "aggr"),
4842 getContext().getTypeAlignInChars(Ty));
4843 }
4844
4845 return Result;
4846 }
4847
isStructReturnInRegABI(const llvm::Triple & Triple,const CodeGenOptions & Opts)4848 bool PPC32TargetCodeGenInfo::isStructReturnInRegABI(
4849 const llvm::Triple &Triple, const CodeGenOptions &Opts) {
4850 assert(Triple.getArch() == llvm::Triple::ppc);
4851
4852 switch (Opts.getStructReturnConvention()) {
4853 case CodeGenOptions::SRCK_Default:
4854 break;
4855 case CodeGenOptions::SRCK_OnStack: // -maix-struct-return
4856 return false;
4857 case CodeGenOptions::SRCK_InRegs: // -msvr4-struct-return
4858 return true;
4859 }
4860
4861 if (Triple.isOSBinFormatELF() && !Triple.isOSLinux())
4862 return true;
4863
4864 return false;
4865 }
4866
4867 bool
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const4868 PPC32TargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
4869 llvm::Value *Address) const {
4870 return PPC_initDwarfEHRegSizeTable(CGF, Address, /*Is64Bit*/ false,
4871 /*IsAIX*/ false);
4872 }
4873
4874 // PowerPC-64
4875
4876 namespace {
4877 /// PPC64_SVR4_ABIInfo - The 64-bit PowerPC ELF (SVR4) ABI information.
4878 class PPC64_SVR4_ABIInfo : public SwiftABIInfo {
4879 public:
4880 enum ABIKind {
4881 ELFv1 = 0,
4882 ELFv2
4883 };
4884
4885 private:
4886 static const unsigned GPRBits = 64;
4887 ABIKind Kind;
4888 bool IsSoftFloatABI;
4889
4890 public:
PPC64_SVR4_ABIInfo(CodeGen::CodeGenTypes & CGT,ABIKind Kind,bool SoftFloatABI)4891 PPC64_SVR4_ABIInfo(CodeGen::CodeGenTypes &CGT, ABIKind Kind,
4892 bool SoftFloatABI)
4893 : SwiftABIInfo(CGT), Kind(Kind), IsSoftFloatABI(SoftFloatABI) {}
4894
4895 bool isPromotableTypeForABI(QualType Ty) const;
4896 CharUnits getParamTypeAlignment(QualType Ty) const;
4897
4898 ABIArgInfo classifyReturnType(QualType RetTy) const;
4899 ABIArgInfo classifyArgumentType(QualType Ty) const;
4900
4901 bool isHomogeneousAggregateBaseType(QualType Ty) const override;
4902 bool isHomogeneousAggregateSmallEnough(const Type *Ty,
4903 uint64_t Members) const override;
4904
4905 // TODO: We can add more logic to computeInfo to improve performance.
4906 // Example: For aggregate arguments that fit in a register, we could
4907 // use getDirectInReg (as is done below for structs containing a single
4908 // floating-point value) to avoid pushing them to memory on function
4909 // entry. This would require changing the logic in PPCISelLowering
4910 // when lowering the parameters in the caller and args in the callee.
computeInfo(CGFunctionInfo & FI) const4911 void computeInfo(CGFunctionInfo &FI) const override {
4912 if (!getCXXABI().classifyReturnType(FI))
4913 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
4914 for (auto &I : FI.arguments()) {
4915 // We rely on the default argument classification for the most part.
4916 // One exception: An aggregate containing a single floating-point
4917 // or vector item must be passed in a register if one is available.
4918 const Type *T = isSingleElementStruct(I.type, getContext());
4919 if (T) {
4920 const BuiltinType *BT = T->getAs<BuiltinType>();
4921 if ((T->isVectorType() && getContext().getTypeSize(T) == 128) ||
4922 (BT && BT->isFloatingPoint())) {
4923 QualType QT(T, 0);
4924 I.info = ABIArgInfo::getDirectInReg(CGT.ConvertType(QT));
4925 continue;
4926 }
4927 }
4928 I.info = classifyArgumentType(I.type);
4929 }
4930 }
4931
4932 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
4933 QualType Ty) const override;
4934
shouldPassIndirectlyForSwift(ArrayRef<llvm::Type * > scalars,bool asReturnValue) const4935 bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars,
4936 bool asReturnValue) const override {
4937 return occupiesMoreThan(CGT, scalars, /*total*/ 4);
4938 }
4939
isSwiftErrorInRegister() const4940 bool isSwiftErrorInRegister() const override {
4941 return false;
4942 }
4943 };
4944
4945 class PPC64_SVR4_TargetCodeGenInfo : public TargetCodeGenInfo {
4946
4947 public:
PPC64_SVR4_TargetCodeGenInfo(CodeGenTypes & CGT,PPC64_SVR4_ABIInfo::ABIKind Kind,bool SoftFloatABI)4948 PPC64_SVR4_TargetCodeGenInfo(CodeGenTypes &CGT,
4949 PPC64_SVR4_ABIInfo::ABIKind Kind,
4950 bool SoftFloatABI)
4951 : TargetCodeGenInfo(
4952 std::make_unique<PPC64_SVR4_ABIInfo>(CGT, Kind, SoftFloatABI)) {}
4953
getDwarfEHStackPointer(CodeGen::CodeGenModule & M) const4954 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
4955 // This is recovered from gcc output.
4956 return 1; // r1 is the dedicated stack pointer
4957 }
4958
4959 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
4960 llvm::Value *Address) const override;
4961 };
4962
4963 class PPC64TargetCodeGenInfo : public DefaultTargetCodeGenInfo {
4964 public:
PPC64TargetCodeGenInfo(CodeGenTypes & CGT)4965 PPC64TargetCodeGenInfo(CodeGenTypes &CGT) : DefaultTargetCodeGenInfo(CGT) {}
4966
getDwarfEHStackPointer(CodeGen::CodeGenModule & M) const4967 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
4968 // This is recovered from gcc output.
4969 return 1; // r1 is the dedicated stack pointer
4970 }
4971
4972 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
4973 llvm::Value *Address) const override;
4974 };
4975
4976 }
4977
4978 // Return true if the ABI requires Ty to be passed sign- or zero-
4979 // extended to 64 bits.
4980 bool
isPromotableTypeForABI(QualType Ty) const4981 PPC64_SVR4_ABIInfo::isPromotableTypeForABI(QualType Ty) const {
4982 // Treat an enum type as its underlying type.
4983 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
4984 Ty = EnumTy->getDecl()->getIntegerType();
4985
4986 // Promotable integer types are required to be promoted by the ABI.
4987 if (isPromotableIntegerTypeForABI(Ty))
4988 return true;
4989
4990 // In addition to the usual promotable integer types, we also need to
4991 // extend all 32-bit types, since the ABI requires promotion to 64 bits.
4992 if (const BuiltinType *BT = Ty->getAs<BuiltinType>())
4993 switch (BT->getKind()) {
4994 case BuiltinType::Int:
4995 case BuiltinType::UInt:
4996 return true;
4997 default:
4998 break;
4999 }
5000
5001 if (const auto *EIT = Ty->getAs<ExtIntType>())
5002 if (EIT->getNumBits() < 64)
5003 return true;
5004
5005 return false;
5006 }
5007
5008 /// isAlignedParamType - Determine whether a type requires 16-byte or
5009 /// higher alignment in the parameter area. Always returns at least 8.
getParamTypeAlignment(QualType Ty) const5010 CharUnits PPC64_SVR4_ABIInfo::getParamTypeAlignment(QualType Ty) const {
5011 // Complex types are passed just like their elements.
5012 if (const ComplexType *CTy = Ty->getAs<ComplexType>())
5013 Ty = CTy->getElementType();
5014
5015 // Only vector types of size 16 bytes need alignment (larger types are
5016 // passed via reference, smaller types are not aligned).
5017 if (Ty->isVectorType()) {
5018 return CharUnits::fromQuantity(getContext().getTypeSize(Ty) == 128 ? 16 : 8);
5019 } else if (Ty->isRealFloatingType() &&
5020 &getContext().getFloatTypeSemantics(Ty) ==
5021 &llvm::APFloat::IEEEquad()) {
5022 // According to ABI document section 'Optional Save Areas': If extended
5023 // precision floating-point values in IEEE BINARY 128 QUADRUPLE PRECISION
5024 // format are supported, map them to a single quadword, quadword aligned.
5025 return CharUnits::fromQuantity(16);
5026 }
5027
5028 // For single-element float/vector structs, we consider the whole type
5029 // to have the same alignment requirements as its single element.
5030 const Type *AlignAsType = nullptr;
5031 const Type *EltType = isSingleElementStruct(Ty, getContext());
5032 if (EltType) {
5033 const BuiltinType *BT = EltType->getAs<BuiltinType>();
5034 if ((EltType->isVectorType() && getContext().getTypeSize(EltType) == 128) ||
5035 (BT && BT->isFloatingPoint()))
5036 AlignAsType = EltType;
5037 }
5038
5039 // Likewise for ELFv2 homogeneous aggregates.
5040 const Type *Base = nullptr;
5041 uint64_t Members = 0;
5042 if (!AlignAsType && Kind == ELFv2 &&
5043 isAggregateTypeForABI(Ty) && isHomogeneousAggregate(Ty, Base, Members))
5044 AlignAsType = Base;
5045
5046 // With special case aggregates, only vector base types need alignment.
5047 if (AlignAsType) {
5048 return CharUnits::fromQuantity(AlignAsType->isVectorType() ? 16 : 8);
5049 }
5050
5051 // Otherwise, we only need alignment for any aggregate type that
5052 // has an alignment requirement of >= 16 bytes.
5053 if (isAggregateTypeForABI(Ty) && getContext().getTypeAlign(Ty) >= 128) {
5054 return CharUnits::fromQuantity(16);
5055 }
5056
5057 return CharUnits::fromQuantity(8);
5058 }
5059
5060 /// isHomogeneousAggregate - Return true if a type is an ELFv2 homogeneous
5061 /// aggregate. Base is set to the base element type, and Members is set
5062 /// to the number of base elements.
isHomogeneousAggregate(QualType Ty,const Type * & Base,uint64_t & Members) const5063 bool ABIInfo::isHomogeneousAggregate(QualType Ty, const Type *&Base,
5064 uint64_t &Members) const {
5065 if (const ConstantArrayType *AT = getContext().getAsConstantArrayType(Ty)) {
5066 uint64_t NElements = AT->getSize().getZExtValue();
5067 if (NElements == 0)
5068 return false;
5069 if (!isHomogeneousAggregate(AT->getElementType(), Base, Members))
5070 return false;
5071 Members *= NElements;
5072 } else if (const RecordType *RT = Ty->getAs<RecordType>()) {
5073 const RecordDecl *RD = RT->getDecl();
5074 if (RD->hasFlexibleArrayMember())
5075 return false;
5076
5077 Members = 0;
5078
5079 // If this is a C++ record, check the bases first.
5080 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
5081 for (const auto &I : CXXRD->bases()) {
5082 // Ignore empty records.
5083 if (isEmptyRecord(getContext(), I.getType(), true))
5084 continue;
5085
5086 uint64_t FldMembers;
5087 if (!isHomogeneousAggregate(I.getType(), Base, FldMembers))
5088 return false;
5089
5090 Members += FldMembers;
5091 }
5092 }
5093
5094 for (const auto *FD : RD->fields()) {
5095 // Ignore (non-zero arrays of) empty records.
5096 QualType FT = FD->getType();
5097 while (const ConstantArrayType *AT =
5098 getContext().getAsConstantArrayType(FT)) {
5099 if (AT->getSize().getZExtValue() == 0)
5100 return false;
5101 FT = AT->getElementType();
5102 }
5103 if (isEmptyRecord(getContext(), FT, true))
5104 continue;
5105
5106 // For compatibility with GCC, ignore empty bitfields in C++ mode.
5107 if (getContext().getLangOpts().CPlusPlus &&
5108 FD->isZeroLengthBitField(getContext()))
5109 continue;
5110
5111 uint64_t FldMembers;
5112 if (!isHomogeneousAggregate(FD->getType(), Base, FldMembers))
5113 return false;
5114
5115 Members = (RD->isUnion() ?
5116 std::max(Members, FldMembers) : Members + FldMembers);
5117 }
5118
5119 if (!Base)
5120 return false;
5121
5122 // Ensure there is no padding.
5123 if (getContext().getTypeSize(Base) * Members !=
5124 getContext().getTypeSize(Ty))
5125 return false;
5126 } else {
5127 Members = 1;
5128 if (const ComplexType *CT = Ty->getAs<ComplexType>()) {
5129 Members = 2;
5130 Ty = CT->getElementType();
5131 }
5132
5133 // Most ABIs only support float, double, and some vector type widths.
5134 if (!isHomogeneousAggregateBaseType(Ty))
5135 return false;
5136
5137 // The base type must be the same for all members. Types that
5138 // agree in both total size and mode (float vs. vector) are
5139 // treated as being equivalent here.
5140 const Type *TyPtr = Ty.getTypePtr();
5141 if (!Base) {
5142 Base = TyPtr;
5143 // If it's a non-power-of-2 vector, its size is already a power-of-2,
5144 // so make sure to widen it explicitly.
5145 if (const VectorType *VT = Base->getAs<VectorType>()) {
5146 QualType EltTy = VT->getElementType();
5147 unsigned NumElements =
5148 getContext().getTypeSize(VT) / getContext().getTypeSize(EltTy);
5149 Base = getContext()
5150 .getVectorType(EltTy, NumElements, VT->getVectorKind())
5151 .getTypePtr();
5152 }
5153 }
5154
5155 if (Base->isVectorType() != TyPtr->isVectorType() ||
5156 getContext().getTypeSize(Base) != getContext().getTypeSize(TyPtr))
5157 return false;
5158 }
5159 return Members > 0 && isHomogeneousAggregateSmallEnough(Base, Members);
5160 }
5161
isHomogeneousAggregateBaseType(QualType Ty) const5162 bool PPC64_SVR4_ABIInfo::isHomogeneousAggregateBaseType(QualType Ty) const {
5163 // Homogeneous aggregates for ELFv2 must have base types of float,
5164 // double, long double, or 128-bit vectors.
5165 if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
5166 if (BT->getKind() == BuiltinType::Float ||
5167 BT->getKind() == BuiltinType::Double ||
5168 BT->getKind() == BuiltinType::LongDouble ||
5169 (getContext().getTargetInfo().hasFloat128Type() &&
5170 (BT->getKind() == BuiltinType::Float128))) {
5171 if (IsSoftFloatABI)
5172 return false;
5173 return true;
5174 }
5175 }
5176 if (const VectorType *VT = Ty->getAs<VectorType>()) {
5177 if (getContext().getTypeSize(VT) == 128)
5178 return true;
5179 }
5180 return false;
5181 }
5182
isHomogeneousAggregateSmallEnough(const Type * Base,uint64_t Members) const5183 bool PPC64_SVR4_ABIInfo::isHomogeneousAggregateSmallEnough(
5184 const Type *Base, uint64_t Members) const {
5185 // Vector and fp128 types require one register, other floating point types
5186 // require one or two registers depending on their size.
5187 uint32_t NumRegs =
5188 ((getContext().getTargetInfo().hasFloat128Type() &&
5189 Base->isFloat128Type()) ||
5190 Base->isVectorType()) ? 1
5191 : (getContext().getTypeSize(Base) + 63) / 64;
5192
5193 // Homogeneous Aggregates may occupy at most 8 registers.
5194 return Members * NumRegs <= 8;
5195 }
5196
5197 ABIArgInfo
classifyArgumentType(QualType Ty) const5198 PPC64_SVR4_ABIInfo::classifyArgumentType(QualType Ty) const {
5199 Ty = useFirstFieldIfTransparentUnion(Ty);
5200
5201 if (Ty->isAnyComplexType())
5202 return ABIArgInfo::getDirect();
5203
5204 // Non-Altivec vector types are passed in GPRs (smaller than 16 bytes)
5205 // or via reference (larger than 16 bytes).
5206 if (Ty->isVectorType()) {
5207 uint64_t Size = getContext().getTypeSize(Ty);
5208 if (Size > 128)
5209 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
5210 else if (Size < 128) {
5211 llvm::Type *CoerceTy = llvm::IntegerType::get(getVMContext(), Size);
5212 return ABIArgInfo::getDirect(CoerceTy);
5213 }
5214 }
5215
5216 if (const auto *EIT = Ty->getAs<ExtIntType>())
5217 if (EIT->getNumBits() > 128)
5218 return getNaturalAlignIndirect(Ty, /*ByVal=*/true);
5219
5220 if (isAggregateTypeForABI(Ty)) {
5221 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
5222 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
5223
5224 uint64_t ABIAlign = getParamTypeAlignment(Ty).getQuantity();
5225 uint64_t TyAlign = getContext().getTypeAlignInChars(Ty).getQuantity();
5226
5227 // ELFv2 homogeneous aggregates are passed as array types.
5228 const Type *Base = nullptr;
5229 uint64_t Members = 0;
5230 if (Kind == ELFv2 &&
5231 isHomogeneousAggregate(Ty, Base, Members)) {
5232 llvm::Type *BaseTy = CGT.ConvertType(QualType(Base, 0));
5233 llvm::Type *CoerceTy = llvm::ArrayType::get(BaseTy, Members);
5234 return ABIArgInfo::getDirect(CoerceTy);
5235 }
5236
5237 // If an aggregate may end up fully in registers, we do not
5238 // use the ByVal method, but pass the aggregate as array.
5239 // This is usually beneficial since we avoid forcing the
5240 // back-end to store the argument to memory.
5241 uint64_t Bits = getContext().getTypeSize(Ty);
5242 if (Bits > 0 && Bits <= 8 * GPRBits) {
5243 llvm::Type *CoerceTy;
5244
5245 // Types up to 8 bytes are passed as integer type (which will be
5246 // properly aligned in the argument save area doubleword).
5247 if (Bits <= GPRBits)
5248 CoerceTy =
5249 llvm::IntegerType::get(getVMContext(), llvm::alignTo(Bits, 8));
5250 // Larger types are passed as arrays, with the base type selected
5251 // according to the required alignment in the save area.
5252 else {
5253 uint64_t RegBits = ABIAlign * 8;
5254 uint64_t NumRegs = llvm::alignTo(Bits, RegBits) / RegBits;
5255 llvm::Type *RegTy = llvm::IntegerType::get(getVMContext(), RegBits);
5256 CoerceTy = llvm::ArrayType::get(RegTy, NumRegs);
5257 }
5258
5259 return ABIArgInfo::getDirect(CoerceTy);
5260 }
5261
5262 // All other aggregates are passed ByVal.
5263 return ABIArgInfo::getIndirect(CharUnits::fromQuantity(ABIAlign),
5264 /*ByVal=*/true,
5265 /*Realign=*/TyAlign > ABIAlign);
5266 }
5267
5268 return (isPromotableTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
5269 : ABIArgInfo::getDirect());
5270 }
5271
5272 ABIArgInfo
classifyReturnType(QualType RetTy) const5273 PPC64_SVR4_ABIInfo::classifyReturnType(QualType RetTy) const {
5274 if (RetTy->isVoidType())
5275 return ABIArgInfo::getIgnore();
5276
5277 if (RetTy->isAnyComplexType())
5278 return ABIArgInfo::getDirect();
5279
5280 // Non-Altivec vector types are returned in GPRs (smaller than 16 bytes)
5281 // or via reference (larger than 16 bytes).
5282 if (RetTy->isVectorType()) {
5283 uint64_t Size = getContext().getTypeSize(RetTy);
5284 if (Size > 128)
5285 return getNaturalAlignIndirect(RetTy);
5286 else if (Size < 128) {
5287 llvm::Type *CoerceTy = llvm::IntegerType::get(getVMContext(), Size);
5288 return ABIArgInfo::getDirect(CoerceTy);
5289 }
5290 }
5291
5292 if (const auto *EIT = RetTy->getAs<ExtIntType>())
5293 if (EIT->getNumBits() > 128)
5294 return getNaturalAlignIndirect(RetTy, /*ByVal=*/false);
5295
5296 if (isAggregateTypeForABI(RetTy)) {
5297 // ELFv2 homogeneous aggregates are returned as array types.
5298 const Type *Base = nullptr;
5299 uint64_t Members = 0;
5300 if (Kind == ELFv2 &&
5301 isHomogeneousAggregate(RetTy, Base, Members)) {
5302 llvm::Type *BaseTy = CGT.ConvertType(QualType(Base, 0));
5303 llvm::Type *CoerceTy = llvm::ArrayType::get(BaseTy, Members);
5304 return ABIArgInfo::getDirect(CoerceTy);
5305 }
5306
5307 // ELFv2 small aggregates are returned in up to two registers.
5308 uint64_t Bits = getContext().getTypeSize(RetTy);
5309 if (Kind == ELFv2 && Bits <= 2 * GPRBits) {
5310 if (Bits == 0)
5311 return ABIArgInfo::getIgnore();
5312
5313 llvm::Type *CoerceTy;
5314 if (Bits > GPRBits) {
5315 CoerceTy = llvm::IntegerType::get(getVMContext(), GPRBits);
5316 CoerceTy = llvm::StructType::get(CoerceTy, CoerceTy);
5317 } else
5318 CoerceTy =
5319 llvm::IntegerType::get(getVMContext(), llvm::alignTo(Bits, 8));
5320 return ABIArgInfo::getDirect(CoerceTy);
5321 }
5322
5323 // All other aggregates are returned indirectly.
5324 return getNaturalAlignIndirect(RetTy);
5325 }
5326
5327 return (isPromotableTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
5328 : ABIArgInfo::getDirect());
5329 }
5330
5331 // Based on ARMABIInfo::EmitVAArg, adjusted for 64-bit machine.
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const5332 Address PPC64_SVR4_ABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
5333 QualType Ty) const {
5334 auto TypeInfo = getContext().getTypeInfoInChars(Ty);
5335 TypeInfo.Align = getParamTypeAlignment(Ty);
5336
5337 CharUnits SlotSize = CharUnits::fromQuantity(8);
5338
5339 // If we have a complex type and the base type is smaller than 8 bytes,
5340 // the ABI calls for the real and imaginary parts to be right-adjusted
5341 // in separate doublewords. However, Clang expects us to produce a
5342 // pointer to a structure with the two parts packed tightly. So generate
5343 // loads of the real and imaginary parts relative to the va_list pointer,
5344 // and store them to a temporary structure.
5345 if (const ComplexType *CTy = Ty->getAs<ComplexType>()) {
5346 CharUnits EltSize = TypeInfo.Width / 2;
5347 if (EltSize < SlotSize) {
5348 Address Addr = emitVoidPtrDirectVAArg(CGF, VAListAddr, CGF.Int8Ty,
5349 SlotSize * 2, SlotSize,
5350 SlotSize, /*AllowHigher*/ true);
5351
5352 Address RealAddr = Addr;
5353 Address ImagAddr = RealAddr;
5354 if (CGF.CGM.getDataLayout().isBigEndian()) {
5355 RealAddr = CGF.Builder.CreateConstInBoundsByteGEP(RealAddr,
5356 SlotSize - EltSize);
5357 ImagAddr = CGF.Builder.CreateConstInBoundsByteGEP(ImagAddr,
5358 2 * SlotSize - EltSize);
5359 } else {
5360 ImagAddr = CGF.Builder.CreateConstInBoundsByteGEP(RealAddr, SlotSize);
5361 }
5362
5363 llvm::Type *EltTy = CGF.ConvertTypeForMem(CTy->getElementType());
5364 RealAddr = CGF.Builder.CreateElementBitCast(RealAddr, EltTy);
5365 ImagAddr = CGF.Builder.CreateElementBitCast(ImagAddr, EltTy);
5366 llvm::Value *Real = CGF.Builder.CreateLoad(RealAddr, ".vareal");
5367 llvm::Value *Imag = CGF.Builder.CreateLoad(ImagAddr, ".vaimag");
5368
5369 Address Temp = CGF.CreateMemTemp(Ty, "vacplx");
5370 CGF.EmitStoreOfComplex({Real, Imag}, CGF.MakeAddrLValue(Temp, Ty),
5371 /*init*/ true);
5372 return Temp;
5373 }
5374 }
5375
5376 // Otherwise, just use the general rule.
5377 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, /*Indirect*/ false,
5378 TypeInfo, SlotSize, /*AllowHigher*/ true);
5379 }
5380
5381 bool
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const5382 PPC64_SVR4_TargetCodeGenInfo::initDwarfEHRegSizeTable(
5383 CodeGen::CodeGenFunction &CGF,
5384 llvm::Value *Address) const {
5385 return PPC_initDwarfEHRegSizeTable(CGF, Address, /*Is64Bit*/ true,
5386 /*IsAIX*/ false);
5387 }
5388
5389 bool
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const5390 PPC64TargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
5391 llvm::Value *Address) const {
5392 return PPC_initDwarfEHRegSizeTable(CGF, Address, /*Is64Bit*/ true,
5393 /*IsAIX*/ false);
5394 }
5395
5396 //===----------------------------------------------------------------------===//
5397 // AArch64 ABI Implementation
5398 //===----------------------------------------------------------------------===//
5399
5400 namespace {
5401
5402 class AArch64ABIInfo : public SwiftABIInfo {
5403 public:
5404 enum ABIKind {
5405 AAPCS = 0,
5406 DarwinPCS,
5407 Win64
5408 };
5409
5410 private:
5411 ABIKind Kind;
5412
5413 public:
AArch64ABIInfo(CodeGenTypes & CGT,ABIKind Kind)5414 AArch64ABIInfo(CodeGenTypes &CGT, ABIKind Kind)
5415 : SwiftABIInfo(CGT), Kind(Kind) {}
5416
5417 private:
getABIKind() const5418 ABIKind getABIKind() const { return Kind; }
isDarwinPCS() const5419 bool isDarwinPCS() const { return Kind == DarwinPCS; }
5420
5421 ABIArgInfo classifyReturnType(QualType RetTy, bool IsVariadic) const;
5422 ABIArgInfo classifyArgumentType(QualType RetTy) 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);
5437 }
5438
5439 Address EmitDarwinVAArg(Address VAListAddr, QualType Ty,
5440 CodeGenFunction &CGF) const;
5441
5442 Address EmitAAPCSVAArg(Address VAListAddr, QualType Ty,
5443 CodeGenFunction &CGF) const;
5444
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const5445 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
5446 QualType Ty) const override {
5447 llvm::Type *BaseTy = CGF.ConvertType(Ty);
5448 if (isa<llvm::ScalableVectorType>(BaseTy))
5449 llvm::report_fatal_error("Passing SVE types to variadic functions is "
5450 "currently not supported");
5451
5452 return Kind == Win64 ? EmitMSVAArg(CGF, VAListAddr, Ty)
5453 : isDarwinPCS() ? EmitDarwinVAArg(VAListAddr, Ty, CGF)
5454 : EmitAAPCSVAArg(VAListAddr, Ty, CGF);
5455 }
5456
5457 Address EmitMSVAArg(CodeGenFunction &CGF, Address VAListAddr,
5458 QualType Ty) const override;
5459
shouldPassIndirectlyForSwift(ArrayRef<llvm::Type * > scalars,bool asReturnValue) const5460 bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars,
5461 bool asReturnValue) const override {
5462 return occupiesMoreThan(CGT, scalars, /*total*/ 4);
5463 }
isSwiftErrorInRegister() const5464 bool isSwiftErrorInRegister() const override {
5465 return true;
5466 }
5467
5468 bool isLegalVectorTypeForSwift(CharUnits totalSize, llvm::Type *eltTy,
5469 unsigned elts) const override;
5470
allowBFloatArgsAndRet() const5471 bool allowBFloatArgsAndRet() const override {
5472 return getTarget().hasBFloat16Type();
5473 }
5474 };
5475
5476 class AArch64TargetCodeGenInfo : public TargetCodeGenInfo {
5477 public:
AArch64TargetCodeGenInfo(CodeGenTypes & CGT,AArch64ABIInfo::ABIKind Kind)5478 AArch64TargetCodeGenInfo(CodeGenTypes &CGT, AArch64ABIInfo::ABIKind Kind)
5479 : TargetCodeGenInfo(std::make_unique<AArch64ABIInfo>(CGT, Kind)) {}
5480
getARCRetainAutoreleasedReturnValueMarker() const5481 StringRef getARCRetainAutoreleasedReturnValueMarker() const override {
5482 return "mov\tfp, fp\t\t// marker for objc_retainAutoreleaseReturnValue";
5483 }
5484
getDwarfEHStackPointer(CodeGen::CodeGenModule & M) const5485 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
5486 return 31;
5487 }
5488
doesReturnSlotInterfereWithArgs() const5489 bool doesReturnSlotInterfereWithArgs() const override { return false; }
5490
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const5491 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
5492 CodeGen::CodeGenModule &CGM) const override {
5493 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
5494 if (!FD)
5495 return;
5496
5497 const auto *TA = FD->getAttr<TargetAttr>();
5498 if (TA == nullptr)
5499 return;
5500
5501 ParsedTargetAttr Attr = TA->parse();
5502 if (Attr.BranchProtection.empty())
5503 return;
5504
5505 TargetInfo::BranchProtectionInfo BPI;
5506 StringRef Error;
5507 (void)CGM.getTarget().validateBranchProtection(Attr.BranchProtection,
5508 BPI, Error);
5509 assert(Error.empty());
5510
5511 auto *Fn = cast<llvm::Function>(GV);
5512 static const char *SignReturnAddrStr[] = {"none", "non-leaf", "all"};
5513 Fn->addFnAttr("sign-return-address", SignReturnAddrStr[static_cast<int>(BPI.SignReturnAddr)]);
5514
5515 if (BPI.SignReturnAddr != LangOptions::SignReturnAddressScopeKind::None) {
5516 Fn->addFnAttr("sign-return-address-key",
5517 BPI.SignKey == LangOptions::SignReturnAddressKeyKind::AKey
5518 ? "a_key"
5519 : "b_key");
5520 }
5521
5522 Fn->addFnAttr("branch-target-enforcement",
5523 BPI.BranchTargetEnforcement ? "true" : "false");
5524 }
5525 };
5526
5527 class WindowsAArch64TargetCodeGenInfo : public AArch64TargetCodeGenInfo {
5528 public:
WindowsAArch64TargetCodeGenInfo(CodeGenTypes & CGT,AArch64ABIInfo::ABIKind K)5529 WindowsAArch64TargetCodeGenInfo(CodeGenTypes &CGT, AArch64ABIInfo::ABIKind K)
5530 : AArch64TargetCodeGenInfo(CGT, K) {}
5531
5532 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
5533 CodeGen::CodeGenModule &CGM) const override;
5534
getDependentLibraryOption(llvm::StringRef Lib,llvm::SmallString<24> & Opt) const5535 void getDependentLibraryOption(llvm::StringRef Lib,
5536 llvm::SmallString<24> &Opt) const override {
5537 Opt = "/DEFAULTLIB:" + qualifyWindowsLibrary(Lib);
5538 }
5539
getDetectMismatchOption(llvm::StringRef Name,llvm::StringRef Value,llvm::SmallString<32> & Opt) const5540 void getDetectMismatchOption(llvm::StringRef Name, llvm::StringRef Value,
5541 llvm::SmallString<32> &Opt) const override {
5542 Opt = "/FAILIFMISMATCH:\"" + Name.str() + "=" + Value.str() + "\"";
5543 }
5544 };
5545
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const5546 void WindowsAArch64TargetCodeGenInfo::setTargetAttributes(
5547 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const {
5548 AArch64TargetCodeGenInfo::setTargetAttributes(D, GV, CGM);
5549 if (GV->isDeclaration())
5550 return;
5551 addStackProbeTargetAttributes(D, GV, CGM);
5552 }
5553 }
5554
coerceIllegalVector(QualType Ty) const5555 ABIArgInfo AArch64ABIInfo::coerceIllegalVector(QualType Ty) const {
5556 assert(Ty->isVectorType() && "expected vector type!");
5557
5558 const auto *VT = Ty->castAs<VectorType>();
5559 if (VT->getVectorKind() == VectorType::SveFixedLengthPredicateVector) {
5560 assert(VT->getElementType()->isBuiltinType() && "expected builtin type!");
5561 assert(VT->getElementType()->castAs<BuiltinType>()->getKind() ==
5562 BuiltinType::UChar &&
5563 "unexpected builtin type for SVE predicate!");
5564 return ABIArgInfo::getDirect(llvm::ScalableVectorType::get(
5565 llvm::Type::getInt1Ty(getVMContext()), 16));
5566 }
5567
5568 if (VT->getVectorKind() == VectorType::SveFixedLengthDataVector) {
5569 assert(VT->getElementType()->isBuiltinType() && "expected builtin type!");
5570
5571 const auto *BT = VT->getElementType()->castAs<BuiltinType>();
5572 llvm::ScalableVectorType *ResType = nullptr;
5573 switch (BT->getKind()) {
5574 default:
5575 llvm_unreachable("unexpected builtin type for SVE vector!");
5576 case BuiltinType::SChar:
5577 case BuiltinType::UChar:
5578 ResType = llvm::ScalableVectorType::get(
5579 llvm::Type::getInt8Ty(getVMContext()), 16);
5580 break;
5581 case BuiltinType::Short:
5582 case BuiltinType::UShort:
5583 ResType = llvm::ScalableVectorType::get(
5584 llvm::Type::getInt16Ty(getVMContext()), 8);
5585 break;
5586 case BuiltinType::Int:
5587 case BuiltinType::UInt:
5588 ResType = llvm::ScalableVectorType::get(
5589 llvm::Type::getInt32Ty(getVMContext()), 4);
5590 break;
5591 case BuiltinType::Long:
5592 case BuiltinType::ULong:
5593 ResType = llvm::ScalableVectorType::get(
5594 llvm::Type::getInt64Ty(getVMContext()), 2);
5595 break;
5596 case BuiltinType::Half:
5597 ResType = llvm::ScalableVectorType::get(
5598 llvm::Type::getHalfTy(getVMContext()), 8);
5599 break;
5600 case BuiltinType::Float:
5601 ResType = llvm::ScalableVectorType::get(
5602 llvm::Type::getFloatTy(getVMContext()), 4);
5603 break;
5604 case BuiltinType::Double:
5605 ResType = llvm::ScalableVectorType::get(
5606 llvm::Type::getDoubleTy(getVMContext()), 2);
5607 break;
5608 case BuiltinType::BFloat16:
5609 ResType = llvm::ScalableVectorType::get(
5610 llvm::Type::getBFloatTy(getVMContext()), 8);
5611 break;
5612 }
5613 return ABIArgInfo::getDirect(ResType);
5614 }
5615
5616 uint64_t Size = getContext().getTypeSize(Ty);
5617 // Android promotes <2 x i8> to i16, not i32
5618 if (isAndroid() && (Size <= 16)) {
5619 llvm::Type *ResType = llvm::Type::getInt16Ty(getVMContext());
5620 return ABIArgInfo::getDirect(ResType);
5621 }
5622 if (Size <= 32) {
5623 llvm::Type *ResType = llvm::Type::getInt32Ty(getVMContext());
5624 return ABIArgInfo::getDirect(ResType);
5625 }
5626 if (Size == 64) {
5627 auto *ResType =
5628 llvm::FixedVectorType::get(llvm::Type::getInt32Ty(getVMContext()), 2);
5629 return ABIArgInfo::getDirect(ResType);
5630 }
5631 if (Size == 128) {
5632 auto *ResType =
5633 llvm::FixedVectorType::get(llvm::Type::getInt32Ty(getVMContext()), 4);
5634 return ABIArgInfo::getDirect(ResType);
5635 }
5636 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
5637 }
5638
classifyArgumentType(QualType Ty) const5639 ABIArgInfo AArch64ABIInfo::classifyArgumentType(QualType Ty) const {
5640 Ty = useFirstFieldIfTransparentUnion(Ty);
5641
5642 // Handle illegal vector types here.
5643 if (isIllegalVectorType(Ty))
5644 return coerceIllegalVector(Ty);
5645
5646 if (!isAggregateTypeForABI(Ty)) {
5647 // Treat an enum type as its underlying type.
5648 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
5649 Ty = EnumTy->getDecl()->getIntegerType();
5650
5651 if (const auto *EIT = Ty->getAs<ExtIntType>())
5652 if (EIT->getNumBits() > 128)
5653 return getNaturalAlignIndirect(Ty);
5654
5655 return (isPromotableIntegerTypeForABI(Ty) && isDarwinPCS()
5656 ? ABIArgInfo::getExtend(Ty)
5657 : ABIArgInfo::getDirect());
5658 }
5659
5660 // Structures with either a non-trivial destructor or a non-trivial
5661 // copy constructor are always indirect.
5662 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI())) {
5663 return getNaturalAlignIndirect(Ty, /*ByVal=*/RAA ==
5664 CGCXXABI::RAA_DirectInMemory);
5665 }
5666
5667 // Empty records are always ignored on Darwin, but actually passed in C++ mode
5668 // elsewhere for GNU compatibility.
5669 uint64_t Size = getContext().getTypeSize(Ty);
5670 bool IsEmpty = isEmptyRecord(getContext(), Ty, true);
5671 if (IsEmpty || Size == 0) {
5672 if (!getContext().getLangOpts().CPlusPlus || isDarwinPCS())
5673 return ABIArgInfo::getIgnore();
5674
5675 // GNU C mode. The only argument that gets ignored is an empty one with size
5676 // 0.
5677 if (IsEmpty && Size == 0)
5678 return ABIArgInfo::getIgnore();
5679 return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext()));
5680 }
5681
5682 // Homogeneous Floating-point Aggregates (HFAs) need to be expanded.
5683 const Type *Base = nullptr;
5684 uint64_t Members = 0;
5685 if (isHomogeneousAggregate(Ty, Base, Members)) {
5686 return ABIArgInfo::getDirect(
5687 llvm::ArrayType::get(CGT.ConvertType(QualType(Base, 0)), Members));
5688 }
5689
5690 // Aggregates <= 16 bytes are passed directly in registers or on the stack.
5691 if (Size <= 128) {
5692 // On RenderScript, coerce Aggregates <= 16 bytes to an integer array of
5693 // same size and alignment.
5694 if (getTarget().isRenderScriptTarget()) {
5695 return coerceToIntArray(Ty, getContext(), getVMContext());
5696 }
5697 unsigned Alignment;
5698 if (Kind == AArch64ABIInfo::AAPCS) {
5699 Alignment = getContext().getTypeUnadjustedAlign(Ty);
5700 Alignment = Alignment < 128 ? 64 : 128;
5701 } else {
5702 Alignment = std::max(getContext().getTypeAlign(Ty),
5703 (unsigned)getTarget().getPointerWidth(0));
5704 }
5705 Size = llvm::alignTo(Size, Alignment);
5706
5707 // We use a pair of i64 for 16-byte aggregate with 8-byte alignment.
5708 // For aggregates with 16-byte alignment, we use i128.
5709 llvm::Type *BaseTy = llvm::Type::getIntNTy(getVMContext(), Alignment);
5710 return ABIArgInfo::getDirect(
5711 Size == Alignment ? BaseTy
5712 : llvm::ArrayType::get(BaseTy, Size / Alignment));
5713 }
5714
5715 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
5716 }
5717
classifyReturnType(QualType RetTy,bool IsVariadic) const5718 ABIArgInfo AArch64ABIInfo::classifyReturnType(QualType RetTy,
5719 bool IsVariadic) const {
5720 if (RetTy->isVoidType())
5721 return ABIArgInfo::getIgnore();
5722
5723 if (const auto *VT = RetTy->getAs<VectorType>()) {
5724 if (VT->getVectorKind() == VectorType::SveFixedLengthDataVector ||
5725 VT->getVectorKind() == VectorType::SveFixedLengthPredicateVector)
5726 return coerceIllegalVector(RetTy);
5727 }
5728
5729 // Large vector types should be returned via memory.
5730 if (RetTy->isVectorType() && getContext().getTypeSize(RetTy) > 128)
5731 return getNaturalAlignIndirect(RetTy);
5732
5733 if (!isAggregateTypeForABI(RetTy)) {
5734 // Treat an enum type as its underlying type.
5735 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
5736 RetTy = EnumTy->getDecl()->getIntegerType();
5737
5738 if (const auto *EIT = RetTy->getAs<ExtIntType>())
5739 if (EIT->getNumBits() > 128)
5740 return getNaturalAlignIndirect(RetTy);
5741
5742 return (isPromotableIntegerTypeForABI(RetTy) && isDarwinPCS()
5743 ? ABIArgInfo::getExtend(RetTy)
5744 : ABIArgInfo::getDirect());
5745 }
5746
5747 uint64_t Size = getContext().getTypeSize(RetTy);
5748 if (isEmptyRecord(getContext(), RetTy, true) || Size == 0)
5749 return ABIArgInfo::getIgnore();
5750
5751 const Type *Base = nullptr;
5752 uint64_t Members = 0;
5753 if (isHomogeneousAggregate(RetTy, Base, Members) &&
5754 !(getTarget().getTriple().getArch() == llvm::Triple::aarch64_32 &&
5755 IsVariadic))
5756 // Homogeneous Floating-point Aggregates (HFAs) are returned directly.
5757 return ABIArgInfo::getDirect();
5758
5759 // Aggregates <= 16 bytes are returned directly in registers or on the stack.
5760 if (Size <= 128) {
5761 // On RenderScript, coerce Aggregates <= 16 bytes to an integer array of
5762 // same size and alignment.
5763 if (getTarget().isRenderScriptTarget()) {
5764 return coerceToIntArray(RetTy, getContext(), getVMContext());
5765 }
5766 unsigned Alignment = getContext().getTypeAlign(RetTy);
5767 Size = llvm::alignTo(Size, 64); // round up to multiple of 8 bytes
5768
5769 // We use a pair of i64 for 16-byte aggregate with 8-byte alignment.
5770 // For aggregates with 16-byte alignment, we use i128.
5771 if (Alignment < 128 && Size == 128) {
5772 llvm::Type *BaseTy = llvm::Type::getInt64Ty(getVMContext());
5773 return ABIArgInfo::getDirect(llvm::ArrayType::get(BaseTy, Size / 64));
5774 }
5775 return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), Size));
5776 }
5777
5778 return getNaturalAlignIndirect(RetTy);
5779 }
5780
5781 /// isIllegalVectorType - check whether the vector type is legal for AArch64.
isIllegalVectorType(QualType Ty) const5782 bool AArch64ABIInfo::isIllegalVectorType(QualType Ty) const {
5783 if (const VectorType *VT = Ty->getAs<VectorType>()) {
5784 // Check whether VT is a fixed-length SVE vector. These types are
5785 // represented as scalable vectors in function args/return and must be
5786 // coerced from fixed vectors.
5787 if (VT->getVectorKind() == VectorType::SveFixedLengthDataVector ||
5788 VT->getVectorKind() == VectorType::SveFixedLengthPredicateVector)
5789 return true;
5790
5791 // Check whether VT is legal.
5792 unsigned NumElements = VT->getNumElements();
5793 uint64_t Size = getContext().getTypeSize(VT);
5794 // NumElements should be power of 2.
5795 if (!llvm::isPowerOf2_32(NumElements))
5796 return true;
5797
5798 // arm64_32 has to be compatible with the ARM logic here, which allows huge
5799 // vectors for some reason.
5800 llvm::Triple Triple = getTarget().getTriple();
5801 if (Triple.getArch() == llvm::Triple::aarch64_32 &&
5802 Triple.isOSBinFormatMachO())
5803 return Size <= 32;
5804
5805 return Size != 64 && (Size != 128 || NumElements == 1);
5806 }
5807 return false;
5808 }
5809
isLegalVectorTypeForSwift(CharUnits totalSize,llvm::Type * eltTy,unsigned elts) const5810 bool AArch64ABIInfo::isLegalVectorTypeForSwift(CharUnits totalSize,
5811 llvm::Type *eltTy,
5812 unsigned elts) const {
5813 if (!llvm::isPowerOf2_32(elts))
5814 return false;
5815 if (totalSize.getQuantity() != 8 &&
5816 (totalSize.getQuantity() != 16 || elts == 1))
5817 return false;
5818 return true;
5819 }
5820
isHomogeneousAggregateBaseType(QualType Ty) const5821 bool AArch64ABIInfo::isHomogeneousAggregateBaseType(QualType Ty) const {
5822 // Homogeneous aggregates for AAPCS64 must have base types of a floating
5823 // point type or a short-vector type. This is the same as the 32-bit ABI,
5824 // but with the difference that any floating-point type is allowed,
5825 // including __fp16.
5826 if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
5827 if (BT->isFloatingPoint())
5828 return true;
5829 } else if (const VectorType *VT = Ty->getAs<VectorType>()) {
5830 unsigned VecSize = getContext().getTypeSize(VT);
5831 if (VecSize == 64 || VecSize == 128)
5832 return true;
5833 }
5834 return false;
5835 }
5836
isHomogeneousAggregateSmallEnough(const Type * Base,uint64_t Members) const5837 bool AArch64ABIInfo::isHomogeneousAggregateSmallEnough(const Type *Base,
5838 uint64_t Members) const {
5839 return Members <= 4;
5840 }
5841
EmitAAPCSVAArg(Address VAListAddr,QualType Ty,CodeGenFunction & CGF) const5842 Address AArch64ABIInfo::EmitAAPCSVAArg(Address VAListAddr,
5843 QualType Ty,
5844 CodeGenFunction &CGF) const {
5845 ABIArgInfo AI = classifyArgumentType(Ty);
5846 bool IsIndirect = AI.isIndirect();
5847
5848 llvm::Type *BaseTy = CGF.ConvertType(Ty);
5849 if (IsIndirect)
5850 BaseTy = llvm::PointerType::getUnqual(BaseTy);
5851 else if (AI.getCoerceToType())
5852 BaseTy = AI.getCoerceToType();
5853
5854 unsigned NumRegs = 1;
5855 if (llvm::ArrayType *ArrTy = dyn_cast<llvm::ArrayType>(BaseTy)) {
5856 BaseTy = ArrTy->getElementType();
5857 NumRegs = ArrTy->getNumElements();
5858 }
5859 bool IsFPR = BaseTy->isFloatingPointTy() || BaseTy->isVectorTy();
5860
5861 // The AArch64 va_list type and handling is specified in the Procedure Call
5862 // Standard, section B.4:
5863 //
5864 // struct {
5865 // void *__stack;
5866 // void *__gr_top;
5867 // void *__vr_top;
5868 // int __gr_offs;
5869 // int __vr_offs;
5870 // };
5871
5872 llvm::BasicBlock *MaybeRegBlock = CGF.createBasicBlock("vaarg.maybe_reg");
5873 llvm::BasicBlock *InRegBlock = CGF.createBasicBlock("vaarg.in_reg");
5874 llvm::BasicBlock *OnStackBlock = CGF.createBasicBlock("vaarg.on_stack");
5875 llvm::BasicBlock *ContBlock = CGF.createBasicBlock("vaarg.end");
5876
5877 CharUnits TySize = getContext().getTypeSizeInChars(Ty);
5878 CharUnits TyAlign = getContext().getTypeUnadjustedAlignInChars(Ty);
5879
5880 Address reg_offs_p = Address::invalid();
5881 llvm::Value *reg_offs = nullptr;
5882 int reg_top_index;
5883 int RegSize = IsIndirect ? 8 : TySize.getQuantity();
5884 if (!IsFPR) {
5885 // 3 is the field number of __gr_offs
5886 reg_offs_p = CGF.Builder.CreateStructGEP(VAListAddr, 3, "gr_offs_p");
5887 reg_offs = CGF.Builder.CreateLoad(reg_offs_p, "gr_offs");
5888 reg_top_index = 1; // field number for __gr_top
5889 RegSize = llvm::alignTo(RegSize, 8);
5890 } else {
5891 // 4 is the field number of __vr_offs.
5892 reg_offs_p = CGF.Builder.CreateStructGEP(VAListAddr, 4, "vr_offs_p");
5893 reg_offs = CGF.Builder.CreateLoad(reg_offs_p, "vr_offs");
5894 reg_top_index = 2; // field number for __vr_top
5895 RegSize = 16 * NumRegs;
5896 }
5897
5898 //=======================================
5899 // Find out where argument was passed
5900 //=======================================
5901
5902 // If reg_offs >= 0 we're already using the stack for this type of
5903 // argument. We don't want to keep updating reg_offs (in case it overflows,
5904 // though anyone passing 2GB of arguments, each at most 16 bytes, deserves
5905 // whatever they get).
5906 llvm::Value *UsingStack = nullptr;
5907 UsingStack = CGF.Builder.CreateICmpSGE(
5908 reg_offs, llvm::ConstantInt::get(CGF.Int32Ty, 0));
5909
5910 CGF.Builder.CreateCondBr(UsingStack, OnStackBlock, MaybeRegBlock);
5911
5912 // Otherwise, at least some kind of argument could go in these registers, the
5913 // question is whether this particular type is too big.
5914 CGF.EmitBlock(MaybeRegBlock);
5915
5916 // Integer arguments may need to correct register alignment (for example a
5917 // "struct { __int128 a; };" gets passed in x_2N, x_{2N+1}). In this case we
5918 // align __gr_offs to calculate the potential address.
5919 if (!IsFPR && !IsIndirect && TyAlign.getQuantity() > 8) {
5920 int Align = TyAlign.getQuantity();
5921
5922 reg_offs = CGF.Builder.CreateAdd(
5923 reg_offs, llvm::ConstantInt::get(CGF.Int32Ty, Align - 1),
5924 "align_regoffs");
5925 reg_offs = CGF.Builder.CreateAnd(
5926 reg_offs, llvm::ConstantInt::get(CGF.Int32Ty, -Align),
5927 "aligned_regoffs");
5928 }
5929
5930 // Update the gr_offs/vr_offs pointer for next call to va_arg on this va_list.
5931 // The fact that this is done unconditionally reflects the fact that
5932 // allocating an argument to the stack also uses up all the remaining
5933 // registers of the appropriate kind.
5934 llvm::Value *NewOffset = nullptr;
5935 NewOffset = CGF.Builder.CreateAdd(
5936 reg_offs, llvm::ConstantInt::get(CGF.Int32Ty, RegSize), "new_reg_offs");
5937 CGF.Builder.CreateStore(NewOffset, reg_offs_p);
5938
5939 // Now we're in a position to decide whether this argument really was in
5940 // registers or not.
5941 llvm::Value *InRegs = nullptr;
5942 InRegs = CGF.Builder.CreateICmpSLE(
5943 NewOffset, llvm::ConstantInt::get(CGF.Int32Ty, 0), "inreg");
5944
5945 CGF.Builder.CreateCondBr(InRegs, InRegBlock, OnStackBlock);
5946
5947 //=======================================
5948 // Argument was in registers
5949 //=======================================
5950
5951 // Now we emit the code for if the argument was originally passed in
5952 // registers. First start the appropriate block:
5953 CGF.EmitBlock(InRegBlock);
5954
5955 llvm::Value *reg_top = nullptr;
5956 Address reg_top_p =
5957 CGF.Builder.CreateStructGEP(VAListAddr, reg_top_index, "reg_top_p");
5958 reg_top = CGF.Builder.CreateLoad(reg_top_p, "reg_top");
5959 Address BaseAddr(CGF.Builder.CreateInBoundsGEP(reg_top, reg_offs),
5960 CharUnits::fromQuantity(IsFPR ? 16 : 8));
5961 Address RegAddr = Address::invalid();
5962 llvm::Type *MemTy = CGF.ConvertTypeForMem(Ty);
5963
5964 if (IsIndirect) {
5965 // If it's been passed indirectly (actually a struct), whatever we find from
5966 // stored registers or on the stack will actually be a struct **.
5967 MemTy = llvm::PointerType::getUnqual(MemTy);
5968 }
5969
5970 const Type *Base = nullptr;
5971 uint64_t NumMembers = 0;
5972 bool IsHFA = isHomogeneousAggregate(Ty, Base, NumMembers);
5973 if (IsHFA && NumMembers > 1) {
5974 // Homogeneous aggregates passed in registers will have their elements split
5975 // and stored 16-bytes apart regardless of size (they're notionally in qN,
5976 // qN+1, ...). We reload and store into a temporary local variable
5977 // contiguously.
5978 assert(!IsIndirect && "Homogeneous aggregates should be passed directly");
5979 auto BaseTyInfo = getContext().getTypeInfoInChars(QualType(Base, 0));
5980 llvm::Type *BaseTy = CGF.ConvertType(QualType(Base, 0));
5981 llvm::Type *HFATy = llvm::ArrayType::get(BaseTy, NumMembers);
5982 Address Tmp = CGF.CreateTempAlloca(HFATy,
5983 std::max(TyAlign, BaseTyInfo.Align));
5984
5985 // On big-endian platforms, the value will be right-aligned in its slot.
5986 int Offset = 0;
5987 if (CGF.CGM.getDataLayout().isBigEndian() &&
5988 BaseTyInfo.Width.getQuantity() < 16)
5989 Offset = 16 - BaseTyInfo.Width.getQuantity();
5990
5991 for (unsigned i = 0; i < NumMembers; ++i) {
5992 CharUnits BaseOffset = CharUnits::fromQuantity(16 * i + Offset);
5993 Address LoadAddr =
5994 CGF.Builder.CreateConstInBoundsByteGEP(BaseAddr, BaseOffset);
5995 LoadAddr = CGF.Builder.CreateElementBitCast(LoadAddr, BaseTy);
5996
5997 Address StoreAddr = CGF.Builder.CreateConstArrayGEP(Tmp, i);
5998
5999 llvm::Value *Elem = CGF.Builder.CreateLoad(LoadAddr);
6000 CGF.Builder.CreateStore(Elem, StoreAddr);
6001 }
6002
6003 RegAddr = CGF.Builder.CreateElementBitCast(Tmp, MemTy);
6004 } else {
6005 // Otherwise the object is contiguous in memory.
6006
6007 // It might be right-aligned in its slot.
6008 CharUnits SlotSize = BaseAddr.getAlignment();
6009 if (CGF.CGM.getDataLayout().isBigEndian() && !IsIndirect &&
6010 (IsHFA || !isAggregateTypeForABI(Ty)) &&
6011 TySize < SlotSize) {
6012 CharUnits Offset = SlotSize - TySize;
6013 BaseAddr = CGF.Builder.CreateConstInBoundsByteGEP(BaseAddr, Offset);
6014 }
6015
6016 RegAddr = CGF.Builder.CreateElementBitCast(BaseAddr, MemTy);
6017 }
6018
6019 CGF.EmitBranch(ContBlock);
6020
6021 //=======================================
6022 // Argument was on the stack
6023 //=======================================
6024 CGF.EmitBlock(OnStackBlock);
6025
6026 Address stack_p = CGF.Builder.CreateStructGEP(VAListAddr, 0, "stack_p");
6027 llvm::Value *OnStackPtr = CGF.Builder.CreateLoad(stack_p, "stack");
6028
6029 // Again, stack arguments may need realignment. In this case both integer and
6030 // floating-point ones might be affected.
6031 if (!IsIndirect && TyAlign.getQuantity() > 8) {
6032 int Align = TyAlign.getQuantity();
6033
6034 OnStackPtr = CGF.Builder.CreatePtrToInt(OnStackPtr, CGF.Int64Ty);
6035
6036 OnStackPtr = CGF.Builder.CreateAdd(
6037 OnStackPtr, llvm::ConstantInt::get(CGF.Int64Ty, Align - 1),
6038 "align_stack");
6039 OnStackPtr = CGF.Builder.CreateAnd(
6040 OnStackPtr, llvm::ConstantInt::get(CGF.Int64Ty, -Align),
6041 "align_stack");
6042
6043 OnStackPtr = CGF.Builder.CreateIntToPtr(OnStackPtr, CGF.Int8PtrTy);
6044 }
6045 Address OnStackAddr(OnStackPtr,
6046 std::max(CharUnits::fromQuantity(8), TyAlign));
6047
6048 // All stack slots are multiples of 8 bytes.
6049 CharUnits StackSlotSize = CharUnits::fromQuantity(8);
6050 CharUnits StackSize;
6051 if (IsIndirect)
6052 StackSize = StackSlotSize;
6053 else
6054 StackSize = TySize.alignTo(StackSlotSize);
6055
6056 llvm::Value *StackSizeC = CGF.Builder.getSize(StackSize);
6057 llvm::Value *NewStack =
6058 CGF.Builder.CreateInBoundsGEP(OnStackPtr, StackSizeC, "new_stack");
6059
6060 // Write the new value of __stack for the next call to va_arg
6061 CGF.Builder.CreateStore(NewStack, stack_p);
6062
6063 if (CGF.CGM.getDataLayout().isBigEndian() && !isAggregateTypeForABI(Ty) &&
6064 TySize < StackSlotSize) {
6065 CharUnits Offset = StackSlotSize - TySize;
6066 OnStackAddr = CGF.Builder.CreateConstInBoundsByteGEP(OnStackAddr, Offset);
6067 }
6068
6069 OnStackAddr = CGF.Builder.CreateElementBitCast(OnStackAddr, MemTy);
6070
6071 CGF.EmitBranch(ContBlock);
6072
6073 //=======================================
6074 // Tidy up
6075 //=======================================
6076 CGF.EmitBlock(ContBlock);
6077
6078 Address ResAddr = emitMergePHI(CGF, RegAddr, InRegBlock,
6079 OnStackAddr, OnStackBlock, "vaargs.addr");
6080
6081 if (IsIndirect)
6082 return Address(CGF.Builder.CreateLoad(ResAddr, "vaarg.addr"),
6083 TyAlign);
6084
6085 return ResAddr;
6086 }
6087
EmitDarwinVAArg(Address VAListAddr,QualType Ty,CodeGenFunction & CGF) const6088 Address AArch64ABIInfo::EmitDarwinVAArg(Address VAListAddr, QualType Ty,
6089 CodeGenFunction &CGF) const {
6090 // The backend's lowering doesn't support va_arg for aggregates or
6091 // illegal vector types. Lower VAArg here for these cases and use
6092 // the LLVM va_arg instruction for everything else.
6093 if (!isAggregateTypeForABI(Ty) && !isIllegalVectorType(Ty))
6094 return EmitVAArgInstr(CGF, VAListAddr, Ty, ABIArgInfo::getDirect());
6095
6096 uint64_t PointerSize = getTarget().getPointerWidth(0) / 8;
6097 CharUnits SlotSize = CharUnits::fromQuantity(PointerSize);
6098
6099 // Empty records are ignored for parameter passing purposes.
6100 if (isEmptyRecord(getContext(), Ty, true)) {
6101 Address Addr(CGF.Builder.CreateLoad(VAListAddr, "ap.cur"), SlotSize);
6102 Addr = CGF.Builder.CreateElementBitCast(Addr, CGF.ConvertTypeForMem(Ty));
6103 return Addr;
6104 }
6105
6106 // The size of the actual thing passed, which might end up just
6107 // being a pointer for indirect types.
6108 auto TyInfo = getContext().getTypeInfoInChars(Ty);
6109
6110 // Arguments bigger than 16 bytes which aren't homogeneous
6111 // aggregates should be passed indirectly.
6112 bool IsIndirect = false;
6113 if (TyInfo.Width.getQuantity() > 16) {
6114 const Type *Base = nullptr;
6115 uint64_t Members = 0;
6116 IsIndirect = !isHomogeneousAggregate(Ty, Base, Members);
6117 }
6118
6119 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, IsIndirect,
6120 TyInfo, SlotSize, /*AllowHigherAlign*/ true);
6121 }
6122
EmitMSVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const6123 Address AArch64ABIInfo::EmitMSVAArg(CodeGenFunction &CGF, Address VAListAddr,
6124 QualType Ty) const {
6125 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, /*indirect*/ false,
6126 CGF.getContext().getTypeInfoInChars(Ty),
6127 CharUnits::fromQuantity(8),
6128 /*allowHigherAlign*/ false);
6129 }
6130
6131 //===----------------------------------------------------------------------===//
6132 // ARM ABI Implementation
6133 //===----------------------------------------------------------------------===//
6134
6135 namespace {
6136
6137 class ARMABIInfo : public SwiftABIInfo {
6138 public:
6139 enum ABIKind {
6140 APCS = 0,
6141 AAPCS = 1,
6142 AAPCS_VFP = 2,
6143 AAPCS16_VFP = 3,
6144 };
6145
6146 private:
6147 ABIKind Kind;
6148 bool IsFloatABISoftFP;
6149
6150 public:
ARMABIInfo(CodeGenTypes & CGT,ABIKind _Kind)6151 ARMABIInfo(CodeGenTypes &CGT, ABIKind _Kind)
6152 : SwiftABIInfo(CGT), Kind(_Kind) {
6153 setCCs();
6154 IsFloatABISoftFP = CGT.getCodeGenOpts().FloatABI == "softfp" ||
6155 CGT.getCodeGenOpts().FloatABI == ""; // default
6156 }
6157
isEABI() const6158 bool isEABI() const {
6159 switch (getTarget().getTriple().getEnvironment()) {
6160 case llvm::Triple::Android:
6161 case llvm::Triple::EABI:
6162 case llvm::Triple::EABIHF:
6163 case llvm::Triple::GNUEABI:
6164 case llvm::Triple::GNUEABIHF:
6165 case llvm::Triple::MuslEABI:
6166 case llvm::Triple::MuslEABIHF:
6167 return true;
6168 default:
6169 return false;
6170 }
6171 }
6172
isEABIHF() const6173 bool isEABIHF() const {
6174 switch (getTarget().getTriple().getEnvironment()) {
6175 case llvm::Triple::EABIHF:
6176 case llvm::Triple::GNUEABIHF:
6177 case llvm::Triple::MuslEABIHF:
6178 return true;
6179 default:
6180 return false;
6181 }
6182 }
6183
getABIKind() const6184 ABIKind getABIKind() const { return Kind; }
6185
allowBFloatArgsAndRet() const6186 bool allowBFloatArgsAndRet() const override {
6187 return !IsFloatABISoftFP && getTarget().hasBFloat16Type();
6188 }
6189
6190 private:
6191 ABIArgInfo classifyReturnType(QualType RetTy, bool isVariadic,
6192 unsigned functionCallConv) const;
6193 ABIArgInfo classifyArgumentType(QualType RetTy, bool isVariadic,
6194 unsigned functionCallConv) const;
6195 ABIArgInfo classifyHomogeneousAggregate(QualType Ty, const Type *Base,
6196 uint64_t Members) const;
6197 ABIArgInfo coerceIllegalVector(QualType Ty) const;
6198 bool isIllegalVectorType(QualType Ty) const;
6199 bool containsAnyFP16Vectors(QualType Ty) const;
6200
6201 bool isHomogeneousAggregateBaseType(QualType Ty) const override;
6202 bool isHomogeneousAggregateSmallEnough(const Type *Ty,
6203 uint64_t Members) const override;
6204
6205 bool isEffectivelyAAPCS_VFP(unsigned callConvention, bool acceptHalf) const;
6206
6207 void computeInfo(CGFunctionInfo &FI) const override;
6208
6209 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
6210 QualType Ty) const override;
6211
6212 llvm::CallingConv::ID getLLVMDefaultCC() const;
6213 llvm::CallingConv::ID getABIDefaultCC() const;
6214 void setCCs();
6215
shouldPassIndirectlyForSwift(ArrayRef<llvm::Type * > scalars,bool asReturnValue) const6216 bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars,
6217 bool asReturnValue) const override {
6218 return occupiesMoreThan(CGT, scalars, /*total*/ 4);
6219 }
isSwiftErrorInRegister() const6220 bool isSwiftErrorInRegister() const override {
6221 return true;
6222 }
6223 bool isLegalVectorTypeForSwift(CharUnits totalSize, llvm::Type *eltTy,
6224 unsigned elts) const override;
6225 };
6226
6227 class ARMTargetCodeGenInfo : public TargetCodeGenInfo {
6228 public:
ARMTargetCodeGenInfo(CodeGenTypes & CGT,ARMABIInfo::ABIKind K)6229 ARMTargetCodeGenInfo(CodeGenTypes &CGT, ARMABIInfo::ABIKind K)
6230 : TargetCodeGenInfo(std::make_unique<ARMABIInfo>(CGT, K)) {}
6231
getABIInfo() const6232 const ARMABIInfo &getABIInfo() const {
6233 return static_cast<const ARMABIInfo&>(TargetCodeGenInfo::getABIInfo());
6234 }
6235
getDwarfEHStackPointer(CodeGen::CodeGenModule & M) const6236 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
6237 return 13;
6238 }
6239
getARCRetainAutoreleasedReturnValueMarker() const6240 StringRef getARCRetainAutoreleasedReturnValueMarker() const override {
6241 return "mov\tr7, r7\t\t// marker for objc_retainAutoreleaseReturnValue";
6242 }
6243
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const6244 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
6245 llvm::Value *Address) const override {
6246 llvm::Value *Four8 = llvm::ConstantInt::get(CGF.Int8Ty, 4);
6247
6248 // 0-15 are the 16 integer registers.
6249 AssignToArrayRange(CGF.Builder, Address, Four8, 0, 15);
6250 return false;
6251 }
6252
getSizeOfUnwindException() const6253 unsigned getSizeOfUnwindException() const override {
6254 if (getABIInfo().isEABI()) return 88;
6255 return TargetCodeGenInfo::getSizeOfUnwindException();
6256 }
6257
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const6258 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
6259 CodeGen::CodeGenModule &CGM) const override {
6260 if (GV->isDeclaration())
6261 return;
6262 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
6263 if (!FD)
6264 return;
6265
6266 const ARMInterruptAttr *Attr = FD->getAttr<ARMInterruptAttr>();
6267 if (!Attr)
6268 return;
6269
6270 const char *Kind;
6271 switch (Attr->getInterrupt()) {
6272 case ARMInterruptAttr::Generic: Kind = ""; break;
6273 case ARMInterruptAttr::IRQ: Kind = "IRQ"; break;
6274 case ARMInterruptAttr::FIQ: Kind = "FIQ"; break;
6275 case ARMInterruptAttr::SWI: Kind = "SWI"; break;
6276 case ARMInterruptAttr::ABORT: Kind = "ABORT"; break;
6277 case ARMInterruptAttr::UNDEF: Kind = "UNDEF"; break;
6278 }
6279
6280 llvm::Function *Fn = cast<llvm::Function>(GV);
6281
6282 Fn->addFnAttr("interrupt", Kind);
6283
6284 ARMABIInfo::ABIKind ABI = cast<ARMABIInfo>(getABIInfo()).getABIKind();
6285 if (ABI == ARMABIInfo::APCS)
6286 return;
6287
6288 // AAPCS guarantees that sp will be 8-byte aligned on any public interface,
6289 // however this is not necessarily true on taking any interrupt. Instruct
6290 // the backend to perform a realignment as part of the function prologue.
6291 llvm::AttrBuilder B;
6292 B.addStackAlignmentAttr(8);
6293 Fn->addAttributes(llvm::AttributeList::FunctionIndex, B);
6294 }
6295 };
6296
6297 class WindowsARMTargetCodeGenInfo : public ARMTargetCodeGenInfo {
6298 public:
WindowsARMTargetCodeGenInfo(CodeGenTypes & CGT,ARMABIInfo::ABIKind K)6299 WindowsARMTargetCodeGenInfo(CodeGenTypes &CGT, ARMABIInfo::ABIKind K)
6300 : ARMTargetCodeGenInfo(CGT, K) {}
6301
6302 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
6303 CodeGen::CodeGenModule &CGM) const override;
6304
getDependentLibraryOption(llvm::StringRef Lib,llvm::SmallString<24> & Opt) const6305 void getDependentLibraryOption(llvm::StringRef Lib,
6306 llvm::SmallString<24> &Opt) const override {
6307 Opt = "/DEFAULTLIB:" + qualifyWindowsLibrary(Lib);
6308 }
6309
getDetectMismatchOption(llvm::StringRef Name,llvm::StringRef Value,llvm::SmallString<32> & Opt) const6310 void getDetectMismatchOption(llvm::StringRef Name, llvm::StringRef Value,
6311 llvm::SmallString<32> &Opt) const override {
6312 Opt = "/FAILIFMISMATCH:\"" + Name.str() + "=" + Value.str() + "\"";
6313 }
6314 };
6315
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const6316 void WindowsARMTargetCodeGenInfo::setTargetAttributes(
6317 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const {
6318 ARMTargetCodeGenInfo::setTargetAttributes(D, GV, CGM);
6319 if (GV->isDeclaration())
6320 return;
6321 addStackProbeTargetAttributes(D, GV, CGM);
6322 }
6323 }
6324
computeInfo(CGFunctionInfo & FI) const6325 void ARMABIInfo::computeInfo(CGFunctionInfo &FI) const {
6326 if (!::classifyReturnType(getCXXABI(), FI, *this))
6327 FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), FI.isVariadic(),
6328 FI.getCallingConvention());
6329
6330 for (auto &I : FI.arguments())
6331 I.info = classifyArgumentType(I.type, FI.isVariadic(),
6332 FI.getCallingConvention());
6333
6334
6335 // Always honor user-specified calling convention.
6336 if (FI.getCallingConvention() != llvm::CallingConv::C)
6337 return;
6338
6339 llvm::CallingConv::ID cc = getRuntimeCC();
6340 if (cc != llvm::CallingConv::C)
6341 FI.setEffectiveCallingConvention(cc);
6342 }
6343
6344 /// Return the default calling convention that LLVM will use.
getLLVMDefaultCC() const6345 llvm::CallingConv::ID ARMABIInfo::getLLVMDefaultCC() const {
6346 // The default calling convention that LLVM will infer.
6347 if (isEABIHF() || getTarget().getTriple().isWatchABI())
6348 return llvm::CallingConv::ARM_AAPCS_VFP;
6349 else if (isEABI())
6350 return llvm::CallingConv::ARM_AAPCS;
6351 else
6352 return llvm::CallingConv::ARM_APCS;
6353 }
6354
6355 /// Return the calling convention that our ABI would like us to use
6356 /// as the C calling convention.
getABIDefaultCC() const6357 llvm::CallingConv::ID ARMABIInfo::getABIDefaultCC() const {
6358 switch (getABIKind()) {
6359 case APCS: return llvm::CallingConv::ARM_APCS;
6360 case AAPCS: return llvm::CallingConv::ARM_AAPCS;
6361 case AAPCS_VFP: return llvm::CallingConv::ARM_AAPCS_VFP;
6362 case AAPCS16_VFP: return llvm::CallingConv::ARM_AAPCS_VFP;
6363 }
6364 llvm_unreachable("bad ABI kind");
6365 }
6366
setCCs()6367 void ARMABIInfo::setCCs() {
6368 assert(getRuntimeCC() == llvm::CallingConv::C);
6369
6370 // Don't muddy up the IR with a ton of explicit annotations if
6371 // they'd just match what LLVM will infer from the triple.
6372 llvm::CallingConv::ID abiCC = getABIDefaultCC();
6373 if (abiCC != getLLVMDefaultCC())
6374 RuntimeCC = abiCC;
6375 }
6376
coerceIllegalVector(QualType Ty) const6377 ABIArgInfo ARMABIInfo::coerceIllegalVector(QualType Ty) const {
6378 uint64_t Size = getContext().getTypeSize(Ty);
6379 if (Size <= 32) {
6380 llvm::Type *ResType =
6381 llvm::Type::getInt32Ty(getVMContext());
6382 return ABIArgInfo::getDirect(ResType);
6383 }
6384 if (Size == 64 || Size == 128) {
6385 auto *ResType = llvm::FixedVectorType::get(
6386 llvm::Type::getInt32Ty(getVMContext()), Size / 32);
6387 return ABIArgInfo::getDirect(ResType);
6388 }
6389 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
6390 }
6391
classifyHomogeneousAggregate(QualType Ty,const Type * Base,uint64_t Members) const6392 ABIArgInfo ARMABIInfo::classifyHomogeneousAggregate(QualType Ty,
6393 const Type *Base,
6394 uint64_t Members) const {
6395 assert(Base && "Base class should be set for homogeneous aggregate");
6396 // Base can be a floating-point or a vector.
6397 if (const VectorType *VT = Base->getAs<VectorType>()) {
6398 // FP16 vectors should be converted to integer vectors
6399 if (!getTarget().hasLegalHalfType() && containsAnyFP16Vectors(Ty)) {
6400 uint64_t Size = getContext().getTypeSize(VT);
6401 auto *NewVecTy = llvm::FixedVectorType::get(
6402 llvm::Type::getInt32Ty(getVMContext()), Size / 32);
6403 llvm::Type *Ty = llvm::ArrayType::get(NewVecTy, Members);
6404 return ABIArgInfo::getDirect(Ty, 0, nullptr, false);
6405 }
6406 }
6407 return ABIArgInfo::getDirect(nullptr, 0, nullptr, false);
6408 }
6409
classifyArgumentType(QualType Ty,bool isVariadic,unsigned functionCallConv) const6410 ABIArgInfo ARMABIInfo::classifyArgumentType(QualType Ty, bool isVariadic,
6411 unsigned functionCallConv) const {
6412 // 6.1.2.1 The following argument types are VFP CPRCs:
6413 // A single-precision floating-point type (including promoted
6414 // half-precision types); A double-precision floating-point type;
6415 // A 64-bit or 128-bit containerized vector type; Homogeneous Aggregate
6416 // with a Base Type of a single- or double-precision floating-point type,
6417 // 64-bit containerized vectors or 128-bit containerized vectors with one
6418 // to four Elements.
6419 // Variadic functions should always marshal to the base standard.
6420 bool IsAAPCS_VFP =
6421 !isVariadic && isEffectivelyAAPCS_VFP(functionCallConv, /* AAPCS16 */ false);
6422
6423 Ty = useFirstFieldIfTransparentUnion(Ty);
6424
6425 // Handle illegal vector types here.
6426 if (isIllegalVectorType(Ty))
6427 return coerceIllegalVector(Ty);
6428
6429 if (!isAggregateTypeForABI(Ty)) {
6430 // Treat an enum type as its underlying type.
6431 if (const EnumType *EnumTy = Ty->getAs<EnumType>()) {
6432 Ty = EnumTy->getDecl()->getIntegerType();
6433 }
6434
6435 if (const auto *EIT = Ty->getAs<ExtIntType>())
6436 if (EIT->getNumBits() > 64)
6437 return getNaturalAlignIndirect(Ty, /*ByVal=*/true);
6438
6439 return (isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
6440 : ABIArgInfo::getDirect());
6441 }
6442
6443 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI())) {
6444 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
6445 }
6446
6447 // Ignore empty records.
6448 if (isEmptyRecord(getContext(), Ty, true))
6449 return ABIArgInfo::getIgnore();
6450
6451 if (IsAAPCS_VFP) {
6452 // Homogeneous Aggregates need to be expanded when we can fit the aggregate
6453 // into VFP registers.
6454 const Type *Base = nullptr;
6455 uint64_t Members = 0;
6456 if (isHomogeneousAggregate(Ty, Base, Members))
6457 return classifyHomogeneousAggregate(Ty, Base, Members);
6458 } else if (getABIKind() == ARMABIInfo::AAPCS16_VFP) {
6459 // WatchOS does have homogeneous aggregates. Note that we intentionally use
6460 // this convention even for a variadic function: the backend will use GPRs
6461 // if needed.
6462 const Type *Base = nullptr;
6463 uint64_t Members = 0;
6464 if (isHomogeneousAggregate(Ty, Base, Members)) {
6465 assert(Base && Members <= 4 && "unexpected homogeneous aggregate");
6466 llvm::Type *Ty =
6467 llvm::ArrayType::get(CGT.ConvertType(QualType(Base, 0)), Members);
6468 return ABIArgInfo::getDirect(Ty, 0, nullptr, false);
6469 }
6470 }
6471
6472 if (getABIKind() == ARMABIInfo::AAPCS16_VFP &&
6473 getContext().getTypeSizeInChars(Ty) > CharUnits::fromQuantity(16)) {
6474 // WatchOS is adopting the 64-bit AAPCS rule on composite types: if they're
6475 // bigger than 128-bits, they get placed in space allocated by the caller,
6476 // and a pointer is passed.
6477 return ABIArgInfo::getIndirect(
6478 CharUnits::fromQuantity(getContext().getTypeAlign(Ty) / 8), false);
6479 }
6480
6481 // Support byval for ARM.
6482 // The ABI alignment for APCS is 4-byte and for AAPCS at least 4-byte and at
6483 // most 8-byte. We realign the indirect argument if type alignment is bigger
6484 // than ABI alignment.
6485 uint64_t ABIAlign = 4;
6486 uint64_t TyAlign;
6487 if (getABIKind() == ARMABIInfo::AAPCS_VFP ||
6488 getABIKind() == ARMABIInfo::AAPCS) {
6489 TyAlign = getContext().getTypeUnadjustedAlignInChars(Ty).getQuantity();
6490 ABIAlign = std::min(std::max(TyAlign, (uint64_t)4), (uint64_t)8);
6491 } else {
6492 TyAlign = getContext().getTypeAlignInChars(Ty).getQuantity();
6493 }
6494 if (getContext().getTypeSizeInChars(Ty) > CharUnits::fromQuantity(64)) {
6495 assert(getABIKind() != ARMABIInfo::AAPCS16_VFP && "unexpected byval");
6496 return ABIArgInfo::getIndirect(CharUnits::fromQuantity(ABIAlign),
6497 /*ByVal=*/true,
6498 /*Realign=*/TyAlign > ABIAlign);
6499 }
6500
6501 // On RenderScript, coerce Aggregates <= 64 bytes to an integer array of
6502 // same size and alignment.
6503 if (getTarget().isRenderScriptTarget()) {
6504 return coerceToIntArray(Ty, getContext(), getVMContext());
6505 }
6506
6507 // Otherwise, pass by coercing to a structure of the appropriate size.
6508 llvm::Type* ElemTy;
6509 unsigned SizeRegs;
6510 // FIXME: Try to match the types of the arguments more accurately where
6511 // we can.
6512 if (TyAlign <= 4) {
6513 ElemTy = llvm::Type::getInt32Ty(getVMContext());
6514 SizeRegs = (getContext().getTypeSize(Ty) + 31) / 32;
6515 } else {
6516 ElemTy = llvm::Type::getInt64Ty(getVMContext());
6517 SizeRegs = (getContext().getTypeSize(Ty) + 63) / 64;
6518 }
6519
6520 return ABIArgInfo::getDirect(llvm::ArrayType::get(ElemTy, SizeRegs));
6521 }
6522
isIntegerLikeType(QualType Ty,ASTContext & Context,llvm::LLVMContext & VMContext)6523 static bool isIntegerLikeType(QualType Ty, ASTContext &Context,
6524 llvm::LLVMContext &VMContext) {
6525 // APCS, C Language Calling Conventions, Non-Simple Return Values: A structure
6526 // is called integer-like if its size is less than or equal to one word, and
6527 // the offset of each of its addressable sub-fields is zero.
6528
6529 uint64_t Size = Context.getTypeSize(Ty);
6530
6531 // Check that the type fits in a word.
6532 if (Size > 32)
6533 return false;
6534
6535 // FIXME: Handle vector types!
6536 if (Ty->isVectorType())
6537 return false;
6538
6539 // Float types are never treated as "integer like".
6540 if (Ty->isRealFloatingType())
6541 return false;
6542
6543 // If this is a builtin or pointer type then it is ok.
6544 if (Ty->getAs<BuiltinType>() || Ty->isPointerType())
6545 return true;
6546
6547 // Small complex integer types are "integer like".
6548 if (const ComplexType *CT = Ty->getAs<ComplexType>())
6549 return isIntegerLikeType(CT->getElementType(), Context, VMContext);
6550
6551 // Single element and zero sized arrays should be allowed, by the definition
6552 // above, but they are not.
6553
6554 // Otherwise, it must be a record type.
6555 const RecordType *RT = Ty->getAs<RecordType>();
6556 if (!RT) return false;
6557
6558 // Ignore records with flexible arrays.
6559 const RecordDecl *RD = RT->getDecl();
6560 if (RD->hasFlexibleArrayMember())
6561 return false;
6562
6563 // Check that all sub-fields are at offset 0, and are themselves "integer
6564 // like".
6565 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
6566
6567 bool HadField = false;
6568 unsigned idx = 0;
6569 for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
6570 i != e; ++i, ++idx) {
6571 const FieldDecl *FD = *i;
6572
6573 // Bit-fields are not addressable, we only need to verify they are "integer
6574 // like". We still have to disallow a subsequent non-bitfield, for example:
6575 // struct { int : 0; int x }
6576 // is non-integer like according to gcc.
6577 if (FD->isBitField()) {
6578 if (!RD->isUnion())
6579 HadField = true;
6580
6581 if (!isIntegerLikeType(FD->getType(), Context, VMContext))
6582 return false;
6583
6584 continue;
6585 }
6586
6587 // Check if this field is at offset 0.
6588 if (Layout.getFieldOffset(idx) != 0)
6589 return false;
6590
6591 if (!isIntegerLikeType(FD->getType(), Context, VMContext))
6592 return false;
6593
6594 // Only allow at most one field in a structure. This doesn't match the
6595 // wording above, but follows gcc in situations with a field following an
6596 // empty structure.
6597 if (!RD->isUnion()) {
6598 if (HadField)
6599 return false;
6600
6601 HadField = true;
6602 }
6603 }
6604
6605 return true;
6606 }
6607
classifyReturnType(QualType RetTy,bool isVariadic,unsigned functionCallConv) const6608 ABIArgInfo ARMABIInfo::classifyReturnType(QualType RetTy, bool isVariadic,
6609 unsigned functionCallConv) const {
6610
6611 // Variadic functions should always marshal to the base standard.
6612 bool IsAAPCS_VFP =
6613 !isVariadic && isEffectivelyAAPCS_VFP(functionCallConv, /* AAPCS16 */ true);
6614
6615 if (RetTy->isVoidType())
6616 return ABIArgInfo::getIgnore();
6617
6618 if (const VectorType *VT = RetTy->getAs<VectorType>()) {
6619 // Large vector types should be returned via memory.
6620 if (getContext().getTypeSize(RetTy) > 128)
6621 return getNaturalAlignIndirect(RetTy);
6622 // TODO: FP16/BF16 vectors should be converted to integer vectors
6623 // This check is similar to isIllegalVectorType - refactor?
6624 if ((!getTarget().hasLegalHalfType() &&
6625 (VT->getElementType()->isFloat16Type() ||
6626 VT->getElementType()->isHalfType())) ||
6627 (IsFloatABISoftFP &&
6628 VT->getElementType()->isBFloat16Type()))
6629 return coerceIllegalVector(RetTy);
6630 }
6631
6632 if (!isAggregateTypeForABI(RetTy)) {
6633 // Treat an enum type as its underlying type.
6634 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
6635 RetTy = EnumTy->getDecl()->getIntegerType();
6636
6637 if (const auto *EIT = RetTy->getAs<ExtIntType>())
6638 if (EIT->getNumBits() > 64)
6639 return getNaturalAlignIndirect(RetTy, /*ByVal=*/false);
6640
6641 return isPromotableIntegerTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
6642 : ABIArgInfo::getDirect();
6643 }
6644
6645 // Are we following APCS?
6646 if (getABIKind() == APCS) {
6647 if (isEmptyRecord(getContext(), RetTy, false))
6648 return ABIArgInfo::getIgnore();
6649
6650 // Complex types are all returned as packed integers.
6651 //
6652 // FIXME: Consider using 2 x vector types if the back end handles them
6653 // correctly.
6654 if (RetTy->isAnyComplexType())
6655 return ABIArgInfo::getDirect(llvm::IntegerType::get(
6656 getVMContext(), getContext().getTypeSize(RetTy)));
6657
6658 // Integer like structures are returned in r0.
6659 if (isIntegerLikeType(RetTy, getContext(), getVMContext())) {
6660 // Return in the smallest viable integer type.
6661 uint64_t Size = getContext().getTypeSize(RetTy);
6662 if (Size <= 8)
6663 return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext()));
6664 if (Size <= 16)
6665 return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext()));
6666 return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
6667 }
6668
6669 // Otherwise return in memory.
6670 return getNaturalAlignIndirect(RetTy);
6671 }
6672
6673 // Otherwise this is an AAPCS variant.
6674
6675 if (isEmptyRecord(getContext(), RetTy, true))
6676 return ABIArgInfo::getIgnore();
6677
6678 // Check for homogeneous aggregates with AAPCS-VFP.
6679 if (IsAAPCS_VFP) {
6680 const Type *Base = nullptr;
6681 uint64_t Members = 0;
6682 if (isHomogeneousAggregate(RetTy, Base, Members))
6683 return classifyHomogeneousAggregate(RetTy, Base, Members);
6684 }
6685
6686 // Aggregates <= 4 bytes are returned in r0; other aggregates
6687 // are returned indirectly.
6688 uint64_t Size = getContext().getTypeSize(RetTy);
6689 if (Size <= 32) {
6690 // On RenderScript, coerce Aggregates <= 4 bytes to an integer array of
6691 // same size and alignment.
6692 if (getTarget().isRenderScriptTarget()) {
6693 return coerceToIntArray(RetTy, getContext(), getVMContext());
6694 }
6695 if (getDataLayout().isBigEndian())
6696 // Return in 32 bit integer integer type (as if loaded by LDR, AAPCS 5.4)
6697 return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
6698
6699 // Return in the smallest viable integer type.
6700 if (Size <= 8)
6701 return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext()));
6702 if (Size <= 16)
6703 return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext()));
6704 return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
6705 } else if (Size <= 128 && getABIKind() == AAPCS16_VFP) {
6706 llvm::Type *Int32Ty = llvm::Type::getInt32Ty(getVMContext());
6707 llvm::Type *CoerceTy =
6708 llvm::ArrayType::get(Int32Ty, llvm::alignTo(Size, 32) / 32);
6709 return ABIArgInfo::getDirect(CoerceTy);
6710 }
6711
6712 return getNaturalAlignIndirect(RetTy);
6713 }
6714
6715 /// isIllegalVector - check whether Ty is an illegal vector type.
isIllegalVectorType(QualType Ty) const6716 bool ARMABIInfo::isIllegalVectorType(QualType Ty) const {
6717 if (const VectorType *VT = Ty->getAs<VectorType> ()) {
6718 // On targets that don't support half, fp16 or bfloat, they are expanded
6719 // into float, and we don't want the ABI to depend on whether or not they
6720 // are supported in hardware. Thus return false to coerce vectors of these
6721 // types into integer vectors.
6722 // We do not depend on hasLegalHalfType for bfloat as it is a
6723 // separate IR type.
6724 if ((!getTarget().hasLegalHalfType() &&
6725 (VT->getElementType()->isFloat16Type() ||
6726 VT->getElementType()->isHalfType())) ||
6727 (IsFloatABISoftFP &&
6728 VT->getElementType()->isBFloat16Type()))
6729 return true;
6730 if (isAndroid()) {
6731 // Android shipped using Clang 3.1, which supported a slightly different
6732 // vector ABI. The primary differences were that 3-element vector types
6733 // were legal, and so were sub 32-bit vectors (i.e. <2 x i8>). This path
6734 // accepts that legacy behavior for Android only.
6735 // Check whether VT is legal.
6736 unsigned NumElements = VT->getNumElements();
6737 // NumElements should be power of 2 or equal to 3.
6738 if (!llvm::isPowerOf2_32(NumElements) && NumElements != 3)
6739 return true;
6740 } else {
6741 // Check whether VT is legal.
6742 unsigned NumElements = VT->getNumElements();
6743 uint64_t Size = getContext().getTypeSize(VT);
6744 // NumElements should be power of 2.
6745 if (!llvm::isPowerOf2_32(NumElements))
6746 return true;
6747 // Size should be greater than 32 bits.
6748 return Size <= 32;
6749 }
6750 }
6751 return false;
6752 }
6753
6754 /// Return true if a type contains any 16-bit floating point vectors
containsAnyFP16Vectors(QualType Ty) const6755 bool ARMABIInfo::containsAnyFP16Vectors(QualType Ty) const {
6756 if (const ConstantArrayType *AT = getContext().getAsConstantArrayType(Ty)) {
6757 uint64_t NElements = AT->getSize().getZExtValue();
6758 if (NElements == 0)
6759 return false;
6760 return containsAnyFP16Vectors(AT->getElementType());
6761 } else if (const RecordType *RT = Ty->getAs<RecordType>()) {
6762 const RecordDecl *RD = RT->getDecl();
6763
6764 // If this is a C++ record, check the bases first.
6765 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
6766 if (llvm::any_of(CXXRD->bases(), [this](const CXXBaseSpecifier &B) {
6767 return containsAnyFP16Vectors(B.getType());
6768 }))
6769 return true;
6770
6771 if (llvm::any_of(RD->fields(), [this](FieldDecl *FD) {
6772 return FD && containsAnyFP16Vectors(FD->getType());
6773 }))
6774 return true;
6775
6776 return false;
6777 } else {
6778 if (const VectorType *VT = Ty->getAs<VectorType>())
6779 return (VT->getElementType()->isFloat16Type() ||
6780 VT->getElementType()->isBFloat16Type() ||
6781 VT->getElementType()->isHalfType());
6782 return false;
6783 }
6784 }
6785
isLegalVectorTypeForSwift(CharUnits vectorSize,llvm::Type * eltTy,unsigned numElts) const6786 bool ARMABIInfo::isLegalVectorTypeForSwift(CharUnits vectorSize,
6787 llvm::Type *eltTy,
6788 unsigned numElts) const {
6789 if (!llvm::isPowerOf2_32(numElts))
6790 return false;
6791 unsigned size = getDataLayout().getTypeStoreSizeInBits(eltTy);
6792 if (size > 64)
6793 return false;
6794 if (vectorSize.getQuantity() != 8 &&
6795 (vectorSize.getQuantity() != 16 || numElts == 1))
6796 return false;
6797 return true;
6798 }
6799
isHomogeneousAggregateBaseType(QualType Ty) const6800 bool ARMABIInfo::isHomogeneousAggregateBaseType(QualType Ty) const {
6801 // Homogeneous aggregates for AAPCS-VFP must have base types of float,
6802 // double, or 64-bit or 128-bit vectors.
6803 if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
6804 if (BT->getKind() == BuiltinType::Float ||
6805 BT->getKind() == BuiltinType::Double ||
6806 BT->getKind() == BuiltinType::LongDouble)
6807 return true;
6808 } else if (const VectorType *VT = Ty->getAs<VectorType>()) {
6809 unsigned VecSize = getContext().getTypeSize(VT);
6810 if (VecSize == 64 || VecSize == 128)
6811 return true;
6812 }
6813 return false;
6814 }
6815
isHomogeneousAggregateSmallEnough(const Type * Base,uint64_t Members) const6816 bool ARMABIInfo::isHomogeneousAggregateSmallEnough(const Type *Base,
6817 uint64_t Members) const {
6818 return Members <= 4;
6819 }
6820
isEffectivelyAAPCS_VFP(unsigned callConvention,bool acceptHalf) const6821 bool ARMABIInfo::isEffectivelyAAPCS_VFP(unsigned callConvention,
6822 bool acceptHalf) const {
6823 // Give precedence to user-specified calling conventions.
6824 if (callConvention != llvm::CallingConv::C)
6825 return (callConvention == llvm::CallingConv::ARM_AAPCS_VFP);
6826 else
6827 return (getABIKind() == AAPCS_VFP) ||
6828 (acceptHalf && (getABIKind() == AAPCS16_VFP));
6829 }
6830
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const6831 Address ARMABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
6832 QualType Ty) const {
6833 CharUnits SlotSize = CharUnits::fromQuantity(4);
6834
6835 // Empty records are ignored for parameter passing purposes.
6836 if (isEmptyRecord(getContext(), Ty, true)) {
6837 Address Addr(CGF.Builder.CreateLoad(VAListAddr), SlotSize);
6838 Addr = CGF.Builder.CreateElementBitCast(Addr, CGF.ConvertTypeForMem(Ty));
6839 return Addr;
6840 }
6841
6842 CharUnits TySize = getContext().getTypeSizeInChars(Ty);
6843 CharUnits TyAlignForABI = getContext().getTypeUnadjustedAlignInChars(Ty);
6844
6845 // Use indirect if size of the illegal vector is bigger than 16 bytes.
6846 bool IsIndirect = false;
6847 const Type *Base = nullptr;
6848 uint64_t Members = 0;
6849 if (TySize > CharUnits::fromQuantity(16) && isIllegalVectorType(Ty)) {
6850 IsIndirect = true;
6851
6852 // ARMv7k passes structs bigger than 16 bytes indirectly, in space
6853 // allocated by the caller.
6854 } else if (TySize > CharUnits::fromQuantity(16) &&
6855 getABIKind() == ARMABIInfo::AAPCS16_VFP &&
6856 !isHomogeneousAggregate(Ty, Base, Members)) {
6857 IsIndirect = true;
6858
6859 // Otherwise, bound the type's ABI alignment.
6860 // The ABI alignment for 64-bit or 128-bit vectors is 8 for AAPCS and 4 for
6861 // APCS. For AAPCS, the ABI alignment is at least 4-byte and at most 8-byte.
6862 // Our callers should be prepared to handle an under-aligned address.
6863 } else if (getABIKind() == ARMABIInfo::AAPCS_VFP ||
6864 getABIKind() == ARMABIInfo::AAPCS) {
6865 TyAlignForABI = std::max(TyAlignForABI, CharUnits::fromQuantity(4));
6866 TyAlignForABI = std::min(TyAlignForABI, CharUnits::fromQuantity(8));
6867 } else if (getABIKind() == ARMABIInfo::AAPCS16_VFP) {
6868 // ARMv7k allows type alignment up to 16 bytes.
6869 TyAlignForABI = std::max(TyAlignForABI, CharUnits::fromQuantity(4));
6870 TyAlignForABI = std::min(TyAlignForABI, CharUnits::fromQuantity(16));
6871 } else {
6872 TyAlignForABI = CharUnits::fromQuantity(4);
6873 }
6874
6875 TypeInfoChars TyInfo(TySize, TyAlignForABI, false);
6876 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, IsIndirect, TyInfo,
6877 SlotSize, /*AllowHigherAlign*/ true);
6878 }
6879
6880 //===----------------------------------------------------------------------===//
6881 // NVPTX ABI Implementation
6882 //===----------------------------------------------------------------------===//
6883
6884 namespace {
6885
6886 class NVPTXTargetCodeGenInfo;
6887
6888 class NVPTXABIInfo : public ABIInfo {
6889 NVPTXTargetCodeGenInfo &CGInfo;
6890
6891 public:
NVPTXABIInfo(CodeGenTypes & CGT,NVPTXTargetCodeGenInfo & Info)6892 NVPTXABIInfo(CodeGenTypes &CGT, NVPTXTargetCodeGenInfo &Info)
6893 : ABIInfo(CGT), CGInfo(Info) {}
6894
6895 ABIArgInfo classifyReturnType(QualType RetTy) const;
6896 ABIArgInfo classifyArgumentType(QualType Ty) const;
6897
6898 void computeInfo(CGFunctionInfo &FI) const override;
6899 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
6900 QualType Ty) const override;
6901 bool isUnsupportedType(QualType T) const;
6902 ABIArgInfo coerceToIntArrayWithLimit(QualType Ty, unsigned MaxSize) const;
6903 };
6904
6905 class NVPTXTargetCodeGenInfo : public TargetCodeGenInfo {
6906 public:
NVPTXTargetCodeGenInfo(CodeGenTypes & CGT)6907 NVPTXTargetCodeGenInfo(CodeGenTypes &CGT)
6908 : TargetCodeGenInfo(std::make_unique<NVPTXABIInfo>(CGT, *this)) {}
6909
6910 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
6911 CodeGen::CodeGenModule &M) const override;
6912 bool shouldEmitStaticExternCAliases() const override;
6913
getCUDADeviceBuiltinSurfaceDeviceType() const6914 llvm::Type *getCUDADeviceBuiltinSurfaceDeviceType() const override {
6915 // On the device side, surface reference is represented as an object handle
6916 // in 64-bit integer.
6917 return llvm::Type::getInt64Ty(getABIInfo().getVMContext());
6918 }
6919
getCUDADeviceBuiltinTextureDeviceType() const6920 llvm::Type *getCUDADeviceBuiltinTextureDeviceType() const override {
6921 // On the device side, texture reference is represented as an object handle
6922 // in 64-bit integer.
6923 return llvm::Type::getInt64Ty(getABIInfo().getVMContext());
6924 }
6925
emitCUDADeviceBuiltinSurfaceDeviceCopy(CodeGenFunction & CGF,LValue Dst,LValue Src) const6926 bool emitCUDADeviceBuiltinSurfaceDeviceCopy(CodeGenFunction &CGF, LValue Dst,
6927 LValue Src) const override {
6928 emitBuiltinSurfTexDeviceCopy(CGF, Dst, Src);
6929 return true;
6930 }
6931
emitCUDADeviceBuiltinTextureDeviceCopy(CodeGenFunction & CGF,LValue Dst,LValue Src) const6932 bool emitCUDADeviceBuiltinTextureDeviceCopy(CodeGenFunction &CGF, LValue Dst,
6933 LValue Src) const override {
6934 emitBuiltinSurfTexDeviceCopy(CGF, Dst, Src);
6935 return true;
6936 }
6937
6938 private:
6939 // Adds a NamedMDNode with GV, Name, and Operand as operands, and adds the
6940 // resulting MDNode to the nvvm.annotations MDNode.
6941 static void addNVVMMetadata(llvm::GlobalValue *GV, StringRef Name,
6942 int Operand);
6943
emitBuiltinSurfTexDeviceCopy(CodeGenFunction & CGF,LValue Dst,LValue Src)6944 static void emitBuiltinSurfTexDeviceCopy(CodeGenFunction &CGF, LValue Dst,
6945 LValue Src) {
6946 llvm::Value *Handle = nullptr;
6947 llvm::Constant *C =
6948 llvm::dyn_cast<llvm::Constant>(Src.getAddress(CGF).getPointer());
6949 // Lookup `addrspacecast` through the constant pointer if any.
6950 if (auto *ASC = llvm::dyn_cast_or_null<llvm::AddrSpaceCastOperator>(C))
6951 C = llvm::cast<llvm::Constant>(ASC->getPointerOperand());
6952 if (auto *GV = llvm::dyn_cast_or_null<llvm::GlobalVariable>(C)) {
6953 // Load the handle from the specific global variable using
6954 // `nvvm.texsurf.handle.internal` intrinsic.
6955 Handle = CGF.EmitRuntimeCall(
6956 CGF.CGM.getIntrinsic(llvm::Intrinsic::nvvm_texsurf_handle_internal,
6957 {GV->getType()}),
6958 {GV}, "texsurf_handle");
6959 } else
6960 Handle = CGF.EmitLoadOfScalar(Src, SourceLocation());
6961 CGF.EmitStoreOfScalar(Handle, Dst);
6962 }
6963 };
6964
6965 /// Checks if the type is unsupported directly by the current target.
isUnsupportedType(QualType T) const6966 bool NVPTXABIInfo::isUnsupportedType(QualType T) const {
6967 ASTContext &Context = getContext();
6968 if (!Context.getTargetInfo().hasFloat16Type() && T->isFloat16Type())
6969 return true;
6970 if (!Context.getTargetInfo().hasFloat128Type() &&
6971 (T->isFloat128Type() ||
6972 (T->isRealFloatingType() && Context.getTypeSize(T) == 128)))
6973 return true;
6974 if (const auto *EIT = T->getAs<ExtIntType>())
6975 return EIT->getNumBits() >
6976 (Context.getTargetInfo().hasInt128Type() ? 128U : 64U);
6977 if (!Context.getTargetInfo().hasInt128Type() && T->isIntegerType() &&
6978 Context.getTypeSize(T) > 64U)
6979 return true;
6980 if (const auto *AT = T->getAsArrayTypeUnsafe())
6981 return isUnsupportedType(AT->getElementType());
6982 const auto *RT = T->getAs<RecordType>();
6983 if (!RT)
6984 return false;
6985 const RecordDecl *RD = RT->getDecl();
6986
6987 // If this is a C++ record, check the bases first.
6988 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
6989 for (const CXXBaseSpecifier &I : CXXRD->bases())
6990 if (isUnsupportedType(I.getType()))
6991 return true;
6992
6993 for (const FieldDecl *I : RD->fields())
6994 if (isUnsupportedType(I->getType()))
6995 return true;
6996 return false;
6997 }
6998
6999 /// Coerce the given type into an array with maximum allowed size of elements.
coerceToIntArrayWithLimit(QualType Ty,unsigned MaxSize) const7000 ABIArgInfo NVPTXABIInfo::coerceToIntArrayWithLimit(QualType Ty,
7001 unsigned MaxSize) const {
7002 // Alignment and Size are measured in bits.
7003 const uint64_t Size = getContext().getTypeSize(Ty);
7004 const uint64_t Alignment = getContext().getTypeAlign(Ty);
7005 const unsigned Div = std::min<unsigned>(MaxSize, Alignment);
7006 llvm::Type *IntType = llvm::Type::getIntNTy(getVMContext(), Div);
7007 const uint64_t NumElements = (Size + Div - 1) / Div;
7008 return ABIArgInfo::getDirect(llvm::ArrayType::get(IntType, NumElements));
7009 }
7010
classifyReturnType(QualType RetTy) const7011 ABIArgInfo NVPTXABIInfo::classifyReturnType(QualType RetTy) const {
7012 if (RetTy->isVoidType())
7013 return ABIArgInfo::getIgnore();
7014
7015 if (getContext().getLangOpts().OpenMP &&
7016 getContext().getLangOpts().OpenMPIsDevice && isUnsupportedType(RetTy))
7017 return coerceToIntArrayWithLimit(RetTy, 64);
7018
7019 // note: this is different from default ABI
7020 if (!RetTy->isScalarType())
7021 return ABIArgInfo::getDirect();
7022
7023 // Treat an enum type as its underlying type.
7024 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
7025 RetTy = EnumTy->getDecl()->getIntegerType();
7026
7027 return (isPromotableIntegerTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
7028 : ABIArgInfo::getDirect());
7029 }
7030
classifyArgumentType(QualType Ty) const7031 ABIArgInfo NVPTXABIInfo::classifyArgumentType(QualType Ty) const {
7032 // Treat an enum type as its underlying type.
7033 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
7034 Ty = EnumTy->getDecl()->getIntegerType();
7035
7036 // Return aggregates type as indirect by value
7037 if (isAggregateTypeForABI(Ty)) {
7038 // Under CUDA device compilation, tex/surf builtin types are replaced with
7039 // object types and passed directly.
7040 if (getContext().getLangOpts().CUDAIsDevice) {
7041 if (Ty->isCUDADeviceBuiltinSurfaceType())
7042 return ABIArgInfo::getDirect(
7043 CGInfo.getCUDADeviceBuiltinSurfaceDeviceType());
7044 if (Ty->isCUDADeviceBuiltinTextureType())
7045 return ABIArgInfo::getDirect(
7046 CGInfo.getCUDADeviceBuiltinTextureDeviceType());
7047 }
7048 return getNaturalAlignIndirect(Ty, /* byval */ true);
7049 }
7050
7051 if (const auto *EIT = Ty->getAs<ExtIntType>()) {
7052 if ((EIT->getNumBits() > 128) ||
7053 (!getContext().getTargetInfo().hasInt128Type() &&
7054 EIT->getNumBits() > 64))
7055 return getNaturalAlignIndirect(Ty, /* byval */ true);
7056 }
7057
7058 return (isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
7059 : ABIArgInfo::getDirect());
7060 }
7061
computeInfo(CGFunctionInfo & FI) const7062 void NVPTXABIInfo::computeInfo(CGFunctionInfo &FI) const {
7063 if (!getCXXABI().classifyReturnType(FI))
7064 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
7065 for (auto &I : FI.arguments())
7066 I.info = classifyArgumentType(I.type);
7067
7068 // Always honor user-specified calling convention.
7069 if (FI.getCallingConvention() != llvm::CallingConv::C)
7070 return;
7071
7072 FI.setEffectiveCallingConvention(getRuntimeCC());
7073 }
7074
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const7075 Address NVPTXABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
7076 QualType Ty) const {
7077 llvm_unreachable("NVPTX does not support varargs");
7078 }
7079
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & M) const7080 void NVPTXTargetCodeGenInfo::setTargetAttributes(
7081 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &M) const {
7082 if (GV->isDeclaration())
7083 return;
7084 const VarDecl *VD = dyn_cast_or_null<VarDecl>(D);
7085 if (VD) {
7086 if (M.getLangOpts().CUDA) {
7087 if (VD->getType()->isCUDADeviceBuiltinSurfaceType())
7088 addNVVMMetadata(GV, "surface", 1);
7089 else if (VD->getType()->isCUDADeviceBuiltinTextureType())
7090 addNVVMMetadata(GV, "texture", 1);
7091 return;
7092 }
7093 }
7094
7095 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
7096 if (!FD) return;
7097
7098 llvm::Function *F = cast<llvm::Function>(GV);
7099
7100 // Perform special handling in OpenCL mode
7101 if (M.getLangOpts().OpenCL) {
7102 // Use OpenCL function attributes to check for kernel functions
7103 // By default, all functions are device functions
7104 if (FD->hasAttr<OpenCLKernelAttr>()) {
7105 // OpenCL __kernel functions get kernel metadata
7106 // Create !{<func-ref>, metadata !"kernel", i32 1} node
7107 addNVVMMetadata(F, "kernel", 1);
7108 // And kernel functions are not subject to inlining
7109 F->addFnAttr(llvm::Attribute::NoInline);
7110 }
7111 }
7112
7113 // Perform special handling in CUDA mode.
7114 if (M.getLangOpts().CUDA) {
7115 // CUDA __global__ functions get a kernel metadata entry. Since
7116 // __global__ functions cannot be called from the device, we do not
7117 // need to set the noinline attribute.
7118 if (FD->hasAttr<CUDAGlobalAttr>()) {
7119 // Create !{<func-ref>, metadata !"kernel", i32 1} node
7120 addNVVMMetadata(F, "kernel", 1);
7121 }
7122 if (CUDALaunchBoundsAttr *Attr = FD->getAttr<CUDALaunchBoundsAttr>()) {
7123 // Create !{<func-ref>, metadata !"maxntidx", i32 <val>} node
7124 llvm::APSInt MaxThreads(32);
7125 MaxThreads = Attr->getMaxThreads()->EvaluateKnownConstInt(M.getContext());
7126 if (MaxThreads > 0)
7127 addNVVMMetadata(F, "maxntidx", MaxThreads.getExtValue());
7128
7129 // min blocks is an optional argument for CUDALaunchBoundsAttr. If it was
7130 // not specified in __launch_bounds__ or if the user specified a 0 value,
7131 // we don't have to add a PTX directive.
7132 if (Attr->getMinBlocks()) {
7133 llvm::APSInt MinBlocks(32);
7134 MinBlocks = Attr->getMinBlocks()->EvaluateKnownConstInt(M.getContext());
7135 if (MinBlocks > 0)
7136 // Create !{<func-ref>, metadata !"minctasm", i32 <val>} node
7137 addNVVMMetadata(F, "minctasm", MinBlocks.getExtValue());
7138 }
7139 }
7140 }
7141 }
7142
addNVVMMetadata(llvm::GlobalValue * GV,StringRef Name,int Operand)7143 void NVPTXTargetCodeGenInfo::addNVVMMetadata(llvm::GlobalValue *GV,
7144 StringRef Name, int Operand) {
7145 llvm::Module *M = GV->getParent();
7146 llvm::LLVMContext &Ctx = M->getContext();
7147
7148 // Get "nvvm.annotations" metadata node
7149 llvm::NamedMDNode *MD = M->getOrInsertNamedMetadata("nvvm.annotations");
7150
7151 llvm::Metadata *MDVals[] = {
7152 llvm::ConstantAsMetadata::get(GV), llvm::MDString::get(Ctx, Name),
7153 llvm::ConstantAsMetadata::get(
7154 llvm::ConstantInt::get(llvm::Type::getInt32Ty(Ctx), Operand))};
7155 // Append metadata to nvvm.annotations
7156 MD->addOperand(llvm::MDNode::get(Ctx, MDVals));
7157 }
7158
shouldEmitStaticExternCAliases() const7159 bool NVPTXTargetCodeGenInfo::shouldEmitStaticExternCAliases() const {
7160 return false;
7161 }
7162 }
7163
7164 //===----------------------------------------------------------------------===//
7165 // SystemZ ABI Implementation
7166 //===----------------------------------------------------------------------===//
7167
7168 namespace {
7169
7170 class SystemZABIInfo : public SwiftABIInfo {
7171 bool HasVector;
7172 bool IsSoftFloatABI;
7173
7174 public:
SystemZABIInfo(CodeGenTypes & CGT,bool HV,bool SF)7175 SystemZABIInfo(CodeGenTypes &CGT, bool HV, bool SF)
7176 : SwiftABIInfo(CGT), HasVector(HV), IsSoftFloatABI(SF) {}
7177
7178 bool isPromotableIntegerTypeForABI(QualType Ty) const;
7179 bool isCompoundType(QualType Ty) const;
7180 bool isVectorArgumentType(QualType Ty) const;
7181 bool isFPArgumentType(QualType Ty) const;
7182 QualType GetSingleElementType(QualType Ty) const;
7183
7184 ABIArgInfo classifyReturnType(QualType RetTy) const;
7185 ABIArgInfo classifyArgumentType(QualType ArgTy) const;
7186
computeInfo(CGFunctionInfo & FI) const7187 void computeInfo(CGFunctionInfo &FI) const override {
7188 if (!getCXXABI().classifyReturnType(FI))
7189 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
7190 for (auto &I : FI.arguments())
7191 I.info = classifyArgumentType(I.type);
7192 }
7193
7194 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
7195 QualType Ty) const override;
7196
shouldPassIndirectlyForSwift(ArrayRef<llvm::Type * > scalars,bool asReturnValue) const7197 bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars,
7198 bool asReturnValue) const override {
7199 return occupiesMoreThan(CGT, scalars, /*total*/ 4);
7200 }
isSwiftErrorInRegister() const7201 bool isSwiftErrorInRegister() const override {
7202 return false;
7203 }
7204 };
7205
7206 class SystemZTargetCodeGenInfo : public TargetCodeGenInfo {
7207 public:
SystemZTargetCodeGenInfo(CodeGenTypes & CGT,bool HasVector,bool SoftFloatABI)7208 SystemZTargetCodeGenInfo(CodeGenTypes &CGT, bool HasVector, bool SoftFloatABI)
7209 : TargetCodeGenInfo(
7210 std::make_unique<SystemZABIInfo>(CGT, HasVector, SoftFloatABI)) {}
7211 };
7212
7213 }
7214
isPromotableIntegerTypeForABI(QualType Ty) const7215 bool SystemZABIInfo::isPromotableIntegerTypeForABI(QualType Ty) const {
7216 // Treat an enum type as its underlying type.
7217 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
7218 Ty = EnumTy->getDecl()->getIntegerType();
7219
7220 // Promotable integer types are required to be promoted by the ABI.
7221 if (ABIInfo::isPromotableIntegerTypeForABI(Ty))
7222 return true;
7223
7224 if (const auto *EIT = Ty->getAs<ExtIntType>())
7225 if (EIT->getNumBits() < 64)
7226 return true;
7227
7228 // 32-bit values must also be promoted.
7229 if (const BuiltinType *BT = Ty->getAs<BuiltinType>())
7230 switch (BT->getKind()) {
7231 case BuiltinType::Int:
7232 case BuiltinType::UInt:
7233 return true;
7234 default:
7235 return false;
7236 }
7237 return false;
7238 }
7239
isCompoundType(QualType Ty) const7240 bool SystemZABIInfo::isCompoundType(QualType Ty) const {
7241 return (Ty->isAnyComplexType() ||
7242 Ty->isVectorType() ||
7243 isAggregateTypeForABI(Ty));
7244 }
7245
isVectorArgumentType(QualType Ty) const7246 bool SystemZABIInfo::isVectorArgumentType(QualType Ty) const {
7247 return (HasVector &&
7248 Ty->isVectorType() &&
7249 getContext().getTypeSize(Ty) <= 128);
7250 }
7251
isFPArgumentType(QualType Ty) const7252 bool SystemZABIInfo::isFPArgumentType(QualType Ty) const {
7253 if (IsSoftFloatABI)
7254 return false;
7255
7256 if (const BuiltinType *BT = Ty->getAs<BuiltinType>())
7257 switch (BT->getKind()) {
7258 case BuiltinType::Float:
7259 case BuiltinType::Double:
7260 return true;
7261 default:
7262 return false;
7263 }
7264
7265 return false;
7266 }
7267
GetSingleElementType(QualType Ty) const7268 QualType SystemZABIInfo::GetSingleElementType(QualType Ty) const {
7269 const RecordType *RT = Ty->getAs<RecordType>();
7270
7271 if (RT && RT->isStructureOrClassType()) {
7272 const RecordDecl *RD = RT->getDecl();
7273 QualType Found;
7274
7275 // If this is a C++ record, check the bases first.
7276 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
7277 for (const auto &I : CXXRD->bases()) {
7278 QualType Base = I.getType();
7279
7280 // Empty bases don't affect things either way.
7281 if (isEmptyRecord(getContext(), Base, true))
7282 continue;
7283
7284 if (!Found.isNull())
7285 return Ty;
7286 Found = GetSingleElementType(Base);
7287 }
7288
7289 // Check the fields.
7290 for (const auto *FD : RD->fields()) {
7291 // For compatibility with GCC, ignore empty bitfields in C++ mode.
7292 // Unlike isSingleElementStruct(), empty structure and array fields
7293 // do count. So do anonymous bitfields that aren't zero-sized.
7294 if (getContext().getLangOpts().CPlusPlus &&
7295 FD->isZeroLengthBitField(getContext()))
7296 continue;
7297 // Like isSingleElementStruct(), ignore C++20 empty data members.
7298 if (FD->hasAttr<NoUniqueAddressAttr>() &&
7299 isEmptyRecord(getContext(), FD->getType(), true))
7300 continue;
7301
7302 // Unlike isSingleElementStruct(), arrays do not count.
7303 // Nested structures still do though.
7304 if (!Found.isNull())
7305 return Ty;
7306 Found = GetSingleElementType(FD->getType());
7307 }
7308
7309 // Unlike isSingleElementStruct(), trailing padding is allowed.
7310 // An 8-byte aligned struct s { float f; } is passed as a double.
7311 if (!Found.isNull())
7312 return Found;
7313 }
7314
7315 return Ty;
7316 }
7317
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const7318 Address SystemZABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
7319 QualType Ty) const {
7320 // Assume that va_list type is correct; should be pointer to LLVM type:
7321 // struct {
7322 // i64 __gpr;
7323 // i64 __fpr;
7324 // i8 *__overflow_arg_area;
7325 // i8 *__reg_save_area;
7326 // };
7327
7328 // Every non-vector argument occupies 8 bytes and is passed by preference
7329 // in either GPRs or FPRs. Vector arguments occupy 8 or 16 bytes and are
7330 // always passed on the stack.
7331 Ty = getContext().getCanonicalType(Ty);
7332 auto TyInfo = getContext().getTypeInfoInChars(Ty);
7333 llvm::Type *ArgTy = CGF.ConvertTypeForMem(Ty);
7334 llvm::Type *DirectTy = ArgTy;
7335 ABIArgInfo AI = classifyArgumentType(Ty);
7336 bool IsIndirect = AI.isIndirect();
7337 bool InFPRs = false;
7338 bool IsVector = false;
7339 CharUnits UnpaddedSize;
7340 CharUnits DirectAlign;
7341 if (IsIndirect) {
7342 DirectTy = llvm::PointerType::getUnqual(DirectTy);
7343 UnpaddedSize = DirectAlign = CharUnits::fromQuantity(8);
7344 } else {
7345 if (AI.getCoerceToType())
7346 ArgTy = AI.getCoerceToType();
7347 InFPRs = (!IsSoftFloatABI && (ArgTy->isFloatTy() || ArgTy->isDoubleTy()));
7348 IsVector = ArgTy->isVectorTy();
7349 UnpaddedSize = TyInfo.Width;
7350 DirectAlign = TyInfo.Align;
7351 }
7352 CharUnits PaddedSize = CharUnits::fromQuantity(8);
7353 if (IsVector && UnpaddedSize > PaddedSize)
7354 PaddedSize = CharUnits::fromQuantity(16);
7355 assert((UnpaddedSize <= PaddedSize) && "Invalid argument size.");
7356
7357 CharUnits Padding = (PaddedSize - UnpaddedSize);
7358
7359 llvm::Type *IndexTy = CGF.Int64Ty;
7360 llvm::Value *PaddedSizeV =
7361 llvm::ConstantInt::get(IndexTy, PaddedSize.getQuantity());
7362
7363 if (IsVector) {
7364 // Work out the address of a vector argument on the stack.
7365 // Vector arguments are always passed in the high bits of a
7366 // single (8 byte) or double (16 byte) stack slot.
7367 Address OverflowArgAreaPtr =
7368 CGF.Builder.CreateStructGEP(VAListAddr, 2, "overflow_arg_area_ptr");
7369 Address OverflowArgArea =
7370 Address(CGF.Builder.CreateLoad(OverflowArgAreaPtr, "overflow_arg_area"),
7371 TyInfo.Align);
7372 Address MemAddr =
7373 CGF.Builder.CreateElementBitCast(OverflowArgArea, DirectTy, "mem_addr");
7374
7375 // Update overflow_arg_area_ptr pointer
7376 llvm::Value *NewOverflowArgArea =
7377 CGF.Builder.CreateGEP(OverflowArgArea.getPointer(), PaddedSizeV,
7378 "overflow_arg_area");
7379 CGF.Builder.CreateStore(NewOverflowArgArea, OverflowArgAreaPtr);
7380
7381 return MemAddr;
7382 }
7383
7384 assert(PaddedSize.getQuantity() == 8);
7385
7386 unsigned MaxRegs, RegCountField, RegSaveIndex;
7387 CharUnits RegPadding;
7388 if (InFPRs) {
7389 MaxRegs = 4; // Maximum of 4 FPR arguments
7390 RegCountField = 1; // __fpr
7391 RegSaveIndex = 16; // save offset for f0
7392 RegPadding = CharUnits(); // floats are passed in the high bits of an FPR
7393 } else {
7394 MaxRegs = 5; // Maximum of 5 GPR arguments
7395 RegCountField = 0; // __gpr
7396 RegSaveIndex = 2; // save offset for r2
7397 RegPadding = Padding; // values are passed in the low bits of a GPR
7398 }
7399
7400 Address RegCountPtr =
7401 CGF.Builder.CreateStructGEP(VAListAddr, RegCountField, "reg_count_ptr");
7402 llvm::Value *RegCount = CGF.Builder.CreateLoad(RegCountPtr, "reg_count");
7403 llvm::Value *MaxRegsV = llvm::ConstantInt::get(IndexTy, MaxRegs);
7404 llvm::Value *InRegs = CGF.Builder.CreateICmpULT(RegCount, MaxRegsV,
7405 "fits_in_regs");
7406
7407 llvm::BasicBlock *InRegBlock = CGF.createBasicBlock("vaarg.in_reg");
7408 llvm::BasicBlock *InMemBlock = CGF.createBasicBlock("vaarg.in_mem");
7409 llvm::BasicBlock *ContBlock = CGF.createBasicBlock("vaarg.end");
7410 CGF.Builder.CreateCondBr(InRegs, InRegBlock, InMemBlock);
7411
7412 // Emit code to load the value if it was passed in registers.
7413 CGF.EmitBlock(InRegBlock);
7414
7415 // Work out the address of an argument register.
7416 llvm::Value *ScaledRegCount =
7417 CGF.Builder.CreateMul(RegCount, PaddedSizeV, "scaled_reg_count");
7418 llvm::Value *RegBase =
7419 llvm::ConstantInt::get(IndexTy, RegSaveIndex * PaddedSize.getQuantity()
7420 + RegPadding.getQuantity());
7421 llvm::Value *RegOffset =
7422 CGF.Builder.CreateAdd(ScaledRegCount, RegBase, "reg_offset");
7423 Address RegSaveAreaPtr =
7424 CGF.Builder.CreateStructGEP(VAListAddr, 3, "reg_save_area_ptr");
7425 llvm::Value *RegSaveArea =
7426 CGF.Builder.CreateLoad(RegSaveAreaPtr, "reg_save_area");
7427 Address RawRegAddr(CGF.Builder.CreateGEP(RegSaveArea, RegOffset,
7428 "raw_reg_addr"),
7429 PaddedSize);
7430 Address RegAddr =
7431 CGF.Builder.CreateElementBitCast(RawRegAddr, DirectTy, "reg_addr");
7432
7433 // Update the register count
7434 llvm::Value *One = llvm::ConstantInt::get(IndexTy, 1);
7435 llvm::Value *NewRegCount =
7436 CGF.Builder.CreateAdd(RegCount, One, "reg_count");
7437 CGF.Builder.CreateStore(NewRegCount, RegCountPtr);
7438 CGF.EmitBranch(ContBlock);
7439
7440 // Emit code to load the value if it was passed in memory.
7441 CGF.EmitBlock(InMemBlock);
7442
7443 // Work out the address of a stack argument.
7444 Address OverflowArgAreaPtr =
7445 CGF.Builder.CreateStructGEP(VAListAddr, 2, "overflow_arg_area_ptr");
7446 Address OverflowArgArea =
7447 Address(CGF.Builder.CreateLoad(OverflowArgAreaPtr, "overflow_arg_area"),
7448 PaddedSize);
7449 Address RawMemAddr =
7450 CGF.Builder.CreateConstByteGEP(OverflowArgArea, Padding, "raw_mem_addr");
7451 Address MemAddr =
7452 CGF.Builder.CreateElementBitCast(RawMemAddr, DirectTy, "mem_addr");
7453
7454 // Update overflow_arg_area_ptr pointer
7455 llvm::Value *NewOverflowArgArea =
7456 CGF.Builder.CreateGEP(OverflowArgArea.getPointer(), PaddedSizeV,
7457 "overflow_arg_area");
7458 CGF.Builder.CreateStore(NewOverflowArgArea, OverflowArgAreaPtr);
7459 CGF.EmitBranch(ContBlock);
7460
7461 // Return the appropriate result.
7462 CGF.EmitBlock(ContBlock);
7463 Address ResAddr = emitMergePHI(CGF, RegAddr, InRegBlock,
7464 MemAddr, InMemBlock, "va_arg.addr");
7465
7466 if (IsIndirect)
7467 ResAddr = Address(CGF.Builder.CreateLoad(ResAddr, "indirect_arg"),
7468 TyInfo.Align);
7469
7470 return ResAddr;
7471 }
7472
classifyReturnType(QualType RetTy) const7473 ABIArgInfo SystemZABIInfo::classifyReturnType(QualType RetTy) const {
7474 if (RetTy->isVoidType())
7475 return ABIArgInfo::getIgnore();
7476 if (isVectorArgumentType(RetTy))
7477 return ABIArgInfo::getDirect();
7478 if (isCompoundType(RetTy) || getContext().getTypeSize(RetTy) > 64)
7479 return getNaturalAlignIndirect(RetTy);
7480 return (isPromotableIntegerTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
7481 : ABIArgInfo::getDirect());
7482 }
7483
classifyArgumentType(QualType Ty) const7484 ABIArgInfo SystemZABIInfo::classifyArgumentType(QualType Ty) const {
7485 // Handle the generic C++ ABI.
7486 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
7487 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
7488
7489 // Integers and enums are extended to full register width.
7490 if (isPromotableIntegerTypeForABI(Ty))
7491 return ABIArgInfo::getExtend(Ty);
7492
7493 // Handle vector types and vector-like structure types. Note that
7494 // as opposed to float-like structure types, we do not allow any
7495 // padding for vector-like structures, so verify the sizes match.
7496 uint64_t Size = getContext().getTypeSize(Ty);
7497 QualType SingleElementTy = GetSingleElementType(Ty);
7498 if (isVectorArgumentType(SingleElementTy) &&
7499 getContext().getTypeSize(SingleElementTy) == Size)
7500 return ABIArgInfo::getDirect(CGT.ConvertType(SingleElementTy));
7501
7502 // Values that are not 1, 2, 4 or 8 bytes in size are passed indirectly.
7503 if (Size != 8 && Size != 16 && Size != 32 && Size != 64)
7504 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
7505
7506 // Handle small structures.
7507 if (const RecordType *RT = Ty->getAs<RecordType>()) {
7508 // Structures with flexible arrays have variable length, so really
7509 // fail the size test above.
7510 const RecordDecl *RD = RT->getDecl();
7511 if (RD->hasFlexibleArrayMember())
7512 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
7513
7514 // The structure is passed as an unextended integer, a float, or a double.
7515 llvm::Type *PassTy;
7516 if (isFPArgumentType(SingleElementTy)) {
7517 assert(Size == 32 || Size == 64);
7518 if (Size == 32)
7519 PassTy = llvm::Type::getFloatTy(getVMContext());
7520 else
7521 PassTy = llvm::Type::getDoubleTy(getVMContext());
7522 } else
7523 PassTy = llvm::IntegerType::get(getVMContext(), Size);
7524 return ABIArgInfo::getDirect(PassTy);
7525 }
7526
7527 // Non-structure compounds are passed indirectly.
7528 if (isCompoundType(Ty))
7529 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
7530
7531 return ABIArgInfo::getDirect(nullptr);
7532 }
7533
7534 //===----------------------------------------------------------------------===//
7535 // MSP430 ABI Implementation
7536 //===----------------------------------------------------------------------===//
7537
7538 namespace {
7539
7540 class MSP430ABIInfo : public DefaultABIInfo {
complexArgInfo()7541 static ABIArgInfo complexArgInfo() {
7542 ABIArgInfo Info = ABIArgInfo::getDirect();
7543 Info.setCanBeFlattened(false);
7544 return Info;
7545 }
7546
7547 public:
MSP430ABIInfo(CodeGenTypes & CGT)7548 MSP430ABIInfo(CodeGenTypes &CGT) : DefaultABIInfo(CGT) {}
7549
classifyReturnType(QualType RetTy) const7550 ABIArgInfo classifyReturnType(QualType RetTy) const {
7551 if (RetTy->isAnyComplexType())
7552 return complexArgInfo();
7553
7554 return DefaultABIInfo::classifyReturnType(RetTy);
7555 }
7556
classifyArgumentType(QualType RetTy) const7557 ABIArgInfo classifyArgumentType(QualType RetTy) const {
7558 if (RetTy->isAnyComplexType())
7559 return complexArgInfo();
7560
7561 return DefaultABIInfo::classifyArgumentType(RetTy);
7562 }
7563
7564 // Just copy the original implementations because
7565 // DefaultABIInfo::classify{Return,Argument}Type() are not virtual
computeInfo(CGFunctionInfo & FI) const7566 void computeInfo(CGFunctionInfo &FI) const override {
7567 if (!getCXXABI().classifyReturnType(FI))
7568 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
7569 for (auto &I : FI.arguments())
7570 I.info = classifyArgumentType(I.type);
7571 }
7572
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const7573 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
7574 QualType Ty) const override {
7575 return EmitVAArgInstr(CGF, VAListAddr, Ty, classifyArgumentType(Ty));
7576 }
7577 };
7578
7579 class MSP430TargetCodeGenInfo : public TargetCodeGenInfo {
7580 public:
MSP430TargetCodeGenInfo(CodeGenTypes & CGT)7581 MSP430TargetCodeGenInfo(CodeGenTypes &CGT)
7582 : TargetCodeGenInfo(std::make_unique<MSP430ABIInfo>(CGT)) {}
7583 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
7584 CodeGen::CodeGenModule &M) const override;
7585 };
7586
7587 }
7588
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & M) const7589 void MSP430TargetCodeGenInfo::setTargetAttributes(
7590 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &M) const {
7591 if (GV->isDeclaration())
7592 return;
7593 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
7594 const auto *InterruptAttr = FD->getAttr<MSP430InterruptAttr>();
7595 if (!InterruptAttr)
7596 return;
7597
7598 // Handle 'interrupt' attribute:
7599 llvm::Function *F = cast<llvm::Function>(GV);
7600
7601 // Step 1: Set ISR calling convention.
7602 F->setCallingConv(llvm::CallingConv::MSP430_INTR);
7603
7604 // Step 2: Add attributes goodness.
7605 F->addFnAttr(llvm::Attribute::NoInline);
7606 F->addFnAttr("interrupt", llvm::utostr(InterruptAttr->getNumber()));
7607 }
7608 }
7609
7610 //===----------------------------------------------------------------------===//
7611 // MIPS ABI Implementation. This works for both little-endian and
7612 // big-endian variants.
7613 //===----------------------------------------------------------------------===//
7614
7615 namespace {
7616 class MipsABIInfo : public ABIInfo {
7617 bool IsO32;
7618 unsigned MinABIStackAlignInBytes, StackAlignInBytes;
7619 void CoerceToIntArgs(uint64_t TySize,
7620 SmallVectorImpl<llvm::Type *> &ArgList) const;
7621 llvm::Type* HandleAggregates(QualType Ty, uint64_t TySize) const;
7622 llvm::Type* returnAggregateInRegs(QualType RetTy, uint64_t Size) const;
7623 llvm::Type* getPaddingType(uint64_t Align, uint64_t Offset) const;
7624 public:
MipsABIInfo(CodeGenTypes & CGT,bool _IsO32)7625 MipsABIInfo(CodeGenTypes &CGT, bool _IsO32) :
7626 ABIInfo(CGT), IsO32(_IsO32), MinABIStackAlignInBytes(IsO32 ? 4 : 8),
7627 StackAlignInBytes(IsO32 ? 8 : 16) {}
7628
7629 ABIArgInfo classifyReturnType(QualType RetTy) const;
7630 ABIArgInfo classifyArgumentType(QualType RetTy, uint64_t &Offset) const;
7631 void computeInfo(CGFunctionInfo &FI) const override;
7632 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
7633 QualType Ty) const override;
7634 ABIArgInfo extendType(QualType Ty) const;
7635 };
7636
7637 class MIPSTargetCodeGenInfo : public TargetCodeGenInfo {
7638 unsigned SizeOfUnwindException;
7639 public:
MIPSTargetCodeGenInfo(CodeGenTypes & CGT,bool IsO32)7640 MIPSTargetCodeGenInfo(CodeGenTypes &CGT, bool IsO32)
7641 : TargetCodeGenInfo(std::make_unique<MipsABIInfo>(CGT, IsO32)),
7642 SizeOfUnwindException(IsO32 ? 24 : 32) {}
7643
getDwarfEHStackPointer(CodeGen::CodeGenModule & CGM) const7644 int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const override {
7645 return 29;
7646 }
7647
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const7648 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
7649 CodeGen::CodeGenModule &CGM) const override {
7650 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
7651 if (!FD) return;
7652 llvm::Function *Fn = cast<llvm::Function>(GV);
7653
7654 if (FD->hasAttr<MipsLongCallAttr>())
7655 Fn->addFnAttr("long-call");
7656 else if (FD->hasAttr<MipsShortCallAttr>())
7657 Fn->addFnAttr("short-call");
7658
7659 // Other attributes do not have a meaning for declarations.
7660 if (GV->isDeclaration())
7661 return;
7662
7663 if (FD->hasAttr<Mips16Attr>()) {
7664 Fn->addFnAttr("mips16");
7665 }
7666 else if (FD->hasAttr<NoMips16Attr>()) {
7667 Fn->addFnAttr("nomips16");
7668 }
7669
7670 if (FD->hasAttr<MicroMipsAttr>())
7671 Fn->addFnAttr("micromips");
7672 else if (FD->hasAttr<NoMicroMipsAttr>())
7673 Fn->addFnAttr("nomicromips");
7674
7675 const MipsInterruptAttr *Attr = FD->getAttr<MipsInterruptAttr>();
7676 if (!Attr)
7677 return;
7678
7679 const char *Kind;
7680 switch (Attr->getInterrupt()) {
7681 case MipsInterruptAttr::eic: Kind = "eic"; break;
7682 case MipsInterruptAttr::sw0: Kind = "sw0"; break;
7683 case MipsInterruptAttr::sw1: Kind = "sw1"; break;
7684 case MipsInterruptAttr::hw0: Kind = "hw0"; break;
7685 case MipsInterruptAttr::hw1: Kind = "hw1"; break;
7686 case MipsInterruptAttr::hw2: Kind = "hw2"; break;
7687 case MipsInterruptAttr::hw3: Kind = "hw3"; break;
7688 case MipsInterruptAttr::hw4: Kind = "hw4"; break;
7689 case MipsInterruptAttr::hw5: Kind = "hw5"; break;
7690 }
7691
7692 Fn->addFnAttr("interrupt", Kind);
7693
7694 }
7695
7696 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
7697 llvm::Value *Address) const override;
7698
getSizeOfUnwindException() const7699 unsigned getSizeOfUnwindException() const override {
7700 return SizeOfUnwindException;
7701 }
7702 };
7703 }
7704
CoerceToIntArgs(uint64_t TySize,SmallVectorImpl<llvm::Type * > & ArgList) const7705 void MipsABIInfo::CoerceToIntArgs(
7706 uint64_t TySize, SmallVectorImpl<llvm::Type *> &ArgList) const {
7707 llvm::IntegerType *IntTy =
7708 llvm::IntegerType::get(getVMContext(), MinABIStackAlignInBytes * 8);
7709
7710 // Add (TySize / MinABIStackAlignInBytes) args of IntTy.
7711 for (unsigned N = TySize / (MinABIStackAlignInBytes * 8); N; --N)
7712 ArgList.push_back(IntTy);
7713
7714 // If necessary, add one more integer type to ArgList.
7715 unsigned R = TySize % (MinABIStackAlignInBytes * 8);
7716
7717 if (R)
7718 ArgList.push_back(llvm::IntegerType::get(getVMContext(), R));
7719 }
7720
7721 // In N32/64, an aligned double precision floating point field is passed in
7722 // a register.
HandleAggregates(QualType Ty,uint64_t TySize) const7723 llvm::Type* MipsABIInfo::HandleAggregates(QualType Ty, uint64_t TySize) const {
7724 SmallVector<llvm::Type*, 8> ArgList, IntArgList;
7725
7726 if (IsO32) {
7727 CoerceToIntArgs(TySize, ArgList);
7728 return llvm::StructType::get(getVMContext(), ArgList);
7729 }
7730
7731 if (Ty->isComplexType())
7732 return CGT.ConvertType(Ty);
7733
7734 const RecordType *RT = Ty->getAs<RecordType>();
7735
7736 // Unions/vectors are passed in integer registers.
7737 if (!RT || !RT->isStructureOrClassType()) {
7738 CoerceToIntArgs(TySize, ArgList);
7739 return llvm::StructType::get(getVMContext(), ArgList);
7740 }
7741
7742 const RecordDecl *RD = RT->getDecl();
7743 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
7744 assert(!(TySize % 8) && "Size of structure must be multiple of 8.");
7745
7746 uint64_t LastOffset = 0;
7747 unsigned idx = 0;
7748 llvm::IntegerType *I64 = llvm::IntegerType::get(getVMContext(), 64);
7749
7750 // Iterate over fields in the struct/class and check if there are any aligned
7751 // double fields.
7752 for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
7753 i != e; ++i, ++idx) {
7754 const QualType Ty = i->getType();
7755 const BuiltinType *BT = Ty->getAs<BuiltinType>();
7756
7757 if (!BT || BT->getKind() != BuiltinType::Double)
7758 continue;
7759
7760 uint64_t Offset = Layout.getFieldOffset(idx);
7761 if (Offset % 64) // Ignore doubles that are not aligned.
7762 continue;
7763
7764 // Add ((Offset - LastOffset) / 64) args of type i64.
7765 for (unsigned j = (Offset - LastOffset) / 64; j > 0; --j)
7766 ArgList.push_back(I64);
7767
7768 // Add double type.
7769 ArgList.push_back(llvm::Type::getDoubleTy(getVMContext()));
7770 LastOffset = Offset + 64;
7771 }
7772
7773 CoerceToIntArgs(TySize - LastOffset, IntArgList);
7774 ArgList.append(IntArgList.begin(), IntArgList.end());
7775
7776 return llvm::StructType::get(getVMContext(), ArgList);
7777 }
7778
getPaddingType(uint64_t OrigOffset,uint64_t Offset) const7779 llvm::Type *MipsABIInfo::getPaddingType(uint64_t OrigOffset,
7780 uint64_t Offset) const {
7781 if (OrigOffset + MinABIStackAlignInBytes > Offset)
7782 return nullptr;
7783
7784 return llvm::IntegerType::get(getVMContext(), (Offset - OrigOffset) * 8);
7785 }
7786
7787 ABIArgInfo
classifyArgumentType(QualType Ty,uint64_t & Offset) const7788 MipsABIInfo::classifyArgumentType(QualType Ty, uint64_t &Offset) const {
7789 Ty = useFirstFieldIfTransparentUnion(Ty);
7790
7791 uint64_t OrigOffset = Offset;
7792 uint64_t TySize = getContext().getTypeSize(Ty);
7793 uint64_t Align = getContext().getTypeAlign(Ty) / 8;
7794
7795 Align = std::min(std::max(Align, (uint64_t)MinABIStackAlignInBytes),
7796 (uint64_t)StackAlignInBytes);
7797 unsigned CurrOffset = llvm::alignTo(Offset, Align);
7798 Offset = CurrOffset + llvm::alignTo(TySize, Align * 8) / 8;
7799
7800 if (isAggregateTypeForABI(Ty) || Ty->isVectorType()) {
7801 // Ignore empty aggregates.
7802 if (TySize == 0)
7803 return ABIArgInfo::getIgnore();
7804
7805 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI())) {
7806 Offset = OrigOffset + MinABIStackAlignInBytes;
7807 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
7808 }
7809
7810 // If we have reached here, aggregates are passed directly by coercing to
7811 // another structure type. Padding is inserted if the offset of the
7812 // aggregate is unaligned.
7813 ABIArgInfo ArgInfo =
7814 ABIArgInfo::getDirect(HandleAggregates(Ty, TySize), 0,
7815 getPaddingType(OrigOffset, CurrOffset));
7816 ArgInfo.setInReg(true);
7817 return ArgInfo;
7818 }
7819
7820 // Treat an enum type as its underlying type.
7821 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
7822 Ty = EnumTy->getDecl()->getIntegerType();
7823
7824 // Make sure we pass indirectly things that are too large.
7825 if (const auto *EIT = Ty->getAs<ExtIntType>())
7826 if (EIT->getNumBits() > 128 ||
7827 (EIT->getNumBits() > 64 &&
7828 !getContext().getTargetInfo().hasInt128Type()))
7829 return getNaturalAlignIndirect(Ty);
7830
7831 // All integral types are promoted to the GPR width.
7832 if (Ty->isIntegralOrEnumerationType())
7833 return extendType(Ty);
7834
7835 return ABIArgInfo::getDirect(
7836 nullptr, 0, IsO32 ? nullptr : getPaddingType(OrigOffset, CurrOffset));
7837 }
7838
7839 llvm::Type*
returnAggregateInRegs(QualType RetTy,uint64_t Size) const7840 MipsABIInfo::returnAggregateInRegs(QualType RetTy, uint64_t Size) const {
7841 const RecordType *RT = RetTy->getAs<RecordType>();
7842 SmallVector<llvm::Type*, 8> RTList;
7843
7844 if (RT && RT->isStructureOrClassType()) {
7845 const RecordDecl *RD = RT->getDecl();
7846 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
7847 unsigned FieldCnt = Layout.getFieldCount();
7848
7849 // N32/64 returns struct/classes in floating point registers if the
7850 // following conditions are met:
7851 // 1. The size of the struct/class is no larger than 128-bit.
7852 // 2. The struct/class has one or two fields all of which are floating
7853 // point types.
7854 // 3. The offset of the first field is zero (this follows what gcc does).
7855 //
7856 // Any other composite results are returned in integer registers.
7857 //
7858 if (FieldCnt && (FieldCnt <= 2) && !Layout.getFieldOffset(0)) {
7859 RecordDecl::field_iterator b = RD->field_begin(), e = RD->field_end();
7860 for (; b != e; ++b) {
7861 const BuiltinType *BT = b->getType()->getAs<BuiltinType>();
7862
7863 if (!BT || !BT->isFloatingPoint())
7864 break;
7865
7866 RTList.push_back(CGT.ConvertType(b->getType()));
7867 }
7868
7869 if (b == e)
7870 return llvm::StructType::get(getVMContext(), RTList,
7871 RD->hasAttr<PackedAttr>());
7872
7873 RTList.clear();
7874 }
7875 }
7876
7877 CoerceToIntArgs(Size, RTList);
7878 return llvm::StructType::get(getVMContext(), RTList);
7879 }
7880
classifyReturnType(QualType RetTy) const7881 ABIArgInfo MipsABIInfo::classifyReturnType(QualType RetTy) const {
7882 uint64_t Size = getContext().getTypeSize(RetTy);
7883
7884 if (RetTy->isVoidType())
7885 return ABIArgInfo::getIgnore();
7886
7887 // O32 doesn't treat zero-sized structs differently from other structs.
7888 // However, N32/N64 ignores zero sized return values.
7889 if (!IsO32 && Size == 0)
7890 return ABIArgInfo::getIgnore();
7891
7892 if (isAggregateTypeForABI(RetTy) || RetTy->isVectorType()) {
7893 if (Size <= 128) {
7894 if (RetTy->isAnyComplexType())
7895 return ABIArgInfo::getDirect();
7896
7897 // O32 returns integer vectors in registers and N32/N64 returns all small
7898 // aggregates in registers.
7899 if (!IsO32 ||
7900 (RetTy->isVectorType() && !RetTy->hasFloatingRepresentation())) {
7901 ABIArgInfo ArgInfo =
7902 ABIArgInfo::getDirect(returnAggregateInRegs(RetTy, Size));
7903 ArgInfo.setInReg(true);
7904 return ArgInfo;
7905 }
7906 }
7907
7908 return getNaturalAlignIndirect(RetTy);
7909 }
7910
7911 // Treat an enum type as its underlying type.
7912 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
7913 RetTy = EnumTy->getDecl()->getIntegerType();
7914
7915 // Make sure we pass indirectly things that are too large.
7916 if (const auto *EIT = RetTy->getAs<ExtIntType>())
7917 if (EIT->getNumBits() > 128 ||
7918 (EIT->getNumBits() > 64 &&
7919 !getContext().getTargetInfo().hasInt128Type()))
7920 return getNaturalAlignIndirect(RetTy);
7921
7922 if (isPromotableIntegerTypeForABI(RetTy))
7923 return ABIArgInfo::getExtend(RetTy);
7924
7925 if ((RetTy->isUnsignedIntegerOrEnumerationType() ||
7926 RetTy->isSignedIntegerOrEnumerationType()) && Size == 32 && !IsO32)
7927 return ABIArgInfo::getSignExtend(RetTy);
7928
7929 return ABIArgInfo::getDirect();
7930 }
7931
computeInfo(CGFunctionInfo & FI) const7932 void MipsABIInfo::computeInfo(CGFunctionInfo &FI) const {
7933 ABIArgInfo &RetInfo = FI.getReturnInfo();
7934 if (!getCXXABI().classifyReturnType(FI))
7935 RetInfo = classifyReturnType(FI.getReturnType());
7936
7937 // Check if a pointer to an aggregate is passed as a hidden argument.
7938 uint64_t Offset = RetInfo.isIndirect() ? MinABIStackAlignInBytes : 0;
7939
7940 for (auto &I : FI.arguments())
7941 I.info = classifyArgumentType(I.type, Offset);
7942 }
7943
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType OrigTy) const7944 Address MipsABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
7945 QualType OrigTy) const {
7946 QualType Ty = OrigTy;
7947
7948 // Integer arguments are promoted to 32-bit on O32 and 64-bit on N32/N64.
7949 // Pointers are also promoted in the same way but this only matters for N32.
7950 unsigned SlotSizeInBits = IsO32 ? 32 : 64;
7951 unsigned PtrWidth = getTarget().getPointerWidth(0);
7952 bool DidPromote = false;
7953 if ((Ty->isIntegerType() &&
7954 getContext().getIntWidth(Ty) < SlotSizeInBits) ||
7955 (Ty->isPointerType() && PtrWidth < SlotSizeInBits)) {
7956 DidPromote = true;
7957 Ty = getContext().getIntTypeForBitwidth(SlotSizeInBits,
7958 Ty->isSignedIntegerType());
7959 }
7960
7961 auto TyInfo = getContext().getTypeInfoInChars(Ty);
7962
7963 // The alignment of things in the argument area is never larger than
7964 // StackAlignInBytes.
7965 TyInfo.Align =
7966 std::min(TyInfo.Align, CharUnits::fromQuantity(StackAlignInBytes));
7967
7968 // MinABIStackAlignInBytes is the size of argument slots on the stack.
7969 CharUnits ArgSlotSize = CharUnits::fromQuantity(MinABIStackAlignInBytes);
7970
7971 Address Addr = emitVoidPtrVAArg(CGF, VAListAddr, Ty, /*indirect*/ false,
7972 TyInfo, ArgSlotSize, /*AllowHigherAlign*/ true);
7973
7974
7975 // If there was a promotion, "unpromote" into a temporary.
7976 // TODO: can we just use a pointer into a subset of the original slot?
7977 if (DidPromote) {
7978 Address Temp = CGF.CreateMemTemp(OrigTy, "vaarg.promotion-temp");
7979 llvm::Value *Promoted = CGF.Builder.CreateLoad(Addr);
7980
7981 // Truncate down to the right width.
7982 llvm::Type *IntTy = (OrigTy->isIntegerType() ? Temp.getElementType()
7983 : CGF.IntPtrTy);
7984 llvm::Value *V = CGF.Builder.CreateTrunc(Promoted, IntTy);
7985 if (OrigTy->isPointerType())
7986 V = CGF.Builder.CreateIntToPtr(V, Temp.getElementType());
7987
7988 CGF.Builder.CreateStore(V, Temp);
7989 Addr = Temp;
7990 }
7991
7992 return Addr;
7993 }
7994
extendType(QualType Ty) const7995 ABIArgInfo MipsABIInfo::extendType(QualType Ty) const {
7996 int TySize = getContext().getTypeSize(Ty);
7997
7998 // MIPS64 ABI requires unsigned 32 bit integers to be sign extended.
7999 if (Ty->isUnsignedIntegerOrEnumerationType() && TySize == 32)
8000 return ABIArgInfo::getSignExtend(Ty);
8001
8002 return ABIArgInfo::getExtend(Ty);
8003 }
8004
8005 bool
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const8006 MIPSTargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
8007 llvm::Value *Address) const {
8008 // This information comes from gcc's implementation, which seems to
8009 // as canonical as it gets.
8010
8011 // Everything on MIPS is 4 bytes. Double-precision FP registers
8012 // are aliased to pairs of single-precision FP registers.
8013 llvm::Value *Four8 = llvm::ConstantInt::get(CGF.Int8Ty, 4);
8014
8015 // 0-31 are the general purpose registers, $0 - $31.
8016 // 32-63 are the floating-point registers, $f0 - $f31.
8017 // 64 and 65 are the multiply/divide registers, $hi and $lo.
8018 // 66 is the (notional, I think) register for signal-handler return.
8019 AssignToArrayRange(CGF.Builder, Address, Four8, 0, 65);
8020
8021 // 67-74 are the floating-point status registers, $fcc0 - $fcc7.
8022 // They are one bit wide and ignored here.
8023
8024 // 80-111 are the coprocessor 0 registers, $c0r0 - $c0r31.
8025 // (coprocessor 1 is the FP unit)
8026 // 112-143 are the coprocessor 2 registers, $c2r0 - $c2r31.
8027 // 144-175 are the coprocessor 3 registers, $c3r0 - $c3r31.
8028 // 176-181 are the DSP accumulator registers.
8029 AssignToArrayRange(CGF.Builder, Address, Four8, 80, 181);
8030 return false;
8031 }
8032
8033 //===----------------------------------------------------------------------===//
8034 // AVR ABI Implementation.
8035 //===----------------------------------------------------------------------===//
8036
8037 namespace {
8038 class AVRTargetCodeGenInfo : public TargetCodeGenInfo {
8039 public:
AVRTargetCodeGenInfo(CodeGenTypes & CGT)8040 AVRTargetCodeGenInfo(CodeGenTypes &CGT)
8041 : TargetCodeGenInfo(std::make_unique<DefaultABIInfo>(CGT)) {}
8042
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const8043 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
8044 CodeGen::CodeGenModule &CGM) const override {
8045 if (GV->isDeclaration())
8046 return;
8047 const auto *FD = dyn_cast_or_null<FunctionDecl>(D);
8048 if (!FD) return;
8049 auto *Fn = cast<llvm::Function>(GV);
8050
8051 if (FD->getAttr<AVRInterruptAttr>())
8052 Fn->addFnAttr("interrupt");
8053
8054 if (FD->getAttr<AVRSignalAttr>())
8055 Fn->addFnAttr("signal");
8056 }
8057 };
8058 }
8059
8060 //===----------------------------------------------------------------------===//
8061 // TCE ABI Implementation (see http://tce.cs.tut.fi). Uses mostly the defaults.
8062 // Currently subclassed only to implement custom OpenCL C function attribute
8063 // handling.
8064 //===----------------------------------------------------------------------===//
8065
8066 namespace {
8067
8068 class TCETargetCodeGenInfo : public DefaultTargetCodeGenInfo {
8069 public:
TCETargetCodeGenInfo(CodeGenTypes & CGT)8070 TCETargetCodeGenInfo(CodeGenTypes &CGT)
8071 : DefaultTargetCodeGenInfo(CGT) {}
8072
8073 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
8074 CodeGen::CodeGenModule &M) const override;
8075 };
8076
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & M) const8077 void TCETargetCodeGenInfo::setTargetAttributes(
8078 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &M) const {
8079 if (GV->isDeclaration())
8080 return;
8081 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
8082 if (!FD) return;
8083
8084 llvm::Function *F = cast<llvm::Function>(GV);
8085
8086 if (M.getLangOpts().OpenCL) {
8087 if (FD->hasAttr<OpenCLKernelAttr>()) {
8088 // OpenCL C Kernel functions are not subject to inlining
8089 F->addFnAttr(llvm::Attribute::NoInline);
8090 const ReqdWorkGroupSizeAttr *Attr = FD->getAttr<ReqdWorkGroupSizeAttr>();
8091 if (Attr) {
8092 // Convert the reqd_work_group_size() attributes to metadata.
8093 llvm::LLVMContext &Context = F->getContext();
8094 llvm::NamedMDNode *OpenCLMetadata =
8095 M.getModule().getOrInsertNamedMetadata(
8096 "opencl.kernel_wg_size_info");
8097
8098 SmallVector<llvm::Metadata *, 5> Operands;
8099 Operands.push_back(llvm::ConstantAsMetadata::get(F));
8100
8101 Operands.push_back(
8102 llvm::ConstantAsMetadata::get(llvm::Constant::getIntegerValue(
8103 M.Int32Ty, llvm::APInt(32, Attr->getXDim()))));
8104 Operands.push_back(
8105 llvm::ConstantAsMetadata::get(llvm::Constant::getIntegerValue(
8106 M.Int32Ty, llvm::APInt(32, Attr->getYDim()))));
8107 Operands.push_back(
8108 llvm::ConstantAsMetadata::get(llvm::Constant::getIntegerValue(
8109 M.Int32Ty, llvm::APInt(32, Attr->getZDim()))));
8110
8111 // Add a boolean constant operand for "required" (true) or "hint"
8112 // (false) for implementing the work_group_size_hint attr later.
8113 // Currently always true as the hint is not yet implemented.
8114 Operands.push_back(
8115 llvm::ConstantAsMetadata::get(llvm::ConstantInt::getTrue(Context)));
8116 OpenCLMetadata->addOperand(llvm::MDNode::get(Context, Operands));
8117 }
8118 }
8119 }
8120 }
8121
8122 }
8123
8124 //===----------------------------------------------------------------------===//
8125 // Hexagon ABI Implementation
8126 //===----------------------------------------------------------------------===//
8127
8128 namespace {
8129
8130 class HexagonABIInfo : public DefaultABIInfo {
8131 public:
HexagonABIInfo(CodeGenTypes & CGT)8132 HexagonABIInfo(CodeGenTypes &CGT) : DefaultABIInfo(CGT) {}
8133
8134 private:
8135 ABIArgInfo classifyReturnType(QualType RetTy) const;
8136 ABIArgInfo classifyArgumentType(QualType RetTy) const;
8137 ABIArgInfo classifyArgumentType(QualType RetTy, unsigned *RegsLeft) const;
8138
8139 void computeInfo(CGFunctionInfo &FI) const override;
8140
8141 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
8142 QualType Ty) const override;
8143 Address EmitVAArgFromMemory(CodeGenFunction &CFG, Address VAListAddr,
8144 QualType Ty) const;
8145 Address EmitVAArgForHexagon(CodeGenFunction &CFG, Address VAListAddr,
8146 QualType Ty) const;
8147 Address EmitVAArgForHexagonLinux(CodeGenFunction &CFG, Address VAListAddr,
8148 QualType Ty) const;
8149 };
8150
8151 class HexagonTargetCodeGenInfo : public TargetCodeGenInfo {
8152 public:
HexagonTargetCodeGenInfo(CodeGenTypes & CGT)8153 HexagonTargetCodeGenInfo(CodeGenTypes &CGT)
8154 : TargetCodeGenInfo(std::make_unique<HexagonABIInfo>(CGT)) {}
8155
getDwarfEHStackPointer(CodeGen::CodeGenModule & M) const8156 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
8157 return 29;
8158 }
8159
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & GCM) const8160 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
8161 CodeGen::CodeGenModule &GCM) const override {
8162 if (GV->isDeclaration())
8163 return;
8164 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
8165 if (!FD)
8166 return;
8167 }
8168 };
8169
8170 } // namespace
8171
computeInfo(CGFunctionInfo & FI) const8172 void HexagonABIInfo::computeInfo(CGFunctionInfo &FI) const {
8173 unsigned RegsLeft = 6;
8174 if (!getCXXABI().classifyReturnType(FI))
8175 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
8176 for (auto &I : FI.arguments())
8177 I.info = classifyArgumentType(I.type, &RegsLeft);
8178 }
8179
HexagonAdjustRegsLeft(uint64_t Size,unsigned * RegsLeft)8180 static bool HexagonAdjustRegsLeft(uint64_t Size, unsigned *RegsLeft) {
8181 assert(Size <= 64 && "Not expecting to pass arguments larger than 64 bits"
8182 " through registers");
8183
8184 if (*RegsLeft == 0)
8185 return false;
8186
8187 if (Size <= 32) {
8188 (*RegsLeft)--;
8189 return true;
8190 }
8191
8192 if (2 <= (*RegsLeft & (~1U))) {
8193 *RegsLeft = (*RegsLeft & (~1U)) - 2;
8194 return true;
8195 }
8196
8197 // Next available register was r5 but candidate was greater than 32-bits so it
8198 // has to go on the stack. However we still consume r5
8199 if (*RegsLeft == 1)
8200 *RegsLeft = 0;
8201
8202 return false;
8203 }
8204
classifyArgumentType(QualType Ty,unsigned * RegsLeft) const8205 ABIArgInfo HexagonABIInfo::classifyArgumentType(QualType Ty,
8206 unsigned *RegsLeft) const {
8207 if (!isAggregateTypeForABI(Ty)) {
8208 // Treat an enum type as its underlying type.
8209 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
8210 Ty = EnumTy->getDecl()->getIntegerType();
8211
8212 uint64_t Size = getContext().getTypeSize(Ty);
8213 if (Size <= 64)
8214 HexagonAdjustRegsLeft(Size, RegsLeft);
8215
8216 if (Size > 64 && Ty->isExtIntType())
8217 return getNaturalAlignIndirect(Ty, /*ByVal=*/true);
8218
8219 return isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
8220 : ABIArgInfo::getDirect();
8221 }
8222
8223 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
8224 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
8225
8226 // Ignore empty records.
8227 if (isEmptyRecord(getContext(), Ty, true))
8228 return ABIArgInfo::getIgnore();
8229
8230 uint64_t Size = getContext().getTypeSize(Ty);
8231 unsigned Align = getContext().getTypeAlign(Ty);
8232
8233 if (Size > 64)
8234 return getNaturalAlignIndirect(Ty, /*ByVal=*/true);
8235
8236 if (HexagonAdjustRegsLeft(Size, RegsLeft))
8237 Align = Size <= 32 ? 32 : 64;
8238 if (Size <= Align) {
8239 // Pass in the smallest viable integer type.
8240 if (!llvm::isPowerOf2_64(Size))
8241 Size = llvm::NextPowerOf2(Size);
8242 return ABIArgInfo::getDirect(llvm::Type::getIntNTy(getVMContext(), Size));
8243 }
8244 return DefaultABIInfo::classifyArgumentType(Ty);
8245 }
8246
classifyReturnType(QualType RetTy) const8247 ABIArgInfo HexagonABIInfo::classifyReturnType(QualType RetTy) const {
8248 if (RetTy->isVoidType())
8249 return ABIArgInfo::getIgnore();
8250
8251 const TargetInfo &T = CGT.getTarget();
8252 uint64_t Size = getContext().getTypeSize(RetTy);
8253
8254 if (RetTy->getAs<VectorType>()) {
8255 // HVX vectors are returned in vector registers or register pairs.
8256 if (T.hasFeature("hvx")) {
8257 assert(T.hasFeature("hvx-length64b") || T.hasFeature("hvx-length128b"));
8258 uint64_t VecSize = T.hasFeature("hvx-length64b") ? 64*8 : 128*8;
8259 if (Size == VecSize || Size == 2*VecSize)
8260 return ABIArgInfo::getDirectInReg();
8261 }
8262 // Large vector types should be returned via memory.
8263 if (Size > 64)
8264 return getNaturalAlignIndirect(RetTy);
8265 }
8266
8267 if (!isAggregateTypeForABI(RetTy)) {
8268 // Treat an enum type as its underlying type.
8269 if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
8270 RetTy = EnumTy->getDecl()->getIntegerType();
8271
8272 if (Size > 64 && RetTy->isExtIntType())
8273 return getNaturalAlignIndirect(RetTy, /*ByVal=*/false);
8274
8275 return isPromotableIntegerTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
8276 : ABIArgInfo::getDirect();
8277 }
8278
8279 if (isEmptyRecord(getContext(), RetTy, true))
8280 return ABIArgInfo::getIgnore();
8281
8282 // Aggregates <= 8 bytes are returned in registers, other aggregates
8283 // are returned indirectly.
8284 if (Size <= 64) {
8285 // Return in the smallest viable integer type.
8286 if (!llvm::isPowerOf2_64(Size))
8287 Size = llvm::NextPowerOf2(Size);
8288 return ABIArgInfo::getDirect(llvm::Type::getIntNTy(getVMContext(), Size));
8289 }
8290 return getNaturalAlignIndirect(RetTy, /*ByVal=*/true);
8291 }
8292
EmitVAArgFromMemory(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const8293 Address HexagonABIInfo::EmitVAArgFromMemory(CodeGenFunction &CGF,
8294 Address VAListAddr,
8295 QualType Ty) const {
8296 // Load the overflow area pointer.
8297 Address __overflow_area_pointer_p =
8298 CGF.Builder.CreateStructGEP(VAListAddr, 2, "__overflow_area_pointer_p");
8299 llvm::Value *__overflow_area_pointer = CGF.Builder.CreateLoad(
8300 __overflow_area_pointer_p, "__overflow_area_pointer");
8301
8302 uint64_t Align = CGF.getContext().getTypeAlign(Ty) / 8;
8303 if (Align > 4) {
8304 // Alignment should be a power of 2.
8305 assert((Align & (Align - 1)) == 0 && "Alignment is not power of 2!");
8306
8307 // overflow_arg_area = (overflow_arg_area + align - 1) & -align;
8308 llvm::Value *Offset = llvm::ConstantInt::get(CGF.Int64Ty, Align - 1);
8309
8310 // Add offset to the current pointer to access the argument.
8311 __overflow_area_pointer =
8312 CGF.Builder.CreateGEP(__overflow_area_pointer, Offset);
8313 llvm::Value *AsInt =
8314 CGF.Builder.CreatePtrToInt(__overflow_area_pointer, CGF.Int32Ty);
8315
8316 // Create a mask which should be "AND"ed
8317 // with (overflow_arg_area + align - 1)
8318 llvm::Value *Mask = llvm::ConstantInt::get(CGF.Int32Ty, -(int)Align);
8319 __overflow_area_pointer = CGF.Builder.CreateIntToPtr(
8320 CGF.Builder.CreateAnd(AsInt, Mask), __overflow_area_pointer->getType(),
8321 "__overflow_area_pointer.align");
8322 }
8323
8324 // Get the type of the argument from memory and bitcast
8325 // overflow area pointer to the argument type.
8326 llvm::Type *PTy = CGF.ConvertTypeForMem(Ty);
8327 Address AddrTyped = CGF.Builder.CreateBitCast(
8328 Address(__overflow_area_pointer, CharUnits::fromQuantity(Align)),
8329 llvm::PointerType::getUnqual(PTy));
8330
8331 // Round up to the minimum stack alignment for varargs which is 4 bytes.
8332 uint64_t Offset = llvm::alignTo(CGF.getContext().getTypeSize(Ty) / 8, 4);
8333
8334 __overflow_area_pointer = CGF.Builder.CreateGEP(
8335 __overflow_area_pointer, llvm::ConstantInt::get(CGF.Int32Ty, Offset),
8336 "__overflow_area_pointer.next");
8337 CGF.Builder.CreateStore(__overflow_area_pointer, __overflow_area_pointer_p);
8338
8339 return AddrTyped;
8340 }
8341
EmitVAArgForHexagon(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const8342 Address HexagonABIInfo::EmitVAArgForHexagon(CodeGenFunction &CGF,
8343 Address VAListAddr,
8344 QualType Ty) const {
8345 // FIXME: Need to handle alignment
8346 llvm::Type *BP = CGF.Int8PtrTy;
8347 llvm::Type *BPP = CGF.Int8PtrPtrTy;
8348 CGBuilderTy &Builder = CGF.Builder;
8349 Address VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP, "ap");
8350 llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur");
8351 // Handle address alignment for type alignment > 32 bits
8352 uint64_t TyAlign = CGF.getContext().getTypeAlign(Ty) / 8;
8353 if (TyAlign > 4) {
8354 assert((TyAlign & (TyAlign - 1)) == 0 && "Alignment is not power of 2!");
8355 llvm::Value *AddrAsInt = Builder.CreatePtrToInt(Addr, CGF.Int32Ty);
8356 AddrAsInt = Builder.CreateAdd(AddrAsInt, Builder.getInt32(TyAlign - 1));
8357 AddrAsInt = Builder.CreateAnd(AddrAsInt, Builder.getInt32(~(TyAlign - 1)));
8358 Addr = Builder.CreateIntToPtr(AddrAsInt, BP);
8359 }
8360 llvm::Type *PTy = llvm::PointerType::getUnqual(CGF.ConvertType(Ty));
8361 Address AddrTyped = Builder.CreateBitCast(
8362 Address(Addr, CharUnits::fromQuantity(TyAlign)), PTy);
8363
8364 uint64_t Offset = llvm::alignTo(CGF.getContext().getTypeSize(Ty) / 8, 4);
8365 llvm::Value *NextAddr = Builder.CreateGEP(
8366 Addr, llvm::ConstantInt::get(CGF.Int32Ty, Offset), "ap.next");
8367 Builder.CreateStore(NextAddr, VAListAddrAsBPP);
8368
8369 return AddrTyped;
8370 }
8371
EmitVAArgForHexagonLinux(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const8372 Address HexagonABIInfo::EmitVAArgForHexagonLinux(CodeGenFunction &CGF,
8373 Address VAListAddr,
8374 QualType Ty) const {
8375 int ArgSize = CGF.getContext().getTypeSize(Ty) / 8;
8376
8377 if (ArgSize > 8)
8378 return EmitVAArgFromMemory(CGF, VAListAddr, Ty);
8379
8380 // Here we have check if the argument is in register area or
8381 // in overflow area.
8382 // If the saved register area pointer + argsize rounded up to alignment >
8383 // saved register area end pointer, argument is in overflow area.
8384 unsigned RegsLeft = 6;
8385 Ty = CGF.getContext().getCanonicalType(Ty);
8386 (void)classifyArgumentType(Ty, &RegsLeft);
8387
8388 llvm::BasicBlock *MaybeRegBlock = CGF.createBasicBlock("vaarg.maybe_reg");
8389 llvm::BasicBlock *InRegBlock = CGF.createBasicBlock("vaarg.in_reg");
8390 llvm::BasicBlock *OnStackBlock = CGF.createBasicBlock("vaarg.on_stack");
8391 llvm::BasicBlock *ContBlock = CGF.createBasicBlock("vaarg.end");
8392
8393 // Get rounded size of the argument.GCC does not allow vararg of
8394 // size < 4 bytes. We follow the same logic here.
8395 ArgSize = (CGF.getContext().getTypeSize(Ty) <= 32) ? 4 : 8;
8396 int ArgAlign = (CGF.getContext().getTypeSize(Ty) <= 32) ? 4 : 8;
8397
8398 // Argument may be in saved register area
8399 CGF.EmitBlock(MaybeRegBlock);
8400
8401 // Load the current saved register area pointer.
8402 Address __current_saved_reg_area_pointer_p = CGF.Builder.CreateStructGEP(
8403 VAListAddr, 0, "__current_saved_reg_area_pointer_p");
8404 llvm::Value *__current_saved_reg_area_pointer = CGF.Builder.CreateLoad(
8405 __current_saved_reg_area_pointer_p, "__current_saved_reg_area_pointer");
8406
8407 // Load the saved register area end pointer.
8408 Address __saved_reg_area_end_pointer_p = CGF.Builder.CreateStructGEP(
8409 VAListAddr, 1, "__saved_reg_area_end_pointer_p");
8410 llvm::Value *__saved_reg_area_end_pointer = CGF.Builder.CreateLoad(
8411 __saved_reg_area_end_pointer_p, "__saved_reg_area_end_pointer");
8412
8413 // If the size of argument is > 4 bytes, check if the stack
8414 // location is aligned to 8 bytes
8415 if (ArgAlign > 4) {
8416
8417 llvm::Value *__current_saved_reg_area_pointer_int =
8418 CGF.Builder.CreatePtrToInt(__current_saved_reg_area_pointer,
8419 CGF.Int32Ty);
8420
8421 __current_saved_reg_area_pointer_int = CGF.Builder.CreateAdd(
8422 __current_saved_reg_area_pointer_int,
8423 llvm::ConstantInt::get(CGF.Int32Ty, (ArgAlign - 1)),
8424 "align_current_saved_reg_area_pointer");
8425
8426 __current_saved_reg_area_pointer_int =
8427 CGF.Builder.CreateAnd(__current_saved_reg_area_pointer_int,
8428 llvm::ConstantInt::get(CGF.Int32Ty, -ArgAlign),
8429 "align_current_saved_reg_area_pointer");
8430
8431 __current_saved_reg_area_pointer =
8432 CGF.Builder.CreateIntToPtr(__current_saved_reg_area_pointer_int,
8433 __current_saved_reg_area_pointer->getType(),
8434 "align_current_saved_reg_area_pointer");
8435 }
8436
8437 llvm::Value *__new_saved_reg_area_pointer =
8438 CGF.Builder.CreateGEP(__current_saved_reg_area_pointer,
8439 llvm::ConstantInt::get(CGF.Int32Ty, ArgSize),
8440 "__new_saved_reg_area_pointer");
8441
8442 llvm::Value *UsingStack = 0;
8443 UsingStack = CGF.Builder.CreateICmpSGT(__new_saved_reg_area_pointer,
8444 __saved_reg_area_end_pointer);
8445
8446 CGF.Builder.CreateCondBr(UsingStack, OnStackBlock, InRegBlock);
8447
8448 // Argument in saved register area
8449 // Implement the block where argument is in register saved area
8450 CGF.EmitBlock(InRegBlock);
8451
8452 llvm::Type *PTy = CGF.ConvertType(Ty);
8453 llvm::Value *__saved_reg_area_p = CGF.Builder.CreateBitCast(
8454 __current_saved_reg_area_pointer, llvm::PointerType::getUnqual(PTy));
8455
8456 CGF.Builder.CreateStore(__new_saved_reg_area_pointer,
8457 __current_saved_reg_area_pointer_p);
8458
8459 CGF.EmitBranch(ContBlock);
8460
8461 // Argument in overflow area
8462 // Implement the block where the argument is in overflow area.
8463 CGF.EmitBlock(OnStackBlock);
8464
8465 // Load the overflow area pointer
8466 Address __overflow_area_pointer_p =
8467 CGF.Builder.CreateStructGEP(VAListAddr, 2, "__overflow_area_pointer_p");
8468 llvm::Value *__overflow_area_pointer = CGF.Builder.CreateLoad(
8469 __overflow_area_pointer_p, "__overflow_area_pointer");
8470
8471 // Align the overflow area pointer according to the alignment of the argument
8472 if (ArgAlign > 4) {
8473 llvm::Value *__overflow_area_pointer_int =
8474 CGF.Builder.CreatePtrToInt(__overflow_area_pointer, CGF.Int32Ty);
8475
8476 __overflow_area_pointer_int =
8477 CGF.Builder.CreateAdd(__overflow_area_pointer_int,
8478 llvm::ConstantInt::get(CGF.Int32Ty, ArgAlign - 1),
8479 "align_overflow_area_pointer");
8480
8481 __overflow_area_pointer_int =
8482 CGF.Builder.CreateAnd(__overflow_area_pointer_int,
8483 llvm::ConstantInt::get(CGF.Int32Ty, -ArgAlign),
8484 "align_overflow_area_pointer");
8485
8486 __overflow_area_pointer = CGF.Builder.CreateIntToPtr(
8487 __overflow_area_pointer_int, __overflow_area_pointer->getType(),
8488 "align_overflow_area_pointer");
8489 }
8490
8491 // Get the pointer for next argument in overflow area and store it
8492 // to overflow area pointer.
8493 llvm::Value *__new_overflow_area_pointer = CGF.Builder.CreateGEP(
8494 __overflow_area_pointer, llvm::ConstantInt::get(CGF.Int32Ty, ArgSize),
8495 "__overflow_area_pointer.next");
8496
8497 CGF.Builder.CreateStore(__new_overflow_area_pointer,
8498 __overflow_area_pointer_p);
8499
8500 CGF.Builder.CreateStore(__new_overflow_area_pointer,
8501 __current_saved_reg_area_pointer_p);
8502
8503 // Bitcast the overflow area pointer to the type of argument.
8504 llvm::Type *OverflowPTy = CGF.ConvertTypeForMem(Ty);
8505 llvm::Value *__overflow_area_p = CGF.Builder.CreateBitCast(
8506 __overflow_area_pointer, llvm::PointerType::getUnqual(OverflowPTy));
8507
8508 CGF.EmitBranch(ContBlock);
8509
8510 // Get the correct pointer to load the variable argument
8511 // Implement the ContBlock
8512 CGF.EmitBlock(ContBlock);
8513
8514 llvm::Type *MemPTy = llvm::PointerType::getUnqual(CGF.ConvertTypeForMem(Ty));
8515 llvm::PHINode *ArgAddr = CGF.Builder.CreatePHI(MemPTy, 2, "vaarg.addr");
8516 ArgAddr->addIncoming(__saved_reg_area_p, InRegBlock);
8517 ArgAddr->addIncoming(__overflow_area_p, OnStackBlock);
8518
8519 return Address(ArgAddr, CharUnits::fromQuantity(ArgAlign));
8520 }
8521
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const8522 Address HexagonABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
8523 QualType Ty) const {
8524
8525 if (getTarget().getTriple().isMusl())
8526 return EmitVAArgForHexagonLinux(CGF, VAListAddr, Ty);
8527
8528 return EmitVAArgForHexagon(CGF, VAListAddr, Ty);
8529 }
8530
8531 //===----------------------------------------------------------------------===//
8532 // Lanai ABI Implementation
8533 //===----------------------------------------------------------------------===//
8534
8535 namespace {
8536 class LanaiABIInfo : public DefaultABIInfo {
8537 public:
LanaiABIInfo(CodeGen::CodeGenTypes & CGT)8538 LanaiABIInfo(CodeGen::CodeGenTypes &CGT) : DefaultABIInfo(CGT) {}
8539
8540 bool shouldUseInReg(QualType Ty, CCState &State) const;
8541
computeInfo(CGFunctionInfo & FI) const8542 void computeInfo(CGFunctionInfo &FI) const override {
8543 CCState State(FI);
8544 // Lanai uses 4 registers to pass arguments unless the function has the
8545 // regparm attribute set.
8546 if (FI.getHasRegParm()) {
8547 State.FreeRegs = FI.getRegParm();
8548 } else {
8549 State.FreeRegs = 4;
8550 }
8551
8552 if (!getCXXABI().classifyReturnType(FI))
8553 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
8554 for (auto &I : FI.arguments())
8555 I.info = classifyArgumentType(I.type, State);
8556 }
8557
8558 ABIArgInfo getIndirectResult(QualType Ty, bool ByVal, CCState &State) const;
8559 ABIArgInfo classifyArgumentType(QualType RetTy, CCState &State) const;
8560 };
8561 } // end anonymous namespace
8562
shouldUseInReg(QualType Ty,CCState & State) const8563 bool LanaiABIInfo::shouldUseInReg(QualType Ty, CCState &State) const {
8564 unsigned Size = getContext().getTypeSize(Ty);
8565 unsigned SizeInRegs = llvm::alignTo(Size, 32U) / 32U;
8566
8567 if (SizeInRegs == 0)
8568 return false;
8569
8570 if (SizeInRegs > State.FreeRegs) {
8571 State.FreeRegs = 0;
8572 return false;
8573 }
8574
8575 State.FreeRegs -= SizeInRegs;
8576
8577 return true;
8578 }
8579
getIndirectResult(QualType Ty,bool ByVal,CCState & State) const8580 ABIArgInfo LanaiABIInfo::getIndirectResult(QualType Ty, bool ByVal,
8581 CCState &State) const {
8582 if (!ByVal) {
8583 if (State.FreeRegs) {
8584 --State.FreeRegs; // Non-byval indirects just use one pointer.
8585 return getNaturalAlignIndirectInReg(Ty);
8586 }
8587 return getNaturalAlignIndirect(Ty, false);
8588 }
8589
8590 // Compute the byval alignment.
8591 const unsigned MinABIStackAlignInBytes = 4;
8592 unsigned TypeAlign = getContext().getTypeAlign(Ty) / 8;
8593 return ABIArgInfo::getIndirect(CharUnits::fromQuantity(4), /*ByVal=*/true,
8594 /*Realign=*/TypeAlign >
8595 MinABIStackAlignInBytes);
8596 }
8597
classifyArgumentType(QualType Ty,CCState & State) const8598 ABIArgInfo LanaiABIInfo::classifyArgumentType(QualType Ty,
8599 CCState &State) const {
8600 // Check with the C++ ABI first.
8601 const RecordType *RT = Ty->getAs<RecordType>();
8602 if (RT) {
8603 CGCXXABI::RecordArgABI RAA = getRecordArgABI(RT, getCXXABI());
8604 if (RAA == CGCXXABI::RAA_Indirect) {
8605 return getIndirectResult(Ty, /*ByVal=*/false, State);
8606 } else if (RAA == CGCXXABI::RAA_DirectInMemory) {
8607 return getNaturalAlignIndirect(Ty, /*ByVal=*/true);
8608 }
8609 }
8610
8611 if (isAggregateTypeForABI(Ty)) {
8612 // Structures with flexible arrays are always indirect.
8613 if (RT && RT->getDecl()->hasFlexibleArrayMember())
8614 return getIndirectResult(Ty, /*ByVal=*/true, State);
8615
8616 // Ignore empty structs/unions.
8617 if (isEmptyRecord(getContext(), Ty, true))
8618 return ABIArgInfo::getIgnore();
8619
8620 llvm::LLVMContext &LLVMContext = getVMContext();
8621 unsigned SizeInRegs = (getContext().getTypeSize(Ty) + 31) / 32;
8622 if (SizeInRegs <= State.FreeRegs) {
8623 llvm::IntegerType *Int32 = llvm::Type::getInt32Ty(LLVMContext);
8624 SmallVector<llvm::Type *, 3> Elements(SizeInRegs, Int32);
8625 llvm::Type *Result = llvm::StructType::get(LLVMContext, Elements);
8626 State.FreeRegs -= SizeInRegs;
8627 return ABIArgInfo::getDirectInReg(Result);
8628 } else {
8629 State.FreeRegs = 0;
8630 }
8631 return getIndirectResult(Ty, true, State);
8632 }
8633
8634 // Treat an enum type as its underlying type.
8635 if (const auto *EnumTy = Ty->getAs<EnumType>())
8636 Ty = EnumTy->getDecl()->getIntegerType();
8637
8638 bool InReg = shouldUseInReg(Ty, State);
8639
8640 // Don't pass >64 bit integers in registers.
8641 if (const auto *EIT = Ty->getAs<ExtIntType>())
8642 if (EIT->getNumBits() > 64)
8643 return getIndirectResult(Ty, /*ByVal=*/true, State);
8644
8645 if (isPromotableIntegerTypeForABI(Ty)) {
8646 if (InReg)
8647 return ABIArgInfo::getDirectInReg();
8648 return ABIArgInfo::getExtend(Ty);
8649 }
8650 if (InReg)
8651 return ABIArgInfo::getDirectInReg();
8652 return ABIArgInfo::getDirect();
8653 }
8654
8655 namespace {
8656 class LanaiTargetCodeGenInfo : public TargetCodeGenInfo {
8657 public:
LanaiTargetCodeGenInfo(CodeGen::CodeGenTypes & CGT)8658 LanaiTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT)
8659 : TargetCodeGenInfo(std::make_unique<LanaiABIInfo>(CGT)) {}
8660 };
8661 }
8662
8663 //===----------------------------------------------------------------------===//
8664 // AMDGPU ABI Implementation
8665 //===----------------------------------------------------------------------===//
8666
8667 namespace {
8668
8669 class AMDGPUABIInfo final : public DefaultABIInfo {
8670 private:
8671 static const unsigned MaxNumRegsForArgsRet = 16;
8672
8673 unsigned numRegsForType(QualType Ty) const;
8674
8675 bool isHomogeneousAggregateBaseType(QualType Ty) const override;
8676 bool isHomogeneousAggregateSmallEnough(const Type *Base,
8677 uint64_t Members) const override;
8678
8679 // Coerce HIP scalar pointer arguments from generic pointers to global ones.
coerceKernelArgumentType(llvm::Type * Ty,unsigned FromAS,unsigned ToAS) const8680 llvm::Type *coerceKernelArgumentType(llvm::Type *Ty, unsigned FromAS,
8681 unsigned ToAS) const {
8682 // Single value types.
8683 if (Ty->isPointerTy() && Ty->getPointerAddressSpace() == FromAS)
8684 return llvm::PointerType::get(
8685 cast<llvm::PointerType>(Ty)->getElementType(), ToAS);
8686 return Ty;
8687 }
8688
8689 public:
AMDGPUABIInfo(CodeGen::CodeGenTypes & CGT)8690 explicit AMDGPUABIInfo(CodeGen::CodeGenTypes &CGT) :
8691 DefaultABIInfo(CGT) {}
8692
8693 ABIArgInfo classifyReturnType(QualType RetTy) const;
8694 ABIArgInfo classifyKernelArgumentType(QualType Ty) const;
8695 ABIArgInfo classifyArgumentType(QualType Ty, unsigned &NumRegsLeft) const;
8696
8697 void computeInfo(CGFunctionInfo &FI) const override;
8698 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
8699 QualType Ty) const override;
8700 };
8701
isHomogeneousAggregateBaseType(QualType Ty) const8702 bool AMDGPUABIInfo::isHomogeneousAggregateBaseType(QualType Ty) const {
8703 return true;
8704 }
8705
isHomogeneousAggregateSmallEnough(const Type * Base,uint64_t Members) const8706 bool AMDGPUABIInfo::isHomogeneousAggregateSmallEnough(
8707 const Type *Base, uint64_t Members) const {
8708 uint32_t NumRegs = (getContext().getTypeSize(Base) + 31) / 32;
8709
8710 // Homogeneous Aggregates may occupy at most 16 registers.
8711 return Members * NumRegs <= MaxNumRegsForArgsRet;
8712 }
8713
8714 /// Estimate number of registers the type will use when passed in registers.
numRegsForType(QualType Ty) const8715 unsigned AMDGPUABIInfo::numRegsForType(QualType Ty) const {
8716 unsigned NumRegs = 0;
8717
8718 if (const VectorType *VT = Ty->getAs<VectorType>()) {
8719 // Compute from the number of elements. The reported size is based on the
8720 // in-memory size, which includes the padding 4th element for 3-vectors.
8721 QualType EltTy = VT->getElementType();
8722 unsigned EltSize = getContext().getTypeSize(EltTy);
8723
8724 // 16-bit element vectors should be passed as packed.
8725 if (EltSize == 16)
8726 return (VT->getNumElements() + 1) / 2;
8727
8728 unsigned EltNumRegs = (EltSize + 31) / 32;
8729 return EltNumRegs * VT->getNumElements();
8730 }
8731
8732 if (const RecordType *RT = Ty->getAs<RecordType>()) {
8733 const RecordDecl *RD = RT->getDecl();
8734 assert(!RD->hasFlexibleArrayMember());
8735
8736 for (const FieldDecl *Field : RD->fields()) {
8737 QualType FieldTy = Field->getType();
8738 NumRegs += numRegsForType(FieldTy);
8739 }
8740
8741 return NumRegs;
8742 }
8743
8744 return (getContext().getTypeSize(Ty) + 31) / 32;
8745 }
8746
computeInfo(CGFunctionInfo & FI) const8747 void AMDGPUABIInfo::computeInfo(CGFunctionInfo &FI) const {
8748 llvm::CallingConv::ID CC = FI.getCallingConvention();
8749
8750 if (!getCXXABI().classifyReturnType(FI))
8751 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
8752
8753 unsigned NumRegsLeft = MaxNumRegsForArgsRet;
8754 for (auto &Arg : FI.arguments()) {
8755 if (CC == llvm::CallingConv::AMDGPU_KERNEL) {
8756 Arg.info = classifyKernelArgumentType(Arg.type);
8757 } else {
8758 Arg.info = classifyArgumentType(Arg.type, NumRegsLeft);
8759 }
8760 }
8761 }
8762
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const8763 Address AMDGPUABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
8764 QualType Ty) const {
8765 llvm_unreachable("AMDGPU does not support varargs");
8766 }
8767
classifyReturnType(QualType RetTy) const8768 ABIArgInfo AMDGPUABIInfo::classifyReturnType(QualType RetTy) const {
8769 if (isAggregateTypeForABI(RetTy)) {
8770 // Records with non-trivial destructors/copy-constructors should not be
8771 // returned by value.
8772 if (!getRecordArgABI(RetTy, getCXXABI())) {
8773 // Ignore empty structs/unions.
8774 if (isEmptyRecord(getContext(), RetTy, true))
8775 return ABIArgInfo::getIgnore();
8776
8777 // Lower single-element structs to just return a regular value.
8778 if (const Type *SeltTy = isSingleElementStruct(RetTy, getContext()))
8779 return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0)));
8780
8781 if (const RecordType *RT = RetTy->getAs<RecordType>()) {
8782 const RecordDecl *RD = RT->getDecl();
8783 if (RD->hasFlexibleArrayMember())
8784 return DefaultABIInfo::classifyReturnType(RetTy);
8785 }
8786
8787 // Pack aggregates <= 4 bytes into single VGPR or pair.
8788 uint64_t Size = getContext().getTypeSize(RetTy);
8789 if (Size <= 16)
8790 return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext()));
8791
8792 if (Size <= 32)
8793 return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
8794
8795 if (Size <= 64) {
8796 llvm::Type *I32Ty = llvm::Type::getInt32Ty(getVMContext());
8797 return ABIArgInfo::getDirect(llvm::ArrayType::get(I32Ty, 2));
8798 }
8799
8800 if (numRegsForType(RetTy) <= MaxNumRegsForArgsRet)
8801 return ABIArgInfo::getDirect();
8802 }
8803 }
8804
8805 // Otherwise just do the default thing.
8806 return DefaultABIInfo::classifyReturnType(RetTy);
8807 }
8808
8809 /// For kernels all parameters are really passed in a special buffer. It doesn't
8810 /// make sense to pass anything byval, so everything must be direct.
classifyKernelArgumentType(QualType Ty) const8811 ABIArgInfo AMDGPUABIInfo::classifyKernelArgumentType(QualType Ty) const {
8812 Ty = useFirstFieldIfTransparentUnion(Ty);
8813
8814 // TODO: Can we omit empty structs?
8815
8816 if (const Type *SeltTy = isSingleElementStruct(Ty, getContext()))
8817 Ty = QualType(SeltTy, 0);
8818
8819 llvm::Type *OrigLTy = CGT.ConvertType(Ty);
8820 llvm::Type *LTy = OrigLTy;
8821 if (getContext().getLangOpts().HIP) {
8822 LTy = coerceKernelArgumentType(
8823 OrigLTy, /*FromAS=*/getContext().getTargetAddressSpace(LangAS::Default),
8824 /*ToAS=*/getContext().getTargetAddressSpace(LangAS::cuda_device));
8825 }
8826
8827 // FIXME: Should also use this for OpenCL, but it requires addressing the
8828 // problem of kernels being called.
8829 //
8830 // FIXME: This doesn't apply the optimization of coercing pointers in structs
8831 // to global address space when using byref. This would require implementing a
8832 // new kind of coercion of the in-memory type when for indirect arguments.
8833 if (!getContext().getLangOpts().OpenCL && LTy == OrigLTy &&
8834 isAggregateTypeForABI(Ty)) {
8835 return ABIArgInfo::getIndirectAliased(
8836 getContext().getTypeAlignInChars(Ty),
8837 getContext().getTargetAddressSpace(LangAS::opencl_constant),
8838 false /*Realign*/, nullptr /*Padding*/);
8839 }
8840
8841 // If we set CanBeFlattened to true, CodeGen will expand the struct to its
8842 // individual elements, which confuses the Clover OpenCL backend; therefore we
8843 // have to set it to false here. Other args of getDirect() are just defaults.
8844 return ABIArgInfo::getDirect(LTy, 0, nullptr, false);
8845 }
8846
classifyArgumentType(QualType Ty,unsigned & NumRegsLeft) const8847 ABIArgInfo AMDGPUABIInfo::classifyArgumentType(QualType Ty,
8848 unsigned &NumRegsLeft) const {
8849 assert(NumRegsLeft <= MaxNumRegsForArgsRet && "register estimate underflow");
8850
8851 Ty = useFirstFieldIfTransparentUnion(Ty);
8852
8853 if (isAggregateTypeForABI(Ty)) {
8854 // Records with non-trivial destructors/copy-constructors should not be
8855 // passed by value.
8856 if (auto RAA = getRecordArgABI(Ty, getCXXABI()))
8857 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
8858
8859 // Ignore empty structs/unions.
8860 if (isEmptyRecord(getContext(), Ty, true))
8861 return ABIArgInfo::getIgnore();
8862
8863 // Lower single-element structs to just pass a regular value. TODO: We
8864 // could do reasonable-size multiple-element structs too, using getExpand(),
8865 // though watch out for things like bitfields.
8866 if (const Type *SeltTy = isSingleElementStruct(Ty, getContext()))
8867 return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0)));
8868
8869 if (const RecordType *RT = Ty->getAs<RecordType>()) {
8870 const RecordDecl *RD = RT->getDecl();
8871 if (RD->hasFlexibleArrayMember())
8872 return DefaultABIInfo::classifyArgumentType(Ty);
8873 }
8874
8875 // Pack aggregates <= 8 bytes into single VGPR or pair.
8876 uint64_t Size = getContext().getTypeSize(Ty);
8877 if (Size <= 64) {
8878 unsigned NumRegs = (Size + 31) / 32;
8879 NumRegsLeft -= std::min(NumRegsLeft, NumRegs);
8880
8881 if (Size <= 16)
8882 return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext()));
8883
8884 if (Size <= 32)
8885 return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
8886
8887 // XXX: Should this be i64 instead, and should the limit increase?
8888 llvm::Type *I32Ty = llvm::Type::getInt32Ty(getVMContext());
8889 return ABIArgInfo::getDirect(llvm::ArrayType::get(I32Ty, 2));
8890 }
8891
8892 if (NumRegsLeft > 0) {
8893 unsigned NumRegs = numRegsForType(Ty);
8894 if (NumRegsLeft >= NumRegs) {
8895 NumRegsLeft -= NumRegs;
8896 return ABIArgInfo::getDirect();
8897 }
8898 }
8899 }
8900
8901 // Otherwise just do the default thing.
8902 ABIArgInfo ArgInfo = DefaultABIInfo::classifyArgumentType(Ty);
8903 if (!ArgInfo.isIndirect()) {
8904 unsigned NumRegs = numRegsForType(Ty);
8905 NumRegsLeft -= std::min(NumRegs, NumRegsLeft);
8906 }
8907
8908 return ArgInfo;
8909 }
8910
8911 class AMDGPUTargetCodeGenInfo : public TargetCodeGenInfo {
8912 public:
AMDGPUTargetCodeGenInfo(CodeGenTypes & CGT)8913 AMDGPUTargetCodeGenInfo(CodeGenTypes &CGT)
8914 : TargetCodeGenInfo(std::make_unique<AMDGPUABIInfo>(CGT)) {}
8915 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
8916 CodeGen::CodeGenModule &M) const override;
8917 unsigned getOpenCLKernelCallingConv() const override;
8918
8919 llvm::Constant *getNullPointer(const CodeGen::CodeGenModule &CGM,
8920 llvm::PointerType *T, QualType QT) const override;
8921
getASTAllocaAddressSpace() const8922 LangAS getASTAllocaAddressSpace() const override {
8923 return getLangASFromTargetAS(
8924 getABIInfo().getDataLayout().getAllocaAddrSpace());
8925 }
8926 LangAS getGlobalVarAddressSpace(CodeGenModule &CGM,
8927 const VarDecl *D) const override;
8928 llvm::SyncScope::ID getLLVMSyncScopeID(const LangOptions &LangOpts,
8929 SyncScope Scope,
8930 llvm::AtomicOrdering Ordering,
8931 llvm::LLVMContext &Ctx) const override;
8932 llvm::Function *
8933 createEnqueuedBlockKernel(CodeGenFunction &CGF,
8934 llvm::Function *BlockInvokeFunc,
8935 llvm::Value *BlockLiteral) const override;
8936 bool shouldEmitStaticExternCAliases() const override;
8937 void setCUDAKernelCallingConvention(const FunctionType *&FT) const override;
8938 };
8939 }
8940
requiresAMDGPUProtectedVisibility(const Decl * D,llvm::GlobalValue * GV)8941 static bool requiresAMDGPUProtectedVisibility(const Decl *D,
8942 llvm::GlobalValue *GV) {
8943 if (GV->getVisibility() != llvm::GlobalValue::HiddenVisibility)
8944 return false;
8945
8946 return D->hasAttr<OpenCLKernelAttr>() ||
8947 (isa<FunctionDecl>(D) && D->hasAttr<CUDAGlobalAttr>()) ||
8948 (isa<VarDecl>(D) &&
8949 (D->hasAttr<CUDADeviceAttr>() || D->hasAttr<CUDAConstantAttr>() ||
8950 cast<VarDecl>(D)->getType()->isCUDADeviceBuiltinSurfaceType() ||
8951 cast<VarDecl>(D)->getType()->isCUDADeviceBuiltinTextureType()));
8952 }
8953
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & M) const8954 void AMDGPUTargetCodeGenInfo::setTargetAttributes(
8955 const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &M) const {
8956 if (requiresAMDGPUProtectedVisibility(D, GV)) {
8957 GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
8958 GV->setDSOLocal(true);
8959 }
8960
8961 if (GV->isDeclaration())
8962 return;
8963 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
8964 if (!FD)
8965 return;
8966
8967 llvm::Function *F = cast<llvm::Function>(GV);
8968
8969 const auto *ReqdWGS = M.getLangOpts().OpenCL ?
8970 FD->getAttr<ReqdWorkGroupSizeAttr>() : nullptr;
8971
8972
8973 const bool IsOpenCLKernel = M.getLangOpts().OpenCL &&
8974 FD->hasAttr<OpenCLKernelAttr>();
8975 const bool IsHIPKernel = M.getLangOpts().HIP &&
8976 FD->hasAttr<CUDAGlobalAttr>();
8977 if ((IsOpenCLKernel || IsHIPKernel) &&
8978 (M.getTriple().getOS() == llvm::Triple::AMDHSA))
8979 F->addFnAttr("amdgpu-implicitarg-num-bytes", "56");
8980
8981 if (IsHIPKernel)
8982 F->addFnAttr("uniform-work-group-size", "true");
8983
8984
8985 const auto *FlatWGS = FD->getAttr<AMDGPUFlatWorkGroupSizeAttr>();
8986 if (ReqdWGS || FlatWGS) {
8987 unsigned Min = 0;
8988 unsigned Max = 0;
8989 if (FlatWGS) {
8990 Min = FlatWGS->getMin()
8991 ->EvaluateKnownConstInt(M.getContext())
8992 .getExtValue();
8993 Max = FlatWGS->getMax()
8994 ->EvaluateKnownConstInt(M.getContext())
8995 .getExtValue();
8996 }
8997 if (ReqdWGS && Min == 0 && Max == 0)
8998 Min = Max = ReqdWGS->getXDim() * ReqdWGS->getYDim() * ReqdWGS->getZDim();
8999
9000 if (Min != 0) {
9001 assert(Min <= Max && "Min must be less than or equal Max");
9002
9003 std::string AttrVal = llvm::utostr(Min) + "," + llvm::utostr(Max);
9004 F->addFnAttr("amdgpu-flat-work-group-size", AttrVal);
9005 } else
9006 assert(Max == 0 && "Max must be zero");
9007 } else if (IsOpenCLKernel || IsHIPKernel) {
9008 // By default, restrict the maximum size to a value specified by
9009 // --gpu-max-threads-per-block=n or its default value.
9010 std::string AttrVal =
9011 std::string("1,") + llvm::utostr(M.getLangOpts().GPUMaxThreadsPerBlock);
9012 F->addFnAttr("amdgpu-flat-work-group-size", AttrVal);
9013 }
9014
9015 if (const auto *Attr = FD->getAttr<AMDGPUWavesPerEUAttr>()) {
9016 unsigned Min =
9017 Attr->getMin()->EvaluateKnownConstInt(M.getContext()).getExtValue();
9018 unsigned Max = Attr->getMax() ? Attr->getMax()
9019 ->EvaluateKnownConstInt(M.getContext())
9020 .getExtValue()
9021 : 0;
9022
9023 if (Min != 0) {
9024 assert((Max == 0 || Min <= Max) && "Min must be less than or equal Max");
9025
9026 std::string AttrVal = llvm::utostr(Min);
9027 if (Max != 0)
9028 AttrVal = AttrVal + "," + llvm::utostr(Max);
9029 F->addFnAttr("amdgpu-waves-per-eu", AttrVal);
9030 } else
9031 assert(Max == 0 && "Max must be zero");
9032 }
9033
9034 if (const auto *Attr = FD->getAttr<AMDGPUNumSGPRAttr>()) {
9035 unsigned NumSGPR = Attr->getNumSGPR();
9036
9037 if (NumSGPR != 0)
9038 F->addFnAttr("amdgpu-num-sgpr", llvm::utostr(NumSGPR));
9039 }
9040
9041 if (const auto *Attr = FD->getAttr<AMDGPUNumVGPRAttr>()) {
9042 uint32_t NumVGPR = Attr->getNumVGPR();
9043
9044 if (NumVGPR != 0)
9045 F->addFnAttr("amdgpu-num-vgpr", llvm::utostr(NumVGPR));
9046 }
9047
9048 if (M.getContext().getTargetInfo().allowAMDGPUUnsafeFPAtomics())
9049 F->addFnAttr("amdgpu-unsafe-fp-atomics", "true");
9050 }
9051
getOpenCLKernelCallingConv() const9052 unsigned AMDGPUTargetCodeGenInfo::getOpenCLKernelCallingConv() const {
9053 return llvm::CallingConv::AMDGPU_KERNEL;
9054 }
9055
9056 // Currently LLVM assumes null pointers always have value 0,
9057 // which results in incorrectly transformed IR. Therefore, instead of
9058 // emitting null pointers in private and local address spaces, a null
9059 // pointer in generic address space is emitted which is casted to a
9060 // pointer in local or private address space.
getNullPointer(const CodeGen::CodeGenModule & CGM,llvm::PointerType * PT,QualType QT) const9061 llvm::Constant *AMDGPUTargetCodeGenInfo::getNullPointer(
9062 const CodeGen::CodeGenModule &CGM, llvm::PointerType *PT,
9063 QualType QT) const {
9064 if (CGM.getContext().getTargetNullPointerValue(QT) == 0)
9065 return llvm::ConstantPointerNull::get(PT);
9066
9067 auto &Ctx = CGM.getContext();
9068 auto NPT = llvm::PointerType::get(PT->getElementType(),
9069 Ctx.getTargetAddressSpace(LangAS::opencl_generic));
9070 return llvm::ConstantExpr::getAddrSpaceCast(
9071 llvm::ConstantPointerNull::get(NPT), PT);
9072 }
9073
9074 LangAS
getGlobalVarAddressSpace(CodeGenModule & CGM,const VarDecl * D) const9075 AMDGPUTargetCodeGenInfo::getGlobalVarAddressSpace(CodeGenModule &CGM,
9076 const VarDecl *D) const {
9077 assert(!CGM.getLangOpts().OpenCL &&
9078 !(CGM.getLangOpts().CUDA && CGM.getLangOpts().CUDAIsDevice) &&
9079 "Address space agnostic languages only");
9080 LangAS DefaultGlobalAS = getLangASFromTargetAS(
9081 CGM.getContext().getTargetAddressSpace(LangAS::opencl_global));
9082 if (!D)
9083 return DefaultGlobalAS;
9084
9085 LangAS AddrSpace = D->getType().getAddressSpace();
9086 assert(AddrSpace == LangAS::Default || isTargetAddressSpace(AddrSpace));
9087 if (AddrSpace != LangAS::Default)
9088 return AddrSpace;
9089
9090 if (CGM.isTypeConstant(D->getType(), false)) {
9091 if (auto ConstAS = CGM.getTarget().getConstantAddressSpace())
9092 return ConstAS.getValue();
9093 }
9094 return DefaultGlobalAS;
9095 }
9096
9097 llvm::SyncScope::ID
getLLVMSyncScopeID(const LangOptions & LangOpts,SyncScope Scope,llvm::AtomicOrdering Ordering,llvm::LLVMContext & Ctx) const9098 AMDGPUTargetCodeGenInfo::getLLVMSyncScopeID(const LangOptions &LangOpts,
9099 SyncScope Scope,
9100 llvm::AtomicOrdering Ordering,
9101 llvm::LLVMContext &Ctx) const {
9102 std::string Name;
9103 switch (Scope) {
9104 case SyncScope::OpenCLWorkGroup:
9105 Name = "workgroup";
9106 break;
9107 case SyncScope::OpenCLDevice:
9108 Name = "agent";
9109 break;
9110 case SyncScope::OpenCLAllSVMDevices:
9111 Name = "";
9112 break;
9113 case SyncScope::OpenCLSubGroup:
9114 Name = "wavefront";
9115 }
9116
9117 if (Ordering != llvm::AtomicOrdering::SequentiallyConsistent) {
9118 if (!Name.empty())
9119 Name = Twine(Twine(Name) + Twine("-")).str();
9120
9121 Name = Twine(Twine(Name) + Twine("one-as")).str();
9122 }
9123
9124 return Ctx.getOrInsertSyncScopeID(Name);
9125 }
9126
shouldEmitStaticExternCAliases() const9127 bool AMDGPUTargetCodeGenInfo::shouldEmitStaticExternCAliases() const {
9128 return false;
9129 }
9130
setCUDAKernelCallingConvention(const FunctionType * & FT) const9131 void AMDGPUTargetCodeGenInfo::setCUDAKernelCallingConvention(
9132 const FunctionType *&FT) const {
9133 FT = getABIInfo().getContext().adjustFunctionType(
9134 FT, FT->getExtInfo().withCallingConv(CC_OpenCLKernel));
9135 }
9136
9137 //===----------------------------------------------------------------------===//
9138 // SPARC v8 ABI Implementation.
9139 // Based on the SPARC Compliance Definition version 2.4.1.
9140 //
9141 // Ensures that complex values are passed in registers.
9142 //
9143 namespace {
9144 class SparcV8ABIInfo : public DefaultABIInfo {
9145 public:
SparcV8ABIInfo(CodeGenTypes & CGT)9146 SparcV8ABIInfo(CodeGenTypes &CGT) : DefaultABIInfo(CGT) {}
9147
9148 private:
9149 ABIArgInfo classifyReturnType(QualType RetTy) const;
9150 void computeInfo(CGFunctionInfo &FI) const override;
9151 };
9152 } // end anonymous namespace
9153
9154
9155 ABIArgInfo
classifyReturnType(QualType Ty) const9156 SparcV8ABIInfo::classifyReturnType(QualType Ty) const {
9157 if (Ty->isAnyComplexType()) {
9158 return ABIArgInfo::getDirect();
9159 }
9160 else {
9161 return DefaultABIInfo::classifyReturnType(Ty);
9162 }
9163 }
9164
computeInfo(CGFunctionInfo & FI) const9165 void SparcV8ABIInfo::computeInfo(CGFunctionInfo &FI) const {
9166
9167 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
9168 for (auto &Arg : FI.arguments())
9169 Arg.info = classifyArgumentType(Arg.type);
9170 }
9171
9172 namespace {
9173 class SparcV8TargetCodeGenInfo : public TargetCodeGenInfo {
9174 public:
SparcV8TargetCodeGenInfo(CodeGenTypes & CGT)9175 SparcV8TargetCodeGenInfo(CodeGenTypes &CGT)
9176 : TargetCodeGenInfo(std::make_unique<SparcV8ABIInfo>(CGT)) {}
9177 };
9178 } // end anonymous namespace
9179
9180 //===----------------------------------------------------------------------===//
9181 // SPARC v9 ABI Implementation.
9182 // Based on the SPARC Compliance Definition version 2.4.1.
9183 //
9184 // Function arguments a mapped to a nominal "parameter array" and promoted to
9185 // registers depending on their type. Each argument occupies 8 or 16 bytes in
9186 // the array, structs larger than 16 bytes are passed indirectly.
9187 //
9188 // One case requires special care:
9189 //
9190 // struct mixed {
9191 // int i;
9192 // float f;
9193 // };
9194 //
9195 // When a struct mixed is passed by value, it only occupies 8 bytes in the
9196 // parameter array, but the int is passed in an integer register, and the float
9197 // is passed in a floating point register. This is represented as two arguments
9198 // with the LLVM IR inreg attribute:
9199 //
9200 // declare void f(i32 inreg %i, float inreg %f)
9201 //
9202 // The code generator will only allocate 4 bytes from the parameter array for
9203 // the inreg arguments. All other arguments are allocated a multiple of 8
9204 // bytes.
9205 //
9206 namespace {
9207 class SparcV9ABIInfo : public ABIInfo {
9208 public:
SparcV9ABIInfo(CodeGenTypes & CGT)9209 SparcV9ABIInfo(CodeGenTypes &CGT) : ABIInfo(CGT) {}
9210
9211 private:
9212 ABIArgInfo classifyType(QualType RetTy, unsigned SizeLimit) const;
9213 void computeInfo(CGFunctionInfo &FI) const override;
9214 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
9215 QualType Ty) const override;
9216
9217 // Coercion type builder for structs passed in registers. The coercion type
9218 // serves two purposes:
9219 //
9220 // 1. Pad structs to a multiple of 64 bits, so they are passed 'left-aligned'
9221 // in registers.
9222 // 2. Expose aligned floating point elements as first-level elements, so the
9223 // code generator knows to pass them in floating point registers.
9224 //
9225 // We also compute the InReg flag which indicates that the struct contains
9226 // aligned 32-bit floats.
9227 //
9228 struct CoerceBuilder {
9229 llvm::LLVMContext &Context;
9230 const llvm::DataLayout &DL;
9231 SmallVector<llvm::Type*, 8> Elems;
9232 uint64_t Size;
9233 bool InReg;
9234
CoerceBuilder__anon57a50d411711::SparcV9ABIInfo::CoerceBuilder9235 CoerceBuilder(llvm::LLVMContext &c, const llvm::DataLayout &dl)
9236 : Context(c), DL(dl), Size(0), InReg(false) {}
9237
9238 // Pad Elems with integers until Size is ToSize.
pad__anon57a50d411711::SparcV9ABIInfo::CoerceBuilder9239 void pad(uint64_t ToSize) {
9240 assert(ToSize >= Size && "Cannot remove elements");
9241 if (ToSize == Size)
9242 return;
9243
9244 // Finish the current 64-bit word.
9245 uint64_t Aligned = llvm::alignTo(Size, 64);
9246 if (Aligned > Size && Aligned <= ToSize) {
9247 Elems.push_back(llvm::IntegerType::get(Context, Aligned - Size));
9248 Size = Aligned;
9249 }
9250
9251 // Add whole 64-bit words.
9252 while (Size + 64 <= ToSize) {
9253 Elems.push_back(llvm::Type::getInt64Ty(Context));
9254 Size += 64;
9255 }
9256
9257 // Final in-word padding.
9258 if (Size < ToSize) {
9259 Elems.push_back(llvm::IntegerType::get(Context, ToSize - Size));
9260 Size = ToSize;
9261 }
9262 }
9263
9264 // Add a floating point element at Offset.
addFloat__anon57a50d411711::SparcV9ABIInfo::CoerceBuilder9265 void addFloat(uint64_t Offset, llvm::Type *Ty, unsigned Bits) {
9266 // Unaligned floats are treated as integers.
9267 if (Offset % Bits)
9268 return;
9269 // The InReg flag is only required if there are any floats < 64 bits.
9270 if (Bits < 64)
9271 InReg = true;
9272 pad(Offset);
9273 Elems.push_back(Ty);
9274 Size = Offset + Bits;
9275 }
9276
9277 // Add a struct type to the coercion type, starting at Offset (in bits).
addStruct__anon57a50d411711::SparcV9ABIInfo::CoerceBuilder9278 void addStruct(uint64_t Offset, llvm::StructType *StrTy) {
9279 const llvm::StructLayout *Layout = DL.getStructLayout(StrTy);
9280 for (unsigned i = 0, e = StrTy->getNumElements(); i != e; ++i) {
9281 llvm::Type *ElemTy = StrTy->getElementType(i);
9282 uint64_t ElemOffset = Offset + Layout->getElementOffsetInBits(i);
9283 switch (ElemTy->getTypeID()) {
9284 case llvm::Type::StructTyID:
9285 addStruct(ElemOffset, cast<llvm::StructType>(ElemTy));
9286 break;
9287 case llvm::Type::FloatTyID:
9288 addFloat(ElemOffset, ElemTy, 32);
9289 break;
9290 case llvm::Type::DoubleTyID:
9291 addFloat(ElemOffset, ElemTy, 64);
9292 break;
9293 case llvm::Type::FP128TyID:
9294 addFloat(ElemOffset, ElemTy, 128);
9295 break;
9296 case llvm::Type::PointerTyID:
9297 if (ElemOffset % 64 == 0) {
9298 pad(ElemOffset);
9299 Elems.push_back(ElemTy);
9300 Size += 64;
9301 }
9302 break;
9303 default:
9304 break;
9305 }
9306 }
9307 }
9308
9309 // Check if Ty is a usable substitute for the coercion type.
isUsableType__anon57a50d411711::SparcV9ABIInfo::CoerceBuilder9310 bool isUsableType(llvm::StructType *Ty) const {
9311 return llvm::makeArrayRef(Elems) == Ty->elements();
9312 }
9313
9314 // Get the coercion type as a literal struct type.
getType__anon57a50d411711::SparcV9ABIInfo::CoerceBuilder9315 llvm::Type *getType() const {
9316 if (Elems.size() == 1)
9317 return Elems.front();
9318 else
9319 return llvm::StructType::get(Context, Elems);
9320 }
9321 };
9322 };
9323 } // end anonymous namespace
9324
9325 ABIArgInfo
classifyType(QualType Ty,unsigned SizeLimit) const9326 SparcV9ABIInfo::classifyType(QualType Ty, unsigned SizeLimit) const {
9327 if (Ty->isVoidType())
9328 return ABIArgInfo::getIgnore();
9329
9330 uint64_t Size = getContext().getTypeSize(Ty);
9331
9332 // Anything too big to fit in registers is passed with an explicit indirect
9333 // pointer / sret pointer.
9334 if (Size > SizeLimit)
9335 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
9336
9337 // Treat an enum type as its underlying type.
9338 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
9339 Ty = EnumTy->getDecl()->getIntegerType();
9340
9341 // Integer types smaller than a register are extended.
9342 if (Size < 64 && Ty->isIntegerType())
9343 return ABIArgInfo::getExtend(Ty);
9344
9345 if (const auto *EIT = Ty->getAs<ExtIntType>())
9346 if (EIT->getNumBits() < 64)
9347 return ABIArgInfo::getExtend(Ty);
9348
9349 // Other non-aggregates go in registers.
9350 if (!isAggregateTypeForABI(Ty))
9351 return ABIArgInfo::getDirect();
9352
9353 // If a C++ object has either a non-trivial copy constructor or a non-trivial
9354 // destructor, it is passed with an explicit indirect pointer / sret pointer.
9355 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI()))
9356 return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
9357
9358 // This is a small aggregate type that should be passed in registers.
9359 // Build a coercion type from the LLVM struct type.
9360 llvm::StructType *StrTy = dyn_cast<llvm::StructType>(CGT.ConvertType(Ty));
9361 if (!StrTy)
9362 return ABIArgInfo::getDirect();
9363
9364 CoerceBuilder CB(getVMContext(), getDataLayout());
9365 CB.addStruct(0, StrTy);
9366 CB.pad(llvm::alignTo(CB.DL.getTypeSizeInBits(StrTy), 64));
9367
9368 // Try to use the original type for coercion.
9369 llvm::Type *CoerceTy = CB.isUsableType(StrTy) ? StrTy : CB.getType();
9370
9371 if (CB.InReg)
9372 return ABIArgInfo::getDirectInReg(CoerceTy);
9373 else
9374 return ABIArgInfo::getDirect(CoerceTy);
9375 }
9376
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const9377 Address SparcV9ABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
9378 QualType Ty) const {
9379 ABIArgInfo AI = classifyType(Ty, 16 * 8);
9380 llvm::Type *ArgTy = CGT.ConvertType(Ty);
9381 if (AI.canHaveCoerceToType() && !AI.getCoerceToType())
9382 AI.setCoerceToType(ArgTy);
9383
9384 CharUnits SlotSize = CharUnits::fromQuantity(8);
9385
9386 CGBuilderTy &Builder = CGF.Builder;
9387 Address Addr(Builder.CreateLoad(VAListAddr, "ap.cur"), SlotSize);
9388 llvm::Type *ArgPtrTy = llvm::PointerType::getUnqual(ArgTy);
9389
9390 auto TypeInfo = getContext().getTypeInfoInChars(Ty);
9391
9392 Address ArgAddr = Address::invalid();
9393 CharUnits Stride;
9394 switch (AI.getKind()) {
9395 case ABIArgInfo::Expand:
9396 case ABIArgInfo::CoerceAndExpand:
9397 case ABIArgInfo::InAlloca:
9398 llvm_unreachable("Unsupported ABI kind for va_arg");
9399
9400 case ABIArgInfo::Extend: {
9401 Stride = SlotSize;
9402 CharUnits Offset = SlotSize - TypeInfo.Width;
9403 ArgAddr = Builder.CreateConstInBoundsByteGEP(Addr, Offset, "extend");
9404 break;
9405 }
9406
9407 case ABIArgInfo::Direct: {
9408 auto AllocSize = getDataLayout().getTypeAllocSize(AI.getCoerceToType());
9409 Stride = CharUnits::fromQuantity(AllocSize).alignTo(SlotSize);
9410 ArgAddr = Addr;
9411 break;
9412 }
9413
9414 case ABIArgInfo::Indirect:
9415 case ABIArgInfo::IndirectAliased:
9416 Stride = SlotSize;
9417 ArgAddr = Builder.CreateElementBitCast(Addr, ArgPtrTy, "indirect");
9418 ArgAddr = Address(Builder.CreateLoad(ArgAddr, "indirect.arg"),
9419 TypeInfo.Align);
9420 break;
9421
9422 case ABIArgInfo::Ignore:
9423 return Address(llvm::UndefValue::get(ArgPtrTy), TypeInfo.Align);
9424 }
9425
9426 // Update VAList.
9427 Address NextPtr = Builder.CreateConstInBoundsByteGEP(Addr, Stride, "ap.next");
9428 Builder.CreateStore(NextPtr.getPointer(), VAListAddr);
9429
9430 return Builder.CreateBitCast(ArgAddr, ArgPtrTy, "arg.addr");
9431 }
9432
computeInfo(CGFunctionInfo & FI) const9433 void SparcV9ABIInfo::computeInfo(CGFunctionInfo &FI) const {
9434 FI.getReturnInfo() = classifyType(FI.getReturnType(), 32 * 8);
9435 for (auto &I : FI.arguments())
9436 I.info = classifyType(I.type, 16 * 8);
9437 }
9438
9439 namespace {
9440 class SparcV9TargetCodeGenInfo : public TargetCodeGenInfo {
9441 public:
SparcV9TargetCodeGenInfo(CodeGenTypes & CGT)9442 SparcV9TargetCodeGenInfo(CodeGenTypes &CGT)
9443 : TargetCodeGenInfo(std::make_unique<SparcV9ABIInfo>(CGT)) {}
9444
getDwarfEHStackPointer(CodeGen::CodeGenModule & M) const9445 int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
9446 return 14;
9447 }
9448
9449 bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
9450 llvm::Value *Address) const override;
9451 };
9452 } // end anonymous namespace
9453
9454 bool
initDwarfEHRegSizeTable(CodeGen::CodeGenFunction & CGF,llvm::Value * Address) const9455 SparcV9TargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
9456 llvm::Value *Address) const {
9457 // This is calculated from the LLVM and GCC tables and verified
9458 // against gcc output. AFAIK all ABIs use the same encoding.
9459
9460 CodeGen::CGBuilderTy &Builder = CGF.Builder;
9461
9462 llvm::IntegerType *i8 = CGF.Int8Ty;
9463 llvm::Value *Four8 = llvm::ConstantInt::get(i8, 4);
9464 llvm::Value *Eight8 = llvm::ConstantInt::get(i8, 8);
9465
9466 // 0-31: the 8-byte general-purpose registers
9467 AssignToArrayRange(Builder, Address, Eight8, 0, 31);
9468
9469 // 32-63: f0-31, the 4-byte floating-point registers
9470 AssignToArrayRange(Builder, Address, Four8, 32, 63);
9471
9472 // Y = 64
9473 // PSR = 65
9474 // WIM = 66
9475 // TBR = 67
9476 // PC = 68
9477 // NPC = 69
9478 // FSR = 70
9479 // CSR = 71
9480 AssignToArrayRange(Builder, Address, Eight8, 64, 71);
9481
9482 // 72-87: d0-15, the 8-byte floating-point registers
9483 AssignToArrayRange(Builder, Address, Eight8, 72, 87);
9484
9485 return false;
9486 }
9487
9488 // ARC ABI implementation.
9489 namespace {
9490
9491 class ARCABIInfo : public DefaultABIInfo {
9492 public:
9493 using DefaultABIInfo::DefaultABIInfo;
9494
9495 private:
9496 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
9497 QualType Ty) const override;
9498
updateState(const ABIArgInfo & Info,QualType Ty,CCState & State) const9499 void updateState(const ABIArgInfo &Info, QualType Ty, CCState &State) const {
9500 if (!State.FreeRegs)
9501 return;
9502 if (Info.isIndirect() && Info.getInReg())
9503 State.FreeRegs--;
9504 else if (Info.isDirect() && Info.getInReg()) {
9505 unsigned sz = (getContext().getTypeSize(Ty) + 31) / 32;
9506 if (sz < State.FreeRegs)
9507 State.FreeRegs -= sz;
9508 else
9509 State.FreeRegs = 0;
9510 }
9511 }
9512
computeInfo(CGFunctionInfo & FI) const9513 void computeInfo(CGFunctionInfo &FI) const override {
9514 CCState State(FI);
9515 // ARC uses 8 registers to pass arguments.
9516 State.FreeRegs = 8;
9517
9518 if (!getCXXABI().classifyReturnType(FI))
9519 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
9520 updateState(FI.getReturnInfo(), FI.getReturnType(), State);
9521 for (auto &I : FI.arguments()) {
9522 I.info = classifyArgumentType(I.type, State.FreeRegs);
9523 updateState(I.info, I.type, State);
9524 }
9525 }
9526
9527 ABIArgInfo getIndirectByRef(QualType Ty, bool HasFreeRegs) const;
9528 ABIArgInfo getIndirectByValue(QualType Ty) const;
9529 ABIArgInfo classifyArgumentType(QualType Ty, uint8_t FreeRegs) const;
9530 ABIArgInfo classifyReturnType(QualType RetTy) const;
9531 };
9532
9533 class ARCTargetCodeGenInfo : public TargetCodeGenInfo {
9534 public:
ARCTargetCodeGenInfo(CodeGenTypes & CGT)9535 ARCTargetCodeGenInfo(CodeGenTypes &CGT)
9536 : TargetCodeGenInfo(std::make_unique<ARCABIInfo>(CGT)) {}
9537 };
9538
9539
getIndirectByRef(QualType Ty,bool HasFreeRegs) const9540 ABIArgInfo ARCABIInfo::getIndirectByRef(QualType Ty, bool HasFreeRegs) const {
9541 return HasFreeRegs ? getNaturalAlignIndirectInReg(Ty) :
9542 getNaturalAlignIndirect(Ty, false);
9543 }
9544
getIndirectByValue(QualType Ty) const9545 ABIArgInfo ARCABIInfo::getIndirectByValue(QualType Ty) const {
9546 // Compute the byval alignment.
9547 const unsigned MinABIStackAlignInBytes = 4;
9548 unsigned TypeAlign = getContext().getTypeAlign(Ty) / 8;
9549 return ABIArgInfo::getIndirect(CharUnits::fromQuantity(4), /*ByVal=*/true,
9550 TypeAlign > MinABIStackAlignInBytes);
9551 }
9552
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const9553 Address ARCABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
9554 QualType Ty) const {
9555 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, /*indirect*/ false,
9556 getContext().getTypeInfoInChars(Ty),
9557 CharUnits::fromQuantity(4), true);
9558 }
9559
classifyArgumentType(QualType Ty,uint8_t FreeRegs) const9560 ABIArgInfo ARCABIInfo::classifyArgumentType(QualType Ty,
9561 uint8_t FreeRegs) const {
9562 // Handle the generic C++ ABI.
9563 const RecordType *RT = Ty->getAs<RecordType>();
9564 if (RT) {
9565 CGCXXABI::RecordArgABI RAA = getRecordArgABI(RT, getCXXABI());
9566 if (RAA == CGCXXABI::RAA_Indirect)
9567 return getIndirectByRef(Ty, FreeRegs > 0);
9568
9569 if (RAA == CGCXXABI::RAA_DirectInMemory)
9570 return getIndirectByValue(Ty);
9571 }
9572
9573 // Treat an enum type as its underlying type.
9574 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
9575 Ty = EnumTy->getDecl()->getIntegerType();
9576
9577 auto SizeInRegs = llvm::alignTo(getContext().getTypeSize(Ty), 32) / 32;
9578
9579 if (isAggregateTypeForABI(Ty)) {
9580 // Structures with flexible arrays are always indirect.
9581 if (RT && RT->getDecl()->hasFlexibleArrayMember())
9582 return getIndirectByValue(Ty);
9583
9584 // Ignore empty structs/unions.
9585 if (isEmptyRecord(getContext(), Ty, true))
9586 return ABIArgInfo::getIgnore();
9587
9588 llvm::LLVMContext &LLVMContext = getVMContext();
9589
9590 llvm::IntegerType *Int32 = llvm::Type::getInt32Ty(LLVMContext);
9591 SmallVector<llvm::Type *, 3> Elements(SizeInRegs, Int32);
9592 llvm::Type *Result = llvm::StructType::get(LLVMContext, Elements);
9593
9594 return FreeRegs >= SizeInRegs ?
9595 ABIArgInfo::getDirectInReg(Result) :
9596 ABIArgInfo::getDirect(Result, 0, nullptr, false);
9597 }
9598
9599 if (const auto *EIT = Ty->getAs<ExtIntType>())
9600 if (EIT->getNumBits() > 64)
9601 return getIndirectByValue(Ty);
9602
9603 return isPromotableIntegerTypeForABI(Ty)
9604 ? (FreeRegs >= SizeInRegs ? ABIArgInfo::getExtendInReg(Ty)
9605 : ABIArgInfo::getExtend(Ty))
9606 : (FreeRegs >= SizeInRegs ? ABIArgInfo::getDirectInReg()
9607 : ABIArgInfo::getDirect());
9608 }
9609
classifyReturnType(QualType RetTy) const9610 ABIArgInfo ARCABIInfo::classifyReturnType(QualType RetTy) const {
9611 if (RetTy->isAnyComplexType())
9612 return ABIArgInfo::getDirectInReg();
9613
9614 // Arguments of size > 4 registers are indirect.
9615 auto RetSize = llvm::alignTo(getContext().getTypeSize(RetTy), 32) / 32;
9616 if (RetSize > 4)
9617 return getIndirectByRef(RetTy, /*HasFreeRegs*/ true);
9618
9619 return DefaultABIInfo::classifyReturnType(RetTy);
9620 }
9621
9622 } // End anonymous namespace.
9623
9624 //===----------------------------------------------------------------------===//
9625 // XCore ABI Implementation
9626 //===----------------------------------------------------------------------===//
9627
9628 namespace {
9629
9630 /// A SmallStringEnc instance is used to build up the TypeString by passing
9631 /// it by reference between functions that append to it.
9632 typedef llvm::SmallString<128> SmallStringEnc;
9633
9634 /// TypeStringCache caches the meta encodings of Types.
9635 ///
9636 /// The reason for caching TypeStrings is two fold:
9637 /// 1. To cache a type's encoding for later uses;
9638 /// 2. As a means to break recursive member type inclusion.
9639 ///
9640 /// A cache Entry can have a Status of:
9641 /// NonRecursive: The type encoding is not recursive;
9642 /// Recursive: The type encoding is recursive;
9643 /// Incomplete: An incomplete TypeString;
9644 /// IncompleteUsed: An incomplete TypeString that has been used in a
9645 /// Recursive type encoding.
9646 ///
9647 /// A NonRecursive entry will have all of its sub-members expanded as fully
9648 /// as possible. Whilst it may contain types which are recursive, the type
9649 /// itself is not recursive and thus its encoding may be safely used whenever
9650 /// the type is encountered.
9651 ///
9652 /// A Recursive entry will have all of its sub-members expanded as fully as
9653 /// possible. The type itself is recursive and it may contain other types which
9654 /// are recursive. The Recursive encoding must not be used during the expansion
9655 /// of a recursive type's recursive branch. For simplicity the code uses
9656 /// IncompleteCount to reject all usage of Recursive encodings for member types.
9657 ///
9658 /// An Incomplete entry is always a RecordType and only encodes its
9659 /// identifier e.g. "s(S){}". Incomplete 'StubEnc' entries are ephemeral and
9660 /// are placed into the cache during type expansion as a means to identify and
9661 /// handle recursive inclusion of types as sub-members. If there is recursion
9662 /// the entry becomes IncompleteUsed.
9663 ///
9664 /// During the expansion of a RecordType's members:
9665 ///
9666 /// If the cache contains a NonRecursive encoding for the member type, the
9667 /// cached encoding is used;
9668 ///
9669 /// If the cache contains a Recursive encoding for the member type, the
9670 /// cached encoding is 'Swapped' out, as it may be incorrect, and...
9671 ///
9672 /// If the member is a RecordType, an Incomplete encoding is placed into the
9673 /// cache to break potential recursive inclusion of itself as a sub-member;
9674 ///
9675 /// Once a member RecordType has been expanded, its temporary incomplete
9676 /// entry is removed from the cache. If a Recursive encoding was swapped out
9677 /// it is swapped back in;
9678 ///
9679 /// If an incomplete entry is used to expand a sub-member, the incomplete
9680 /// entry is marked as IncompleteUsed. The cache keeps count of how many
9681 /// IncompleteUsed entries it currently contains in IncompleteUsedCount;
9682 ///
9683 /// If a member's encoding is found to be a NonRecursive or Recursive viz:
9684 /// IncompleteUsedCount==0, the member's encoding is added to the cache.
9685 /// Else the member is part of a recursive type and thus the recursion has
9686 /// been exited too soon for the encoding to be correct for the member.
9687 ///
9688 class TypeStringCache {
9689 enum Status {NonRecursive, Recursive, Incomplete, IncompleteUsed};
9690 struct Entry {
9691 std::string Str; // The encoded TypeString for the type.
9692 enum Status State; // Information about the encoding in 'Str'.
9693 std::string Swapped; // A temporary place holder for a Recursive encoding
9694 // during the expansion of RecordType's members.
9695 };
9696 std::map<const IdentifierInfo *, struct Entry> Map;
9697 unsigned IncompleteCount; // Number of Incomplete entries in the Map.
9698 unsigned IncompleteUsedCount; // Number of IncompleteUsed entries in the Map.
9699 public:
TypeStringCache()9700 TypeStringCache() : IncompleteCount(0), IncompleteUsedCount(0) {}
9701 void addIncomplete(const IdentifierInfo *ID, std::string StubEnc);
9702 bool removeIncomplete(const IdentifierInfo *ID);
9703 void addIfComplete(const IdentifierInfo *ID, StringRef Str,
9704 bool IsRecursive);
9705 StringRef lookupStr(const IdentifierInfo *ID);
9706 };
9707
9708 /// TypeString encodings for enum & union fields must be order.
9709 /// FieldEncoding is a helper for this ordering process.
9710 class FieldEncoding {
9711 bool HasName;
9712 std::string Enc;
9713 public:
FieldEncoding(bool b,SmallStringEnc & e)9714 FieldEncoding(bool b, SmallStringEnc &e) : HasName(b), Enc(e.c_str()) {}
str()9715 StringRef str() { return Enc; }
operator <(const FieldEncoding & rhs) const9716 bool operator<(const FieldEncoding &rhs) const {
9717 if (HasName != rhs.HasName) return HasName;
9718 return Enc < rhs.Enc;
9719 }
9720 };
9721
9722 class XCoreABIInfo : public DefaultABIInfo {
9723 public:
XCoreABIInfo(CodeGen::CodeGenTypes & CGT)9724 XCoreABIInfo(CodeGen::CodeGenTypes &CGT) : DefaultABIInfo(CGT) {}
9725 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
9726 QualType Ty) const override;
9727 };
9728
9729 class XCoreTargetCodeGenInfo : public TargetCodeGenInfo {
9730 mutable TypeStringCache TSC;
9731 void emitTargetMD(const Decl *D, llvm::GlobalValue *GV,
9732 const CodeGen::CodeGenModule &M) const;
9733
9734 public:
XCoreTargetCodeGenInfo(CodeGenTypes & CGT)9735 XCoreTargetCodeGenInfo(CodeGenTypes &CGT)
9736 : TargetCodeGenInfo(std::make_unique<XCoreABIInfo>(CGT)) {}
9737 void emitTargetMetadata(CodeGen::CodeGenModule &CGM,
9738 const llvm::MapVector<GlobalDecl, StringRef>
9739 &MangledDeclNames) const override;
9740 };
9741
9742 } // End anonymous namespace.
9743
9744 // TODO: this implementation is likely now redundant with the default
9745 // EmitVAArg.
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const9746 Address XCoreABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
9747 QualType Ty) const {
9748 CGBuilderTy &Builder = CGF.Builder;
9749
9750 // Get the VAList.
9751 CharUnits SlotSize = CharUnits::fromQuantity(4);
9752 Address AP(Builder.CreateLoad(VAListAddr), SlotSize);
9753
9754 // Handle the argument.
9755 ABIArgInfo AI = classifyArgumentType(Ty);
9756 CharUnits TypeAlign = getContext().getTypeAlignInChars(Ty);
9757 llvm::Type *ArgTy = CGT.ConvertType(Ty);
9758 if (AI.canHaveCoerceToType() && !AI.getCoerceToType())
9759 AI.setCoerceToType(ArgTy);
9760 llvm::Type *ArgPtrTy = llvm::PointerType::getUnqual(ArgTy);
9761
9762 Address Val = Address::invalid();
9763 CharUnits ArgSize = CharUnits::Zero();
9764 switch (AI.getKind()) {
9765 case ABIArgInfo::Expand:
9766 case ABIArgInfo::CoerceAndExpand:
9767 case ABIArgInfo::InAlloca:
9768 llvm_unreachable("Unsupported ABI kind for va_arg");
9769 case ABIArgInfo::Ignore:
9770 Val = Address(llvm::UndefValue::get(ArgPtrTy), TypeAlign);
9771 ArgSize = CharUnits::Zero();
9772 break;
9773 case ABIArgInfo::Extend:
9774 case ABIArgInfo::Direct:
9775 Val = Builder.CreateBitCast(AP, ArgPtrTy);
9776 ArgSize = CharUnits::fromQuantity(
9777 getDataLayout().getTypeAllocSize(AI.getCoerceToType()));
9778 ArgSize = ArgSize.alignTo(SlotSize);
9779 break;
9780 case ABIArgInfo::Indirect:
9781 case ABIArgInfo::IndirectAliased:
9782 Val = Builder.CreateElementBitCast(AP, ArgPtrTy);
9783 Val = Address(Builder.CreateLoad(Val), TypeAlign);
9784 ArgSize = SlotSize;
9785 break;
9786 }
9787
9788 // Increment the VAList.
9789 if (!ArgSize.isZero()) {
9790 Address APN = Builder.CreateConstInBoundsByteGEP(AP, ArgSize);
9791 Builder.CreateStore(APN.getPointer(), VAListAddr);
9792 }
9793
9794 return Val;
9795 }
9796
9797 /// During the expansion of a RecordType, an incomplete TypeString is placed
9798 /// into the cache as a means to identify and break recursion.
9799 /// If there is a Recursive encoding in the cache, it is swapped out and will
9800 /// be reinserted by removeIncomplete().
9801 /// All other types of encoding should have been used rather than arriving here.
addIncomplete(const IdentifierInfo * ID,std::string StubEnc)9802 void TypeStringCache::addIncomplete(const IdentifierInfo *ID,
9803 std::string StubEnc) {
9804 if (!ID)
9805 return;
9806 Entry &E = Map[ID];
9807 assert( (E.Str.empty() || E.State == Recursive) &&
9808 "Incorrectly use of addIncomplete");
9809 assert(!StubEnc.empty() && "Passing an empty string to addIncomplete()");
9810 E.Swapped.swap(E.Str); // swap out the Recursive
9811 E.Str.swap(StubEnc);
9812 E.State = Incomplete;
9813 ++IncompleteCount;
9814 }
9815
9816 /// Once the RecordType has been expanded, the temporary incomplete TypeString
9817 /// must be removed from the cache.
9818 /// If a Recursive was swapped out by addIncomplete(), it will be replaced.
9819 /// Returns true if the RecordType was defined recursively.
removeIncomplete(const IdentifierInfo * ID)9820 bool TypeStringCache::removeIncomplete(const IdentifierInfo *ID) {
9821 if (!ID)
9822 return false;
9823 auto I = Map.find(ID);
9824 assert(I != Map.end() && "Entry not present");
9825 Entry &E = I->second;
9826 assert( (E.State == Incomplete ||
9827 E.State == IncompleteUsed) &&
9828 "Entry must be an incomplete type");
9829 bool IsRecursive = false;
9830 if (E.State == IncompleteUsed) {
9831 // We made use of our Incomplete encoding, thus we are recursive.
9832 IsRecursive = true;
9833 --IncompleteUsedCount;
9834 }
9835 if (E.Swapped.empty())
9836 Map.erase(I);
9837 else {
9838 // Swap the Recursive back.
9839 E.Swapped.swap(E.Str);
9840 E.Swapped.clear();
9841 E.State = Recursive;
9842 }
9843 --IncompleteCount;
9844 return IsRecursive;
9845 }
9846
9847 /// Add the encoded TypeString to the cache only if it is NonRecursive or
9848 /// Recursive (viz: all sub-members were expanded as fully as possible).
addIfComplete(const IdentifierInfo * ID,StringRef Str,bool IsRecursive)9849 void TypeStringCache::addIfComplete(const IdentifierInfo *ID, StringRef Str,
9850 bool IsRecursive) {
9851 if (!ID || IncompleteUsedCount)
9852 return; // No key or it is is an incomplete sub-type so don't add.
9853 Entry &E = Map[ID];
9854 if (IsRecursive && !E.Str.empty()) {
9855 assert(E.State==Recursive && E.Str.size() == Str.size() &&
9856 "This is not the same Recursive entry");
9857 // The parent container was not recursive after all, so we could have used
9858 // this Recursive sub-member entry after all, but we assumed the worse when
9859 // we started viz: IncompleteCount!=0.
9860 return;
9861 }
9862 assert(E.Str.empty() && "Entry already present");
9863 E.Str = Str.str();
9864 E.State = IsRecursive? Recursive : NonRecursive;
9865 }
9866
9867 /// Return a cached TypeString encoding for the ID. If there isn't one, or we
9868 /// are recursively expanding a type (IncompleteCount != 0) and the cached
9869 /// encoding is Recursive, return an empty StringRef.
lookupStr(const IdentifierInfo * ID)9870 StringRef TypeStringCache::lookupStr(const IdentifierInfo *ID) {
9871 if (!ID)
9872 return StringRef(); // We have no key.
9873 auto I = Map.find(ID);
9874 if (I == Map.end())
9875 return StringRef(); // We have no encoding.
9876 Entry &E = I->second;
9877 if (E.State == Recursive && IncompleteCount)
9878 return StringRef(); // We don't use Recursive encodings for member types.
9879
9880 if (E.State == Incomplete) {
9881 // The incomplete type is being used to break out of recursion.
9882 E.State = IncompleteUsed;
9883 ++IncompleteUsedCount;
9884 }
9885 return E.Str;
9886 }
9887
9888 /// The XCore ABI includes a type information section that communicates symbol
9889 /// type information to the linker. The linker uses this information to verify
9890 /// safety/correctness of things such as array bound and pointers et al.
9891 /// The ABI only requires C (and XC) language modules to emit TypeStrings.
9892 /// This type information (TypeString) is emitted into meta data for all global
9893 /// symbols: definitions, declarations, functions & variables.
9894 ///
9895 /// The TypeString carries type, qualifier, name, size & value details.
9896 /// Please see 'Tools Development Guide' section 2.16.2 for format details:
9897 /// https://www.xmos.com/download/public/Tools-Development-Guide%28X9114A%29.pdf
9898 /// The output is tested by test/CodeGen/xcore-stringtype.c.
9899 ///
9900 static bool getTypeString(SmallStringEnc &Enc, const Decl *D,
9901 const CodeGen::CodeGenModule &CGM,
9902 TypeStringCache &TSC);
9903
9904 /// XCore uses emitTargetMD to emit TypeString metadata for global symbols.
emitTargetMD(const Decl * D,llvm::GlobalValue * GV,const CodeGen::CodeGenModule & CGM) const9905 void XCoreTargetCodeGenInfo::emitTargetMD(
9906 const Decl *D, llvm::GlobalValue *GV,
9907 const CodeGen::CodeGenModule &CGM) const {
9908 SmallStringEnc Enc;
9909 if (getTypeString(Enc, D, CGM, TSC)) {
9910 llvm::LLVMContext &Ctx = CGM.getModule().getContext();
9911 llvm::Metadata *MDVals[] = {llvm::ConstantAsMetadata::get(GV),
9912 llvm::MDString::get(Ctx, Enc.str())};
9913 llvm::NamedMDNode *MD =
9914 CGM.getModule().getOrInsertNamedMetadata("xcore.typestrings");
9915 MD->addOperand(llvm::MDNode::get(Ctx, MDVals));
9916 }
9917 }
9918
emitTargetMetadata(CodeGen::CodeGenModule & CGM,const llvm::MapVector<GlobalDecl,StringRef> & MangledDeclNames) const9919 void XCoreTargetCodeGenInfo::emitTargetMetadata(
9920 CodeGen::CodeGenModule &CGM,
9921 const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames) const {
9922 // Warning, new MangledDeclNames may be appended within this loop.
9923 // We rely on MapVector insertions adding new elements to the end
9924 // of the container.
9925 for (unsigned I = 0; I != MangledDeclNames.size(); ++I) {
9926 auto Val = *(MangledDeclNames.begin() + I);
9927 llvm::GlobalValue *GV = CGM.GetGlobalValue(Val.second);
9928 if (GV) {
9929 const Decl *D = Val.first.getDecl()->getMostRecentDecl();
9930 emitTargetMD(D, GV, CGM);
9931 }
9932 }
9933 }
9934 //===----------------------------------------------------------------------===//
9935 // SPIR ABI Implementation
9936 //===----------------------------------------------------------------------===//
9937
9938 namespace {
9939 class SPIRTargetCodeGenInfo : public TargetCodeGenInfo {
9940 public:
SPIRTargetCodeGenInfo(CodeGen::CodeGenTypes & CGT)9941 SPIRTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT)
9942 : TargetCodeGenInfo(std::make_unique<DefaultABIInfo>(CGT)) {}
9943 unsigned getOpenCLKernelCallingConv() const override;
9944 };
9945
9946 } // End anonymous namespace.
9947
9948 namespace clang {
9949 namespace CodeGen {
computeSPIRKernelABIInfo(CodeGenModule & CGM,CGFunctionInfo & FI)9950 void computeSPIRKernelABIInfo(CodeGenModule &CGM, CGFunctionInfo &FI) {
9951 DefaultABIInfo SPIRABI(CGM.getTypes());
9952 SPIRABI.computeInfo(FI);
9953 }
9954 }
9955 }
9956
getOpenCLKernelCallingConv() const9957 unsigned SPIRTargetCodeGenInfo::getOpenCLKernelCallingConv() const {
9958 return llvm::CallingConv::SPIR_KERNEL;
9959 }
9960
9961 static bool appendType(SmallStringEnc &Enc, QualType QType,
9962 const CodeGen::CodeGenModule &CGM,
9963 TypeStringCache &TSC);
9964
9965 /// Helper function for appendRecordType().
9966 /// Builds a SmallVector containing the encoded field types in declaration
9967 /// order.
extractFieldType(SmallVectorImpl<FieldEncoding> & FE,const RecordDecl * RD,const CodeGen::CodeGenModule & CGM,TypeStringCache & TSC)9968 static bool extractFieldType(SmallVectorImpl<FieldEncoding> &FE,
9969 const RecordDecl *RD,
9970 const CodeGen::CodeGenModule &CGM,
9971 TypeStringCache &TSC) {
9972 for (const auto *Field : RD->fields()) {
9973 SmallStringEnc Enc;
9974 Enc += "m(";
9975 Enc += Field->getName();
9976 Enc += "){";
9977 if (Field->isBitField()) {
9978 Enc += "b(";
9979 llvm::raw_svector_ostream OS(Enc);
9980 OS << Field->getBitWidthValue(CGM.getContext());
9981 Enc += ':';
9982 }
9983 if (!appendType(Enc, Field->getType(), CGM, TSC))
9984 return false;
9985 if (Field->isBitField())
9986 Enc += ')';
9987 Enc += '}';
9988 FE.emplace_back(!Field->getName().empty(), Enc);
9989 }
9990 return true;
9991 }
9992
9993 /// Appends structure and union types to Enc and adds encoding to cache.
9994 /// Recursively calls appendType (via extractFieldType) for each field.
9995 /// 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)9996 static bool appendRecordType(SmallStringEnc &Enc, const RecordType *RT,
9997 const CodeGen::CodeGenModule &CGM,
9998 TypeStringCache &TSC, const IdentifierInfo *ID) {
9999 // Append the cached TypeString if we have one.
10000 StringRef TypeString = TSC.lookupStr(ID);
10001 if (!TypeString.empty()) {
10002 Enc += TypeString;
10003 return true;
10004 }
10005
10006 // Start to emit an incomplete TypeString.
10007 size_t Start = Enc.size();
10008 Enc += (RT->isUnionType()? 'u' : 's');
10009 Enc += '(';
10010 if (ID)
10011 Enc += ID->getName();
10012 Enc += "){";
10013
10014 // We collect all encoded fields and order as necessary.
10015 bool IsRecursive = false;
10016 const RecordDecl *RD = RT->getDecl()->getDefinition();
10017 if (RD && !RD->field_empty()) {
10018 // An incomplete TypeString stub is placed in the cache for this RecordType
10019 // so that recursive calls to this RecordType will use it whilst building a
10020 // complete TypeString for this RecordType.
10021 SmallVector<FieldEncoding, 16> FE;
10022 std::string StubEnc(Enc.substr(Start).str());
10023 StubEnc += '}'; // StubEnc now holds a valid incomplete TypeString.
10024 TSC.addIncomplete(ID, std::move(StubEnc));
10025 if (!extractFieldType(FE, RD, CGM, TSC)) {
10026 (void) TSC.removeIncomplete(ID);
10027 return false;
10028 }
10029 IsRecursive = TSC.removeIncomplete(ID);
10030 // The ABI requires unions to be sorted but not structures.
10031 // See FieldEncoding::operator< for sort algorithm.
10032 if (RT->isUnionType())
10033 llvm::sort(FE);
10034 // We can now complete the TypeString.
10035 unsigned E = FE.size();
10036 for (unsigned I = 0; I != E; ++I) {
10037 if (I)
10038 Enc += ',';
10039 Enc += FE[I].str();
10040 }
10041 }
10042 Enc += '}';
10043 TSC.addIfComplete(ID, Enc.substr(Start), IsRecursive);
10044 return true;
10045 }
10046
10047 /// Appends enum types to Enc and adds the encoding to the cache.
appendEnumType(SmallStringEnc & Enc,const EnumType * ET,TypeStringCache & TSC,const IdentifierInfo * ID)10048 static bool appendEnumType(SmallStringEnc &Enc, const EnumType *ET,
10049 TypeStringCache &TSC,
10050 const IdentifierInfo *ID) {
10051 // Append the cached TypeString if we have one.
10052 StringRef TypeString = TSC.lookupStr(ID);
10053 if (!TypeString.empty()) {
10054 Enc += TypeString;
10055 return true;
10056 }
10057
10058 size_t Start = Enc.size();
10059 Enc += "e(";
10060 if (ID)
10061 Enc += ID->getName();
10062 Enc += "){";
10063
10064 // We collect all encoded enumerations and order them alphanumerically.
10065 if (const EnumDecl *ED = ET->getDecl()->getDefinition()) {
10066 SmallVector<FieldEncoding, 16> FE;
10067 for (auto I = ED->enumerator_begin(), E = ED->enumerator_end(); I != E;
10068 ++I) {
10069 SmallStringEnc EnumEnc;
10070 EnumEnc += "m(";
10071 EnumEnc += I->getName();
10072 EnumEnc += "){";
10073 I->getInitVal().toString(EnumEnc);
10074 EnumEnc += '}';
10075 FE.push_back(FieldEncoding(!I->getName().empty(), EnumEnc));
10076 }
10077 llvm::sort(FE);
10078 unsigned E = FE.size();
10079 for (unsigned I = 0; I != E; ++I) {
10080 if (I)
10081 Enc += ',';
10082 Enc += FE[I].str();
10083 }
10084 }
10085 Enc += '}';
10086 TSC.addIfComplete(ID, Enc.substr(Start), false);
10087 return true;
10088 }
10089
10090 /// Appends type's qualifier to Enc.
10091 /// This is done prior to appending the type's encoding.
appendQualifier(SmallStringEnc & Enc,QualType QT)10092 static void appendQualifier(SmallStringEnc &Enc, QualType QT) {
10093 // Qualifiers are emitted in alphabetical order.
10094 static const char *const Table[]={"","c:","r:","cr:","v:","cv:","rv:","crv:"};
10095 int Lookup = 0;
10096 if (QT.isConstQualified())
10097 Lookup += 1<<0;
10098 if (QT.isRestrictQualified())
10099 Lookup += 1<<1;
10100 if (QT.isVolatileQualified())
10101 Lookup += 1<<2;
10102 Enc += Table[Lookup];
10103 }
10104
10105 /// Appends built-in types to Enc.
appendBuiltinType(SmallStringEnc & Enc,const BuiltinType * BT)10106 static bool appendBuiltinType(SmallStringEnc &Enc, const BuiltinType *BT) {
10107 const char *EncType;
10108 switch (BT->getKind()) {
10109 case BuiltinType::Void:
10110 EncType = "0";
10111 break;
10112 case BuiltinType::Bool:
10113 EncType = "b";
10114 break;
10115 case BuiltinType::Char_U:
10116 EncType = "uc";
10117 break;
10118 case BuiltinType::UChar:
10119 EncType = "uc";
10120 break;
10121 case BuiltinType::SChar:
10122 EncType = "sc";
10123 break;
10124 case BuiltinType::UShort:
10125 EncType = "us";
10126 break;
10127 case BuiltinType::Short:
10128 EncType = "ss";
10129 break;
10130 case BuiltinType::UInt:
10131 EncType = "ui";
10132 break;
10133 case BuiltinType::Int:
10134 EncType = "si";
10135 break;
10136 case BuiltinType::ULong:
10137 EncType = "ul";
10138 break;
10139 case BuiltinType::Long:
10140 EncType = "sl";
10141 break;
10142 case BuiltinType::ULongLong:
10143 EncType = "ull";
10144 break;
10145 case BuiltinType::LongLong:
10146 EncType = "sll";
10147 break;
10148 case BuiltinType::Float:
10149 EncType = "ft";
10150 break;
10151 case BuiltinType::Double:
10152 EncType = "d";
10153 break;
10154 case BuiltinType::LongDouble:
10155 EncType = "ld";
10156 break;
10157 default:
10158 return false;
10159 }
10160 Enc += EncType;
10161 return true;
10162 }
10163
10164 /// Appends a pointer encoding to Enc before calling appendType for the pointee.
appendPointerType(SmallStringEnc & Enc,const PointerType * PT,const CodeGen::CodeGenModule & CGM,TypeStringCache & TSC)10165 static bool appendPointerType(SmallStringEnc &Enc, const PointerType *PT,
10166 const CodeGen::CodeGenModule &CGM,
10167 TypeStringCache &TSC) {
10168 Enc += "p(";
10169 if (!appendType(Enc, PT->getPointeeType(), CGM, TSC))
10170 return false;
10171 Enc += ')';
10172 return true;
10173 }
10174
10175 /// 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)10176 static bool appendArrayType(SmallStringEnc &Enc, QualType QT,
10177 const ArrayType *AT,
10178 const CodeGen::CodeGenModule &CGM,
10179 TypeStringCache &TSC, StringRef NoSizeEnc) {
10180 if (AT->getSizeModifier() != ArrayType::Normal)
10181 return false;
10182 Enc += "a(";
10183 if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT))
10184 CAT->getSize().toStringUnsigned(Enc);
10185 else
10186 Enc += NoSizeEnc; // Global arrays use "*", otherwise it is "".
10187 Enc += ':';
10188 // The Qualifiers should be attached to the type rather than the array.
10189 appendQualifier(Enc, QT);
10190 if (!appendType(Enc, AT->getElementType(), CGM, TSC))
10191 return false;
10192 Enc += ')';
10193 return true;
10194 }
10195
10196 /// Appends a function encoding to Enc, calling appendType for the return type
10197 /// and the arguments.
appendFunctionType(SmallStringEnc & Enc,const FunctionType * FT,const CodeGen::CodeGenModule & CGM,TypeStringCache & TSC)10198 static bool appendFunctionType(SmallStringEnc &Enc, const FunctionType *FT,
10199 const CodeGen::CodeGenModule &CGM,
10200 TypeStringCache &TSC) {
10201 Enc += "f{";
10202 if (!appendType(Enc, FT->getReturnType(), CGM, TSC))
10203 return false;
10204 Enc += "}(";
10205 if (const FunctionProtoType *FPT = FT->getAs<FunctionProtoType>()) {
10206 // N.B. we are only interested in the adjusted param types.
10207 auto I = FPT->param_type_begin();
10208 auto E = FPT->param_type_end();
10209 if (I != E) {
10210 do {
10211 if (!appendType(Enc, *I, CGM, TSC))
10212 return false;
10213 ++I;
10214 if (I != E)
10215 Enc += ',';
10216 } while (I != E);
10217 if (FPT->isVariadic())
10218 Enc += ",va";
10219 } else {
10220 if (FPT->isVariadic())
10221 Enc += "va";
10222 else
10223 Enc += '0';
10224 }
10225 }
10226 Enc += ')';
10227 return true;
10228 }
10229
10230 /// Handles the type's qualifier before dispatching a call to handle specific
10231 /// type encodings.
appendType(SmallStringEnc & Enc,QualType QType,const CodeGen::CodeGenModule & CGM,TypeStringCache & TSC)10232 static bool appendType(SmallStringEnc &Enc, QualType QType,
10233 const CodeGen::CodeGenModule &CGM,
10234 TypeStringCache &TSC) {
10235
10236 QualType QT = QType.getCanonicalType();
10237
10238 if (const ArrayType *AT = QT->getAsArrayTypeUnsafe())
10239 // The Qualifiers should be attached to the type rather than the array.
10240 // Thus we don't call appendQualifier() here.
10241 return appendArrayType(Enc, QT, AT, CGM, TSC, "");
10242
10243 appendQualifier(Enc, QT);
10244
10245 if (const BuiltinType *BT = QT->getAs<BuiltinType>())
10246 return appendBuiltinType(Enc, BT);
10247
10248 if (const PointerType *PT = QT->getAs<PointerType>())
10249 return appendPointerType(Enc, PT, CGM, TSC);
10250
10251 if (const EnumType *ET = QT->getAs<EnumType>())
10252 return appendEnumType(Enc, ET, TSC, QT.getBaseTypeIdentifier());
10253
10254 if (const RecordType *RT = QT->getAsStructureType())
10255 return appendRecordType(Enc, RT, CGM, TSC, QT.getBaseTypeIdentifier());
10256
10257 if (const RecordType *RT = QT->getAsUnionType())
10258 return appendRecordType(Enc, RT, CGM, TSC, QT.getBaseTypeIdentifier());
10259
10260 if (const FunctionType *FT = QT->getAs<FunctionType>())
10261 return appendFunctionType(Enc, FT, CGM, TSC);
10262
10263 return false;
10264 }
10265
getTypeString(SmallStringEnc & Enc,const Decl * D,const CodeGen::CodeGenModule & CGM,TypeStringCache & TSC)10266 static bool getTypeString(SmallStringEnc &Enc, const Decl *D,
10267 const CodeGen::CodeGenModule &CGM,
10268 TypeStringCache &TSC) {
10269 if (!D)
10270 return false;
10271
10272 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
10273 if (FD->getLanguageLinkage() != CLanguageLinkage)
10274 return false;
10275 return appendType(Enc, FD->getType(), CGM, TSC);
10276 }
10277
10278 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
10279 if (VD->getLanguageLinkage() != CLanguageLinkage)
10280 return false;
10281 QualType QT = VD->getType().getCanonicalType();
10282 if (const ArrayType *AT = QT->getAsArrayTypeUnsafe()) {
10283 // Global ArrayTypes are given a size of '*' if the size is unknown.
10284 // The Qualifiers should be attached to the type rather than the array.
10285 // Thus we don't call appendQualifier() here.
10286 return appendArrayType(Enc, QT, AT, CGM, TSC, "*");
10287 }
10288 return appendType(Enc, QT, CGM, TSC);
10289 }
10290 return false;
10291 }
10292
10293 //===----------------------------------------------------------------------===//
10294 // RISCV ABI Implementation
10295 //===----------------------------------------------------------------------===//
10296
10297 namespace {
10298 class RISCVABIInfo : public DefaultABIInfo {
10299 private:
10300 // Size of the integer ('x') registers in bits.
10301 unsigned XLen;
10302 // Size of the floating point ('f') registers in bits. Note that the target
10303 // ISA might have a wider FLen than the selected ABI (e.g. an RV32IF target
10304 // with soft float ABI has FLen==0).
10305 unsigned FLen;
10306 static const int NumArgGPRs = 8;
10307 static const int NumArgFPRs = 8;
10308 bool detectFPCCEligibleStructHelper(QualType Ty, CharUnits CurOff,
10309 llvm::Type *&Field1Ty,
10310 CharUnits &Field1Off,
10311 llvm::Type *&Field2Ty,
10312 CharUnits &Field2Off) const;
10313
10314 public:
RISCVABIInfo(CodeGen::CodeGenTypes & CGT,unsigned XLen,unsigned FLen)10315 RISCVABIInfo(CodeGen::CodeGenTypes &CGT, unsigned XLen, unsigned FLen)
10316 : DefaultABIInfo(CGT), XLen(XLen), FLen(FLen) {}
10317
10318 // DefaultABIInfo's classifyReturnType and classifyArgumentType are
10319 // non-virtual, but computeInfo is virtual, so we overload it.
10320 void computeInfo(CGFunctionInfo &FI) const override;
10321
10322 ABIArgInfo classifyArgumentType(QualType Ty, bool IsFixed, int &ArgGPRsLeft,
10323 int &ArgFPRsLeft) const;
10324 ABIArgInfo classifyReturnType(QualType RetTy) const;
10325
10326 Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
10327 QualType Ty) const override;
10328
10329 ABIArgInfo extendType(QualType Ty) const;
10330
10331 bool detectFPCCEligibleStruct(QualType Ty, llvm::Type *&Field1Ty,
10332 CharUnits &Field1Off, llvm::Type *&Field2Ty,
10333 CharUnits &Field2Off, int &NeededArgGPRs,
10334 int &NeededArgFPRs) const;
10335 ABIArgInfo coerceAndExpandFPCCEligibleStruct(llvm::Type *Field1Ty,
10336 CharUnits Field1Off,
10337 llvm::Type *Field2Ty,
10338 CharUnits Field2Off) const;
10339 };
10340 } // end anonymous namespace
10341
computeInfo(CGFunctionInfo & FI) const10342 void RISCVABIInfo::computeInfo(CGFunctionInfo &FI) const {
10343 QualType RetTy = FI.getReturnType();
10344 if (!getCXXABI().classifyReturnType(FI))
10345 FI.getReturnInfo() = classifyReturnType(RetTy);
10346
10347 // IsRetIndirect is true if classifyArgumentType indicated the value should
10348 // be passed indirect, or if the type size is a scalar greater than 2*XLen
10349 // and not a complex type with elements <= FLen. e.g. fp128 is passed direct
10350 // in LLVM IR, relying on the backend lowering code to rewrite the argument
10351 // list and pass indirectly on RV32.
10352 bool IsRetIndirect = FI.getReturnInfo().getKind() == ABIArgInfo::Indirect;
10353 if (!IsRetIndirect && RetTy->isScalarType() &&
10354 getContext().getTypeSize(RetTy) > (2 * XLen)) {
10355 if (RetTy->isComplexType() && FLen) {
10356 QualType EltTy = RetTy->castAs<ComplexType>()->getElementType();
10357 IsRetIndirect = getContext().getTypeSize(EltTy) > FLen;
10358 } else {
10359 // This is a normal scalar > 2*XLen, such as fp128 on RV32.
10360 IsRetIndirect = true;
10361 }
10362 }
10363
10364 // We must track the number of GPRs used in order to conform to the RISC-V
10365 // ABI, as integer scalars passed in registers should have signext/zeroext
10366 // when promoted, but are anyext if passed on the stack. As GPR usage is
10367 // different for variadic arguments, we must also track whether we are
10368 // examining a vararg or not.
10369 int ArgGPRsLeft = IsRetIndirect ? NumArgGPRs - 1 : NumArgGPRs;
10370 int ArgFPRsLeft = FLen ? NumArgFPRs : 0;
10371 int NumFixedArgs = FI.getNumRequiredArgs();
10372
10373 int ArgNum = 0;
10374 for (auto &ArgInfo : FI.arguments()) {
10375 bool IsFixed = ArgNum < NumFixedArgs;
10376 ArgInfo.info =
10377 classifyArgumentType(ArgInfo.type, IsFixed, ArgGPRsLeft, ArgFPRsLeft);
10378 ArgNum++;
10379 }
10380 }
10381
10382 // Returns true if the struct is a potential candidate for the floating point
10383 // calling convention. If this function returns true, the caller is
10384 // responsible for checking that if there is only a single field then that
10385 // field is a float.
detectFPCCEligibleStructHelper(QualType Ty,CharUnits CurOff,llvm::Type * & Field1Ty,CharUnits & Field1Off,llvm::Type * & Field2Ty,CharUnits & Field2Off) const10386 bool RISCVABIInfo::detectFPCCEligibleStructHelper(QualType Ty, CharUnits CurOff,
10387 llvm::Type *&Field1Ty,
10388 CharUnits &Field1Off,
10389 llvm::Type *&Field2Ty,
10390 CharUnits &Field2Off) const {
10391 bool IsInt = Ty->isIntegralOrEnumerationType();
10392 bool IsFloat = Ty->isRealFloatingType();
10393
10394 if (IsInt || IsFloat) {
10395 uint64_t Size = getContext().getTypeSize(Ty);
10396 if (IsInt && Size > XLen)
10397 return false;
10398 // Can't be eligible if larger than the FP registers. Half precision isn't
10399 // currently supported on RISC-V and the ABI hasn't been confirmed, so
10400 // default to the integer ABI in that case.
10401 if (IsFloat && (Size > FLen || Size < 32))
10402 return false;
10403 // Can't be eligible if an integer type was already found (int+int pairs
10404 // are not eligible).
10405 if (IsInt && Field1Ty && Field1Ty->isIntegerTy())
10406 return false;
10407 if (!Field1Ty) {
10408 Field1Ty = CGT.ConvertType(Ty);
10409 Field1Off = CurOff;
10410 return true;
10411 }
10412 if (!Field2Ty) {
10413 Field2Ty = CGT.ConvertType(Ty);
10414 Field2Off = CurOff;
10415 return true;
10416 }
10417 return false;
10418 }
10419
10420 if (auto CTy = Ty->getAs<ComplexType>()) {
10421 if (Field1Ty)
10422 return false;
10423 QualType EltTy = CTy->getElementType();
10424 if (getContext().getTypeSize(EltTy) > FLen)
10425 return false;
10426 Field1Ty = CGT.ConvertType(EltTy);
10427 Field1Off = CurOff;
10428 Field2Ty = Field1Ty;
10429 Field2Off = Field1Off + getContext().getTypeSizeInChars(EltTy);
10430 return true;
10431 }
10432
10433 if (const ConstantArrayType *ATy = getContext().getAsConstantArrayType(Ty)) {
10434 uint64_t ArraySize = ATy->getSize().getZExtValue();
10435 QualType EltTy = ATy->getElementType();
10436 CharUnits EltSize = getContext().getTypeSizeInChars(EltTy);
10437 for (uint64_t i = 0; i < ArraySize; ++i) {
10438 bool Ret = detectFPCCEligibleStructHelper(EltTy, CurOff, Field1Ty,
10439 Field1Off, Field2Ty, Field2Off);
10440 if (!Ret)
10441 return false;
10442 CurOff += EltSize;
10443 }
10444 return true;
10445 }
10446
10447 if (const auto *RTy = Ty->getAs<RecordType>()) {
10448 // Structures with either a non-trivial destructor or a non-trivial
10449 // copy constructor are not eligible for the FP calling convention.
10450 if (getRecordArgABI(Ty, CGT.getCXXABI()))
10451 return false;
10452 if (isEmptyRecord(getContext(), Ty, true))
10453 return true;
10454 const RecordDecl *RD = RTy->getDecl();
10455 // Unions aren't eligible unless they're empty (which is caught above).
10456 if (RD->isUnion())
10457 return false;
10458 int ZeroWidthBitFieldCount = 0;
10459 for (const FieldDecl *FD : RD->fields()) {
10460 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
10461 uint64_t FieldOffInBits = Layout.getFieldOffset(FD->getFieldIndex());
10462 QualType QTy = FD->getType();
10463 if (FD->isBitField()) {
10464 unsigned BitWidth = FD->getBitWidthValue(getContext());
10465 // Allow a bitfield with a type greater than XLen as long as the
10466 // bitwidth is XLen or less.
10467 if (getContext().getTypeSize(QTy) > XLen && BitWidth <= XLen)
10468 QTy = getContext().getIntTypeForBitwidth(XLen, false);
10469 if (BitWidth == 0) {
10470 ZeroWidthBitFieldCount++;
10471 continue;
10472 }
10473 }
10474
10475 bool Ret = detectFPCCEligibleStructHelper(
10476 QTy, CurOff + getContext().toCharUnitsFromBits(FieldOffInBits),
10477 Field1Ty, Field1Off, Field2Ty, Field2Off);
10478 if (!Ret)
10479 return false;
10480
10481 // As a quirk of the ABI, zero-width bitfields aren't ignored for fp+fp
10482 // or int+fp structs, but are ignored for a struct with an fp field and
10483 // any number of zero-width bitfields.
10484 if (Field2Ty && ZeroWidthBitFieldCount > 0)
10485 return false;
10486 }
10487 return Field1Ty != nullptr;
10488 }
10489
10490 return false;
10491 }
10492
10493 // Determine if a struct is eligible for passing according to the floating
10494 // point calling convention (i.e., when flattened it contains a single fp
10495 // value, fp+fp, or int+fp of appropriate size). If so, NeededArgFPRs and
10496 // NeededArgGPRs are incremented appropriately.
detectFPCCEligibleStruct(QualType Ty,llvm::Type * & Field1Ty,CharUnits & Field1Off,llvm::Type * & Field2Ty,CharUnits & Field2Off,int & NeededArgGPRs,int & NeededArgFPRs) const10497 bool RISCVABIInfo::detectFPCCEligibleStruct(QualType Ty, llvm::Type *&Field1Ty,
10498 CharUnits &Field1Off,
10499 llvm::Type *&Field2Ty,
10500 CharUnits &Field2Off,
10501 int &NeededArgGPRs,
10502 int &NeededArgFPRs) const {
10503 Field1Ty = nullptr;
10504 Field2Ty = nullptr;
10505 NeededArgGPRs = 0;
10506 NeededArgFPRs = 0;
10507 bool IsCandidate = detectFPCCEligibleStructHelper(
10508 Ty, CharUnits::Zero(), Field1Ty, Field1Off, Field2Ty, Field2Off);
10509 // Not really a candidate if we have a single int but no float.
10510 if (Field1Ty && !Field2Ty && !Field1Ty->isFloatingPointTy())
10511 return false;
10512 if (!IsCandidate)
10513 return false;
10514 if (Field1Ty && Field1Ty->isFloatingPointTy())
10515 NeededArgFPRs++;
10516 else if (Field1Ty)
10517 NeededArgGPRs++;
10518 if (Field2Ty && Field2Ty->isFloatingPointTy())
10519 NeededArgFPRs++;
10520 else if (Field2Ty)
10521 NeededArgGPRs++;
10522 return true;
10523 }
10524
10525 // Call getCoerceAndExpand for the two-element flattened struct described by
10526 // Field1Ty, Field1Off, Field2Ty, Field2Off. This method will create an
10527 // appropriate coerceToType and unpaddedCoerceToType.
coerceAndExpandFPCCEligibleStruct(llvm::Type * Field1Ty,CharUnits Field1Off,llvm::Type * Field2Ty,CharUnits Field2Off) const10528 ABIArgInfo RISCVABIInfo::coerceAndExpandFPCCEligibleStruct(
10529 llvm::Type *Field1Ty, CharUnits Field1Off, llvm::Type *Field2Ty,
10530 CharUnits Field2Off) const {
10531 SmallVector<llvm::Type *, 3> CoerceElts;
10532 SmallVector<llvm::Type *, 2> UnpaddedCoerceElts;
10533 if (!Field1Off.isZero())
10534 CoerceElts.push_back(llvm::ArrayType::get(
10535 llvm::Type::getInt8Ty(getVMContext()), Field1Off.getQuantity()));
10536
10537 CoerceElts.push_back(Field1Ty);
10538 UnpaddedCoerceElts.push_back(Field1Ty);
10539
10540 if (!Field2Ty) {
10541 return ABIArgInfo::getCoerceAndExpand(
10542 llvm::StructType::get(getVMContext(), CoerceElts, !Field1Off.isZero()),
10543 UnpaddedCoerceElts[0]);
10544 }
10545
10546 CharUnits Field2Align =
10547 CharUnits::fromQuantity(getDataLayout().getABITypeAlignment(Field2Ty));
10548 CharUnits Field1End = Field1Off +
10549 CharUnits::fromQuantity(getDataLayout().getTypeStoreSize(Field1Ty));
10550 CharUnits Field2OffNoPadNoPack = Field1End.alignTo(Field2Align);
10551
10552 CharUnits Padding = CharUnits::Zero();
10553 if (Field2Off > Field2OffNoPadNoPack)
10554 Padding = Field2Off - Field2OffNoPadNoPack;
10555 else if (Field2Off != Field2Align && Field2Off > Field1End)
10556 Padding = Field2Off - Field1End;
10557
10558 bool IsPacked = !Field2Off.isMultipleOf(Field2Align);
10559
10560 if (!Padding.isZero())
10561 CoerceElts.push_back(llvm::ArrayType::get(
10562 llvm::Type::getInt8Ty(getVMContext()), Padding.getQuantity()));
10563
10564 CoerceElts.push_back(Field2Ty);
10565 UnpaddedCoerceElts.push_back(Field2Ty);
10566
10567 auto CoerceToType =
10568 llvm::StructType::get(getVMContext(), CoerceElts, IsPacked);
10569 auto UnpaddedCoerceToType =
10570 llvm::StructType::get(getVMContext(), UnpaddedCoerceElts, IsPacked);
10571
10572 return ABIArgInfo::getCoerceAndExpand(CoerceToType, UnpaddedCoerceToType);
10573 }
10574
classifyArgumentType(QualType Ty,bool IsFixed,int & ArgGPRsLeft,int & ArgFPRsLeft) const10575 ABIArgInfo RISCVABIInfo::classifyArgumentType(QualType Ty, bool IsFixed,
10576 int &ArgGPRsLeft,
10577 int &ArgFPRsLeft) const {
10578 assert(ArgGPRsLeft <= NumArgGPRs && "Arg GPR tracking underflow");
10579 Ty = useFirstFieldIfTransparentUnion(Ty);
10580
10581 // Structures with either a non-trivial destructor or a non-trivial
10582 // copy constructor are always passed indirectly.
10583 if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI())) {
10584 if (ArgGPRsLeft)
10585 ArgGPRsLeft -= 1;
10586 return getNaturalAlignIndirect(Ty, /*ByVal=*/RAA ==
10587 CGCXXABI::RAA_DirectInMemory);
10588 }
10589
10590 // Ignore empty structs/unions.
10591 if (isEmptyRecord(getContext(), Ty, true))
10592 return ABIArgInfo::getIgnore();
10593
10594 uint64_t Size = getContext().getTypeSize(Ty);
10595
10596 // Pass floating point values via FPRs if possible.
10597 if (IsFixed && Ty->isFloatingType() && !Ty->isComplexType() &&
10598 FLen >= Size && ArgFPRsLeft) {
10599 ArgFPRsLeft--;
10600 return ABIArgInfo::getDirect();
10601 }
10602
10603 // Complex types for the hard float ABI must be passed direct rather than
10604 // using CoerceAndExpand.
10605 if (IsFixed && Ty->isComplexType() && FLen && ArgFPRsLeft >= 2) {
10606 QualType EltTy = Ty->castAs<ComplexType>()->getElementType();
10607 if (getContext().getTypeSize(EltTy) <= FLen) {
10608 ArgFPRsLeft -= 2;
10609 return ABIArgInfo::getDirect();
10610 }
10611 }
10612
10613 if (IsFixed && FLen && Ty->isStructureOrClassType()) {
10614 llvm::Type *Field1Ty = nullptr;
10615 llvm::Type *Field2Ty = nullptr;
10616 CharUnits Field1Off = CharUnits::Zero();
10617 CharUnits Field2Off = CharUnits::Zero();
10618 int NeededArgGPRs;
10619 int NeededArgFPRs;
10620 bool IsCandidate =
10621 detectFPCCEligibleStruct(Ty, Field1Ty, Field1Off, Field2Ty, Field2Off,
10622 NeededArgGPRs, NeededArgFPRs);
10623 if (IsCandidate && NeededArgGPRs <= ArgGPRsLeft &&
10624 NeededArgFPRs <= ArgFPRsLeft) {
10625 ArgGPRsLeft -= NeededArgGPRs;
10626 ArgFPRsLeft -= NeededArgFPRs;
10627 return coerceAndExpandFPCCEligibleStruct(Field1Ty, Field1Off, Field2Ty,
10628 Field2Off);
10629 }
10630 }
10631
10632 uint64_t NeededAlign = getContext().getTypeAlign(Ty);
10633 bool MustUseStack = false;
10634 // Determine the number of GPRs needed to pass the current argument
10635 // according to the ABI. 2*XLen-aligned varargs are passed in "aligned"
10636 // register pairs, so may consume 3 registers.
10637 int NeededArgGPRs = 1;
10638 if (!IsFixed && NeededAlign == 2 * XLen)
10639 NeededArgGPRs = 2 + (ArgGPRsLeft % 2);
10640 else if (Size > XLen && Size <= 2 * XLen)
10641 NeededArgGPRs = 2;
10642
10643 if (NeededArgGPRs > ArgGPRsLeft) {
10644 MustUseStack = true;
10645 NeededArgGPRs = ArgGPRsLeft;
10646 }
10647
10648 ArgGPRsLeft -= NeededArgGPRs;
10649
10650 if (!isAggregateTypeForABI(Ty) && !Ty->isVectorType()) {
10651 // Treat an enum type as its underlying type.
10652 if (const EnumType *EnumTy = Ty->getAs<EnumType>())
10653 Ty = EnumTy->getDecl()->getIntegerType();
10654
10655 // All integral types are promoted to XLen width, unless passed on the
10656 // stack.
10657 if (Size < XLen && Ty->isIntegralOrEnumerationType() && !MustUseStack) {
10658 return extendType(Ty);
10659 }
10660
10661 if (const auto *EIT = Ty->getAs<ExtIntType>()) {
10662 if (EIT->getNumBits() < XLen && !MustUseStack)
10663 return extendType(Ty);
10664 if (EIT->getNumBits() > 128 ||
10665 (!getContext().getTargetInfo().hasInt128Type() &&
10666 EIT->getNumBits() > 64))
10667 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
10668 }
10669
10670 return ABIArgInfo::getDirect();
10671 }
10672
10673 // Aggregates which are <= 2*XLen will be passed in registers if possible,
10674 // so coerce to integers.
10675 if (Size <= 2 * XLen) {
10676 unsigned Alignment = getContext().getTypeAlign(Ty);
10677
10678 // Use a single XLen int if possible, 2*XLen if 2*XLen alignment is
10679 // required, and a 2-element XLen array if only XLen alignment is required.
10680 if (Size <= XLen) {
10681 return ABIArgInfo::getDirect(
10682 llvm::IntegerType::get(getVMContext(), XLen));
10683 } else if (Alignment == 2 * XLen) {
10684 return ABIArgInfo::getDirect(
10685 llvm::IntegerType::get(getVMContext(), 2 * XLen));
10686 } else {
10687 return ABIArgInfo::getDirect(llvm::ArrayType::get(
10688 llvm::IntegerType::get(getVMContext(), XLen), 2));
10689 }
10690 }
10691 return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
10692 }
10693
classifyReturnType(QualType RetTy) const10694 ABIArgInfo RISCVABIInfo::classifyReturnType(QualType RetTy) const {
10695 if (RetTy->isVoidType())
10696 return ABIArgInfo::getIgnore();
10697
10698 int ArgGPRsLeft = 2;
10699 int ArgFPRsLeft = FLen ? 2 : 0;
10700
10701 // The rules for return and argument types are the same, so defer to
10702 // classifyArgumentType.
10703 return classifyArgumentType(RetTy, /*IsFixed=*/true, ArgGPRsLeft,
10704 ArgFPRsLeft);
10705 }
10706
EmitVAArg(CodeGenFunction & CGF,Address VAListAddr,QualType Ty) const10707 Address RISCVABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
10708 QualType Ty) const {
10709 CharUnits SlotSize = CharUnits::fromQuantity(XLen / 8);
10710
10711 // Empty records are ignored for parameter passing purposes.
10712 if (isEmptyRecord(getContext(), Ty, true)) {
10713 Address Addr(CGF.Builder.CreateLoad(VAListAddr), SlotSize);
10714 Addr = CGF.Builder.CreateElementBitCast(Addr, CGF.ConvertTypeForMem(Ty));
10715 return Addr;
10716 }
10717
10718 auto TInfo = getContext().getTypeInfoInChars(Ty);
10719
10720 // Arguments bigger than 2*Xlen bytes are passed indirectly.
10721 bool IsIndirect = TInfo.Width > 2 * SlotSize;
10722
10723 return emitVoidPtrVAArg(CGF, VAListAddr, Ty, IsIndirect, TInfo,
10724 SlotSize, /*AllowHigherAlign=*/true);
10725 }
10726
extendType(QualType Ty) const10727 ABIArgInfo RISCVABIInfo::extendType(QualType Ty) const {
10728 int TySize = getContext().getTypeSize(Ty);
10729 // RV64 ABI requires unsigned 32 bit integers to be sign extended.
10730 if (XLen == 64 && Ty->isUnsignedIntegerOrEnumerationType() && TySize == 32)
10731 return ABIArgInfo::getSignExtend(Ty);
10732 return ABIArgInfo::getExtend(Ty);
10733 }
10734
10735 namespace {
10736 class RISCVTargetCodeGenInfo : public TargetCodeGenInfo {
10737 public:
RISCVTargetCodeGenInfo(CodeGen::CodeGenTypes & CGT,unsigned XLen,unsigned FLen)10738 RISCVTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, unsigned XLen,
10739 unsigned FLen)
10740 : TargetCodeGenInfo(std::make_unique<RISCVABIInfo>(CGT, XLen, FLen)) {}
10741
setTargetAttributes(const Decl * D,llvm::GlobalValue * GV,CodeGen::CodeGenModule & CGM) const10742 void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
10743 CodeGen::CodeGenModule &CGM) const override {
10744 const auto *FD = dyn_cast_or_null<FunctionDecl>(D);
10745 if (!FD) return;
10746
10747 const auto *Attr = FD->getAttr<RISCVInterruptAttr>();
10748 if (!Attr)
10749 return;
10750
10751 const char *Kind;
10752 switch (Attr->getInterrupt()) {
10753 case RISCVInterruptAttr::user: Kind = "user"; break;
10754 case RISCVInterruptAttr::supervisor: Kind = "supervisor"; break;
10755 case RISCVInterruptAttr::machine: Kind = "machine"; break;
10756 }
10757
10758 auto *Fn = cast<llvm::Function>(GV);
10759
10760 Fn->addFnAttr("interrupt", Kind);
10761 }
10762 };
10763 } // namespace
10764
10765 //===----------------------------------------------------------------------===//
10766 // VE ABI Implementation.
10767 //
10768 namespace {
10769 class VEABIInfo : public DefaultABIInfo {
10770 public:
VEABIInfo(CodeGenTypes & CGT)10771 VEABIInfo(CodeGenTypes &CGT) : DefaultABIInfo(CGT) {}
10772
10773 private:
10774 ABIArgInfo classifyReturnType(QualType RetTy) const;
10775 ABIArgInfo classifyArgumentType(QualType RetTy) const;
10776 void computeInfo(CGFunctionInfo &FI) const override;
10777 };
10778 } // end anonymous namespace
10779
classifyReturnType(QualType Ty) const10780 ABIArgInfo VEABIInfo::classifyReturnType(QualType Ty) const {
10781 if (Ty->isAnyComplexType())
10782 return ABIArgInfo::getDirect();
10783 uint64_t Size = getContext().getTypeSize(Ty);
10784 if (Size < 64 && Ty->isIntegerType())
10785 return ABIArgInfo::getExtend(Ty);
10786 return DefaultABIInfo::classifyReturnType(Ty);
10787 }
10788
classifyArgumentType(QualType Ty) const10789 ABIArgInfo VEABIInfo::classifyArgumentType(QualType Ty) const {
10790 if (Ty->isAnyComplexType())
10791 return ABIArgInfo::getDirect();
10792 uint64_t Size = getContext().getTypeSize(Ty);
10793 if (Size < 64 && Ty->isIntegerType())
10794 return ABIArgInfo::getExtend(Ty);
10795 return DefaultABIInfo::classifyArgumentType(Ty);
10796 }
10797
computeInfo(CGFunctionInfo & FI) const10798 void VEABIInfo::computeInfo(CGFunctionInfo &FI) const {
10799 FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
10800 for (auto &Arg : FI.arguments())
10801 Arg.info = classifyArgumentType(Arg.type);
10802 }
10803
10804 namespace {
10805 class VETargetCodeGenInfo : public TargetCodeGenInfo {
10806 public:
VETargetCodeGenInfo(CodeGenTypes & CGT)10807 VETargetCodeGenInfo(CodeGenTypes &CGT)
10808 : TargetCodeGenInfo(std::make_unique<VEABIInfo>(CGT)) {}
10809 // VE ABI requires the arguments of variadic and prototype-less functions
10810 // are passed in both registers and memory.
isNoProtoCallVariadic(const CallArgList & args,const FunctionNoProtoType * fnType) const10811 bool isNoProtoCallVariadic(const CallArgList &args,
10812 const FunctionNoProtoType *fnType) const override {
10813 return true;
10814 }
10815 };
10816 } // end anonymous namespace
10817
10818 //===----------------------------------------------------------------------===//
10819 // Driver code
10820 //===----------------------------------------------------------------------===//
10821
supportsCOMDAT() const10822 bool CodeGenModule::supportsCOMDAT() const {
10823 return getTriple().supportsCOMDAT();
10824 }
10825
getTargetCodeGenInfo()10826 const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() {
10827 if (TheTargetCodeGenInfo)
10828 return *TheTargetCodeGenInfo;
10829
10830 // Helper to set the unique_ptr while still keeping the return value.
10831 auto SetCGInfo = [&](TargetCodeGenInfo *P) -> const TargetCodeGenInfo & {
10832 this->TheTargetCodeGenInfo.reset(P);
10833 return *P;
10834 };
10835
10836 const llvm::Triple &Triple = getTarget().getTriple();
10837 switch (Triple.getArch()) {
10838 default:
10839 return SetCGInfo(new DefaultTargetCodeGenInfo(Types));
10840
10841 case llvm::Triple::le32:
10842 return SetCGInfo(new PNaClTargetCodeGenInfo(Types));
10843 case llvm::Triple::mips:
10844 case llvm::Triple::mipsel:
10845 if (Triple.getOS() == llvm::Triple::NaCl)
10846 return SetCGInfo(new PNaClTargetCodeGenInfo(Types));
10847 return SetCGInfo(new MIPSTargetCodeGenInfo(Types, true));
10848
10849 case llvm::Triple::mips64:
10850 case llvm::Triple::mips64el:
10851 return SetCGInfo(new MIPSTargetCodeGenInfo(Types, false));
10852
10853 case llvm::Triple::avr:
10854 return SetCGInfo(new AVRTargetCodeGenInfo(Types));
10855
10856 case llvm::Triple::aarch64:
10857 case llvm::Triple::aarch64_32:
10858 case llvm::Triple::aarch64_be: {
10859 AArch64ABIInfo::ABIKind Kind = AArch64ABIInfo::AAPCS;
10860 if (getTarget().getABI() == "darwinpcs")
10861 Kind = AArch64ABIInfo::DarwinPCS;
10862 else if (Triple.isOSWindows())
10863 return SetCGInfo(
10864 new WindowsAArch64TargetCodeGenInfo(Types, AArch64ABIInfo::Win64));
10865
10866 return SetCGInfo(new AArch64TargetCodeGenInfo(Types, Kind));
10867 }
10868
10869 case llvm::Triple::wasm32:
10870 case llvm::Triple::wasm64: {
10871 WebAssemblyABIInfo::ABIKind Kind = WebAssemblyABIInfo::MVP;
10872 if (getTarget().getABI() == "experimental-mv")
10873 Kind = WebAssemblyABIInfo::ExperimentalMV;
10874 return SetCGInfo(new WebAssemblyTargetCodeGenInfo(Types, Kind));
10875 }
10876
10877 case llvm::Triple::arm:
10878 case llvm::Triple::armeb:
10879 case llvm::Triple::thumb:
10880 case llvm::Triple::thumbeb: {
10881 if (Triple.getOS() == llvm::Triple::Win32) {
10882 return SetCGInfo(
10883 new WindowsARMTargetCodeGenInfo(Types, ARMABIInfo::AAPCS_VFP));
10884 }
10885
10886 ARMABIInfo::ABIKind Kind = ARMABIInfo::AAPCS;
10887 StringRef ABIStr = getTarget().getABI();
10888 if (ABIStr == "apcs-gnu")
10889 Kind = ARMABIInfo::APCS;
10890 else if (ABIStr == "aapcs16")
10891 Kind = ARMABIInfo::AAPCS16_VFP;
10892 else if (CodeGenOpts.FloatABI == "hard" ||
10893 (CodeGenOpts.FloatABI != "soft" &&
10894 (Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
10895 Triple.getEnvironment() == llvm::Triple::MuslEABIHF ||
10896 Triple.getEnvironment() == llvm::Triple::EABIHF)))
10897 Kind = ARMABIInfo::AAPCS_VFP;
10898
10899 return SetCGInfo(new ARMTargetCodeGenInfo(Types, Kind));
10900 }
10901
10902 case llvm::Triple::ppc: {
10903 if (Triple.isOSAIX())
10904 return SetCGInfo(new AIXTargetCodeGenInfo(Types, /*Is64Bit*/ false));
10905
10906 bool IsSoftFloat =
10907 CodeGenOpts.FloatABI == "soft" || getTarget().hasFeature("spe");
10908 bool RetSmallStructInRegABI =
10909 PPC32TargetCodeGenInfo::isStructReturnInRegABI(Triple, CodeGenOpts);
10910 return SetCGInfo(
10911 new PPC32TargetCodeGenInfo(Types, IsSoftFloat, RetSmallStructInRegABI));
10912 }
10913 case llvm::Triple::ppc64:
10914 if (Triple.isOSAIX())
10915 return SetCGInfo(new AIXTargetCodeGenInfo(Types, /*Is64Bit*/ true));
10916
10917 if (Triple.isOSBinFormatELF()) {
10918 PPC64_SVR4_ABIInfo::ABIKind Kind = PPC64_SVR4_ABIInfo::ELFv1;
10919 if (getTarget().getABI() == "elfv2")
10920 Kind = PPC64_SVR4_ABIInfo::ELFv2;
10921 bool IsSoftFloat = CodeGenOpts.FloatABI == "soft";
10922
10923 return SetCGInfo(
10924 new PPC64_SVR4_TargetCodeGenInfo(Types, Kind, IsSoftFloat));
10925 }
10926 return SetCGInfo(new PPC64TargetCodeGenInfo(Types));
10927 case llvm::Triple::ppc64le: {
10928 assert(Triple.isOSBinFormatELF() && "PPC64 LE non-ELF not supported!");
10929 PPC64_SVR4_ABIInfo::ABIKind Kind = PPC64_SVR4_ABIInfo::ELFv2;
10930 if (getTarget().getABI() == "elfv1")
10931 Kind = PPC64_SVR4_ABIInfo::ELFv1;
10932 bool IsSoftFloat = CodeGenOpts.FloatABI == "soft";
10933
10934 return SetCGInfo(
10935 new PPC64_SVR4_TargetCodeGenInfo(Types, Kind, IsSoftFloat));
10936 }
10937
10938 case llvm::Triple::nvptx:
10939 case llvm::Triple::nvptx64:
10940 return SetCGInfo(new NVPTXTargetCodeGenInfo(Types));
10941
10942 case llvm::Triple::msp430:
10943 return SetCGInfo(new MSP430TargetCodeGenInfo(Types));
10944
10945 case llvm::Triple::riscv32:
10946 case llvm::Triple::riscv64: {
10947 StringRef ABIStr = getTarget().getABI();
10948 unsigned XLen = getTarget().getPointerWidth(0);
10949 unsigned ABIFLen = 0;
10950 if (ABIStr.endswith("f"))
10951 ABIFLen = 32;
10952 else if (ABIStr.endswith("d"))
10953 ABIFLen = 64;
10954 return SetCGInfo(new RISCVTargetCodeGenInfo(Types, XLen, ABIFLen));
10955 }
10956
10957 case llvm::Triple::systemz: {
10958 bool SoftFloat = CodeGenOpts.FloatABI == "soft";
10959 bool HasVector = !SoftFloat && getTarget().getABI() == "vector";
10960 return SetCGInfo(new SystemZTargetCodeGenInfo(Types, HasVector, SoftFloat));
10961 }
10962
10963 case llvm::Triple::tce:
10964 case llvm::Triple::tcele:
10965 return SetCGInfo(new TCETargetCodeGenInfo(Types));
10966
10967 case llvm::Triple::x86: {
10968 bool IsDarwinVectorABI = Triple.isOSDarwin();
10969 bool RetSmallStructInRegABI =
10970 X86_32TargetCodeGenInfo::isStructReturnInRegABI(Triple, CodeGenOpts);
10971 bool IsWin32FloatStructABI = Triple.isOSWindows() && !Triple.isOSCygMing();
10972
10973 if (Triple.getOS() == llvm::Triple::Win32) {
10974 return SetCGInfo(new WinX86_32TargetCodeGenInfo(
10975 Types, IsDarwinVectorABI, RetSmallStructInRegABI,
10976 IsWin32FloatStructABI, CodeGenOpts.NumRegisterParameters));
10977 } else {
10978 return SetCGInfo(new X86_32TargetCodeGenInfo(
10979 Types, IsDarwinVectorABI, RetSmallStructInRegABI,
10980 IsWin32FloatStructABI, CodeGenOpts.NumRegisterParameters,
10981 CodeGenOpts.FloatABI == "soft"));
10982 }
10983 }
10984
10985 case llvm::Triple::x86_64: {
10986 StringRef ABI = getTarget().getABI();
10987 X86AVXABILevel AVXLevel =
10988 (ABI == "avx512"
10989 ? X86AVXABILevel::AVX512
10990 : ABI == "avx" ? X86AVXABILevel::AVX : X86AVXABILevel::None);
10991
10992 switch (Triple.getOS()) {
10993 case llvm::Triple::Win32:
10994 return SetCGInfo(new WinX86_64TargetCodeGenInfo(Types, AVXLevel));
10995 default:
10996 return SetCGInfo(new X86_64TargetCodeGenInfo(Types, AVXLevel));
10997 }
10998 }
10999 case llvm::Triple::hexagon:
11000 return SetCGInfo(new HexagonTargetCodeGenInfo(Types));
11001 case llvm::Triple::lanai:
11002 return SetCGInfo(new LanaiTargetCodeGenInfo(Types));
11003 case llvm::Triple::r600:
11004 return SetCGInfo(new AMDGPUTargetCodeGenInfo(Types));
11005 case llvm::Triple::amdgcn:
11006 return SetCGInfo(new AMDGPUTargetCodeGenInfo(Types));
11007 case llvm::Triple::sparc:
11008 return SetCGInfo(new SparcV8TargetCodeGenInfo(Types));
11009 case llvm::Triple::sparcv9:
11010 return SetCGInfo(new SparcV9TargetCodeGenInfo(Types));
11011 case llvm::Triple::xcore:
11012 return SetCGInfo(new XCoreTargetCodeGenInfo(Types));
11013 case llvm::Triple::arc:
11014 return SetCGInfo(new ARCTargetCodeGenInfo(Types));
11015 case llvm::Triple::spir:
11016 case llvm::Triple::spir64:
11017 return SetCGInfo(new SPIRTargetCodeGenInfo(Types));
11018 case llvm::Triple::ve:
11019 return SetCGInfo(new VETargetCodeGenInfo(Types));
11020 }
11021 }
11022
11023 /// Create an OpenCL kernel for an enqueued block.
11024 ///
11025 /// The kernel has the same function type as the block invoke function. Its
11026 /// name is the name of the block invoke function postfixed with "_kernel".
11027 /// It simply calls the block invoke function then returns.
11028 llvm::Function *
createEnqueuedBlockKernel(CodeGenFunction & CGF,llvm::Function * Invoke,llvm::Value * BlockLiteral) const11029 TargetCodeGenInfo::createEnqueuedBlockKernel(CodeGenFunction &CGF,
11030 llvm::Function *Invoke,
11031 llvm::Value *BlockLiteral) const {
11032 auto *InvokeFT = Invoke->getFunctionType();
11033 llvm::SmallVector<llvm::Type *, 2> ArgTys;
11034 for (auto &P : InvokeFT->params())
11035 ArgTys.push_back(P);
11036 auto &C = CGF.getLLVMContext();
11037 std::string Name = Invoke->getName().str() + "_kernel";
11038 auto *FT = llvm::FunctionType::get(llvm::Type::getVoidTy(C), ArgTys, false);
11039 auto *F = llvm::Function::Create(FT, llvm::GlobalValue::InternalLinkage, Name,
11040 &CGF.CGM.getModule());
11041 auto IP = CGF.Builder.saveIP();
11042 auto *BB = llvm::BasicBlock::Create(C, "entry", F);
11043 auto &Builder = CGF.Builder;
11044 Builder.SetInsertPoint(BB);
11045 llvm::SmallVector<llvm::Value *, 2> Args;
11046 for (auto &A : F->args())
11047 Args.push_back(&A);
11048 Builder.CreateCall(Invoke, Args);
11049 Builder.CreateRetVoid();
11050 Builder.restoreIP(IP);
11051 return F;
11052 }
11053
11054 /// Create an OpenCL kernel for an enqueued block.
11055 ///
11056 /// The type of the first argument (the block literal) is the struct type
11057 /// of the block literal instead of a pointer type. The first argument
11058 /// (block literal) is passed directly by value to the kernel. The kernel
11059 /// allocates the same type of struct on stack and stores the block literal
11060 /// to it and passes its pointer to the block invoke function. The kernel
11061 /// has "enqueued-block" function attribute and kernel argument metadata.
createEnqueuedBlockKernel(CodeGenFunction & CGF,llvm::Function * Invoke,llvm::Value * BlockLiteral) const11062 llvm::Function *AMDGPUTargetCodeGenInfo::createEnqueuedBlockKernel(
11063 CodeGenFunction &CGF, llvm::Function *Invoke,
11064 llvm::Value *BlockLiteral) const {
11065 auto &Builder = CGF.Builder;
11066 auto &C = CGF.getLLVMContext();
11067
11068 auto *BlockTy = BlockLiteral->getType()->getPointerElementType();
11069 auto *InvokeFT = Invoke->getFunctionType();
11070 llvm::SmallVector<llvm::Type *, 2> ArgTys;
11071 llvm::SmallVector<llvm::Metadata *, 8> AddressQuals;
11072 llvm::SmallVector<llvm::Metadata *, 8> AccessQuals;
11073 llvm::SmallVector<llvm::Metadata *, 8> ArgTypeNames;
11074 llvm::SmallVector<llvm::Metadata *, 8> ArgBaseTypeNames;
11075 llvm::SmallVector<llvm::Metadata *, 8> ArgTypeQuals;
11076 llvm::SmallVector<llvm::Metadata *, 8> ArgNames;
11077
11078 ArgTys.push_back(BlockTy);
11079 ArgTypeNames.push_back(llvm::MDString::get(C, "__block_literal"));
11080 AddressQuals.push_back(llvm::ConstantAsMetadata::get(Builder.getInt32(0)));
11081 ArgBaseTypeNames.push_back(llvm::MDString::get(C, "__block_literal"));
11082 ArgTypeQuals.push_back(llvm::MDString::get(C, ""));
11083 AccessQuals.push_back(llvm::MDString::get(C, "none"));
11084 ArgNames.push_back(llvm::MDString::get(C, "block_literal"));
11085 for (unsigned I = 1, E = InvokeFT->getNumParams(); I < E; ++I) {
11086 ArgTys.push_back(InvokeFT->getParamType(I));
11087 ArgTypeNames.push_back(llvm::MDString::get(C, "void*"));
11088 AddressQuals.push_back(llvm::ConstantAsMetadata::get(Builder.getInt32(3)));
11089 AccessQuals.push_back(llvm::MDString::get(C, "none"));
11090 ArgBaseTypeNames.push_back(llvm::MDString::get(C, "void*"));
11091 ArgTypeQuals.push_back(llvm::MDString::get(C, ""));
11092 ArgNames.push_back(
11093 llvm::MDString::get(C, (Twine("local_arg") + Twine(I)).str()));
11094 }
11095 std::string Name = Invoke->getName().str() + "_kernel";
11096 auto *FT = llvm::FunctionType::get(llvm::Type::getVoidTy(C), ArgTys, false);
11097 auto *F = llvm::Function::Create(FT, llvm::GlobalValue::InternalLinkage, Name,
11098 &CGF.CGM.getModule());
11099 F->addFnAttr("enqueued-block");
11100 auto IP = CGF.Builder.saveIP();
11101 auto *BB = llvm::BasicBlock::Create(C, "entry", F);
11102 Builder.SetInsertPoint(BB);
11103 const auto BlockAlign = CGF.CGM.getDataLayout().getPrefTypeAlign(BlockTy);
11104 auto *BlockPtr = Builder.CreateAlloca(BlockTy, nullptr);
11105 BlockPtr->setAlignment(BlockAlign);
11106 Builder.CreateAlignedStore(F->arg_begin(), BlockPtr, BlockAlign);
11107 auto *Cast = Builder.CreatePointerCast(BlockPtr, InvokeFT->getParamType(0));
11108 llvm::SmallVector<llvm::Value *, 2> Args;
11109 Args.push_back(Cast);
11110 for (auto I = F->arg_begin() + 1, E = F->arg_end(); I != E; ++I)
11111 Args.push_back(I);
11112 Builder.CreateCall(Invoke, Args);
11113 Builder.CreateRetVoid();
11114 Builder.restoreIP(IP);
11115
11116 F->setMetadata("kernel_arg_addr_space", llvm::MDNode::get(C, AddressQuals));
11117 F->setMetadata("kernel_arg_access_qual", llvm::MDNode::get(C, AccessQuals));
11118 F->setMetadata("kernel_arg_type", llvm::MDNode::get(C, ArgTypeNames));
11119 F->setMetadata("kernel_arg_base_type",
11120 llvm::MDNode::get(C, ArgBaseTypeNames));
11121 F->setMetadata("kernel_arg_type_qual", llvm::MDNode::get(C, ArgTypeQuals));
11122 if (CGF.CGM.getCodeGenOpts().EmitOpenCLArgMetadata)
11123 F->setMetadata("kernel_arg_name", llvm::MDNode::get(C, ArgNames));
11124
11125 return F;
11126 }
11127