Lines Matching refs:RD

79   void AddSubobjectAtOffset(const CXXRecordDecl *RD, CharUnits Offset);
84 void UpdateEmptyFieldSubobjects(const CXXRecordDecl *RD,
105 bool CanPlaceSubobjectAtOffset(const CXXRecordDecl *RD,
111 bool CanPlaceFieldSubobjectAtOffset(const CXXRecordDecl *RD,
190 EmptySubobjectMap::CanPlaceSubobjectAtOffset(const CXXRecordDecl *RD,
193 if (!RD->isEmpty())
201 if (std::find(Classes.begin(), Classes.end(), RD) == Classes.end())
208 void EmptySubobjectMap::AddSubobjectAtOffset(const CXXRecordDecl *RD,
211 if (!RD->isEmpty())
217 if (std::find(Classes.begin(), Classes.end(), RD) != Classes.end())
220 Classes.push_back(RD);
339 EmptySubobjectMap::CanPlaceFieldSubobjectAtOffset(const CXXRecordDecl *RD,
347 if (!CanPlaceSubobjectAtOffset(RD, Offset))
350 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
353 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
354 E = RD->bases_end(); I != E; ++I) {
366 if (RD == Class) {
368 for (CXXRecordDecl::base_class_const_iterator I = RD->vbases_begin(),
369 E = RD->vbases_end(); I != E; ++I) {
381 for (CXXRecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end();
406 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
407 return CanPlaceFieldSubobjectAtOffset(RD, RD, Offset);
417 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
418 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
428 if (!CanPlaceFieldSubobjectAtOffset(RD, RD, ElementOffset))
450 void EmptySubobjectMap::UpdateEmptyFieldSubobjects(const CXXRecordDecl *RD,
461 AddSubobjectAtOffset(RD, Offset);
463 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
466 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
467 E = RD->bases_end(); I != E; ++I) {
478 if (RD == Class) {
480 for (CXXRecordDecl::base_class_const_iterator I = RD->vbases_begin(),
481 E = RD->vbases_end(); I != E; ++I) {
492 for (CXXRecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end();
508 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
509 UpdateEmptyFieldSubobjects(RD, RD, Offset);
520 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
521 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
535 UpdateEmptyFieldSubobjects(RD, RD, ElementOffset);
640 void MSLayoutVirtualBases(const CXXRecordDecl *RD);
641 void MSLayout(const CXXRecordDecl *RD);
659 void ComputeBaseSubobjectInfo(const CXXRecordDecl *RD);
663 BaseSubobjectInfo *ComputeBaseSubobjectInfo(const CXXRecordDecl *RD,
668 void DeterminePrimaryBase(const CXXRecordDecl *RD);
670 void SelectPrimaryVBase(const CXXRecordDecl *RD);
676 void LayoutNonVirtualBases(const CXXRecordDecl *RD);
684 bool HasNewVirtualFunction(const CXXRecordDecl *RD) const;
685 bool BaseHasVFPtr(const CXXRecordDecl *RD) const;
688 void LayoutVirtualBases(const CXXRecordDecl *RD,
739 static const CXXMethodDecl *ComputeKeyFunction(const CXXRecordDecl *RD);
748 RecordLayoutBuilder::SelectPrimaryVBase(const CXXRecordDecl *RD) {
749 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
750 E = RD->bases_end(); I != E; ++I) {
779 void RecordLayoutBuilder::DeterminePrimaryBase(const CXXRecordDecl *RD) {
781 if (!RD->isDynamicClass())
786 RD->getIndirectPrimaryBases(IndirectPrimaryBases);
791 for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(),
792 e = RD->bases_end(); i != e; ++i) {
818 if (RD->getNumVBases() != 0) {
819 SelectPrimaryVBase(RD);
835 RecordLayoutBuilder::ComputeBaseSubobjectInfo(const CXXRecordDecl *RD,
842 BaseSubobjectInfo *&InfoSlot = VirtualBaseInfo[RD];
844 assert(InfoSlot->Class == RD && "Wrong class for virtual base info!");
855 Info->Class = RD;
864 if (RD->getNumVBases()) {
865 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
890 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
891 E = RD->bases_end(); I != E; ++I) {
915 void RecordLayoutBuilder::ComputeBaseSubobjectInfo(const CXXRecordDecl *RD) {
916 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
917 E = RD->bases_end(); I != E; ++I) {
959 RecordLayoutBuilder::LayoutNonVirtualBases(const CXXRecordDecl *RD) {
961 DeterminePrimaryBase(RD);
964 ComputeBaseSubobjectInfo(RD);
993 !PrimaryBase && RD->isDynamicClass()) {
1005 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
1006 E = RD->bases_end(); I != E; ++I) {
1035 if (HasNewVirtualFunction(RD) &&
1041 if (RD->getNumVBases() &&
1098 RecordLayoutBuilder::HasNewVirtualFunction(const CXXRecordDecl *RD) const {
1099 for (CXXRecordDecl::method_iterator method = RD->method_begin();
1100 method != RD->method_end();
1122 RecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *RD,
1127 if (MostDerivedClass == RD) {
1131 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
1136 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
1137 E = RD->bases_end(); I != E; ++I) {
1225 if (const RecordDecl *RD = dyn_cast<RecordDecl>(D))
1226 IsUnion = RD->isUnion();
1263 void RecordLayoutBuilder::Layout(const CXXRecordDecl *RD) {
1265 MSLayout(RD);
1269 InitializeLayout(RD);
1272 LayoutNonVirtualBases(RD);
1274 LayoutFields(RD);
1282 LayoutVirtualBases(RD, RD);
1288 FinishLayout(RD);
1292 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
1293 E = RD->bases_end(); I != E; ++I) {
1304 for (CXXRecordDecl::base_class_const_iterator I = RD->vbases_begin(),
1305 E = RD->vbases_end(); I != E; ++I) {
1755 void RecordLayoutBuilder::MSLayoutVirtualBases(const CXXRecordDecl *RD) {
1757 if (!RD->getNumVBases())
1760 for (CXXRecordDecl::base_class_const_iterator I = RD->vbases_begin(),
1761 E = RD->vbases_end(); I != E; ++I) {
1772 void RecordLayoutBuilder::MSLayout(const CXXRecordDecl *RD) {
1774 InitializeLayout(RD);
1776 LayoutNonVirtualBases(RD);
1778 LayoutFields(RD);
1797 MSLayoutVirtualBases(RD);
1803 if (!RD->getNumVBases())
1804 FinishLayout(RD);
1808 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
1809 E = RD->bases_end(); I != E; ++I) {
1820 for (CXXRecordDecl::base_class_const_iterator I = RD->vbases_begin(),
1821 E = RD->vbases_end(); I != E; ++I) {
1833 if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
1837 if (RD->isEmpty())
1853 if (const RecordDecl *RD = dyn_cast<RecordDecl>(D)) {
1862 Diag(RD->getLocation(), diag::warn_padded_struct_size)
1863 << Context.getTypeDeclType(RD)
1873 << Context.getTypeDeclType(RD);
1945 RecordLayoutBuilder::ComputeKeyFunction(const CXXRecordDecl *RD) {
1947 if (!RD->isPolymorphic())
1953 if (RD->getLinkage() != ExternalLinkage)
1958 TemplateSpecializationKind TSK = RD->getTemplateSpecializationKind();
1963 for (CXXRecordDecl::method_iterator I = RD->method_begin(),
1964 E = RD->method_end(); I != E; ++I) {
2017 if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
2018 EmptySubobjectMap EmptySubobjects(*this, RD);
2031 Builder->Layout(RD);
2044 Builder->Layout(RD);
2100 const CXXMethodDecl *ASTContext::getKeyFunction(const CXXRecordDecl *RD) {
2101 RD = cast<CXXRecordDecl>(RD->getDefinition());
2102 assert(RD && "Cannot get key function for forward declarations!");
2104 const CXXMethodDecl *&Entry = KeyFunctions[RD];
2106 Entry = RecordLayoutBuilder::ComputeKeyFunction(RD);
2160 const CXXRecordDecl *RD, const ASTContext &C,
2165 const ASTRecordLayout &Layout = C.getASTRecordLayout(RD);
2168 OS << C.getTypeDeclType(const_cast<CXXRecordDecl *>(RD)).getAsString();
2171 if (RD->isEmpty())
2181 if (RD->isDynamicClass() && !PrimaryBase) {
2183 OS << '(' << *RD << " vtable pointer)\n";
2188 OS << '(' << *RD << " vbtable pointer)\n";
2195 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
2196 E = RD->bases_end(); I != E; ++I) {
2214 OS << '(' << *RD << " vbtable pointer)\n";
2219 for (CXXRecordDecl::field_iterator I = RD->field_begin(),
2220 E = RD->field_end(); I != E; ++I, ++FieldNo) {
2242 for (CXXRecordDecl::base_class_const_iterator I = RD->vbases_begin(),
2243 E = RD->vbases_end(); I != E; ++I) {
2263 void ASTContext::DumpRecordLayout(const RecordDecl *RD,
2265 const ASTRecordLayout &Info = getASTRecordLayout(RD);
2267 if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
2271 OS << "Type: " << getTypeDeclType(RD).getAsString() << "\n";
2273 RD->dump();