diff options
Diffstat (limited to 'clang/lib/Frontend')
| -rw-r--r-- | clang/lib/Frontend/PCHReaderDecl.cpp | 31 | ||||
| -rw-r--r-- | clang/lib/Frontend/PCHWriterDecl.cpp | 17 | 
2 files changed, 48 insertions, 0 deletions
| 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<bool>(Record[Idx++]); +  bool isBaseOfClass = static_cast<bool>(Record[Idx++]); +  AccessSpecifier AS = static_cast<AccessSpecifier>(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<CXXBaseSpecifier*, 4> 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;  } | 

