summaryrefslogtreecommitdiffstats
path: root/clang/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
commit3c9c7b84fe1f8fd5e1e551c5e91eec7b2f4bf5a1 (patch)
tree512ae8dc953b76e00ae00dd8bf97f4c36dda8acf /clang/AST/DeclSerialization.cpp
parent545f7e39e1e95990acc951f27e67f3527496a6b1 (diff)
downloadbcm5719-llvm-3c9c7b84fe1f8fd5e1e551c5e91eec7b2f4bf5a1.tar.gz
bcm5719-llvm-3c9c7b84fe1f8fd5e1e551c5e91eec7b2f4bf5a1.zip
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. llvm-svn: 44106
Diffstat (limited to 'clang/AST/DeclSerialization.cpp')
-rw-r--r--clang/AST/DeclSerialization.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/clang/AST/DeclSerialization.cpp b/clang/AST/DeclSerialization.cpp
index b881cbe5b50..cfab8cc76d2 100644
--- a/clang/AST/DeclSerialization.cpp
+++ b/clang/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.
//===----------------------------------------------------------------------===//
OpenPOWER on IntegriCloud