diff options
Diffstat (limited to 'clang/lib/CodeGen/Targets')
| -rw-r--r-- | clang/lib/CodeGen/Targets/AArch64.cpp | 16 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/AMDGPU.cpp | 19 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/ARC.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/ARM.cpp | 16 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/BPF.cpp | 9 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/CSKY.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/DirectX.cpp | 3 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/Hexagon.cpp | 9 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/Lanai.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/LoongArch.cpp | 13 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/Mips.cpp | 12 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/NVPTX.cpp | 55 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/PPC.cpp | 13 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/RISCV.cpp | 13 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/SPIR.cpp | 88 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/Sparc.cpp | 4 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/SystemZ.cpp | 16 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/WebAssembly.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/X86.cpp | 99 | ||||
| -rw-r--r-- | clang/lib/CodeGen/Targets/XCore.cpp | 7 |
20 files changed, 186 insertions, 230 deletions
diff --git a/clang/lib/CodeGen/Targets/AArch64.cpp b/clang/lib/CodeGen/Targets/AArch64.cpp index 289f8a9dcf21..d7deece232a9 100644 --- a/clang/lib/CodeGen/Targets/AArch64.cpp +++ b/clang/lib/CodeGen/Targets/AArch64.cpp @@ -374,8 +374,8 @@ ABIArgInfo AArch64ABIInfo::classifyArgumentType(QualType Ty, bool IsVariadicFn, if (!passAsAggregateType(Ty)) { // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); if (const auto *EIT = Ty->getAs<BitIntType>()) if (EIT->getNumBits() > 128) @@ -493,10 +493,9 @@ ABIArgInfo AArch64ABIInfo::classifyArgumentType(QualType Ty, bool IsVariadicFn, auto ContainsOnlyPointers = [&](const auto &Self, QualType Ty) { if (isEmptyRecord(getContext(), Ty, true)) return false; - const RecordType *RT = Ty->getAs<RecordType>(); - if (!RT) + const auto *RD = Ty->getAsRecordDecl(); + if (!RD) return false; - const RecordDecl *RD = RT->getOriginalDecl()->getDefinitionOrSelf(); if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) { for (const auto &I : CXXRD->bases()) if (!Self(Self, I.getType())) @@ -547,9 +546,8 @@ ABIArgInfo AArch64ABIInfo::classifyReturnType(QualType RetTy, if (!passAsAggregateType(RetTy)) { // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) - RetTy = - EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = RetTy->getAsEnumDecl()) + RetTy = ED->getIntegerType(); if (const auto *EIT = RetTy->getAs<BitIntType>()) if (EIT->getNumBits() > 128) @@ -738,7 +736,7 @@ bool AArch64ABIInfo::passAsPureScalableType( return true; } - if (const RecordType *RT = Ty->getAs<RecordType>()) { + if (const RecordType *RT = Ty->getAsCanonical<RecordType>()) { // If the record cannot be passed in registers, then it's not a PST. if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(RT, getCXXABI()); RAA != CGCXXABI::RAA_Default) diff --git a/clang/lib/CodeGen/Targets/AMDGPU.cpp b/clang/lib/CodeGen/Targets/AMDGPU.cpp index 41bccbb5721b..0fcbf7e458a3 100644 --- a/clang/lib/CodeGen/Targets/AMDGPU.cpp +++ b/clang/lib/CodeGen/Targets/AMDGPU.cpp @@ -95,8 +95,7 @@ unsigned AMDGPUABIInfo::numRegsForType(QualType Ty) const { return EltNumRegs * VT->getNumElements(); } - if (const RecordType *RT = Ty->getAs<RecordType>()) { - const RecordDecl *RD = RT->getOriginalDecl()->getDefinitionOrSelf(); + if (const auto *RD = Ty->getAsRecordDecl()) { assert(!RD->hasFlexibleArrayMember()); for (const FieldDecl *Field : RD->fields()) { @@ -152,11 +151,9 @@ ABIArgInfo AMDGPUABIInfo::classifyReturnType(QualType RetTy) const { if (const Type *SeltTy = isSingleElementStruct(RetTy, getContext())) return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0))); - if (const RecordType *RT = RetTy->getAs<RecordType>()) { - const RecordDecl *RD = RT->getOriginalDecl()->getDefinitionOrSelf(); - if (RD->hasFlexibleArrayMember()) - return DefaultABIInfo::classifyReturnType(RetTy); - } + if (const auto *RD = RetTy->getAsRecordDecl(); + RD && RD->hasFlexibleArrayMember()) + return DefaultABIInfo::classifyReturnType(RetTy); // Pack aggregates <= 4 bytes into single VGPR or pair. uint64_t Size = getContext().getTypeSize(RetTy); @@ -245,11 +242,9 @@ ABIArgInfo AMDGPUABIInfo::classifyArgumentType(QualType Ty, bool Variadic, if (const Type *SeltTy = isSingleElementStruct(Ty, getContext())) return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0))); - if (const RecordType *RT = Ty->getAs<RecordType>()) { - const RecordDecl *RD = RT->getOriginalDecl()->getDefinitionOrSelf(); - if (RD->hasFlexibleArrayMember()) - return DefaultABIInfo::classifyArgumentType(Ty); - } + if (const auto *RD = Ty->getAsRecordDecl(); + RD && RD->hasFlexibleArrayMember()) + return DefaultABIInfo::classifyArgumentType(Ty); // Pack aggregates <= 8 bytes into single VGPR or pair. uint64_t Size = getContext().getTypeSize(Ty); diff --git a/clang/lib/CodeGen/Targets/ARC.cpp b/clang/lib/CodeGen/Targets/ARC.cpp index ace524e1976d..67275877cbd9 100644 --- a/clang/lib/CodeGen/Targets/ARC.cpp +++ b/clang/lib/CodeGen/Targets/ARC.cpp @@ -94,7 +94,7 @@ RValue ARCABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr, ABIArgInfo ARCABIInfo::classifyArgumentType(QualType Ty, uint8_t FreeRegs) const { // Handle the generic C++ ABI. - const RecordType *RT = Ty->getAs<RecordType>(); + const RecordType *RT = Ty->getAsCanonical<RecordType>(); if (RT) { CGCXXABI::RecordArgABI RAA = getRecordArgABI(RT, getCXXABI()); if (RAA == CGCXXABI::RAA_Indirect) @@ -105,8 +105,8 @@ ABIArgInfo ARCABIInfo::classifyArgumentType(QualType Ty, } // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); auto SizeInRegs = llvm::alignTo(getContext().getTypeSize(Ty), 32) / 32; diff --git a/clang/lib/CodeGen/Targets/ARM.cpp b/clang/lib/CodeGen/Targets/ARM.cpp index 3739e16788c3..c84c9f2f643e 100644 --- a/clang/lib/CodeGen/Targets/ARM.cpp +++ b/clang/lib/CodeGen/Targets/ARM.cpp @@ -382,8 +382,8 @@ ABIArgInfo ARMABIInfo::classifyArgumentType(QualType Ty, bool isVariadic, if (!isAggregateTypeForABI(Ty)) { // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) { - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) { + Ty = ED->getIntegerType(); } if (const auto *EIT = Ty->getAs<BitIntType>()) @@ -512,7 +512,7 @@ static bool isIntegerLikeType(QualType Ty, ASTContext &Context, // above, but they are not. // Otherwise, it must be a record type. - const RecordType *RT = Ty->getAs<RecordType>(); + const RecordType *RT = Ty->getAsCanonical<RecordType>(); if (!RT) return false; // Ignore records with flexible arrays. @@ -592,9 +592,8 @@ ABIArgInfo ARMABIInfo::classifyReturnType(QualType RetTy, bool isVariadic, if (!isAggregateTypeForABI(RetTy)) { // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) - RetTy = - EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = RetTy->getAsEnumDecl()) + RetTy = ED->getIntegerType(); if (const auto *EIT = RetTy->getAs<BitIntType>()) if (EIT->getNumBits() > 64) @@ -718,9 +717,8 @@ bool ARMABIInfo::containsAnyFP16Vectors(QualType Ty) const { if (NElements == 0) return false; return containsAnyFP16Vectors(AT->getElementType()); - } else if (const RecordType *RT = Ty->getAs<RecordType>()) { - const RecordDecl *RD = RT->getOriginalDecl()->getDefinitionOrSelf(); - + } + if (const auto *RD = Ty->getAsRecordDecl()) { // If this is a C++ record, check the bases first. if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) if (llvm::any_of(CXXRD->bases(), [this](const CXXBaseSpecifier &B) { diff --git a/clang/lib/CodeGen/Targets/BPF.cpp b/clang/lib/CodeGen/Targets/BPF.cpp index 87d50e671d25..3a7af346f113 100644 --- a/clang/lib/CodeGen/Targets/BPF.cpp +++ b/clang/lib/CodeGen/Targets/BPF.cpp @@ -47,8 +47,8 @@ public: } } - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); ASTContext &Context = getContext(); if (const auto *EIT = Ty->getAs<BitIntType>()) @@ -69,9 +69,8 @@ public: getDataLayout().getAllocaAddrSpace()); // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) - RetTy = - EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = RetTy->getAsEnumDecl()) + RetTy = ED->getIntegerType(); ASTContext &Context = getContext(); if (const auto *EIT = RetTy->getAs<BitIntType>()) diff --git a/clang/lib/CodeGen/Targets/CSKY.cpp b/clang/lib/CodeGen/Targets/CSKY.cpp index 7e5a16f30727..b9254208f912 100644 --- a/clang/lib/CodeGen/Targets/CSKY.cpp +++ b/clang/lib/CodeGen/Targets/CSKY.cpp @@ -91,7 +91,7 @@ ABIArgInfo CSKYABIInfo::classifyArgumentType(QualType Ty, int &ArgGPRsLeft, if (isEmptyRecord(getContext(), Ty, true)) return ABIArgInfo::getIgnore(); - if (!Ty->getAsUnionType()) + if (!Ty->isUnionType()) if (const Type *SeltTy = isSingleElementStruct(Ty, getContext())) return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0))); @@ -115,8 +115,8 @@ ABIArgInfo CSKYABIInfo::classifyArgumentType(QualType Ty, int &ArgGPRsLeft, if (!isAggregateTypeForABI(Ty)) { // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); // All integral types are promoted to XLen width, unless passed on the // stack. diff --git a/clang/lib/CodeGen/Targets/DirectX.cpp b/clang/lib/CodeGen/Targets/DirectX.cpp index 96a128466139..b4cebb9a32ac 100644 --- a/clang/lib/CodeGen/Targets/DirectX.cpp +++ b/clang/lib/CodeGen/Targets/DirectX.cpp @@ -77,7 +77,8 @@ llvm::Type *DirectXTargetCodeGenInfo::getHLSLType( llvm::Type *BufferLayoutTy = HLSLBufferLayoutBuilder(CGM, "dx.Layout") - .createLayoutType(ContainedTy->getAsStructureType(), Packoffsets); + .createLayoutType(ContainedTy->castAsCanonical<RecordType>(), + Packoffsets); if (!BufferLayoutTy) return nullptr; diff --git a/clang/lib/CodeGen/Targets/Hexagon.cpp b/clang/lib/CodeGen/Targets/Hexagon.cpp index 0c423429eda4..97a9300a1b8c 100644 --- a/clang/lib/CodeGen/Targets/Hexagon.cpp +++ b/clang/lib/CodeGen/Targets/Hexagon.cpp @@ -97,8 +97,8 @@ ABIArgInfo HexagonABIInfo::classifyArgumentType(QualType Ty, unsigned *RegsLeft) const { if (!isAggregateTypeForABI(Ty)) { // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); uint64_t Size = getContext().getTypeSize(Ty); if (Size <= 64) @@ -160,9 +160,8 @@ ABIArgInfo HexagonABIInfo::classifyReturnType(QualType RetTy) const { if (!isAggregateTypeForABI(RetTy)) { // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) - RetTy = - EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = RetTy->getAsEnumDecl()) + RetTy = ED->getIntegerType(); if (Size > 64 && RetTy->isBitIntType()) return getNaturalAlignIndirect( diff --git a/clang/lib/CodeGen/Targets/Lanai.cpp b/clang/lib/CodeGen/Targets/Lanai.cpp index 08cb36034f6f..e76431a484e7 100644 --- a/clang/lib/CodeGen/Targets/Lanai.cpp +++ b/clang/lib/CodeGen/Targets/Lanai.cpp @@ -88,7 +88,7 @@ ABIArgInfo LanaiABIInfo::getIndirectResult(QualType Ty, bool ByVal, ABIArgInfo LanaiABIInfo::classifyArgumentType(QualType Ty, CCState &State) const { // Check with the C++ ABI first. - const RecordType *RT = Ty->getAs<RecordType>(); + const RecordType *RT = Ty->getAsCanonical<RecordType>(); if (RT) { CGCXXABI::RecordArgABI RAA = getRecordArgABI(RT, getCXXABI()); if (RAA == CGCXXABI::RAA_Indirect) { @@ -125,8 +125,8 @@ ABIArgInfo LanaiABIInfo::classifyArgumentType(QualType Ty, } // Treat an enum type as its underlying type. - if (const auto *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); bool InReg = shouldUseInReg(Ty, State); diff --git a/clang/lib/CodeGen/Targets/LoongArch.cpp b/clang/lib/CodeGen/Targets/LoongArch.cpp index af863e6101e2..1f344d658251 100644 --- a/clang/lib/CodeGen/Targets/LoongArch.cpp +++ b/clang/lib/CodeGen/Targets/LoongArch.cpp @@ -149,7 +149,7 @@ bool LoongArchABIInfo::detectFARsEligibleStructHelper( QualType EltTy = ATy->getElementType(); // Non-zero-length arrays of empty records make the struct ineligible to be // passed via FARs in C++. - if (const auto *RTy = EltTy->getAs<RecordType>()) { + if (const auto *RTy = EltTy->getAsCanonical<RecordType>()) { if (ArraySize != 0 && isa<CXXRecordDecl>(RTy->getOriginalDecl()) && isEmptyRecord(getContext(), EltTy, true, true)) return false; @@ -164,7 +164,7 @@ bool LoongArchABIInfo::detectFARsEligibleStructHelper( return true; } - if (const auto *RTy = Ty->getAs<RecordType>()) { + if (const auto *RTy = Ty->getAsCanonical<RecordType>()) { // Structures with either a non-trivial destructor or a non-trivial // copy constructor are not eligible for the FP calling convention. if (getRecordArgABI(Ty, CGT.getCXXABI())) @@ -180,10 +180,7 @@ bool LoongArchABIInfo::detectFARsEligibleStructHelper( // If this is a C++ record, check the bases first. if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) { for (const CXXBaseSpecifier &B : CXXRD->bases()) { - const auto *BDecl = - cast<CXXRecordDecl>( - B.getType()->castAs<RecordType>()->getOriginalDecl()) - ->getDefinitionOrSelf(); + const auto *BDecl = B.getType()->castAsCXXRecordDecl(); if (!detectFARsEligibleStructHelper( B.getType(), CurOff + Layout.getBaseClassOffset(BDecl), Field1Ty, Field1Off, Field2Ty, Field2Off)) @@ -370,8 +367,8 @@ ABIArgInfo LoongArchABIInfo::classifyArgumentType(QualType Ty, bool IsFixed, if (!isAggregateTypeForABI(Ty) && !Ty->isVectorType()) { // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); // All integral types are promoted to GRLen width. if (Size < GRLen && Ty->isIntegralOrEnumerationType()) diff --git a/clang/lib/CodeGen/Targets/Mips.cpp b/clang/lib/CodeGen/Targets/Mips.cpp index e12a34ce07bb..f26ab974d699 100644 --- a/clang/lib/CodeGen/Targets/Mips.cpp +++ b/clang/lib/CodeGen/Targets/Mips.cpp @@ -153,7 +153,7 @@ llvm::Type* MipsABIInfo::HandleAggregates(QualType Ty, uint64_t TySize) const { if (Ty->isComplexType()) return CGT.ConvertType(Ty); - const RecordType *RT = Ty->getAs<RecordType>(); + const RecordType *RT = Ty->getAsCanonical<RecordType>(); // Unions/vectors are passed in integer registers. if (!RT || !RT->isStructureOrClassType()) { @@ -241,8 +241,8 @@ MipsABIInfo::classifyArgumentType(QualType Ty, uint64_t &Offset) const { } // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); // Make sure we pass indirectly things that are too large. if (const auto *EIT = Ty->getAs<BitIntType>()) @@ -261,7 +261,7 @@ MipsABIInfo::classifyArgumentType(QualType Ty, uint64_t &Offset) const { llvm::Type* MipsABIInfo::returnAggregateInRegs(QualType RetTy, uint64_t Size) const { - const RecordType *RT = RetTy->getAs<RecordType>(); + const RecordType *RT = RetTy->getAsCanonical<RecordType>(); SmallVector<llvm::Type*, 8> RTList; if (RT && RT->isStructureOrClassType()) { @@ -332,8 +332,8 @@ ABIArgInfo MipsABIInfo::classifyReturnType(QualType RetTy) const { } // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) - RetTy = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = RetTy->getAsEnumDecl()) + RetTy = ED->getIntegerType(); // Make sure we pass indirectly things that are too large. if (const auto *EIT = RetTy->getAs<BitIntType>()) diff --git a/clang/lib/CodeGen/Targets/NVPTX.cpp b/clang/lib/CodeGen/Targets/NVPTX.cpp index e874617796f8..53f2fc4a040a 100644 --- a/clang/lib/CodeGen/Targets/NVPTX.cpp +++ b/clang/lib/CodeGen/Targets/NVPTX.cpp @@ -87,10 +87,6 @@ public: static void addNVVMMetadata(llvm::GlobalValue *GV, StringRef Name, int Operand); - static void - addGridConstantNVVMMetadata(llvm::GlobalValue *GV, - const SmallVectorImpl<int> &GridConstantArgs); - private: static void emitBuiltinSurfTexDeviceCopy(CodeGenFunction &CGF, LValue Dst, LValue Src) { @@ -130,10 +126,9 @@ bool NVPTXABIInfo::isUnsupportedType(QualType T) const { return true; if (const auto *AT = T->getAsArrayTypeUnsafe()) return isUnsupportedType(AT->getElementType()); - const auto *RT = T->getAs<RecordType>(); - if (!RT) + const auto *RD = T->getAsRecordDecl(); + if (!RD) return false; - const RecordDecl *RD = RT->getOriginalDecl()->getDefinitionOrSelf(); // If this is a C++ record, check the bases first. if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) @@ -173,8 +168,8 @@ ABIArgInfo NVPTXABIInfo::classifyReturnType(QualType RetTy) const { return ABIArgInfo::getDirect(); // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) - RetTy = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = RetTy->getAsEnumDecl()) + RetTy = ED->getIntegerType(); return (isPromotableIntegerTypeForABI(RetTy) ? ABIArgInfo::getExtend(RetTy) : ABIArgInfo::getDirect()); @@ -182,8 +177,8 @@ ABIArgInfo NVPTXABIInfo::classifyReturnType(QualType RetTy) const { ABIArgInfo NVPTXABIInfo::classifyArgumentType(QualType Ty) const { // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); // Return aggregates type as indirect by value if (isAggregateTypeForABI(Ty)) { @@ -266,27 +261,24 @@ void NVPTXTargetCodeGenInfo::setTargetAttributes( // By default, all functions are device functions if (FD->hasAttr<DeviceKernelAttr>() || FD->hasAttr<CUDAGlobalAttr>()) { // OpenCL/CUDA kernel functions get kernel metadata - // Create !{<func-ref>, metadata !"kernel", i32 1} node // And kernel functions are not subject to inlining F->addFnAttr(llvm::Attribute::NoInline); if (FD->hasAttr<CUDAGlobalAttr>()) { - SmallVector<int, 10> GCI; + F->setCallingConv(llvm::CallingConv::PTX_Kernel); + for (auto IV : llvm::enumerate(FD->parameters())) if (IV.value()->hasAttr<CUDAGridConstantAttr>()) - // For some reason arg indices are 1-based in NVVM - GCI.push_back(IV.index() + 1); - // Create !{<func-ref>, metadata !"kernel", i32 1} node - F->setCallingConv(llvm::CallingConv::PTX_Kernel); - addGridConstantNVVMMetadata(F, GCI); + F->addParamAttr( + IV.index(), + llvm::Attribute::get(F->getContext(), "nvvm.grid_constant")); } if (CUDALaunchBoundsAttr *Attr = FD->getAttr<CUDALaunchBoundsAttr>()) M.handleCUDALaunchBoundsAttr(F, Attr); } } // Attach kernel metadata directly if compiling for NVPTX. - if (FD->hasAttr<DeviceKernelAttr>()) { + if (FD->hasAttr<DeviceKernelAttr>()) F->setCallingConv(llvm::CallingConv::PTX_Kernel); - } } void NVPTXTargetCodeGenInfo::addNVVMMetadata(llvm::GlobalValue *GV, @@ -306,29 +298,6 @@ void NVPTXTargetCodeGenInfo::addNVVMMetadata(llvm::GlobalValue *GV, MD->addOperand(llvm::MDNode::get(Ctx, MDVals)); } -void NVPTXTargetCodeGenInfo::addGridConstantNVVMMetadata( - llvm::GlobalValue *GV, const SmallVectorImpl<int> &GridConstantArgs) { - - llvm::Module *M = GV->getParent(); - llvm::LLVMContext &Ctx = M->getContext(); - - // Get "nvvm.annotations" metadata node - llvm::NamedMDNode *MD = M->getOrInsertNamedMetadata("nvvm.annotations"); - - SmallVector<llvm::Metadata *, 5> MDVals = {llvm::ConstantAsMetadata::get(GV)}; - if (!GridConstantArgs.empty()) { - SmallVector<llvm::Metadata *, 10> GCM; - for (int I : GridConstantArgs) - GCM.push_back(llvm::ConstantAsMetadata::get( - llvm::ConstantInt::get(llvm::Type::getInt32Ty(Ctx), I))); - MDVals.append({llvm::MDString::get(Ctx, "grid_constant"), - llvm::MDNode::get(Ctx, GCM)}); - } - - // Append metadata to nvvm.annotations - MD->addOperand(llvm::MDNode::get(Ctx, MDVals)); -} - bool NVPTXTargetCodeGenInfo::shouldEmitStaticExternCAliases() const { return false; } diff --git a/clang/lib/CodeGen/Targets/PPC.cpp b/clang/lib/CodeGen/Targets/PPC.cpp index 38e76399299e..380e8c06c46f 100644 --- a/clang/lib/CodeGen/Targets/PPC.cpp +++ b/clang/lib/CodeGen/Targets/PPC.cpp @@ -153,8 +153,8 @@ public: // extended to 32/64 bits. bool AIXABIInfo::isPromotableTypeForABI(QualType Ty) const { // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); // Promotable integer types are required to be promoted by the ABI. if (getContext().isPromotableIntegerType(Ty)) @@ -294,10 +294,7 @@ void AIXTargetCodeGenInfo::setTargetAttributes( ASTContext &Context = D->getASTContext(); unsigned Alignment = Context.toBits(Context.getDeclAlign(D)) / 8; const auto *Ty = VarD->getType().getTypePtr(); - const RecordDecl *RDecl = - Ty->isRecordType() - ? Ty->getAs<RecordType>()->getOriginalDecl()->getDefinitionOrSelf() - : nullptr; + const RecordDecl *RDecl = Ty->getAsRecordDecl(); bool EmitDiagnostic = UserSpecifiedTOC && GV->hasExternalLinkage(); auto reportUnsupportedWarning = [&](bool ShouldEmitWarning, StringRef Msg) { @@ -708,8 +705,8 @@ public: bool PPC64_SVR4_ABIInfo::isPromotableTypeForABI(QualType Ty) const { // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); // Promotable integer types are required to be promoted by the ABI. if (isPromotableIntegerTypeForABI(Ty)) diff --git a/clang/lib/CodeGen/Targets/RISCV.cpp b/clang/lib/CodeGen/Targets/RISCV.cpp index 264595a6e4b7..0ef39b68eb6e 100644 --- a/clang/lib/CodeGen/Targets/RISCV.cpp +++ b/clang/lib/CodeGen/Targets/RISCV.cpp @@ -233,7 +233,7 @@ bool RISCVABIInfo::detectFPCCEligibleStructHelper(QualType Ty, CharUnits CurOff, QualType EltTy = ATy->getElementType(); // Non-zero-length arrays of empty records make the struct ineligible for // the FP calling convention in C++. - if (const auto *RTy = EltTy->getAs<RecordType>()) { + if (const auto *RTy = EltTy->getAsCanonical<RecordType>()) { if (ArraySize != 0 && isa<CXXRecordDecl>(RTy->getOriginalDecl()) && isEmptyRecord(getContext(), EltTy, true, true)) return false; @@ -249,7 +249,7 @@ bool RISCVABIInfo::detectFPCCEligibleStructHelper(QualType Ty, CharUnits CurOff, return true; } - if (const auto *RTy = Ty->getAs<RecordType>()) { + if (const auto *RTy = Ty->getAsCanonical<RecordType>()) { // Structures with either a non-trivial destructor or a non-trivial // copy constructor are not eligible for the FP calling convention. if (getRecordArgABI(Ty, CGT.getCXXABI())) @@ -264,10 +264,7 @@ bool RISCVABIInfo::detectFPCCEligibleStructHelper(QualType Ty, CharUnits CurOff, // If this is a C++ record, check the bases first. if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) { for (const CXXBaseSpecifier &B : CXXRD->bases()) { - const auto *BDecl = - cast<CXXRecordDecl>( - B.getType()->castAs<RecordType>()->getOriginalDecl()) - ->getDefinitionOrSelf(); + const auto *BDecl = B.getType()->castAsCXXRecordDecl(); CharUnits BaseOff = Layout.getBaseClassOffset(BDecl); bool Ret = detectFPCCEligibleStructHelper(B.getType(), CurOff + BaseOff, Field1Ty, Field1Off, Field2Ty, @@ -680,8 +677,8 @@ ABIArgInfo RISCVABIInfo::classifyArgumentType(QualType Ty, bool IsFixed, if (!isAggregateTypeForABI(Ty) && !Ty->isVectorType()) { // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); // All integral types are promoted to XLen width if (Size < XLen && Ty->isIntegralOrEnumerationType()) { diff --git a/clang/lib/CodeGen/Targets/SPIR.cpp b/clang/lib/CodeGen/Targets/SPIR.cpp index 237aea755fa2..2e3fc53c58ed 100644 --- a/clang/lib/CodeGen/Targets/SPIR.cpp +++ b/clang/lib/CodeGen/Targets/SPIR.cpp @@ -118,11 +118,9 @@ ABIArgInfo SPIRVABIInfo::classifyReturnType(QualType RetTy) const { if (!isAggregateTypeForABI(RetTy) || getRecordArgABI(RetTy, getCXXABI())) return DefaultABIInfo::classifyReturnType(RetTy); - if (const RecordType *RT = RetTy->getAs<RecordType>()) { - const RecordDecl *RD = RT->getOriginalDecl()->getDefinitionOrSelf(); - if (RD->hasFlexibleArrayMember()) - return DefaultABIInfo::classifyReturnType(RetTy); - } + if (const auto *RD = RetTy->getAsRecordDecl(); + RD && RD->hasFlexibleArrayMember()) + return DefaultABIInfo::classifyReturnType(RetTy); // TODO: The AMDGPU ABI is non-trivial to represent in SPIR-V; in order to // avoid encoding various architecture specific bits here we return everything @@ -134,13 +132,14 @@ ABIArgInfo SPIRVABIInfo::classifyReturnType(QualType RetTy) const { } ABIArgInfo SPIRVABIInfo::classifyKernelArgumentType(QualType Ty) const { - if (getContext().getLangOpts().CUDAIsDevice) { + if (getContext().getLangOpts().isTargetDevice()) { // Coerce pointer arguments with default address space to CrossWorkGroup - // pointers for HIPSPV/CUDASPV. When the language mode is HIP/CUDA, the - // SPIRTargetInfo maps cuda_device to SPIR-V's CrossWorkGroup address space. + // pointers for target devices as default address space kernel arguments + // are not allowed. We use the opencl_global language address space which + // always maps to CrossWorkGroup. llvm::Type *LTy = CGT.ConvertType(Ty); auto DefaultAS = getContext().getTargetAddressSpace(LangAS::Default); - auto GlobalAS = getContext().getTargetAddressSpace(LangAS::cuda_device); + auto GlobalAS = getContext().getTargetAddressSpace(LangAS::opencl_global); auto *PtrTy = llvm::dyn_cast<llvm::PointerType>(LTy); if (PtrTy && PtrTy->getAddressSpace() == DefaultAS) { LTy = llvm::PointerType::get(PtrTy->getContext(), GlobalAS); @@ -186,11 +185,9 @@ ABIArgInfo SPIRVABIInfo::classifyArgumentType(QualType Ty) const { return getNaturalAlignIndirect(Ty, getDataLayout().getAllocaAddrSpace(), RAA == CGCXXABI::RAA_DirectInMemory); - if (const RecordType *RT = Ty->getAs<RecordType>()) { - const RecordDecl *RD = RT->getOriginalDecl()->getDefinitionOrSelf(); - if (RD->hasFlexibleArrayMember()) - return DefaultABIInfo::classifyArgumentType(Ty); - } + if (const auto *RD = Ty->getAsRecordDecl(); + RD && RD->hasFlexibleArrayMember()) + return DefaultABIInfo::classifyArgumentType(Ty); return ABIArgInfo::getDirect(CGT.ConvertType(Ty), 0u, nullptr, false); } @@ -431,8 +428,7 @@ static llvm::Type *getInlineSpirvType(CodeGenModule &CGM, } case SpirvOperandKind::TypeId: { QualType TypeOperand = Operand.getResultType(); - if (auto *RT = TypeOperand->getAs<RecordType>()) { - auto *RD = RT->getOriginalDecl()->getDefinitionOrSelf(); + if (const auto *RD = TypeOperand->getAsRecordDecl()) { assert(RD->isCompleteDefinition() && "Type completion should have been required in Sema"); @@ -505,7 +501,8 @@ llvm::Type *CommonSPIRTargetCodeGenInfo::getHLSLType( llvm::Type *BufferLayoutTy = HLSLBufferLayoutBuilder(CGM, "spirv.Layout") - .createLayoutType(ContainedTy->getAsStructureType(), Packoffsets); + .createLayoutType(ContainedTy->castAsCanonical<RecordType>(), + Packoffsets); uint32_t StorageClass = /* Uniform storage class */ 2; return llvm::TargetExtType::get(Ctx, "spirv.VulkanBuffer", {BufferLayoutTy}, {StorageClass, false}); @@ -517,14 +514,65 @@ llvm::Type *CommonSPIRTargetCodeGenInfo::getHLSLType( return nullptr; } +static unsigned +getImageFormat(const LangOptions &LangOpts, + const HLSLAttributedResourceType::Attributes &attributes, + llvm::Type *SampledType, QualType Ty, unsigned NumChannels) { + // For images with `Sampled` operand equal to 2, there are restrictions on + // using the Unknown image format. To avoid these restrictions in common + // cases, we guess an image format for them based on the sampled type and the + // number of channels. This is intended to match the behaviour of DXC. + if (LangOpts.HLSLSpvUseUnknownImageFormat || + attributes.ResourceClass != llvm::dxil::ResourceClass::UAV) { + return 0; // Unknown + } + + if (SampledType->isIntegerTy(32)) { + if (Ty->isSignedIntegerType()) { + if (NumChannels == 1) + return 24; // R32i + if (NumChannels == 2) + return 25; // Rg32i + if (NumChannels == 4) + return 21; // Rgba32i + } else { + if (NumChannels == 1) + return 33; // R32ui + if (NumChannels == 2) + return 35; // Rg32ui + if (NumChannels == 4) + return 30; // Rgba32ui + } + } else if (SampledType->isIntegerTy(64)) { + if (NumChannels == 1) { + if (Ty->isSignedIntegerType()) { + return 41; // R64i + } + return 40; // R64ui + } + } else if (SampledType->isFloatTy()) { + if (NumChannels == 1) + return 3; // R32f + if (NumChannels == 2) + return 6; // Rg32f + if (NumChannels == 4) + return 1; // Rgba32f + } + + return 0; // Unknown +} + llvm::Type *CommonSPIRTargetCodeGenInfo::getSPIRVImageTypeFromHLSLResource( const HLSLAttributedResourceType::Attributes &attributes, QualType Ty, CodeGenModule &CGM) const { llvm::LLVMContext &Ctx = CGM.getLLVMContext(); + unsigned NumChannels = 1; Ty = Ty->getCanonicalTypeUnqualified(); - if (const VectorType *V = dyn_cast<VectorType>(Ty)) + if (const VectorType *V = dyn_cast<VectorType>(Ty)) { + NumChannels = V->getNumElements(); Ty = V->getElementType(); + } assert(!Ty->isVectorType() && "We still have a vector type."); llvm::Type *SampledType = CGM.getTypes().ConvertTypeForMem(Ty); @@ -560,8 +608,8 @@ llvm::Type *CommonSPIRTargetCodeGenInfo::getSPIRVImageTypeFromHLSLResource( attributes.ResourceClass == llvm::dxil::ResourceClass::UAV ? 2 : 1; // Image format. - // Setting to unknown for now. - IntParams[5] = 0; + IntParams[5] = getImageFormat(CGM.getLangOpts(), attributes, SampledType, Ty, + NumChannels); llvm::TargetExtType *ImageType = llvm::TargetExtType::get(Ctx, Name, {SampledType}, IntParams); diff --git a/clang/lib/CodeGen/Targets/Sparc.cpp b/clang/lib/CodeGen/Targets/Sparc.cpp index 13a42f66f584..5f3c15d106eb 100644 --- a/clang/lib/CodeGen/Targets/Sparc.cpp +++ b/clang/lib/CodeGen/Targets/Sparc.cpp @@ -237,8 +237,8 @@ SparcV9ABIInfo::classifyType(QualType Ty, unsigned SizeLimit) const { /*ByVal=*/false); // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); // Integer types smaller than a register are extended. if (Size < 64 && Ty->isIntegerType()) diff --git a/clang/lib/CodeGen/Targets/SystemZ.cpp b/clang/lib/CodeGen/Targets/SystemZ.cpp index 38cc4d39126b..9b6b72b1dcc0 100644 --- a/clang/lib/CodeGen/Targets/SystemZ.cpp +++ b/clang/lib/CodeGen/Targets/SystemZ.cpp @@ -145,8 +145,8 @@ public: bool SystemZABIInfo::isPromotableIntegerTypeForABI(QualType Ty) const { // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); // Promotable integer types are required to be promoted by the ABI. if (ABIInfo::isPromotableIntegerTypeForABI(Ty)) @@ -208,10 +208,8 @@ llvm::Type *SystemZABIInfo::getFPArgumentType(QualType Ty, } QualType SystemZABIInfo::GetSingleElementType(QualType Ty) const { - const RecordType *RT = Ty->getAs<RecordType>(); - - if (RT && RT->isStructureOrClassType()) { - const RecordDecl *RD = RT->getOriginalDecl()->getDefinitionOrSelf(); + const auto *RD = Ty->getAsRecordDecl(); + if (RD && RD->isStructureOrClass()) { QualType Found; // If this is a C++ record, check the bases first. @@ -452,10 +450,9 @@ ABIArgInfo SystemZABIInfo::classifyArgumentType(QualType Ty) const { /*ByVal=*/false); // Handle small structures. - if (const RecordType *RT = Ty->getAs<RecordType>()) { + if (const auto *RD = Ty->getAsRecordDecl()) { // Structures with flexible arrays have variable length, so really // fail the size test above. - const RecordDecl *RD = RT->getOriginalDecl()->getDefinitionOrSelf(); if (RD->hasFlexibleArrayMember()) return getNaturalAlignIndirect(Ty, getDataLayout().getAllocaAddrSpace(), /*ByVal=*/false); @@ -525,8 +522,7 @@ bool SystemZTargetCodeGenInfo::isVectorTypeBased(const Type *Ty, if (Ty->isVectorType() && Ctx.getTypeSize(Ty) / 8 >= 16) return true; - if (const auto *RecordTy = Ty->getAs<RecordType>()) { - const RecordDecl *RD = RecordTy->getOriginalDecl()->getDefinitionOrSelf(); + if (const auto *RD = Ty->getAsRecordDecl()) { if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) if (CXXRD->hasDefinition()) for (const auto &I : CXXRD->bases()) diff --git a/clang/lib/CodeGen/Targets/WebAssembly.cpp b/clang/lib/CodeGen/Targets/WebAssembly.cpp index ac8dcd2a0540..ebe996a4edd8 100644 --- a/clang/lib/CodeGen/Targets/WebAssembly.cpp +++ b/clang/lib/CodeGen/Targets/WebAssembly.cpp @@ -115,11 +115,9 @@ ABIArgInfo WebAssemblyABIInfo::classifyArgumentType(QualType Ty) const { return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0))); // For the experimental multivalue ABI, fully expand all other aggregates if (Kind == WebAssemblyABIKind::ExperimentalMV) { - const RecordType *RT = Ty->getAs<RecordType>(); - assert(RT); + const auto *RD = Ty->castAsRecordDecl(); bool HasBitField = false; - for (auto *Field : - RT->getOriginalDecl()->getDefinitionOrSelf()->fields()) { + for (auto *Field : RD->fields()) { if (Field->isBitField()) { HasBitField = true; break; diff --git a/clang/lib/CodeGen/Targets/X86.cpp b/clang/lib/CodeGen/Targets/X86.cpp index 61b833a9c1b4..7ee8a0dc2a0d 100644 --- a/clang/lib/CodeGen/Targets/X86.cpp +++ b/clang/lib/CodeGen/Targets/X86.cpp @@ -352,15 +352,15 @@ bool X86_32ABIInfo::shouldReturnTypeInRegister(QualType Ty, return shouldReturnTypeInRegister(AT->getElementType(), Context); // Otherwise, it must be a record type. - const RecordType *RT = Ty->getAs<RecordType>(); - if (!RT) return false; + const auto *RD = Ty->getAsRecordDecl(); + if (!RD) + return false; // FIXME: Traverse bases here too. // Structure types are passed in register if all fields would be // passed in a register. - for (const auto *FD : - RT->getOriginalDecl()->getDefinitionOrSelf()->fields()) { + for (const auto *FD : RD->fields()) { // Empty fields are ignored. if (isEmptyField(Context, FD, true)) continue; @@ -427,11 +427,10 @@ static bool addBaseAndFieldSizes(ASTContext &Context, const CXXRecordDecl *RD, /// optimizations. bool X86_32ABIInfo::canExpandIndirectArgument(QualType Ty) const { // We can only expand structure types. - const RecordType *RT = Ty->getAs<RecordType>(); - if (!RT) + const RecordDecl *RD = Ty->getAsRecordDecl(); + if (!RD) return false; uint64_t Size = 0; - const RecordDecl *RD = RT->getOriginalDecl()->getDefinitionOrSelf(); if (const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) { if (!IsWin32StructABI) { // On non-Windows, we have to conservatively match our old bitcode @@ -508,13 +507,10 @@ ABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy, } if (isAggregateTypeForABI(RetTy)) { - if (const RecordType *RT = RetTy->getAs<RecordType>()) { + if (const auto *RD = RetTy->getAsRecordDecl(); + RD && RD->hasFlexibleArrayMember()) // Structures with flexible arrays are always indirect. - if (RT->getOriginalDecl() - ->getDefinitionOrSelf() - ->hasFlexibleArrayMember()) - return getIndirectReturnResult(RetTy, State); - } + return getIndirectReturnResult(RetTy, State); // If specified, structs and unions are always indirect. if (!IsRetSmallStructInRegABI && !RetTy->isAnyComplexType()) @@ -556,8 +552,8 @@ ABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy, } // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) - RetTy = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = RetTy->getAsEnumDecl()) + RetTy = ED->getIntegerType(); if (const auto *EIT = RetTy->getAs<BitIntType>()) if (EIT->getNumBits() > 64) @@ -756,7 +752,7 @@ ABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty, CCState &State, TypeInfo TI = getContext().getTypeInfo(Ty); // Check with the C++ ABI first. - const RecordType *RT = Ty->getAs<RecordType>(); + const RecordType *RT = Ty->getAsCanonical<RecordType>(); if (RT) { CGCXXABI::RecordArgABI RAA = getRecordArgABI(RT, getCXXABI()); if (RAA == CGCXXABI::RAA_Indirect) { @@ -885,9 +881,8 @@ ABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty, CCState &State, return ABIArgInfo::getDirect(); } - - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); bool InReg = shouldPrimitiveUseInReg(Ty, State); @@ -1538,24 +1533,6 @@ static bool checkAVXParamFeature(DiagnosticsEngine &Diag, return false; } -static bool checkAVX512ParamFeature(DiagnosticsEngine &Diag, - SourceLocation CallLoc, - const llvm::StringMap<bool> &CallerMap, - const llvm::StringMap<bool> &CalleeMap, - QualType Ty, bool IsArgument) { - bool Caller256 = CallerMap.lookup("avx512f") && !CallerMap.lookup("evex512"); - bool Callee256 = CalleeMap.lookup("avx512f") && !CalleeMap.lookup("evex512"); - - // Forbid 512-bit or larger vector pass or return when we disabled ZMM - // instructions. - if (Caller256 || Callee256) - return Diag.Report(CallLoc, diag::err_avx_calling_convention) - << IsArgument << Ty << "evex512"; - - return checkAVXParamFeature(Diag, CallLoc, CallerMap, CalleeMap, Ty, - "avx512f", IsArgument); -} - static bool checkAVXParam(DiagnosticsEngine &Diag, ASTContext &Ctx, SourceLocation CallLoc, const llvm::StringMap<bool> &CallerMap, @@ -1563,8 +1540,8 @@ static bool checkAVXParam(DiagnosticsEngine &Diag, ASTContext &Ctx, bool IsArgument) { uint64_t Size = Ctx.getTypeSize(Ty); if (Size > 256) - return checkAVX512ParamFeature(Diag, CallLoc, CallerMap, CalleeMap, Ty, - IsArgument); + return checkAVXParamFeature(Diag, CallLoc, CallerMap, CalleeMap, Ty, + "avx512f", IsArgument); if (Size > 128) return checkAVXParamFeature(Diag, CallLoc, CallerMap, CalleeMap, Ty, "avx", @@ -1850,10 +1827,9 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase, Class &Lo, return; } - if (const EnumType *ET = Ty->getAs<EnumType>()) { + if (const auto *ED = Ty->getAsEnumDecl()) { // Classify the underlying integer type. - classify(ET->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(), - OffsetBase, Lo, Hi, isNamedArg); + classify(ED->getIntegerType(), OffsetBase, Lo, Hi, isNamedArg); return; } @@ -2045,7 +2021,7 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase, Class &Lo, return; } - if (const RecordType *RT = Ty->getAs<RecordType>()) { + if (const RecordType *RT = Ty->getAsCanonical<RecordType>()) { uint64_t Size = getContext().getTypeSize(Ty); // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger @@ -2075,11 +2051,7 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase, Class &Lo, for (const auto &I : CXXRD->bases()) { assert(!I.isVirtual() && !I.getType()->isDependentType() && "Unexpected base class!"); - const auto *Base = - cast<CXXRecordDecl>( - I.getType()->castAs<RecordType>()->getOriginalDecl()) - ->getDefinitionOrSelf(); - + const auto *Base = I.getType()->castAsCXXRecordDecl(); // Classify this field. // // AMD64-ABI 3.2.3p2: Rule 3. If the size of the aggregate exceeds a @@ -2191,8 +2163,8 @@ ABIArgInfo X86_64ABIInfo::getIndirectReturnResult(QualType Ty) const { // place naturally. if (!isAggregateTypeForABI(Ty)) { // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); if (Ty->isBitIntType()) return getNaturalAlignIndirect(Ty, getDataLayout().getAllocaAddrSpace()); @@ -2233,8 +2205,8 @@ ABIArgInfo X86_64ABIInfo::getIndirectResult(QualType Ty, if (!isAggregateTypeForABI(Ty) && !IsIllegalVectorType(Ty) && !Ty->isBitIntType()) { // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); return (isPromotableIntegerTypeForABI(Ty) ? ABIArgInfo::getExtend(Ty) : ABIArgInfo::getDirect()); @@ -2354,8 +2326,7 @@ static bool BitsContainNoUserData(QualType Ty, unsigned StartBit, return true; } - if (const RecordType *RT = Ty->getAs<RecordType>()) { - const RecordDecl *RD = RT->getOriginalDecl()->getDefinitionOrSelf(); + if (const auto *RD = Ty->getAsRecordDecl()) { const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); // If this is a C++ record, check the bases first. @@ -2363,10 +2334,7 @@ static bool BitsContainNoUserData(QualType Ty, unsigned StartBit, for (const auto &I : CXXRD->bases()) { assert(!I.isVirtual() && !I.getType()->isDependentType() && "Unexpected base class!"); - const auto *Base = - cast<CXXRecordDecl>( - I.getType()->castAs<RecordType>()->getOriginalDecl()) - ->getDefinitionOrSelf(); + const auto *Base = I.getType()->castAsCXXRecordDecl(); // If the base is after the span we care about, ignore it. unsigned BaseOffset = Context.toBits(Layout.getBaseClassOffset(Base)); @@ -2646,9 +2614,8 @@ ABIArgInfo X86_64ABIInfo::classifyReturnType(QualType RetTy) const { // so that the parameter gets the right LLVM IR attributes. if (Hi == NoClass && isa<llvm::IntegerType>(ResType)) { // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) - RetTy = - EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = RetTy->getAsEnumDecl()) + RetTy = ED->getIntegerType(); if (RetTy->isIntegralOrEnumerationType() && isPromotableIntegerTypeForABI(RetTy)) @@ -2797,8 +2764,8 @@ X86_64ABIInfo::classifyArgumentType(QualType Ty, unsigned freeIntRegs, // so that the parameter gets the right LLVM IR attributes. if (Hi == NoClass && isa<llvm::IntegerType>(ResType)) { // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); if (Ty->isIntegralOrEnumerationType() && isPromotableIntegerTypeForABI(Ty)) @@ -3324,14 +3291,14 @@ ABIArgInfo WinX86_64ABIInfo::classify(QualType Ty, unsigned &FreeSSERegs, if (Ty->isVoidType()) return ABIArgInfo::getIgnore(); - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getOriginalDecl()->getDefinitionOrSelf()->getIntegerType(); + if (const auto *ED = Ty->getAsEnumDecl()) + Ty = ED->getIntegerType(); TypeInfo Info = getContext().getTypeInfo(Ty); uint64_t Width = Info.Width; CharUnits Align = getContext().toCharUnitsFromBits(Info.Align); - const RecordType *RT = Ty->getAs<RecordType>(); + const RecordType *RT = Ty->getAsCanonical<RecordType>(); if (RT) { if (!IsReturnType) { if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(RT, getCXXABI())) diff --git a/clang/lib/CodeGen/Targets/XCore.cpp b/clang/lib/CodeGen/Targets/XCore.cpp index d65af5f82b7f..ab0115467e52 100644 --- a/clang/lib/CodeGen/Targets/XCore.cpp +++ b/clang/lib/CodeGen/Targets/XCore.cpp @@ -615,13 +615,10 @@ static bool appendType(SmallStringEnc &Enc, QualType QType, if (const PointerType *PT = QT->getAs<PointerType>()) return appendPointerType(Enc, PT, CGM, TSC); - if (const EnumType *ET = QT->getAs<EnumType>()) + if (const EnumType *ET = QT->getAsCanonical<EnumType>()) return appendEnumType(Enc, ET, TSC, QT.getBaseTypeIdentifier()); - if (const RecordType *RT = QT->getAsStructureType()) - return appendRecordType(Enc, RT, CGM, TSC, QT.getBaseTypeIdentifier()); - - if (const RecordType *RT = QT->getAsUnionType()) + if (const RecordType *RT = QT->getAsCanonical<RecordType>()) return appendRecordType(Enc, RT, CGM, TSC, QT.getBaseTypeIdentifier()); if (const FunctionType *FT = QT->getAs<FunctionType>()) |
