From 1c70e99a2c18b9a47659c4743f2d5bade3ea85de Mon Sep 17 00:00:00 2001 From: John McCall Date: Thu, 3 Jun 2010 19:28:45 +0000 Subject: Hack in some really terrible C++ record PCH support that I need right now. This is required in order to test: The ASTImporter should set base classes after formally entering the definition. llvm-svn: 105401 --- clang/lib/Frontend/PCHReaderDecl.cpp | 31 +++++++++++++++++++++++++++++++ clang/lib/Frontend/PCHWriterDecl.cpp | 17 +++++++++++++++++ 2 files changed, 48 insertions(+) (limited to 'clang/lib/Frontend') diff --git a/clang/lib/Frontend/PCHReaderDecl.cpp b/clang/lib/Frontend/PCHReaderDecl.cpp index 2a1044c447f..606e852385d 100644 --- a/clang/lib/Frontend/PCHReaderDecl.cpp +++ b/clang/lib/Frontend/PCHReaderDecl.cpp @@ -38,6 +38,8 @@ namespace { unsigned &Idx) : Reader(Reader), Record(Record), Idx(Idx) { } + CXXBaseSpecifier *ReadCXXBaseSpecifier(); + void VisitDecl(Decl *D); void VisitTranslationUnitDecl(TranslationUnitDecl *TU); void VisitNamedDecl(NamedDecl *ND); @@ -550,9 +552,38 @@ void PCHDeclReader::VisitUnresolvedUsingTypename( D->setTargetNestedNameSpecifier(Reader.ReadNestedNameSpecifier(Record, Idx)); } +CXXBaseSpecifier *PCHDeclReader::ReadCXXBaseSpecifier() { + bool isVirtual = static_cast(Record[Idx++]); + bool isBaseOfClass = static_cast(Record[Idx++]); + AccessSpecifier AS = static_cast(Record[Idx++]); + QualType T = Reader.GetType(Record[Idx++]); + SourceRange Range = Reader.ReadSourceRange(Record, Idx); + return new (*Reader.getContext()) + CXXBaseSpecifier(Range, isVirtual, isBaseOfClass, AS, T); +} + void PCHDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) { // assert(false && "cannot read CXXRecordDecl"); VisitRecordDecl(D); + + // FIXME: this is far from complete + + if (D->isDefinition()) { + D->setDefinition(false); // make peace with an assertion + D->startDefinition(); + + unsigned NumBases = Record[Idx++]; + + llvm::SmallVector Bases; + Bases.reserve(NumBases); + for (unsigned I = 0; I != NumBases; ++I) + Bases.push_back(ReadCXXBaseSpecifier()); + D->setBases(Bases.begin(), NumBases); + + // FIXME: there's a lot of stuff we do here that's kindof sketchy + // if we're leaving the context incomplete. + D->completeDefinition(); + } } void PCHDeclReader::VisitCXXMethodDecl(CXXMethodDecl *D) { diff --git a/clang/lib/Frontend/PCHWriterDecl.cpp b/clang/lib/Frontend/PCHWriterDecl.cpp index 42756c35cc3..d0a01f083f9 100644 --- a/clang/lib/Frontend/PCHWriterDecl.cpp +++ b/clang/lib/Frontend/PCHWriterDecl.cpp @@ -105,6 +105,8 @@ namespace { void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D); void VisitObjCPropertyDecl(ObjCPropertyDecl *D); void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D); + + void WriteCXXBaseSpecifier(const CXXBaseSpecifier *Base); }; } @@ -559,9 +561,24 @@ void PCHDeclWriter::VisitUnresolvedUsingTypename( Code = pch::DECL_UNRESOLVED_USING_TYPENAME; } +void PCHDeclWriter::WriteCXXBaseSpecifier(const CXXBaseSpecifier *Base) { + Record.push_back(Base->isVirtual()); + Record.push_back(Base->isBaseOfClass()); + Record.push_back(Base->getAccessSpecifierAsWritten()); + Writer.AddTypeRef(Base->getType(), Record); + Writer.AddSourceRange(Base->getSourceRange(), Record); +} + void PCHDeclWriter::VisitCXXRecordDecl(CXXRecordDecl *D) { // assert(false && "cannot write CXXRecordDecl"); VisitRecordDecl(D); + if (D->isDefinition()) { + unsigned NumBases = D->getNumBases(); + Record.push_back(NumBases); + for (CXXRecordDecl::base_class_iterator I = D->bases_begin(), + E = D->bases_end(); I != E; ++I) + WriteCXXBaseSpecifier(&*I); + } Code = pch::DECL_CXX_RECORD; } -- cgit v1.2.3