diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-07-02 11:55:32 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-07-02 11:55:32 +0000 |
commit | 37ffed3b7f229844cae2463ff82b527506c86c74 (patch) | |
tree | affe75b7183a1ddd1a045d4db3e327c0d9fdf8c0 /lib/Frontend/PCHWriterDecl.cpp | |
parent | f48d45e3e36c132bdee3373beec4e8b19ae3f9c4 (diff) |
Fully read/write CXXRecordDecl for PCH.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107475 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/PCHWriterDecl.cpp')
-rw-r--r-- | lib/Frontend/PCHWriterDecl.cpp | 50 |
1 files changed, 38 insertions, 12 deletions
diff --git a/lib/Frontend/PCHWriterDecl.cpp b/lib/Frontend/PCHWriterDecl.cpp index 000c2d8ba8..86af50b0bc 100644 --- a/lib/Frontend/PCHWriterDecl.cpp +++ b/lib/Frontend/PCHWriterDecl.cpp @@ -632,6 +632,44 @@ void PCHDeclWriter::WriteCXXBaseSpecifier(const CXXBaseSpecifier *Base) { void PCHDeclWriter::VisitCXXRecordDecl(CXXRecordDecl *D) { VisitRecordDecl(D); + if (D->isFirstDeclaration()) { + Record.push_back(D->DefinitionData != 0); + if (D->DefinitionData) { + struct CXXRecordDecl::DefinitionData &Data = *D->DefinitionData; + + Record.push_back(Data.UserDeclaredConstructor); + Record.push_back(Data.UserDeclaredCopyConstructor); + Record.push_back(Data.UserDeclaredCopyAssignment); + Record.push_back(Data.UserDeclaredDestructor); + Record.push_back(Data.Aggregate); + Record.push_back(Data.PlainOldData); + Record.push_back(Data.Empty); + Record.push_back(Data.Polymorphic); + Record.push_back(Data.Abstract); + Record.push_back(Data.HasTrivialConstructor); + Record.push_back(Data.HasTrivialCopyConstructor); + Record.push_back(Data.HasTrivialCopyAssignment); + Record.push_back(Data.HasTrivialDestructor); + Record.push_back(Data.ComputedVisibleConversions); + + Record.push_back(D->getNumBases()); + for (CXXRecordDecl::base_class_iterator I = D->bases_begin(), + E = D->bases_end(); I != E; ++I) + WriteCXXBaseSpecifier(&*I); + + // FIXME: Make VBases lazily computed when needed to avoid storing them. + Record.push_back(D->getNumVBases()); + for (CXXRecordDecl::base_class_iterator I = D->vbases_begin(), + E = D->vbases_end(); I != E; ++I) + WriteCXXBaseSpecifier(&*I); + + Writer.AddUnresolvedSet(Data.Conversions, Record); + Writer.AddUnresolvedSet(Data.VisibleConversions, Record); + Writer.AddDeclRef(Data.Definition, Record); + Writer.AddDeclRef(Data.FirstFriend, Record); + } + } + enum { CXXRecNotTemplate = 0, CXXRecTemplate, CXXRecMemberSpecialization }; @@ -648,18 +686,6 @@ void PCHDeclWriter::VisitCXXRecordDecl(CXXRecordDecl *D) { Record.push_back(CXXRecNotTemplate); } - // FIXME: Hack. See PCHDeclWriter::VisitTypeDecl. - Writer.AddTypeRef(QualType(D->getTypeForDecl(), 0), Record); - - 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); - - Writer.AddDeclRef(D->data().FirstFriend, Record); - } Code = pch::DECL_CXX_RECORD; } |