aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/PCHReaderDecl.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2010-07-02 11:55:32 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2010-07-02 11:55:32 +0000
commit37ffed3b7f229844cae2463ff82b527506c86c74 (patch)
treeaffe75b7183a1ddd1a045d4db3e327c0d9fdf8c0 /lib/Frontend/PCHReaderDecl.cpp
parentf48d45e3e36c132bdee3373beec4e8b19ae3f9c4 (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/PCHReaderDecl.cpp')
-rw-r--r--lib/Frontend/PCHReaderDecl.cpp80
1 files changed, 49 insertions, 31 deletions
diff --git a/lib/Frontend/PCHReaderDecl.cpp b/lib/Frontend/PCHReaderDecl.cpp
index 443842d342..ea99ff249d 100644
--- a/lib/Frontend/PCHReaderDecl.cpp
+++ b/lib/Frontend/PCHReaderDecl.cpp
@@ -39,7 +39,7 @@ namespace clang {
unsigned &Idx)
: Reader(Reader), Record(Record), Idx(Idx), TypeIDForTypeDecl(0) { }
- CXXBaseSpecifier *ReadCXXBaseSpecifier();
+ CXXBaseSpecifier ReadCXXBaseSpecifier();
void Visit(Decl *D);
@@ -628,20 +628,63 @@ void PCHDeclReader::VisitUnresolvedUsingTypenameDecl(
D->setTargetNestedNameSpecifier(Reader.ReadNestedNameSpecifier(Record, Idx));
}
-CXXBaseSpecifier *PCHDeclReader::ReadCXXBaseSpecifier() {
+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);
+ return CXXBaseSpecifier(Range, isVirtual, isBaseOfClass, AS, T);
}
void PCHDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) {
- // assert(false && "cannot read CXXRecordDecl");
VisitRecordDecl(D);
-
+
+ ASTContext &C = *Reader.getContext();
+
+ if (D->isFirstDeclaration()) {
+ if (Record[Idx++]) { // DefinitionData != 0
+ D->DefinitionData = new (C) struct CXXRecordDecl::DefinitionData(0);
+ struct CXXRecordDecl::DefinitionData &Data = *D->DefinitionData;
+
+ Data.UserDeclaredConstructor = Record[Idx++];
+ Data.UserDeclaredCopyConstructor = Record[Idx++];
+ Data.UserDeclaredCopyAssignment = Record[Idx++];
+ Data.UserDeclaredDestructor = Record[Idx++];
+ Data.Aggregate = Record[Idx++];
+ Data.PlainOldData = Record[Idx++];
+ Data.Empty = Record[Idx++];
+ Data.Polymorphic = Record[Idx++];
+ Data.Abstract = Record[Idx++];
+ Data.HasTrivialConstructor = Record[Idx++];
+ Data.HasTrivialCopyConstructor = Record[Idx++];
+ Data.HasTrivialCopyAssignment = Record[Idx++];
+ Data.HasTrivialDestructor = Record[Idx++];
+ Data.ComputedVisibleConversions = Record[Idx++];
+
+ // setBases() is unsuitable since it may try to iterate the bases of an
+ // unitialized base.
+ Data.NumBases = Record[Idx++];
+ Data.Bases = new(C) CXXBaseSpecifier [Data.NumBases];
+ for (unsigned i = 0; i != Data.NumBases; ++i)
+ Data.Bases[i] = ReadCXXBaseSpecifier();
+
+ // FIXME: Make VBases lazily computed when needed to avoid storing them.
+ Data.NumVBases = Record[Idx++];
+ Data.VBases = new(C) CXXBaseSpecifier [Data.NumVBases];
+ for (unsigned i = 0; i != Data.NumVBases; ++i)
+ Data.VBases[i] = ReadCXXBaseSpecifier();
+
+ Reader.ReadUnresolvedSet(Data.Conversions, Record, Idx);
+ Reader.ReadUnresolvedSet(Data.VisibleConversions, Record, Idx);
+ Data.Definition = cast<CXXRecordDecl>(Reader.GetDecl(Record[Idx++]));
+ Data.FirstFriend
+ = cast_or_null<FriendDecl>(Reader.GetDecl(Record[Idx++]));
+ }
+ } else {
+ D->DefinitionData = D->getPreviousDeclaration()->DefinitionData;
+ }
+
enum CXXRecKind {
CXXRecNotTemplate = 0, CXXRecTemplate, CXXRecMemberSpecialization
};
@@ -663,31 +706,6 @@ void PCHDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) {
break;
}
}
-
- // FIXME: Hack. See PCHDeclWriter::VisitTypeDecl.
- D->setTypeForDecl(Reader.GetType(Record[Idx++]).getTypePtr());
-
- // 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);
-
- D->data().FirstFriend
- = cast_or_null<FriendDecl>(Reader.GetDecl(Record[Idx++]));
-
- // 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) {