From dda9a56975dac9f5155c0c1dbada0316250724fc Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Fri, 2 Nov 2007 18:05:11 +0000 Subject: [PATCH] Added most of the boilerplate code for Decl serialization. Still a few key functions to implement. llvm-svn: 43648 --- clang/AST/DeclSerialization.cpp | 117 ++++++++++++++++++++++++++++++++ clang/include/clang/AST/Decl.h | 55 ++++----------- 2 files changed, 132 insertions(+), 40 deletions(-) diff --git a/clang/AST/DeclSerialization.cpp b/clang/AST/DeclSerialization.cpp index 3a326f006b41..c07edb4a589f 100644 --- a/clang/AST/DeclSerialization.cpp +++ b/clang/AST/DeclSerialization.cpp @@ -26,3 +26,120 @@ Decl* Decl::Materialize(llvm::Deserializer& D) { assert ("FIXME: not implemented."); return NULL; } + +void NamedDecl::InternalEmit(llvm::Serializer& S) const { + S.EmitPtr(Identifier); +} + +void NamedDecl::InternalRead(llvm::Deserializer& D) { + D.ReadPtr(Identifier); +} + +void ScopedDecl::InternalEmit(llvm::Serializer& S) const { + NamedDecl::InternalEmit(S); + S.EmitPtr(Next); + S.EmitOwnedPtr(NextDeclarator); +} + +void ScopedDecl::InternalRead(llvm::Deserializer& D) { + NamedDecl::InternalRead(D); + D.ReadPtr(Next); + NextDeclarator = cast(D.ReadOwnedPtr()); +} + +void ValueDecl::InternalEmit(llvm::Serializer& S) const { + S.Emit(DeclType); + ScopedDecl::InternalEmit(S); +} + +void ValueDecl::InternalRead(llvm::Deserializer& D) { + D.Read(DeclType); + ScopedDecl::InternalRead(D); +} + +void VarDecl::InternalEmit(llvm::Serializer& S) const { + S.EmitInt(SClass); + S.EmitInt(objcDeclQualifier); + VarDecl::InternalEmit(S); + S.EmitOwnedPtr(Init); +} + +void VarDecl::InternalRead(llvm::Deserializer& D) { + SClass = D.ReadInt(); + objcDeclQualifier = static_cast(D.ReadInt()); + VarDecl::InternalRead(D); + D.ReadOwnedPtr(Init); +} + + +void BlockVarDecl::Emit(llvm::Serializer& S) const { + S.Emit(getLocation()); + VarDecl::InternalEmit(S); +} + +BlockVarDecl* BlockVarDecl::Materialize(llvm::Deserializer& D) { + SourceLocation L = SourceLocation::ReadVal(D); + BlockVarDecl* decl = new BlockVarDecl(L,NULL,QualType(),None,NULL); + decl->VarDecl::InternalRead(D); + return decl; +} + +void FileVarDecl::Emit(llvm::Serializer& S) const { + S.Emit(getLocation()); + VarDecl::InternalEmit(S); +} + +FileVarDecl* FileVarDecl::Materialize(llvm::Deserializer& D) { + SourceLocation L = SourceLocation::ReadVal(D); + FileVarDecl* decl = new FileVarDecl(L,NULL,QualType(),None,NULL); + decl->VarDecl::InternalRead(D); + return decl; +} + +void ParmVarDecl::Emit(llvm::Serializer& S) const { + S.Emit(getLocation()); + VarDecl::InternalEmit(S); +} + +ParmVarDecl* ParmVarDecl::Materialize(llvm::Deserializer& D) { + SourceLocation L = SourceLocation::ReadVal(D); + ParmVarDecl* decl = new ParmVarDecl(L,NULL,QualType(),None,NULL); + decl->VarDecl::InternalRead(D); + return decl; +} + +void FunctionDecl::Emit(llvm::Serializer& S) const { + S.Emit(getLocation()); + S.EmitInt(SClass); + S.EmitBool(IsInline); + + ValueDecl::InternalEmit(S); + + unsigned NumParams = getNumParams(); + S.EmitInt(NumParams); + + for (unsigned i = 0 ; i < NumParams; ++i) + S.EmitOwnedPtr(ParamInfo[i]); + + S.EmitOwnedPtr(Body); +} + +FunctionDecl* FunctionDecl::Materialize(llvm::Deserializer& D) { + SourceLocation L = SourceLocation::ReadVal(D); + StorageClass SClass = static_cast(D.ReadInt()); + bool IsInline = D.ReadBool(); + + FunctionDecl* decl = new FunctionDecl(L,NULL,QualType(),SClass,IsInline); + + decl->ValueDecl::InternalRead(D); + + unsigned NumParams = D.ReadInt(); + decl->ParamInfo = NumParams ? new ParmVarDecl*[NumParams] : NULL; + + for (unsigned i = 0 ; i < NumParams; ++i) + D.ReadOwnedPtr(decl->ParamInfo[i]); + + D.ReadOwnedPtr(decl->Body); + + return decl; +} diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h index 788a03e8e5ea..008901d85d25 100644 --- a/clang/include/clang/AST/Decl.h +++ b/clang/include/clang/AST/Decl.h @@ -185,16 +185,10 @@ public: return D->getKind() >= NamedFirst && D->getKind() <= NamedLast; } static bool classof(const NamedDecl *D) { return true; } - - /// Emit - Serialize this NamedDecl to Bitcode. - void Emit(llvm::Serializer& S) const { - static_cast(this)->Emit(S); - } - - /// Materialize - Deserialize a ScopedDecl from Bitcode. - static inline NamedDecl* Materialize(llvm::Deserializer& D) { - return cast(Decl::Materialize(D)); - } + +protected: + void InternalEmit(llvm::Serializer& S) const; + void InternalRead(llvm::Deserializer& D); }; /// ScopedDecl - Represent lexically scoped names, used for all ValueDecl's @@ -229,16 +223,10 @@ public: return D->getKind() >= ScopedFirst && D->getKind() <= ScopedLast; } static bool classof(const ScopedDecl *D) { return true; } - - /// Emit - Serialize this ScopedDecl to Bitcode. - void Emit(llvm::Serializer& S) const { - static_cast(this)->Emit(S); - } - - /// Materialize - Deserialize a ScopedDecl from Bitcode. - static inline ScopedDecl* Materialize(llvm::Deserializer& D) { - return cast(Decl::Materialize(D)); - } + +protected: + void InternalEmit(llvm::Serializer& S) const; + void InternalRead(llvm::Deserializer& D); }; /// ValueDecl - Represent the declaration of a variable (in which case it is @@ -259,16 +247,10 @@ public: return D->getKind() >= ValueFirst && D->getKind() <= ValueLast; } static bool classof(const ValueDecl *D) { return true; } - - /// Emit - Serialize this ValueDecl to Bitcode. - void Emit(llvm::Serializer& S) const { - static_cast(this)->Emit(S); - } - - /// Materialize - Deserialize a ValueDecl from Bitcode. - static inline ValueDecl* Materialize(llvm::Deserializer& D) { - return cast(Decl::Materialize(D)); - } + +protected: + void InternalEmit(llvm::Serializer& S) const; + void InternalRead(llvm::Deserializer& D); }; /// VarDecl - An instance of this class is created to represent a variable @@ -339,16 +321,9 @@ private: friend class StmtIteratorBase; -public: - /// Emit - Serialize this VarDecl to Bitcode. - void Emit(llvm::Serializer& S) const { - static_cast(this)->Emit(S); - } - - /// Materialize - Deserialize a VarDecl from Bitcode. - static inline VarDecl* Materialize(llvm::Deserializer& D) { - return cast(Decl::Materialize(D)); - } +protected: + void InternalEmit(llvm::Serializer& S) const; + void InternalRead(llvm::Deserializer& D); }; /// BlockVarDecl - Represent a local variable declaration.