blob: a9819be1cca5ab810d7e1983c359906f949d0798 [file] [log] [blame]
//===--- DeclSerialization.cpp - Serialization of Decls ---------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by Ted Kremenek and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This files defines methods that implement bitcode serialization for Decls.
//
//===----------------------------------------------------------------------===//
#include "clang/AST/Decl.h"
#include "clang/AST/Expr.h"
#include "llvm/Bitcode/Serialize.h"
#include "llvm/Bitcode/Deserialize.h"
using namespace clang;
void Decl::Emit(llvm::Serializer& S) const {
S.EmitInt(getKind());
switch (getKind()) {
default:
assert (false && "Not implemented.");
break;
case BlockVar:
cast<BlockVarDecl>(this)->Emit(S);
break;
case FileVar:
cast<FileVarDecl>(this)->Emit(S);
break;
case ParmVar:
cast<ParmVarDecl>(this)->Emit(S);
break;
case Function:
cast<FunctionDecl>(this)->Emit(S);
break;
}
}
Decl* Decl::Materialize(llvm::Deserializer& D) {
assert (false && "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;
}