Lines Matching defs:RD

85   bool getExternalNVBaseOffset(const CXXRecordDecl *RD, CharUnits &BaseOffset) {
86 auto Known = BaseOffsets.find(RD);
93 bool getExternalVBaseOffset(const CXXRecordDecl *RD, CharUnits &BaseOffset) {
94 auto Known = VirtualBaseOffsets.find(RD);
124 void AddSubobjectAtOffset(const CXXRecordDecl *RD, CharUnits Offset);
129 void UpdateEmptyFieldSubobjects(const CXXRecordDecl *RD,
151 bool CanPlaceSubobjectAtOffset(const CXXRecordDecl *RD,
157 bool CanPlaceFieldSubobjectAtOffset(const CXXRecordDecl *RD,
231 EmptySubobjectMap::CanPlaceSubobjectAtOffset(const CXXRecordDecl *RD,
234 if (!RD->isEmpty())
242 if (!llvm::is_contained(Classes, RD))
249 void EmptySubobjectMap::AddSubobjectAtOffset(const CXXRecordDecl *RD,
252 if (!RD->isEmpty())
258 if (llvm::is_contained(Classes, RD))
261 Classes.push_back(RD);
372 EmptySubobjectMap::CanPlaceFieldSubobjectAtOffset(const CXXRecordDecl *RD,
380 if (!CanPlaceSubobjectAtOffset(RD, Offset))
383 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
386 for (const CXXBaseSpecifier &Base : RD->bases()) {
397 if (RD == Class) {
399 for (const CXXBaseSpecifier &Base : RD->vbases()) {
409 for (const FieldDecl *Field : RD->fields()) {
430 if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl())
431 return CanPlaceFieldSubobjectAtOffset(RD, RD, Offset);
440 const CXXRecordDecl *RD = RT->getAsCXXRecordDecl();
441 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
451 if (!CanPlaceFieldSubobjectAtOffset(RD, RD, ElementOffset))
473 const CXXRecordDecl *RD, const CXXRecordDecl *Class, CharUnits Offset,
488 AddSubobjectAtOffset(RD, Offset);
490 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
493 for (const CXXBaseSpecifier &Base : RD->bases()) {
504 if (RD == Class) {
506 for (const CXXBaseSpecifier &Base : RD->vbases()) {
516 for (const FieldDecl *Field : RD->fields()) {
528 if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl()) {
529 UpdateEmptyFieldSubobjects(RD, RD, Offset, PlacingOverlappingField);
540 const CXXRecordDecl *RD = RT->getAsCXXRecordDecl();
541 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
556 UpdateEmptyFieldSubobjects(RD, RD, ElementOffset,
735 void ComputeBaseSubobjectInfo(const CXXRecordDecl *RD);
739 BaseSubobjectInfo *ComputeBaseSubobjectInfo(const CXXRecordDecl *RD,
744 void DeterminePrimaryBase(const CXXRecordDecl *RD);
746 void SelectPrimaryVBase(const CXXRecordDecl *RD);
752 void LayoutNonVirtualBases(const CXXRecordDecl *RD);
761 void LayoutVirtualBases(const CXXRecordDecl *RD,
826 void ItaniumRecordLayoutBuilder::SelectPrimaryVBase(const CXXRecordDecl *RD) {
827 for (const auto &I : RD->bases()) {
855 void ItaniumRecordLayoutBuilder::DeterminePrimaryBase(const CXXRecordDecl *RD) {
857 if (!RD->isDynamicClass())
862 RD->getIndirectPrimaryBases(IndirectPrimaryBases);
867 for (const auto &I : RD->bases()) {
886 if (RD->getNumVBases() != 0) {
887 SelectPrimaryVBase(RD);
903 const CXXRecordDecl *RD, bool IsVirtual, BaseSubobjectInfo *Derived) {
908 BaseSubobjectInfo *&InfoSlot = VirtualBaseInfo[RD];
910 assert(InfoSlot->Class == RD && "Wrong class for virtual base info!");
921 Info->Class = RD;
930 if (RD->getNumVBases()) {
931 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
956 for (const auto &I : RD->bases()) {
980 const CXXRecordDecl *RD) {
981 for (const auto &I : RD->bases()) {
1021 const CXXRecordDecl *RD) {
1023 DeterminePrimaryBase(RD);
1026 ComputeBaseSubobjectInfo(RD);
1055 } else if (RD->isDynamicClass()) {
1072 for (const auto &I : RD->bases()) {
1140 const CXXRecordDecl *RD, const CXXRecordDecl *MostDerivedClass) {
1144 if (MostDerivedClass == RD) {
1148 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
1153 for (const CXXBaseSpecifier &Base : RD->bases()) {
1311 if (const RecordDecl *RD = dyn_cast<RecordDecl>(D)) {
1312 IsUnion = RD->isUnion();
1313 IsMsStruct = RD->isMsStruct(Context);
1350 if (const RecordDecl *RD = dyn_cast<RecordDecl>(D))
1353 RD, External.Size, External.Align, External.FieldOffsets,
1378 void ItaniumRecordLayoutBuilder::Layout(const CXXRecordDecl *RD) {
1379 InitializeLayout(RD);
1382 LayoutNonVirtualBases(RD);
1384 LayoutFields(RD);
1392 LayoutVirtualBases(RD, RD);
1396 FinishLayout(RD);
1400 for (const CXXBaseSpecifier &Base : RD->bases()) {
1410 for (const CXXBaseSpecifier &Base : RD->vbases()) {
2008 const RecordDecl *RD = RT->getDecl();
2009 assert(RD && "Expected non-null RecordDecl.");
2010 const ASTRecordLayout &FieldRecord = Context.getASTRecordLayout(RD);
2114 if (const RecordDecl *RD = D->getParent()) {
2116 if (RD->hasAttr<PackedAttr>() || !MaxFieldAlignment.isZero())
2124 << Context.getTypeDeclType(RD) << D->getName() << D->getType();
2135 if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
2139 if (RD->isEmpty())
2179 if (const RecordDecl *RD = dyn_cast<RecordDecl>(D)) {
2188 Diag(RD->getLocation(), diag::warn_padded_struct_size)
2189 << Context.getTypeDeclType(RD)
2194 const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD);
2208 << Context.getTypeDeclType(RD);
2319 const CXXRecordDecl *RD) {
2321 if (!RD->isPolymorphic())
2327 if (!RD->isExternallyVisible())
2332 TemplateSpecializationKind TSK = RD->getTemplateSpecializationKind();
2341 for (const CXXMethodDecl *MD : RD->methods()) {
2388 if (MD->hasAttr<DLLImportAttr>() && !RD->hasAttr<DLLImportAttr>() &&
2407 static bool mustSkipTailPadding(TargetCXXABI ABI, const CXXRecordDecl *RD) {
2431 return RD->isPOD();
2434 // This is equivalent to RD->getTypeForDecl().isCXX11PODType(),
2440 return RD->isTrivial() && RD->isCXX11StandardLayout();
2560 void layout(const RecordDecl *RD);
2561 void cxxLayout(const CXXRecordDecl *RD);
2563 void initializeLayout(const RecordDecl *RD);
2567 void initializeCXXLayout(const CXXRecordDecl *RD);
2568 void layoutNonVirtualBases(const CXXRecordDecl *RD);
2569 void layoutNonVirtualBase(const CXXRecordDecl *RD,
2573 void injectVFPtr(const CXXRecordDecl *RD);
2574 void injectVBPtr(const CXXRecordDecl *RD);
2577 void layoutFields(const RecordDecl *RD);
2583 void layoutVirtualBases(const CXXRecordDecl *RD);
2584 void finalizeLayout(const RecordDecl *RD);
2603 const CXXRecordDecl *RD) const;
2729 void MicrosoftRecordLayoutBuilder::layout(const RecordDecl *RD) {
2732 initializeLayout(RD);
2733 layoutFields(RD);
2736 RequiredAlignment, Context.toCharUnitsFromBits(RD->getMaxAlignment()));
2737 finalizeLayout(RD);
2740 void MicrosoftRecordLayoutBuilder::cxxLayout(const CXXRecordDecl *RD) {
2743 initializeLayout(RD);
2744 initializeCXXLayout(RD);
2745 layoutNonVirtualBases(RD);
2746 layoutFields(RD);
2747 injectVBPtr(RD);
2748 injectVFPtr(RD);
2758 RequiredAlignment, Context.toCharUnitsFromBits(RD->getMaxAlignment()));
2759 layoutVirtualBases(RD);
2760 finalizeLayout(RD);
2763 void MicrosoftRecordLayoutBuilder::initializeLayout(const RecordDecl *RD) {
2764 IsUnion = RD->isUnion();
2780 if (const MaxFieldAlignmentAttr *MFAA = RD->getAttr<MaxFieldAlignmentAttr>()){
2787 if (RD->hasAttr<PackedAttr>())
2794 RD, External.Size, External.Align, External.FieldOffsets,
2799 MicrosoftRecordLayoutBuilder::initializeCXXLayout(const CXXRecordDecl *RD) {
2818 MicrosoftRecordLayoutBuilder::layoutNonVirtualBases(const CXXRecordDecl *RD) {
2828 for (const CXXBaseSpecifier &Base : RD->bases()) {
2851 layoutNonVirtualBase(RD, BaseDecl, BaseLayout, PreviousBaseLayout);
2854 if (RD->isPolymorphic()) {
2862 for (CXXMethodDecl *M : RD->methods()) {
2875 for (const CXXBaseSpecifier &Base : RD->bases()) {
2892 layoutNonVirtualBase(RD, BaseDecl, BaseLayout, PreviousBaseLayout);
2904 static bool recordUsesEBO(const RecordDecl *RD) {
2905 if (!isa<CXXRecordDecl>(RD))
2907 if (RD->hasAttr<EmptyBasesAttr>())
2909 if (auto *LVA = RD->getAttr<LayoutVersionAttr>())
2920 const CXXRecordDecl *RD, const CXXRecordDecl *BaseDecl,
2926 bool MDCUsesEBO = recordUsesEBO(RD);
2957 void MicrosoftRecordLayoutBuilder::layoutFields(const RecordDecl *RD) {
2959 for (const FieldDecl *Field : RD->fields())
3082 void MicrosoftRecordLayoutBuilder::injectVBPtr(const CXXRecordDecl *RD) {
3112 void MicrosoftRecordLayoutBuilder::injectVFPtr(const CXXRecordDecl *RD) {
3142 void MicrosoftRecordLayoutBuilder::layoutVirtualBases(const CXXRecordDecl *RD) {
3154 for (const CXXBaseSpecifier &VBase : RD->vbases()) {
3163 computeVtorDispSet(HasVtorDispSet, RD);
3166 for (const CXXBaseSpecifier &VBase : RD->vbases()) {
3176 BaseLayout.leadsWithZeroSizedBase() && !recordUsesEBO(RD)) ||
3201 void MicrosoftRecordLayoutBuilder::finalizeLayout(const RecordDecl *RD) {
3214 if (!recordUsesEBO(RD) || !cast<CXXRecordDecl>(RD)->isEmpty()) {
3238 const CXXRecordDecl *RD) {
3239 if (BasesWithOverriddenMethods.count(RD))
3243 for (const CXXBaseSpecifier &Base : RD->bases())
3253 const CXXRecordDecl *RD) const {
3256 if (RD->getMSVtorDispMode() == MSVtorDispMode::ForVFTable) {
3257 for (const CXXBaseSpecifier &Base : RD->vbases()) {
3268 for (const CXXBaseSpecifier &Base : RD->bases()) {
3278 if ((!RD->hasUserDeclaredConstructor() && !RD->hasUserDeclaredDestructor()) ||
3279 RD->getMSVtorDispMode() == MSVtorDispMode::Never)
3284 assert(RD->getMSVtorDispMode() == MSVtorDispMode::ForVBaseOverride);
3292 for (const CXXMethodDecl *MD : RD->methods())
3309 for (const CXXBaseSpecifier &Base : RD->vbases()) {
3346 if (const auto *RD = dyn_cast<CXXRecordDecl>(D)) {
3347 EmptySubobjectMap EmptySubobjects(*this, RD);
3349 Builder.cxxLayout(RD);
3368 if (const auto *RD = dyn_cast<CXXRecordDecl>(D)) {
3369 EmptySubobjectMap EmptySubobjects(*this, RD);
3371 Builder.Layout(RD);
3377 mustSkipTailPadding(getTargetInfo().getCXXABI(), RD);
3388 Builder.Alignment, Builder.HasOwnVFPtr, RD->isDynamicClass(),
3417 const CXXMethodDecl *ASTContext::getCurrentKeyFunction(const CXXRecordDecl *RD) {
3421 assert(RD->getDefinition() && "Cannot get key function for forward decl!");
3422 RD = RD->getDefinition();
3429 LazyDeclPtr Entry = KeyFunctions[RD];
3431 Entry ? Entry.get(getExternalSource()) : computeKeyFunction(*this, RD);
3435 KeyFunctions[RD] = const_cast<Decl*>(Result);
3594 static void DumpRecordLayout(raw_ostream &OS, const RecordDecl *RD,
3601 const ASTRecordLayout &Layout = C.getASTRecordLayout(RD);
3602 auto CXXRD = dyn_cast<CXXRecordDecl>(RD);
3605 OS << C.getTypeDeclType(const_cast<RecordDecl *>(RD));
3623 OS << '(' << *RD << " vtable pointer)\n";
3627 OS << '(' << *RD << " vftable pointer)\n";
3657 OS << '(' << *RD << " vbtable pointer)\n";
3662 for (const FieldDecl *Field : RD->fields()) {
3737 void ASTContext::DumpRecordLayout(const RecordDecl *RD, raw_ostream &OS,
3740 ::DumpRecordLayout(OS, RD, *this, CharUnits(), 0, nullptr,
3753 const ASTRecordLayout &Info = getASTRecordLayout(RD);
3754 OS << "Type: " << getTypeDeclType(RD) << "\n";
3764 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {