Lines Matching defs:RD
86 bool getExternalNVBaseOffset(const CXXRecordDecl *RD, CharUnits &BaseOffset) {
87 auto Known = BaseOffsets.find(RD);
94 bool getExternalVBaseOffset(const CXXRecordDecl *RD, CharUnits &BaseOffset) {
95 auto Known = VirtualBaseOffsets.find(RD);
125 void AddSubobjectAtOffset(const CXXRecordDecl *RD, CharUnits Offset);
130 void UpdateEmptyFieldSubobjects(const CXXRecordDecl *RD,
152 bool CanPlaceSubobjectAtOffset(const CXXRecordDecl *RD,
158 bool CanPlaceFieldSubobjectAtOffset(const CXXRecordDecl *RD,
232 EmptySubobjectMap::CanPlaceSubobjectAtOffset(const CXXRecordDecl *RD,
235 if (!RD->isEmpty())
243 if (!llvm::is_contained(Classes, RD))
250 void EmptySubobjectMap::AddSubobjectAtOffset(const CXXRecordDecl *RD,
253 if (!RD->isEmpty())
259 if (llvm::is_contained(Classes, RD))
262 Classes.push_back(RD);
377 EmptySubobjectMap::CanPlaceFieldSubobjectAtOffset(const CXXRecordDecl *RD,
385 if (!CanPlaceSubobjectAtOffset(RD, Offset))
388 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
391 for (const CXXBaseSpecifier &Base : RD->bases()) {
402 if (RD == Class) {
404 for (const CXXBaseSpecifier &Base : RD->vbases()) {
415 for (CXXRecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end();
438 if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl())
439 return CanPlaceFieldSubobjectAtOffset(RD, RD, Offset);
448 const CXXRecordDecl *RD = RT->getAsCXXRecordDecl();
449 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
459 if (!CanPlaceFieldSubobjectAtOffset(RD, RD, ElementOffset))
482 const CXXRecordDecl *RD, const CXXRecordDecl *Class, CharUnits Offset,
497 AddSubobjectAtOffset(RD, Offset);
499 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
502 for (const CXXBaseSpecifier &Base : RD->bases()) {
513 if (RD == Class) {
515 for (const CXXBaseSpecifier &Base : RD->vbases()) {
526 for (CXXRecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end();
540 if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl()) {
541 UpdateEmptyFieldSubobjects(RD, RD, Offset, PlacingOverlappingField);
552 const CXXRecordDecl *RD = RT->getAsCXXRecordDecl();
553 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
568 UpdateEmptyFieldSubobjects(RD, RD, ElementOffset,
747 void ComputeBaseSubobjectInfo(const CXXRecordDecl *RD);
751 BaseSubobjectInfo *ComputeBaseSubobjectInfo(const CXXRecordDecl *RD,
756 void DeterminePrimaryBase(const CXXRecordDecl *RD);
758 void SelectPrimaryVBase(const CXXRecordDecl *RD);
764 void LayoutNonVirtualBases(const CXXRecordDecl *RD);
773 void LayoutVirtualBases(const CXXRecordDecl *RD,
838 void ItaniumRecordLayoutBuilder::SelectPrimaryVBase(const CXXRecordDecl *RD) {
839 for (const auto &I : RD->bases()) {
867 void ItaniumRecordLayoutBuilder::DeterminePrimaryBase(const CXXRecordDecl *RD) {
869 if (!RD->isDynamicClass())
874 RD->getIndirectPrimaryBases(IndirectPrimaryBases);
879 for (const auto &I : RD->bases()) {
898 if (RD->getNumVBases() != 0) {
899 SelectPrimaryVBase(RD);
915 const CXXRecordDecl *RD, bool IsVirtual, BaseSubobjectInfo *Derived) {
920 BaseSubobjectInfo *&InfoSlot = VirtualBaseInfo[RD];
922 assert(InfoSlot->Class == RD && "Wrong class for virtual base info!");
933 Info->Class = RD;
942 if (RD->getNumVBases()) {
943 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
968 for (const auto &I : RD->bases()) {
992 const CXXRecordDecl *RD) {
993 for (const auto &I : RD->bases()) {
1033 const CXXRecordDecl *RD) {
1035 DeterminePrimaryBase(RD);
1038 ComputeBaseSubobjectInfo(RD);
1067 } else if (RD->isDynamicClass()) {
1084 for (const auto &I : RD->bases()) {
1152 const CXXRecordDecl *RD, const CXXRecordDecl *MostDerivedClass) {
1156 if (MostDerivedClass == RD) {
1160 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
1165 for (const CXXBaseSpecifier &Base : RD->bases()) {
1323 if (const RecordDecl *RD = dyn_cast<RecordDecl>(D)) {
1324 IsUnion = RD->isUnion();
1325 IsMsStruct = RD->isMsStruct(Context);
1362 if (const RecordDecl *RD = dyn_cast<RecordDecl>(D))
1365 RD, External.Size, External.Align, External.FieldOffsets,
1390 void ItaniumRecordLayoutBuilder::Layout(const CXXRecordDecl *RD) {
1391 InitializeLayout(RD);
1394 LayoutNonVirtualBases(RD);
1396 LayoutFields(RD);
1404 LayoutVirtualBases(RD, RD);
1408 FinishLayout(RD);
1412 for (const CXXBaseSpecifier &Base : RD->bases()) {
1422 for (const CXXBaseSpecifier &Base : RD->vbases()) {
2022 const RecordDecl *RD = RT->getDecl();
2023 assert(RD && "Expected non-null RecordDecl.");
2024 const ASTRecordLayout &FieldRecord = Context.getASTRecordLayout(RD);
2128 if (const RecordDecl *RD = D->getParent()) {
2130 if (RD->hasAttr<PackedAttr>() || !MaxFieldAlignment.isZero())
2138 << Context.getTypeDeclType(RD) << D->getName() << D->getType();
2149 if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
2153 if (RD->isEmpty())
2193 if (const RecordDecl *RD = dyn_cast<RecordDecl>(D)) {
2202 Diag(RD->getLocation(), diag::warn_padded_struct_size)
2203 << Context.getTypeDeclType(RD)
2208 const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD);
2222 << Context.getTypeDeclType(RD);
2333 const CXXRecordDecl *RD) {
2335 if (!RD->isPolymorphic())
2341 if (!RD->isExternallyVisible())
2346 TemplateSpecializationKind TSK = RD->getTemplateSpecializationKind();
2355 for (const CXXMethodDecl *MD : RD->methods()) {
2402 if (MD->hasAttr<DLLImportAttr>() && !RD->hasAttr<DLLImportAttr>() &&
2421 static bool mustSkipTailPadding(TargetCXXABI ABI, const CXXRecordDecl *RD) {
2445 return RD->isPOD();
2448 // This is equivalent to RD->getTypeForDecl().isCXX11PODType(),
2454 return RD->isTrivial() && RD->isCXX11StandardLayout();
2574 void layout(const RecordDecl *RD);
2575 void cxxLayout(const CXXRecordDecl *RD);
2577 void initializeLayout(const RecordDecl *RD);
2581 void initializeCXXLayout(const CXXRecordDecl *RD);
2582 void layoutNonVirtualBases(const CXXRecordDecl *RD);
2583 void layoutNonVirtualBase(const CXXRecordDecl *RD,
2587 void injectVFPtr(const CXXRecordDecl *RD);
2588 void injectVBPtr(const CXXRecordDecl *RD);
2591 void layoutFields(const RecordDecl *RD);
2597 void layoutVirtualBases(const CXXRecordDecl *RD);
2598 void finalizeLayout(const RecordDecl *RD);
2617 const CXXRecordDecl *RD) const;
2743 void MicrosoftRecordLayoutBuilder::layout(const RecordDecl *RD) {
2746 initializeLayout(RD);
2747 layoutFields(RD);
2750 RequiredAlignment, Context.toCharUnitsFromBits(RD->getMaxAlignment()));
2751 finalizeLayout(RD);
2754 void MicrosoftRecordLayoutBuilder::cxxLayout(const CXXRecordDecl *RD) {
2757 initializeLayout(RD);
2758 initializeCXXLayout(RD);
2759 layoutNonVirtualBases(RD);
2760 layoutFields(RD);
2761 injectVBPtr(RD);
2762 injectVFPtr(RD);
2772 RequiredAlignment, Context.toCharUnitsFromBits(RD->getMaxAlignment()));
2773 layoutVirtualBases(RD);
2774 finalizeLayout(RD);
2777 void MicrosoftRecordLayoutBuilder::initializeLayout(const RecordDecl *RD) {
2778 IsUnion = RD->isUnion();
2794 if (const MaxFieldAlignmentAttr *MFAA = RD->getAttr<MaxFieldAlignmentAttr>()){
2801 if (RD->hasAttr<PackedAttr>())
2808 RD, External.Size, External.Align, External.FieldOffsets,
2813 MicrosoftRecordLayoutBuilder::initializeCXXLayout(const CXXRecordDecl *RD) {
2832 MicrosoftRecordLayoutBuilder::layoutNonVirtualBases(const CXXRecordDecl *RD) {
2842 for (const CXXBaseSpecifier &Base : RD->bases()) {
2865 layoutNonVirtualBase(RD, BaseDecl, BaseLayout, PreviousBaseLayout);
2868 if (RD->isPolymorphic()) {
2876 for (CXXMethodDecl *M : RD->methods()) {
2889 for (const CXXBaseSpecifier &Base : RD->bases()) {
2906 layoutNonVirtualBase(RD, BaseDecl, BaseLayout, PreviousBaseLayout);
2918 static bool recordUsesEBO(const RecordDecl *RD) {
2919 if (!isa<CXXRecordDecl>(RD))
2921 if (RD->hasAttr<EmptyBasesAttr>())
2923 if (auto *LVA = RD->getAttr<LayoutVersionAttr>())
2934 const CXXRecordDecl *RD, const CXXRecordDecl *BaseDecl,
2940 bool MDCUsesEBO = recordUsesEBO(RD);
2971 void MicrosoftRecordLayoutBuilder::layoutFields(const RecordDecl *RD) {
2973 for (const FieldDecl *Field : RD->fields())
3096 void MicrosoftRecordLayoutBuilder::injectVBPtr(const CXXRecordDecl *RD) {
3126 void MicrosoftRecordLayoutBuilder::injectVFPtr(const CXXRecordDecl *RD) {
3156 void MicrosoftRecordLayoutBuilder::layoutVirtualBases(const CXXRecordDecl *RD) {
3168 for (const CXXBaseSpecifier &VBase : RD->vbases()) {
3177 computeVtorDispSet(HasVtorDispSet, RD);
3180 for (const CXXBaseSpecifier &VBase : RD->vbases()) {
3190 BaseLayout.leadsWithZeroSizedBase() && !recordUsesEBO(RD)) ||
3215 void MicrosoftRecordLayoutBuilder::finalizeLayout(const RecordDecl *RD) {
3228 if (!recordUsesEBO(RD) || !cast<CXXRecordDecl>(RD)->isEmpty()) {
3252 const CXXRecordDecl *RD) {
3253 if (BasesWithOverriddenMethods.count(RD))
3257 for (const CXXBaseSpecifier &Base : RD->bases())
3267 const CXXRecordDecl *RD) const {
3270 if (RD->getMSVtorDispMode() == MSVtorDispMode::ForVFTable) {
3271 for (const CXXBaseSpecifier &Base : RD->vbases()) {
3282 for (const CXXBaseSpecifier &Base : RD->bases()) {
3292 if ((!RD->hasUserDeclaredConstructor() && !RD->hasUserDeclaredDestructor()) ||
3293 RD->getMSVtorDispMode() == MSVtorDispMode::Never)
3298 assert(RD->getMSVtorDispMode() == MSVtorDispMode::ForVBaseOverride);
3306 for (const CXXMethodDecl *MD : RD->methods())
3323 for (const CXXBaseSpecifier &Base : RD->vbases()) {
3360 if (const auto *RD = dyn_cast<CXXRecordDecl>(D)) {
3361 EmptySubobjectMap EmptySubobjects(*this, RD);
3363 Builder.cxxLayout(RD);
3382 if (const auto *RD = dyn_cast<CXXRecordDecl>(D)) {
3383 EmptySubobjectMap EmptySubobjects(*this, RD);
3385 Builder.Layout(RD);
3391 mustSkipTailPadding(getTargetInfo().getCXXABI(), RD);
3402 Builder.Alignment, Builder.HasOwnVFPtr, RD->isDynamicClass(),
3431 const CXXMethodDecl *ASTContext::getCurrentKeyFunction(const CXXRecordDecl *RD) {
3435 assert(RD->getDefinition() && "Cannot get key function for forward decl!");
3436 RD = RD->getDefinition();
3443 LazyDeclPtr Entry = KeyFunctions[RD];
3445 Entry ? Entry.get(getExternalSource()) : computeKeyFunction(*this, RD);
3449 KeyFunctions[RD] = const_cast<Decl*>(Result);
3608 static void DumpRecordLayout(raw_ostream &OS, const RecordDecl *RD,
3615 const ASTRecordLayout &Layout = C.getASTRecordLayout(RD);
3616 auto CXXRD = dyn_cast<CXXRecordDecl>(RD);
3619 OS << C.getTypeDeclType(const_cast<RecordDecl *>(RD));
3637 OS << '(' << *RD << " vtable pointer)\n";
3641 OS << '(' << *RD << " vftable pointer)\n";
3671 OS << '(' << *RD << " vbtable pointer)\n";
3677 for (RecordDecl::field_iterator I = RD->field_begin(),
3678 E = RD->field_end(); I != E; ++I, ++FieldNo) {
3753 void ASTContext::DumpRecordLayout(const RecordDecl *RD, raw_ostream &OS,
3756 ::DumpRecordLayout(OS, RD, *this, CharUnits(), 0, nullptr,
3769 const ASTRecordLayout &Info = getASTRecordLayout(RD);
3770 OS << "Type: " << getTypeDeclType(RD) << "\n";
3780 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {