aboutsummaryrefslogtreecommitdiff
path: root/AST/DeclSerialization.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2007-11-14 08:06:37 +0000
committerTed Kremenek <kremenek@apple.com>2007-11-14 08:06:37 +0000
commitaad48b6b2dfc81ad36a05d161c775cd6aab5b339 (patch)
treed2d050bea14752ada686c9dedbca0c572d1a0add /AST/DeclSerialization.cpp
parent41af093ee62a4aea948ffef4482c9e2a496d710e (diff)
Implemented serialization of RecordDecls. Changed serialization of TagType to
have an owning pointer to the referred TagDecl. This should hopefully fix a bug where TagDecls (including decls from structs, etc.) were not serialized. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44106 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'AST/DeclSerialization.cpp')
-rw-r--r--AST/DeclSerialization.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/AST/DeclSerialization.cpp b/AST/DeclSerialization.cpp
index b881cbe5b5..cfab8cc76d 100644
--- a/AST/DeclSerialization.cpp
+++ b/AST/DeclSerialization.cpp
@@ -52,6 +52,9 @@ Decl* Decl::Create(Deserializer& D) {
case Function:
return FunctionDecl::CreateImpl(D);
+ case Struct:
+ return RecordDecl::CreateImpl(k,D);
+
case Typedef:
return TypedefDecl::CreateImpl(D);
}
@@ -268,6 +271,46 @@ FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D) {
}
//===----------------------------------------------------------------------===//
+// RecordDecl Serialization.
+//===----------------------------------------------------------------------===//
+
+void RecordDecl::EmitImpl(llvm::Serializer& S) const {
+ ScopedDecl::EmitInRec(S);
+ S.EmitBool(hasFlexibleArrayMember());
+ S.EmitSInt(getNumMembers());
+ if (getNumMembers() > 0) {
+ assert (Members);
+ S.BatchEmitOwnedPtrs((unsigned) getNumMembers(),
+ (Decl**) &Members[0],getNextDeclarator());
+ }
+ else
+ ScopedDecl::EmitOutRec(S);
+}
+
+RecordDecl* RecordDecl::CreateImpl(Decl::Kind DK, Deserializer& D) {
+ RecordDecl* decl = new RecordDecl(DK,SourceLocation(),NULL,NULL);
+
+ decl->ScopedDecl::ReadInRec(D);
+ decl->setHasFlexibleArrayMember(D.ReadBool());
+ decl->NumMembers = D.ReadSInt();
+
+ if (decl->getNumMembers() > 0) {
+ Decl* next_declarator;
+ decl->Members = new FieldDecl*[(unsigned) decl->getNumMembers()];
+
+ D.BatchReadOwnedPtrs((unsigned) decl->getNumMembers(),
+ (Decl**) &decl->Members[0],
+ next_declarator);
+
+ decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
+ }
+ else
+ decl->ScopedDecl::ReadOutRec(D);
+
+ return decl;
+}
+
+//===----------------------------------------------------------------------===//
// TypedefDecl Serialization.
//===----------------------------------------------------------------------===//