diff options
| author | Ted Kremenek <kremenek@apple.com> | 2007-11-14 08:06:37 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2007-11-14 08:06:37 +0000 |
| commit | 3c9c7b84fe1f8fd5e1e551c5e91eec7b2f4bf5a1 (patch) | |
| tree | 512ae8dc953b76e00ae00dd8bf97f4c36dda8acf /clang/AST/DeclSerialization.cpp | |
| parent | 545f7e39e1e95990acc951f27e67f3527496a6b1 (diff) | |
| download | bcm5719-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.cpp | 43 |
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. //===----------------------------------------------------------------------===// |

