aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2007-11-02 18:05:11 +0000
committerTed Kremenek <kremenek@apple.com>2007-11-02 18:05:11 +0000
commit0497331350e9f7838c03eca5f2782a53160f7423 (patch)
treeaad8650346148009d66176d53173e9551042bf8d
parent54a2f071a37ee63d3ef1d4e7ca2570542ee12115 (diff)
Added most of the boilerplate code for Decl serialization. Still a few
key functions to implement. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43648 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--AST/DeclSerialization.cpp117
-rw-r--r--include/clang/AST/Decl.h55
2 files changed, 132 insertions, 40 deletions
diff --git a/AST/DeclSerialization.cpp b/AST/DeclSerialization.cpp
index 3a326f006b..c07edb4a58 100644
--- a/AST/DeclSerialization.cpp
+++ b/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<Decl>(NextDeclarator);
+}
+
+void ScopedDecl::InternalRead(llvm::Deserializer& D) {
+ NamedDecl::InternalRead(D);
+ D.ReadPtr(Next);
+ NextDeclarator = cast<ScopedDecl>(D.ReadOwnedPtr<Decl>());
+}
+
+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<ObjcDeclQualifier>(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<StorageClass>(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/include/clang/AST/Decl.h b/include/clang/AST/Decl.h
index 788a03e8e5..008901d85d 100644
--- a/include/clang/AST/Decl.h
+++ b/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<const Decl*>(this)->Emit(S);
- }
-
- /// Materialize - Deserialize a ScopedDecl from Bitcode.
- static inline NamedDecl* Materialize(llvm::Deserializer& D) {
- return cast<NamedDecl>(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<const Decl*>(this)->Emit(S);
- }
-
- /// Materialize - Deserialize a ScopedDecl from Bitcode.
- static inline ScopedDecl* Materialize(llvm::Deserializer& D) {
- return cast<ScopedDecl>(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<const Decl*>(this)->Emit(S);
- }
-
- /// Materialize - Deserialize a ValueDecl from Bitcode.
- static inline ValueDecl* Materialize(llvm::Deserializer& D) {
- return cast<ValueDecl>(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<const Decl*>(this)->Emit(S);
- }
-
- /// Materialize - Deserialize a VarDecl from Bitcode.
- static inline VarDecl* Materialize(llvm::Deserializer& D) {
- return cast<VarDecl>(Decl::Materialize(D));
- }
+protected:
+ void InternalEmit(llvm::Serializer& S) const;
+ void InternalRead(llvm::Deserializer& D);
};
/// BlockVarDecl - Represent a local variable declaration.