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 | aad48b6b2dfc81ad36a05d161c775cd6aab5b339 (patch) | |
tree | d2d050bea14752ada686c9dedbca0c572d1a0add /AST/DeclSerialization.cpp | |
parent | 41af093ee62a4aea948ffef4482c9e2a496d710e (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.cpp | 43 |
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. //===----------------------------------------------------------------------===// |