25 #include "llvm/IR/DataLayout.h"
26 #include "llvm/IR/DerivedTypes.h"
27 #include "llvm/IR/Module.h"
29 using namespace clang;
30 using namespace CodeGen;
33 : CGM(cgm), Context(cgm.getContext()), TheModule(cgm.getModule()),
34 Target(cgm.getTarget()), TheCXXABI(cgm.getCXXABI()),
35 TheABIInfo(cgm.getTargetCodeGenInfo().getABIInfo()) {
36 SkippedLayout =
false;
40 for (llvm::FoldingSet<CGFunctionInfo>::iterator
41 I = FunctionInfos.begin(), E = FunctionInfos.end(); I != E; )
53 llvm::raw_svector_ostream OS(
TypeName);
74 if (TDD->getDeclContext())
75 TDD->printQualifiedName(OS, Policy);
84 Ty->setName(OS.str());
103 auto *FixedVT = cast<llvm::FixedVectorType>(R);
105 uint64_t BytePadded = std::max<uint64_t>(FixedVT->getNumElements(), 8);
106 return llvm::IntegerType::get(FixedVT->getContext(), BytePadded);
123 llvm::DenseMap<const Type*, llvm::StructType *>::const_iterator I =
124 RecordDeclTypes.find(Ty);
125 return I != RecordDeclTypes.end() && !I->second->isOpaque();
141 if (!AlreadyChecked.insert(RD).second)
157 if (
const CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD)) {
158 for (
const auto &I : CRD->bases())
166 for (
const auto *I : RD->
fields())
182 T = AT->getValueType();
223 if (!TT)
return true;
230 const RecordType *RT = dyn_cast<RecordType>(TT);
231 if (!RT)
return true;
254 for (
unsigned i = 0, e = FPT->getNumParams(); i != e; i++)
267 if (
const EnumDecl *ED = dyn_cast<EnumDecl>(TD)) {
269 if (TypeCache.count(ED->getTypeForDecl())) {
273 if (!
ConvertType(ED->getIntegerType())->isIntegerTy(32))
279 DI->completeType(ED);
296 DI->completeType(RD);
304 if (RecordsWithOpaqueMemberPointers.count(Ty)) {
306 RecordsWithOpaqueMemberPointers.clear();
311 const llvm::fltSemantics &format,
312 bool UseNativeHalf =
false) {
313 if (&format == &llvm::APFloat::IEEEhalf()) {
315 return llvm::Type::getHalfTy(VMContext);
317 return llvm::Type::getInt16Ty(VMContext);
319 if (&format == &llvm::APFloat::BFloat())
320 return llvm::Type::getBFloatTy(VMContext);
321 if (&format == &llvm::APFloat::IEEEsingle())
322 return llvm::Type::getFloatTy(VMContext);
323 if (&format == &llvm::APFloat::IEEEdouble())
324 return llvm::Type::getDoubleTy(VMContext);
325 if (&format == &llvm::APFloat::IEEEquad())
326 return llvm::Type::getFP128Ty(VMContext);
327 if (&format == &llvm::APFloat::PPCDoubleDouble())
328 return llvm::Type::getPPC_FP128Ty(VMContext);
329 if (&format == &llvm::APFloat::x87DoubleExtended())
330 return llvm::Type::getX86_FP80Ty(VMContext);
331 llvm_unreachable(
"Unknown float format!");
334 llvm::Type *CodeGenTypes::ConvertFunctionTypeInternal(
QualType QFT) {
349 for (
unsigned i = 0, e = FPT->getNumParams(); i != e; i++)
353 SkippedLayout =
true;
362 if (!RecordsBeingLaidOut.insert(Ty).second) {
363 SkippedLayout =
true;
379 llvm::Type *ResultType =
nullptr;
382 if (FunctionsBeingProcessed.count(FI)) {
385 SkippedLayout =
true;
392 RecordsBeingLaidOut.erase(Ty);
394 if (RecordsBeingLaidOut.empty())
395 while (!DeferredRecords.empty())
421 if (
const RecordType *RT = dyn_cast<RecordType>(Ty))
429 llvm::Type *CachedType =
nullptr;
430 bool ShouldUseCache =
433 if (ShouldUseCache) {
434 llvm::DenseMap<const Type *, llvm::Type *>::iterator TCI =
436 if (TCI != TypeCache.end())
437 CachedType = TCI->second;
440 #ifndef EXPENSIVE_CHECKS
447 llvm::Type *ResultType =
nullptr;
450 #define TYPE(Class, Base)
451 #define ABSTRACT_TYPE(Class, Base)
452 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
453 #define DEPENDENT_TYPE(Class, Base) case Type::Class:
454 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class:
455 #include "clang/AST/TypeNodes.inc"
456 llvm_unreachable(
"Non-canonical or dependent types aren't possible.");
458 case Type::Builtin: {
459 switch (cast<BuiltinType>(Ty)->
getKind()) {
460 case BuiltinType::Void:
461 case BuiltinType::ObjCId:
462 case BuiltinType::ObjCClass:
463 case BuiltinType::ObjCSel:
469 case BuiltinType::Bool:
474 case BuiltinType::Char_S:
475 case BuiltinType::Char_U:
476 case BuiltinType::SChar:
477 case BuiltinType::UChar:
478 case BuiltinType::Short:
479 case BuiltinType::UShort:
480 case BuiltinType::Int:
481 case BuiltinType::UInt:
482 case BuiltinType::Long:
483 case BuiltinType::ULong:
484 case BuiltinType::LongLong:
485 case BuiltinType::ULongLong:
486 case BuiltinType::WChar_S:
487 case BuiltinType::WChar_U:
488 case BuiltinType::Char8:
489 case BuiltinType::Char16:
490 case BuiltinType::Char32:
491 case BuiltinType::ShortAccum:
492 case BuiltinType::Accum:
493 case BuiltinType::LongAccum:
494 case BuiltinType::UShortAccum:
495 case BuiltinType::UAccum:
496 case BuiltinType::ULongAccum:
497 case BuiltinType::ShortFract:
498 case BuiltinType::Fract:
499 case BuiltinType::LongFract:
500 case BuiltinType::UShortFract:
501 case BuiltinType::UFract:
502 case BuiltinType::ULongFract:
503 case BuiltinType::SatShortAccum:
504 case BuiltinType::SatAccum:
505 case BuiltinType::SatLongAccum:
506 case BuiltinType::SatUShortAccum:
507 case BuiltinType::SatUAccum:
508 case BuiltinType::SatULongAccum:
509 case BuiltinType::SatShortFract:
510 case BuiltinType::SatFract:
511 case BuiltinType::SatLongFract:
512 case BuiltinType::SatUShortFract:
513 case BuiltinType::SatUFract:
514 case BuiltinType::SatULongFract:
519 case BuiltinType::Float16:
525 case BuiltinType::Half:
532 case BuiltinType::BFloat16:
534 case BuiltinType::Double:
535 case BuiltinType::LongDouble:
536 case BuiltinType::Float128:
537 case BuiltinType::Ibm128:
543 case BuiltinType::NullPtr:
548 case BuiltinType::UInt128:
549 case BuiltinType::Int128:
553 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
554 case BuiltinType::Id:
555 #include "clang/Basic/OpenCLImageTypes.def"
556 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
557 case BuiltinType::Id:
558 #include "clang/Basic/OpenCLExtensionTypes.def"
559 case BuiltinType::OCLSampler:
560 case BuiltinType::OCLEvent:
561 case BuiltinType::OCLClkEvent:
562 case BuiltinType::OCLQueue:
563 case BuiltinType::OCLReserveID:
566 case BuiltinType::SveInt8:
567 case BuiltinType::SveUint8:
568 case BuiltinType::SveInt8x2:
569 case BuiltinType::SveUint8x2:
570 case BuiltinType::SveInt8x3:
571 case BuiltinType::SveUint8x3:
572 case BuiltinType::SveInt8x4:
573 case BuiltinType::SveUint8x4:
574 case BuiltinType::SveInt16:
575 case BuiltinType::SveUint16:
576 case BuiltinType::SveInt16x2:
577 case BuiltinType::SveUint16x2:
578 case BuiltinType::SveInt16x3:
579 case BuiltinType::SveUint16x3:
580 case BuiltinType::SveInt16x4:
581 case BuiltinType::SveUint16x4:
582 case BuiltinType::SveInt32:
583 case BuiltinType::SveUint32:
584 case BuiltinType::SveInt32x2:
585 case BuiltinType::SveUint32x2:
586 case BuiltinType::SveInt32x3:
587 case BuiltinType::SveUint32x3:
588 case BuiltinType::SveInt32x4:
589 case BuiltinType::SveUint32x4:
590 case BuiltinType::SveInt64:
591 case BuiltinType::SveUint64:
592 case BuiltinType::SveInt64x2:
593 case BuiltinType::SveUint64x2:
594 case BuiltinType::SveInt64x3:
595 case BuiltinType::SveUint64x3:
596 case BuiltinType::SveInt64x4:
597 case BuiltinType::SveUint64x4:
598 case BuiltinType::SveBool:
599 case BuiltinType::SveFloat16:
600 case BuiltinType::SveFloat16x2:
601 case BuiltinType::SveFloat16x3:
602 case BuiltinType::SveFloat16x4:
603 case BuiltinType::SveFloat32:
604 case BuiltinType::SveFloat32x2:
605 case BuiltinType::SveFloat32x3:
606 case BuiltinType::SveFloat32x4:
607 case BuiltinType::SveFloat64:
608 case BuiltinType::SveFloat64x2:
609 case BuiltinType::SveFloat64x3:
610 case BuiltinType::SveFloat64x4:
611 case BuiltinType::SveBFloat16:
612 case BuiltinType::SveBFloat16x2:
613 case BuiltinType::SveBFloat16x3:
614 case BuiltinType::SveBFloat16x4: {
618 Info.
EC.getKnownMinValue() *
621 #define PPC_VECTOR_TYPE(Name, Id, Size) \
622 case BuiltinType::Id: \
624 llvm::FixedVectorType::get(ConvertType(Context.BoolTy), Size); \
626 #include "clang/Basic/PPCTypes.def"
627 #define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
628 #include "clang/Basic/RISCVVTypes.def"
633 Info.
EC.getKnownMinValue() *
636 case BuiltinType::Dependent:
637 #define BUILTIN_TYPE(Id, SingletonId)
638 #define PLACEHOLDER_TYPE(Id, SingletonId) \
639 case BuiltinType::Id:
640 #include "clang/AST/BuiltinTypes.def"
641 llvm_unreachable(
"Unexpected placeholder builtin type!");
646 case Type::DeducedTemplateSpecialization:
647 llvm_unreachable(
"Unexpected undeduced type!");
648 case Type::Complex: {
649 llvm::Type *EltTy =
ConvertType(cast<ComplexType>(Ty)->getElementType());
650 ResultType = llvm::StructType::get(EltTy, EltTy);
653 case Type::LValueReference:
654 case Type::RValueReference: {
659 ResultType = llvm::PointerType::get(PointeeType, AS);
662 case Type::Pointer: {
666 if (PointeeType->isVoidTy())
669 ResultType = llvm::PointerType::get(PointeeType, AS);
673 case Type::VariableArray: {
676 "FIXME: We only handle trivial array types so far!");
682 case Type::IncompleteArray: {
685 "FIXME: We only handle trivial array types so far!");
689 if (!ResultType->isSized()) {
690 SkippedLayout =
true;
693 ResultType = llvm::ArrayType::get(ResultType, 0);
696 case Type::ConstantArray: {
702 if (!EltTy->isSized()) {
703 SkippedLayout =
true;
707 ResultType = llvm::ArrayType::get(EltTy, A->
getSize().getZExtValue());
710 case Type::ExtVector:
712 const auto *VT = cast<VectorType>(Ty);
714 llvm::Type *IRElemTy = VT->isExtVectorBoolType()
717 ResultType = llvm::FixedVectorType::get(IRElemTy, VT->getNumElements());
720 case Type::ConstantMatrix: {
727 case Type::FunctionNoProto:
728 case Type::FunctionProto:
729 ResultType = ConvertFunctionTypeInternal(T);
731 case Type::ObjCObject:
732 ResultType =
ConvertType(cast<ObjCObjectType>(Ty)->getBaseType());
735 case Type::ObjCInterface: {
739 llvm::Type *&T = InterfaceTypes[cast<ObjCInterfaceType>(Ty)];
746 case Type::ObjCObjectPointer: {
752 ResultType = T->getPointerTo();
757 const EnumDecl *ED = cast<EnumType>(Ty)->getDecl();
767 case Type::BlockPointer: {
779 ResultType = llvm::PointerType::get(PointeeType, AS);
783 case Type::MemberPointer: {
784 auto *MPTy = cast<MemberPointerType>(Ty);
785 if (!
getCXXABI().isMemberPointerConvertible(MPTy)) {
786 auto *C = MPTy->getClass();
787 auto Insertion = RecordsWithOpaqueMemberPointers.insert({C,
nullptr});
788 if (Insertion.second)
790 ResultType = Insertion.first->second;
798 QualType valueType = cast<AtomicType>(Ty)->getValueType();
802 uint64_t valueSize = Context.
getTypeSize(valueType);
804 if (valueSize != atomicSize) {
805 assert(valueSize < atomicSize);
806 llvm::Type *elts[] = {
808 llvm::ArrayType::get(CGM.
Int8Ty, (atomicSize - valueSize) / 8)
811 llvm::makeArrayRef(elts));
820 const auto &EIT = cast<BitIntType>(Ty);
821 ResultType = llvm::Type::getIntNTy(
getLLVMContext(), EIT->getNumBits());
826 assert(ResultType &&
"Didn't convert a type?");
827 assert((!CachedType || CachedType == ResultType) &&
828 "Cached type doesn't match computed type");
831 TypeCache[Ty] = ResultType;
849 llvm::StructType *&Entry = RecordDeclTypes[Key];
856 llvm::StructType *Ty = Entry;
866 DeferredRecords.push_back(RD);
871 bool InsertResult = RecordsBeingLaidOut.insert(Key).second;
873 assert(InsertResult &&
"Recursively compiling a struct?");
876 if (
const CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD)) {
877 for (
const auto &I : CRD->bases()) {
878 if (I.isVirtual())
continue;
885 CGRecordLayouts[Key] = std::move(Layout);
888 bool EraseResult = RecordsBeingLaidOut.erase(Key); (void)EraseResult;
889 assert(EraseResult &&
"struct not in RecordsBeingLaidOut set?");
899 if (RecordsBeingLaidOut.empty())
900 while (!DeferredRecords.empty())
911 auto I = CGRecordLayouts.find(Key);
912 if (I != CGRecordLayouts.end())
918 I = CGRecordLayouts.find(Key);
920 assert(I != CGRecordLayouts.end() &&
921 "Unable to find record layout information for type");
935 if (isa<IncompleteArrayType>(AT))
937 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))