xref: /freebsd/contrib/llvm-project/clang/lib/CodeGen/Targets/ARM.cpp (revision 02e9120893770924227138ba49df1edb3896112a)
1 //===- ARM.cpp ------------------------------------------------------------===//
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 #include "ABIInfoImpl.h"
10 #include "TargetInfo.h"
11 
12 using namespace clang;
13 using namespace clang::CodeGen;
14 
15 //===----------------------------------------------------------------------===//
16 // ARM ABI Implementation
17 //===----------------------------------------------------------------------===//
18 
19 namespace {
20 
21 class ARMABIInfo : public ABIInfo {
22   ARMABIKind Kind;
23   bool IsFloatABISoftFP;
24 
25 public:
26   ARMABIInfo(CodeGenTypes &CGT, ARMABIKind Kind) : ABIInfo(CGT), Kind(Kind) {
27     setCCs();
28     IsFloatABISoftFP = CGT.getCodeGenOpts().FloatABI == "softfp" ||
29         CGT.getCodeGenOpts().FloatABI == ""; // default
30   }
31 
32   bool isEABI() const {
33     switch (getTarget().getTriple().getEnvironment()) {
34     case llvm::Triple::Android:
35     case llvm::Triple::EABI:
36     case llvm::Triple::EABIHF:
37     case llvm::Triple::GNUEABI:
38     case llvm::Triple::GNUEABIHF:
39     case llvm::Triple::MuslEABI:
40     case llvm::Triple::MuslEABIHF:
41       return true;
42     default:
43       return getTarget().getTriple().isOHOSFamily();
44     }
45   }
46 
47   bool isEABIHF() const {
48     switch (getTarget().getTriple().getEnvironment()) {
49     case llvm::Triple::EABIHF:
50     case llvm::Triple::GNUEABIHF:
51     case llvm::Triple::MuslEABIHF:
52       return true;
53     default:
54       return false;
55     }
56   }
57 
58   ARMABIKind getABIKind() const { return Kind; }
59 
60   bool allowBFloatArgsAndRet() const override {
61     return !IsFloatABISoftFP && getTarget().hasBFloat16Type();
62   }
63 
64 private:
65   ABIArgInfo classifyReturnType(QualType RetTy, bool isVariadic,
66                                 unsigned functionCallConv) const;
67   ABIArgInfo classifyArgumentType(QualType RetTy, bool isVariadic,
68                                   unsigned functionCallConv) const;
69   ABIArgInfo classifyHomogeneousAggregate(QualType Ty, const Type *Base,
70                                           uint64_t Members) const;
71   ABIArgInfo coerceIllegalVector(QualType Ty) const;
72   bool isIllegalVectorType(QualType Ty) const;
73   bool containsAnyFP16Vectors(QualType Ty) const;
74 
75   bool isHomogeneousAggregateBaseType(QualType Ty) const override;
76   bool isHomogeneousAggregateSmallEnough(const Type *Ty,
77                                          uint64_t Members) const override;
78   bool isZeroLengthBitfieldPermittedInHomogeneousAggregate() const override;
79 
80   bool isEffectivelyAAPCS_VFP(unsigned callConvention, bool acceptHalf) const;
81 
82   void computeInfo(CGFunctionInfo &FI) const override;
83 
84   Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
85                     QualType Ty) const override;
86 
87   llvm::CallingConv::ID getLLVMDefaultCC() const;
88   llvm::CallingConv::ID getABIDefaultCC() const;
89   void setCCs();
90 };
91 
92 class ARMSwiftABIInfo : public SwiftABIInfo {
93 public:
94   explicit ARMSwiftABIInfo(CodeGenTypes &CGT)
95       : SwiftABIInfo(CGT, /*SwiftErrorInRegister=*/true) {}
96 
97   bool isLegalVectorType(CharUnits VectorSize, llvm::Type *EltTy,
98                          unsigned NumElts) const override;
99 };
100 
101 class ARMTargetCodeGenInfo : public TargetCodeGenInfo {
102 public:
103   ARMTargetCodeGenInfo(CodeGenTypes &CGT, ARMABIKind K)
104       : TargetCodeGenInfo(std::make_unique<ARMABIInfo>(CGT, K)) {
105     SwiftInfo = std::make_unique<ARMSwiftABIInfo>(CGT);
106   }
107 
108   int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const override {
109     return 13;
110   }
111 
112   StringRef getARCRetainAutoreleasedReturnValueMarker() const override {
113     return "mov\tr7, r7\t\t// marker for objc_retainAutoreleaseReturnValue";
114   }
115 
116   bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
117                                llvm::Value *Address) const override {
118     llvm::Value *Four8 = llvm::ConstantInt::get(CGF.Int8Ty, 4);
119 
120     // 0-15 are the 16 integer registers.
121     AssignToArrayRange(CGF.Builder, Address, Four8, 0, 15);
122     return false;
123   }
124 
125   unsigned getSizeOfUnwindException() const override {
126     if (getABIInfo<ARMABIInfo>().isEABI())
127       return 88;
128     return TargetCodeGenInfo::getSizeOfUnwindException();
129   }
130 
131   void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
132                            CodeGen::CodeGenModule &CGM) const override {
133     if (GV->isDeclaration())
134       return;
135     const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
136     if (!FD)
137       return;
138     auto *Fn = cast<llvm::Function>(GV);
139 
140     if (const auto *TA = FD->getAttr<TargetAttr>()) {
141       ParsedTargetAttr Attr =
142           CGM.getTarget().parseTargetAttr(TA->getFeaturesStr());
143       if (!Attr.BranchProtection.empty()) {
144         TargetInfo::BranchProtectionInfo BPI;
145         StringRef DiagMsg;
146         StringRef Arch =
147             Attr.CPU.empty() ? CGM.getTarget().getTargetOpts().CPU : Attr.CPU;
148         if (!CGM.getTarget().validateBranchProtection(Attr.BranchProtection,
149                                                       Arch, BPI, DiagMsg)) {
150           CGM.getDiags().Report(
151               D->getLocation(),
152               diag::warn_target_unsupported_branch_protection_attribute)
153               << Arch;
154         } else {
155           static const char *SignReturnAddrStr[] = {"none", "non-leaf", "all"};
156           assert(static_cast<unsigned>(BPI.SignReturnAddr) <= 2 &&
157                  "Unexpected SignReturnAddressScopeKind");
158           Fn->addFnAttr(
159               "sign-return-address",
160               SignReturnAddrStr[static_cast<int>(BPI.SignReturnAddr)]);
161 
162           Fn->addFnAttr("branch-target-enforcement",
163                         BPI.BranchTargetEnforcement ? "true" : "false");
164         }
165       } else if (CGM.getLangOpts().BranchTargetEnforcement ||
166                  CGM.getLangOpts().hasSignReturnAddress()) {
167         // If the Branch Protection attribute is missing, validate the target
168         // Architecture attribute against Branch Protection command line
169         // settings.
170         if (!CGM.getTarget().isBranchProtectionSupportedArch(Attr.CPU))
171           CGM.getDiags().Report(
172               D->getLocation(),
173               diag::warn_target_unsupported_branch_protection_attribute)
174               << Attr.CPU;
175       }
176     }
177 
178     const ARMInterruptAttr *Attr = FD->getAttr<ARMInterruptAttr>();
179     if (!Attr)
180       return;
181 
182     const char *Kind;
183     switch (Attr->getInterrupt()) {
184     case ARMInterruptAttr::Generic: Kind = ""; break;
185     case ARMInterruptAttr::IRQ:     Kind = "IRQ"; break;
186     case ARMInterruptAttr::FIQ:     Kind = "FIQ"; break;
187     case ARMInterruptAttr::SWI:     Kind = "SWI"; break;
188     case ARMInterruptAttr::ABORT:   Kind = "ABORT"; break;
189     case ARMInterruptAttr::UNDEF:   Kind = "UNDEF"; break;
190     }
191 
192     Fn->addFnAttr("interrupt", Kind);
193 
194     ARMABIKind ABI = getABIInfo<ARMABIInfo>().getABIKind();
195     if (ABI == ARMABIKind::APCS)
196       return;
197 
198     // AAPCS guarantees that sp will be 8-byte aligned on any public interface,
199     // however this is not necessarily true on taking any interrupt. Instruct
200     // the backend to perform a realignment as part of the function prologue.
201     llvm::AttrBuilder B(Fn->getContext());
202     B.addStackAlignmentAttr(8);
203     Fn->addFnAttrs(B);
204   }
205 };
206 
207 class WindowsARMTargetCodeGenInfo : public ARMTargetCodeGenInfo {
208 public:
209   WindowsARMTargetCodeGenInfo(CodeGenTypes &CGT, ARMABIKind K)
210       : ARMTargetCodeGenInfo(CGT, K) {}
211 
212   void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
213                            CodeGen::CodeGenModule &CGM) const override;
214 
215   void getDependentLibraryOption(llvm::StringRef Lib,
216                                  llvm::SmallString<24> &Opt) const override {
217     Opt = "/DEFAULTLIB:" + qualifyWindowsLibrary(Lib);
218   }
219 
220   void getDetectMismatchOption(llvm::StringRef Name, llvm::StringRef Value,
221                                llvm::SmallString<32> &Opt) const override {
222     Opt = "/FAILIFMISMATCH:\"" + Name.str() + "=" + Value.str() + "\"";
223   }
224 };
225 
226 void WindowsARMTargetCodeGenInfo::setTargetAttributes(
227     const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const {
228   ARMTargetCodeGenInfo::setTargetAttributes(D, GV, CGM);
229   if (GV->isDeclaration())
230     return;
231   addStackProbeTargetAttributes(D, GV, CGM);
232 }
233 }
234 
235 void ARMABIInfo::computeInfo(CGFunctionInfo &FI) const {
236   if (!::classifyReturnType(getCXXABI(), FI, *this))
237     FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), FI.isVariadic(),
238                                             FI.getCallingConvention());
239 
240   for (auto &I : FI.arguments())
241     I.info = classifyArgumentType(I.type, FI.isVariadic(),
242                                   FI.getCallingConvention());
243 
244 
245   // Always honor user-specified calling convention.
246   if (FI.getCallingConvention() != llvm::CallingConv::C)
247     return;
248 
249   llvm::CallingConv::ID cc = getRuntimeCC();
250   if (cc != llvm::CallingConv::C)
251     FI.setEffectiveCallingConvention(cc);
252 }
253 
254 /// Return the default calling convention that LLVM will use.
255 llvm::CallingConv::ID ARMABIInfo::getLLVMDefaultCC() const {
256   // The default calling convention that LLVM will infer.
257   if (isEABIHF() || getTarget().getTriple().isWatchABI())
258     return llvm::CallingConv::ARM_AAPCS_VFP;
259   else if (isEABI())
260     return llvm::CallingConv::ARM_AAPCS;
261   else
262     return llvm::CallingConv::ARM_APCS;
263 }
264 
265 /// Return the calling convention that our ABI would like us to use
266 /// as the C calling convention.
267 llvm::CallingConv::ID ARMABIInfo::getABIDefaultCC() const {
268   switch (getABIKind()) {
269   case ARMABIKind::APCS:
270     return llvm::CallingConv::ARM_APCS;
271   case ARMABIKind::AAPCS:
272     return llvm::CallingConv::ARM_AAPCS;
273   case ARMABIKind::AAPCS_VFP:
274     return llvm::CallingConv::ARM_AAPCS_VFP;
275   case ARMABIKind::AAPCS16_VFP:
276     return llvm::CallingConv::ARM_AAPCS_VFP;
277   }
278   llvm_unreachable("bad ABI kind");
279 }
280 
281 void ARMABIInfo::setCCs() {
282   assert(getRuntimeCC() == llvm::CallingConv::C);
283 
284   // Don't muddy up the IR with a ton of explicit annotations if
285   // they'd just match what LLVM will infer from the triple.
286   llvm::CallingConv::ID abiCC = getABIDefaultCC();
287   if (abiCC != getLLVMDefaultCC())
288     RuntimeCC = abiCC;
289 }
290 
291 ABIArgInfo ARMABIInfo::coerceIllegalVector(QualType Ty) const {
292   uint64_t Size = getContext().getTypeSize(Ty);
293   if (Size <= 32) {
294     llvm::Type *ResType =
295         llvm::Type::getInt32Ty(getVMContext());
296     return ABIArgInfo::getDirect(ResType);
297   }
298   if (Size == 64 || Size == 128) {
299     auto *ResType = llvm::FixedVectorType::get(
300         llvm::Type::getInt32Ty(getVMContext()), Size / 32);
301     return ABIArgInfo::getDirect(ResType);
302   }
303   return getNaturalAlignIndirect(Ty, /*ByVal=*/false);
304 }
305 
306 ABIArgInfo ARMABIInfo::classifyHomogeneousAggregate(QualType Ty,
307                                                     const Type *Base,
308                                                     uint64_t Members) const {
309   assert(Base && "Base class should be set for homogeneous aggregate");
310   // Base can be a floating-point or a vector.
311   if (const VectorType *VT = Base->getAs<VectorType>()) {
312     // FP16 vectors should be converted to integer vectors
313     if (!getTarget().hasLegalHalfType() && containsAnyFP16Vectors(Ty)) {
314       uint64_t Size = getContext().getTypeSize(VT);
315       auto *NewVecTy = llvm::FixedVectorType::get(
316           llvm::Type::getInt32Ty(getVMContext()), Size / 32);
317       llvm::Type *Ty = llvm::ArrayType::get(NewVecTy, Members);
318       return ABIArgInfo::getDirect(Ty, 0, nullptr, false);
319     }
320   }
321   unsigned Align = 0;
322   if (getABIKind() == ARMABIKind::AAPCS ||
323       getABIKind() == ARMABIKind::AAPCS_VFP) {
324     // For alignment adjusted HFAs, cap the argument alignment to 8, leave it
325     // default otherwise.
326     Align = getContext().getTypeUnadjustedAlignInChars(Ty).getQuantity();
327     unsigned BaseAlign = getContext().getTypeAlignInChars(Base).getQuantity();
328     Align = (Align > BaseAlign && Align >= 8) ? 8 : 0;
329   }
330   return ABIArgInfo::getDirect(nullptr, 0, nullptr, false, Align);
331 }
332 
333 ABIArgInfo ARMABIInfo::classifyArgumentType(QualType Ty, bool isVariadic,
334                                             unsigned functionCallConv) const {
335   // 6.1.2.1 The following argument types are VFP CPRCs:
336   //   A single-precision floating-point type (including promoted
337   //   half-precision types); A double-precision floating-point type;
338   //   A 64-bit or 128-bit containerized vector type; Homogeneous Aggregate
339   //   with a Base Type of a single- or double-precision floating-point type,
340   //   64-bit containerized vectors or 128-bit containerized vectors with one
341   //   to four Elements.
342   // Variadic functions should always marshal to the base standard.
343   bool IsAAPCS_VFP =
344       !isVariadic && isEffectivelyAAPCS_VFP(functionCallConv, /* AAPCS16 */ false);
345 
346   Ty = useFirstFieldIfTransparentUnion(Ty);
347 
348   // Handle illegal vector types here.
349   if (isIllegalVectorType(Ty))
350     return coerceIllegalVector(Ty);
351 
352   if (!isAggregateTypeForABI(Ty)) {
353     // Treat an enum type as its underlying type.
354     if (const EnumType *EnumTy = Ty->getAs<EnumType>()) {
355       Ty = EnumTy->getDecl()->getIntegerType();
356     }
357 
358     if (const auto *EIT = Ty->getAs<BitIntType>())
359       if (EIT->getNumBits() > 64)
360         return getNaturalAlignIndirect(Ty, /*ByVal=*/true);
361 
362     return (isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty)
363                                               : ABIArgInfo::getDirect());
364   }
365 
366   if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, getCXXABI())) {
367     return getNaturalAlignIndirect(Ty, RAA == CGCXXABI::RAA_DirectInMemory);
368   }
369 
370   // Ignore empty records.
371   if (isEmptyRecord(getContext(), Ty, true))
372     return ABIArgInfo::getIgnore();
373 
374   if (IsAAPCS_VFP) {
375     // Homogeneous Aggregates need to be expanded when we can fit the aggregate
376     // into VFP registers.
377     const Type *Base = nullptr;
378     uint64_t Members = 0;
379     if (isHomogeneousAggregate(Ty, Base, Members))
380       return classifyHomogeneousAggregate(Ty, Base, Members);
381   } else if (getABIKind() == ARMABIKind::AAPCS16_VFP) {
382     // WatchOS does have homogeneous aggregates. Note that we intentionally use
383     // this convention even for a variadic function: the backend will use GPRs
384     // if needed.
385     const Type *Base = nullptr;
386     uint64_t Members = 0;
387     if (isHomogeneousAggregate(Ty, Base, Members)) {
388       assert(Base && Members <= 4 && "unexpected homogeneous aggregate");
389       llvm::Type *Ty =
390         llvm::ArrayType::get(CGT.ConvertType(QualType(Base, 0)), Members);
391       return ABIArgInfo::getDirect(Ty, 0, nullptr, false);
392     }
393   }
394 
395   if (getABIKind() == ARMABIKind::AAPCS16_VFP &&
396       getContext().getTypeSizeInChars(Ty) > CharUnits::fromQuantity(16)) {
397     // WatchOS is adopting the 64-bit AAPCS rule on composite types: if they're
398     // bigger than 128-bits, they get placed in space allocated by the caller,
399     // and a pointer is passed.
400     return ABIArgInfo::getIndirect(
401         CharUnits::fromQuantity(getContext().getTypeAlign(Ty) / 8), false);
402   }
403 
404   // Support byval for ARM.
405   // The ABI alignment for APCS is 4-byte and for AAPCS at least 4-byte and at
406   // most 8-byte. We realign the indirect argument if type alignment is bigger
407   // than ABI alignment.
408   uint64_t ABIAlign = 4;
409   uint64_t TyAlign;
410   if (getABIKind() == ARMABIKind::AAPCS_VFP ||
411       getABIKind() == ARMABIKind::AAPCS) {
412     TyAlign = getContext().getTypeUnadjustedAlignInChars(Ty).getQuantity();
413     ABIAlign = std::clamp(TyAlign, (uint64_t)4, (uint64_t)8);
414   } else {
415     TyAlign = getContext().getTypeAlignInChars(Ty).getQuantity();
416   }
417   if (getContext().getTypeSizeInChars(Ty) > CharUnits::fromQuantity(64)) {
418     assert(getABIKind() != ARMABIKind::AAPCS16_VFP && "unexpected byval");
419     return ABIArgInfo::getIndirect(CharUnits::fromQuantity(ABIAlign),
420                                    /*ByVal=*/true,
421                                    /*Realign=*/TyAlign > ABIAlign);
422   }
423 
424   // On RenderScript, coerce Aggregates <= 64 bytes to an integer array of
425   // same size and alignment.
426   if (getTarget().isRenderScriptTarget()) {
427     return coerceToIntArray(Ty, getContext(), getVMContext());
428   }
429 
430   // Otherwise, pass by coercing to a structure of the appropriate size.
431   llvm::Type* ElemTy;
432   unsigned SizeRegs;
433   // FIXME: Try to match the types of the arguments more accurately where
434   // we can.
435   if (TyAlign <= 4) {
436     ElemTy = llvm::Type::getInt32Ty(getVMContext());
437     SizeRegs = (getContext().getTypeSize(Ty) + 31) / 32;
438   } else {
439     ElemTy = llvm::Type::getInt64Ty(getVMContext());
440     SizeRegs = (getContext().getTypeSize(Ty) + 63) / 64;
441   }
442 
443   return ABIArgInfo::getDirect(llvm::ArrayType::get(ElemTy, SizeRegs));
444 }
445 
446 static bool isIntegerLikeType(QualType Ty, ASTContext &Context,
447                               llvm::LLVMContext &VMContext) {
448   // APCS, C Language Calling Conventions, Non-Simple Return Values: A structure
449   // is called integer-like if its size is less than or equal to one word, and
450   // the offset of each of its addressable sub-fields is zero.
451 
452   uint64_t Size = Context.getTypeSize(Ty);
453 
454   // Check that the type fits in a word.
455   if (Size > 32)
456     return false;
457 
458   // FIXME: Handle vector types!
459   if (Ty->isVectorType())
460     return false;
461 
462   // Float types are never treated as "integer like".
463   if (Ty->isRealFloatingType())
464     return false;
465 
466   // If this is a builtin or pointer type then it is ok.
467   if (Ty->getAs<BuiltinType>() || Ty->isPointerType())
468     return true;
469 
470   // Small complex integer types are "integer like".
471   if (const ComplexType *CT = Ty->getAs<ComplexType>())
472     return isIntegerLikeType(CT->getElementType(), Context, VMContext);
473 
474   // Single element and zero sized arrays should be allowed, by the definition
475   // above, but they are not.
476 
477   // Otherwise, it must be a record type.
478   const RecordType *RT = Ty->getAs<RecordType>();
479   if (!RT) return false;
480 
481   // Ignore records with flexible arrays.
482   const RecordDecl *RD = RT->getDecl();
483   if (RD->hasFlexibleArrayMember())
484     return false;
485 
486   // Check that all sub-fields are at offset 0, and are themselves "integer
487   // like".
488   const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
489 
490   bool HadField = false;
491   unsigned idx = 0;
492   for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end();
493        i != e; ++i, ++idx) {
494     const FieldDecl *FD = *i;
495 
496     // Bit-fields are not addressable, we only need to verify they are "integer
497     // like". We still have to disallow a subsequent non-bitfield, for example:
498     //   struct { int : 0; int x }
499     // is non-integer like according to gcc.
500     if (FD->isBitField()) {
501       if (!RD->isUnion())
502         HadField = true;
503 
504       if (!isIntegerLikeType(FD->getType(), Context, VMContext))
505         return false;
506 
507       continue;
508     }
509 
510     // Check if this field is at offset 0.
511     if (Layout.getFieldOffset(idx) != 0)
512       return false;
513 
514     if (!isIntegerLikeType(FD->getType(), Context, VMContext))
515       return false;
516 
517     // Only allow at most one field in a structure. This doesn't match the
518     // wording above, but follows gcc in situations with a field following an
519     // empty structure.
520     if (!RD->isUnion()) {
521       if (HadField)
522         return false;
523 
524       HadField = true;
525     }
526   }
527 
528   return true;
529 }
530 
531 ABIArgInfo ARMABIInfo::classifyReturnType(QualType RetTy, bool isVariadic,
532                                           unsigned functionCallConv) const {
533 
534   // Variadic functions should always marshal to the base standard.
535   bool IsAAPCS_VFP =
536       !isVariadic && isEffectivelyAAPCS_VFP(functionCallConv, /* AAPCS16 */ true);
537 
538   if (RetTy->isVoidType())
539     return ABIArgInfo::getIgnore();
540 
541   if (const VectorType *VT = RetTy->getAs<VectorType>()) {
542     // Large vector types should be returned via memory.
543     if (getContext().getTypeSize(RetTy) > 128)
544       return getNaturalAlignIndirect(RetTy);
545     // TODO: FP16/BF16 vectors should be converted to integer vectors
546     // This check is similar  to isIllegalVectorType - refactor?
547     if ((!getTarget().hasLegalHalfType() &&
548         (VT->getElementType()->isFloat16Type() ||
549          VT->getElementType()->isHalfType())) ||
550         (IsFloatABISoftFP &&
551          VT->getElementType()->isBFloat16Type()))
552       return coerceIllegalVector(RetTy);
553   }
554 
555   if (!isAggregateTypeForABI(RetTy)) {
556     // Treat an enum type as its underlying type.
557     if (const EnumType *EnumTy = RetTy->getAs<EnumType>())
558       RetTy = EnumTy->getDecl()->getIntegerType();
559 
560     if (const auto *EIT = RetTy->getAs<BitIntType>())
561       if (EIT->getNumBits() > 64)
562         return getNaturalAlignIndirect(RetTy, /*ByVal=*/false);
563 
564     return isPromotableIntegerTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy)
565                                                 : ABIArgInfo::getDirect();
566   }
567 
568   // Are we following APCS?
569   if (getABIKind() == ARMABIKind::APCS) {
570     if (isEmptyRecord(getContext(), RetTy, false))
571       return ABIArgInfo::getIgnore();
572 
573     // Complex types are all returned as packed integers.
574     //
575     // FIXME: Consider using 2 x vector types if the back end handles them
576     // correctly.
577     if (RetTy->isAnyComplexType())
578       return ABIArgInfo::getDirect(llvm::IntegerType::get(
579           getVMContext(), getContext().getTypeSize(RetTy)));
580 
581     // Integer like structures are returned in r0.
582     if (isIntegerLikeType(RetTy, getContext(), getVMContext())) {
583       // Return in the smallest viable integer type.
584       uint64_t Size = getContext().getTypeSize(RetTy);
585       if (Size <= 8)
586         return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext()));
587       if (Size <= 16)
588         return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext()));
589       return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
590     }
591 
592     // Otherwise return in memory.
593     return getNaturalAlignIndirect(RetTy);
594   }
595 
596   // Otherwise this is an AAPCS variant.
597 
598   if (isEmptyRecord(getContext(), RetTy, true))
599     return ABIArgInfo::getIgnore();
600 
601   // Check for homogeneous aggregates with AAPCS-VFP.
602   if (IsAAPCS_VFP) {
603     const Type *Base = nullptr;
604     uint64_t Members = 0;
605     if (isHomogeneousAggregate(RetTy, Base, Members))
606       return classifyHomogeneousAggregate(RetTy, Base, Members);
607   }
608 
609   // Aggregates <= 4 bytes are returned in r0; other aggregates
610   // are returned indirectly.
611   uint64_t Size = getContext().getTypeSize(RetTy);
612   if (Size <= 32) {
613     // On RenderScript, coerce Aggregates <= 4 bytes to an integer array of
614     // same size and alignment.
615     if (getTarget().isRenderScriptTarget()) {
616       return coerceToIntArray(RetTy, getContext(), getVMContext());
617     }
618     if (getDataLayout().isBigEndian())
619       // Return in 32 bit integer integer type (as if loaded by LDR, AAPCS 5.4)
620       return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
621 
622     // Return in the smallest viable integer type.
623     if (Size <= 8)
624       return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext()));
625     if (Size <= 16)
626       return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext()));
627     return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext()));
628   } else if (Size <= 128 && getABIKind() == ARMABIKind::AAPCS16_VFP) {
629     llvm::Type *Int32Ty = llvm::Type::getInt32Ty(getVMContext());
630     llvm::Type *CoerceTy =
631         llvm::ArrayType::get(Int32Ty, llvm::alignTo(Size, 32) / 32);
632     return ABIArgInfo::getDirect(CoerceTy);
633   }
634 
635   return getNaturalAlignIndirect(RetTy);
636 }
637 
638 /// isIllegalVector - check whether Ty is an illegal vector type.
639 bool ARMABIInfo::isIllegalVectorType(QualType Ty) const {
640   if (const VectorType *VT = Ty->getAs<VectorType> ()) {
641     // On targets that don't support half, fp16 or bfloat, they are expanded
642     // into float, and we don't want the ABI to depend on whether or not they
643     // are supported in hardware. Thus return false to coerce vectors of these
644     // types into integer vectors.
645     // We do not depend on hasLegalHalfType for bfloat as it is a
646     // separate IR type.
647     if ((!getTarget().hasLegalHalfType() &&
648         (VT->getElementType()->isFloat16Type() ||
649          VT->getElementType()->isHalfType())) ||
650         (IsFloatABISoftFP &&
651          VT->getElementType()->isBFloat16Type()))
652       return true;
653     if (isAndroid()) {
654       // Android shipped using Clang 3.1, which supported a slightly different
655       // vector ABI. The primary differences were that 3-element vector types
656       // were legal, and so were sub 32-bit vectors (i.e. <2 x i8>). This path
657       // accepts that legacy behavior for Android only.
658       // Check whether VT is legal.
659       unsigned NumElements = VT->getNumElements();
660       // NumElements should be power of 2 or equal to 3.
661       if (!llvm::isPowerOf2_32(NumElements) && NumElements != 3)
662         return true;
663     } else {
664       // Check whether VT is legal.
665       unsigned NumElements = VT->getNumElements();
666       uint64_t Size = getContext().getTypeSize(VT);
667       // NumElements should be power of 2.
668       if (!llvm::isPowerOf2_32(NumElements))
669         return true;
670       // Size should be greater than 32 bits.
671       return Size <= 32;
672     }
673   }
674   return false;
675 }
676 
677 /// Return true if a type contains any 16-bit floating point vectors
678 bool ARMABIInfo::containsAnyFP16Vectors(QualType Ty) const {
679   if (const ConstantArrayType *AT = getContext().getAsConstantArrayType(Ty)) {
680     uint64_t NElements = AT->getSize().getZExtValue();
681     if (NElements == 0)
682       return false;
683     return containsAnyFP16Vectors(AT->getElementType());
684   } else if (const RecordType *RT = Ty->getAs<RecordType>()) {
685     const RecordDecl *RD = RT->getDecl();
686 
687     // If this is a C++ record, check the bases first.
688     if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
689       if (llvm::any_of(CXXRD->bases(), [this](const CXXBaseSpecifier &B) {
690             return containsAnyFP16Vectors(B.getType());
691           }))
692         return true;
693 
694     if (llvm::any_of(RD->fields(), [this](FieldDecl *FD) {
695           return FD && containsAnyFP16Vectors(FD->getType());
696         }))
697       return true;
698 
699     return false;
700   } else {
701     if (const VectorType *VT = Ty->getAs<VectorType>())
702       return (VT->getElementType()->isFloat16Type() ||
703               VT->getElementType()->isBFloat16Type() ||
704               VT->getElementType()->isHalfType());
705     return false;
706   }
707 }
708 
709 bool ARMSwiftABIInfo::isLegalVectorType(CharUnits VectorSize, llvm::Type *EltTy,
710                                         unsigned NumElts) const {
711   if (!llvm::isPowerOf2_32(NumElts))
712     return false;
713   unsigned size = CGT.getDataLayout().getTypeStoreSizeInBits(EltTy);
714   if (size > 64)
715     return false;
716   if (VectorSize.getQuantity() != 8 &&
717       (VectorSize.getQuantity() != 16 || NumElts == 1))
718     return false;
719   return true;
720 }
721 
722 bool ARMABIInfo::isHomogeneousAggregateBaseType(QualType Ty) const {
723   // Homogeneous aggregates for AAPCS-VFP must have base types of float,
724   // double, or 64-bit or 128-bit vectors.
725   if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) {
726     if (BT->getKind() == BuiltinType::Float ||
727         BT->getKind() == BuiltinType::Double ||
728         BT->getKind() == BuiltinType::LongDouble)
729       return true;
730   } else if (const VectorType *VT = Ty->getAs<VectorType>()) {
731     unsigned VecSize = getContext().getTypeSize(VT);
732     if (VecSize == 64 || VecSize == 128)
733       return true;
734   }
735   return false;
736 }
737 
738 bool ARMABIInfo::isHomogeneousAggregateSmallEnough(const Type *Base,
739                                                    uint64_t Members) const {
740   return Members <= 4;
741 }
742 
743 bool ARMABIInfo::isZeroLengthBitfieldPermittedInHomogeneousAggregate() const {
744   // AAPCS32 says that the rule for whether something is a homogeneous
745   // aggregate is applied to the output of the data layout decision. So
746   // anything that doesn't affect the data layout also does not affect
747   // homogeneity. In particular, zero-length bitfields don't stop a struct
748   // being homogeneous.
749   return true;
750 }
751 
752 bool ARMABIInfo::isEffectivelyAAPCS_VFP(unsigned callConvention,
753                                         bool acceptHalf) const {
754   // Give precedence to user-specified calling conventions.
755   if (callConvention != llvm::CallingConv::C)
756     return (callConvention == llvm::CallingConv::ARM_AAPCS_VFP);
757   else
758     return (getABIKind() == ARMABIKind::AAPCS_VFP) ||
759            (acceptHalf && (getABIKind() == ARMABIKind::AAPCS16_VFP));
760 }
761 
762 Address ARMABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
763                               QualType Ty) const {
764   CharUnits SlotSize = CharUnits::fromQuantity(4);
765 
766   // Empty records are ignored for parameter passing purposes.
767   if (isEmptyRecord(getContext(), Ty, true)) {
768     VAListAddr = VAListAddr.withElementType(CGF.Int8PtrTy);
769     auto *Load = CGF.Builder.CreateLoad(VAListAddr);
770     return Address(Load, CGF.ConvertTypeForMem(Ty), SlotSize);
771   }
772 
773   CharUnits TySize = getContext().getTypeSizeInChars(Ty);
774   CharUnits TyAlignForABI = getContext().getTypeUnadjustedAlignInChars(Ty);
775 
776   // Use indirect if size of the illegal vector is bigger than 16 bytes.
777   bool IsIndirect = false;
778   const Type *Base = nullptr;
779   uint64_t Members = 0;
780   if (TySize > CharUnits::fromQuantity(16) && isIllegalVectorType(Ty)) {
781     IsIndirect = true;
782 
783   // ARMv7k passes structs bigger than 16 bytes indirectly, in space
784   // allocated by the caller.
785   } else if (TySize > CharUnits::fromQuantity(16) &&
786              getABIKind() == ARMABIKind::AAPCS16_VFP &&
787              !isHomogeneousAggregate(Ty, Base, Members)) {
788     IsIndirect = true;
789 
790   // Otherwise, bound the type's ABI alignment.
791   // The ABI alignment for 64-bit or 128-bit vectors is 8 for AAPCS and 4 for
792   // APCS. For AAPCS, the ABI alignment is at least 4-byte and at most 8-byte.
793   // Our callers should be prepared to handle an under-aligned address.
794   } else if (getABIKind() == ARMABIKind::AAPCS_VFP ||
795              getABIKind() == ARMABIKind::AAPCS) {
796     TyAlignForABI = std::max(TyAlignForABI, CharUnits::fromQuantity(4));
797     TyAlignForABI = std::min(TyAlignForABI, CharUnits::fromQuantity(8));
798   } else if (getABIKind() == ARMABIKind::AAPCS16_VFP) {
799     // ARMv7k allows type alignment up to 16 bytes.
800     TyAlignForABI = std::max(TyAlignForABI, CharUnits::fromQuantity(4));
801     TyAlignForABI = std::min(TyAlignForABI, CharUnits::fromQuantity(16));
802   } else {
803     TyAlignForABI = CharUnits::fromQuantity(4);
804   }
805 
806   TypeInfoChars TyInfo(TySize, TyAlignForABI, AlignRequirementKind::None);
807   return emitVoidPtrVAArg(CGF, VAListAddr, Ty, IsIndirect, TyInfo,
808                           SlotSize, /*AllowHigherAlign*/ true);
809 }
810 
811 std::unique_ptr<TargetCodeGenInfo>
812 CodeGen::createARMTargetCodeGenInfo(CodeGenModule &CGM, ARMABIKind Kind) {
813   return std::make_unique<ARMTargetCodeGenInfo>(CGM.getTypes(), Kind);
814 }
815 
816 std::unique_ptr<TargetCodeGenInfo>
817 CodeGen::createWindowsARMTargetCodeGenInfo(CodeGenModule &CGM, ARMABIKind K) {
818   return std::make_unique<WindowsARMTargetCodeGenInfo>(CGM.getTypes(), K);
819 }
820