move serialization logic from TranslationUnit to ASTContext.

llvm-svn: 67902
This commit is contained in:
Chris Lattner 2009-03-28 03:45:20 +00:00
parent b9411565ea
commit d286851b57
5 changed files with 97 additions and 87 deletions

View File

@ -32,6 +32,7 @@ namespace llvm {
}
namespace clang {
class FileManager;
class ASTRecordLayout;
class Expr;
class IdentifierTable;
@ -146,6 +147,7 @@ public:
DeclarationNameTable DeclarationNames;
SourceManager& getSourceManager() { return SourceMgr; }
const SourceManager& getSourceManager() const { return SourceMgr; }
void *Allocate(unsigned Size, unsigned Align = 8) {
return FreeMemory ? MallocAlloc.Allocate(Size, Align) :
BumpAlloc.Allocate(Size, Align);
@ -674,6 +676,10 @@ public:
// Serialization
//===--------------------------------------------------------------------===//
void EmitAll(llvm::Serializer& S) const;
static ASTContext* CreateAll(llvm::Deserializer &D,
FileManager &FMgr);
void Emit(llvm::Serializer& S) const;
static ASTContext* Create(llvm::Deserializer& D);

View File

@ -44,10 +44,7 @@ public:
~TranslationUnit();
const std::string& getSourceFile() const;
/// Emit - Emit the translation unit to an arbitray bitcode stream.
void Emit(llvm::Serializer& S) const;
/// Create - Reconsititute a translation unit from a bitcode stream.
static TranslationUnit* Create(llvm::Deserializer& D, FileManager& FMgr);

View File

@ -17,12 +17,12 @@
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/Expr.h"
#include "clang/AST/RecordLayout.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/TargetInfo.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Bitcode/Serialize.h"
#include "llvm/Bitcode/Deserialize.h"
#include "llvm/Support/MathExtras.h"
using namespace clang;
enum FloatingRank {
@ -3080,6 +3080,47 @@ QualType ASTContext::getCorrespondingUnsignedType(QualType T) {
// Serialization Support
//===----------------------------------------------------------------------===//
enum {
BasicMetadataBlock = 1,
ASTContextBlock = 2,
DeclsBlock = 3
};
void ASTContext::EmitAll(llvm::Serializer &S) const {
// ===---------------------------------------------------===/
// Serialize the "Translation Unit" metadata.
// ===---------------------------------------------------===/
// Emit ASTContext.
S.EnterBlock(ASTContextBlock);
S.EmitOwnedPtr(this);
S.ExitBlock(); // exit "ASTContextBlock"
S.EnterBlock(BasicMetadataBlock);
// Block for SourceManager and Target. Allows easy skipping
// around to the block for the Selectors during deserialization.
S.EnterBlock();
// Emit the SourceManager.
S.Emit(getSourceManager());
// Emit the Target.
S.EmitPtr(&Target);
S.EmitCStr(Target.getTargetTriple());
S.ExitBlock(); // exit "SourceManager and Target Block"
// Emit the Selectors.
S.Emit(Selectors);
// Emit the Identifier Table.
S.Emit(Idents);
S.ExitBlock(); // exit "BasicMetadataBlock"
}
/// Emit - Serialize an ASTContext object to Bitcode.
void ASTContext::Emit(llvm::Serializer& S) const {
S.Emit(LangOpts);
@ -3101,6 +3142,51 @@ void ASTContext::Emit(llvm::Serializer& S) const {
// FIXME: S.EmitOwnedPtr(CFConstantStringTypeDecl);
}
ASTContext* ASTContext::CreateAll(llvm::Deserializer &Dezr,
FileManager &FMgr) {
// ===---------------------------------------------------===/
// Deserialize the "Translation Unit" metadata.
// ===---------------------------------------------------===/
// Skip to the BasicMetaDataBlock. First jump to ASTContextBlock
// (which will appear earlier) and record its location.
bool FoundBlock = Dezr.SkipToBlock(ASTContextBlock);
assert (FoundBlock);
llvm::Deserializer::Location ASTContextBlockLoc =
Dezr.getCurrentBlockLocation();
FoundBlock = Dezr.SkipToBlock(BasicMetadataBlock);
assert (FoundBlock);
// Read the SourceManager.
SourceManager::CreateAndRegister(Dezr, FMgr);
{ // Read the TargetInfo.
llvm::SerializedPtrID PtrID = Dezr.ReadPtrID();
char* triple = Dezr.ReadCStr(NULL,0,true);
Dezr.RegisterPtr(PtrID, TargetInfo::CreateTargetInfo(std::string(triple)));
delete [] triple;
}
// For Selectors, we must read the identifier table first because the
// SelectorTable depends on the identifiers being already deserialized.
llvm::Deserializer::Location SelectorBlkLoc = Dezr.getCurrentBlockLocation();
Dezr.SkipBlock();
// Read the identifier table.
IdentifierTable::CreateAndRegister(Dezr);
// Now jump back and read the selectors.
Dezr.JumpTo(SelectorBlkLoc);
SelectorTable::CreateAndRegister(Dezr);
// Now jump back to ASTContextBlock and read the ASTContext.
Dezr.JumpTo(ASTContextBlockLoc);
return Dezr.ReadOwnedPtr<ASTContext>();
}
ASTContext* ASTContext::Create(llvm::Deserializer& D) {
// Read the language options.

View File

@ -26,9 +26,6 @@
using namespace clang;
enum { BasicMetadataBlock = 1,
ASTContextBlock = 2,
DeclsBlock = 3 };
TranslationUnit::~TranslationUnit() {
if (OwnsMetaData && Context) {
@ -79,7 +76,7 @@ bool clang::EmitASTBitcodeBuffer(const TranslationUnit& TU,
llvm::Serializer Sezr(Stream);
// Emit the translation unit.
TU.Emit(Sezr);
TU.getContext().EmitAll(Sezr);
}
return true;
@ -118,40 +115,6 @@ bool clang::EmitASTBitcodeFile(const TranslationUnit& TU,
return false;
}
void TranslationUnit::Emit(llvm::Serializer& Sezr) const {
// ===---------------------------------------------------===/
// Serialize the "Translation Unit" metadata.
// ===---------------------------------------------------===/
// Emit ASTContext.
Sezr.EnterBlock(ASTContextBlock);
Sezr.EmitOwnedPtr(Context);
Sezr.ExitBlock(); // exit "ASTContextBlock"
Sezr.EnterBlock(BasicMetadataBlock);
// Block for SourceManager and Target. Allows easy skipping
// around to the block for the Selectors during deserialization.
Sezr.EnterBlock();
// Emit the SourceManager.
Sezr.Emit(Context->getSourceManager());
// Emit the Target.
Sezr.EmitPtr(&Context->Target);
Sezr.EmitCStr(Context->Target.getTargetTriple());
Sezr.ExitBlock(); // exit "SourceManager and Target Block"
// Emit the Selectors.
Sezr.Emit(Context->Selectors);
// Emit the Identifier Table.
Sezr.Emit(Context->Idents);
Sezr.ExitBlock(); // exit "BasicMetadataBlock"
}
TranslationUnit*
clang::ReadASTBitcodeBuffer(llvm::MemoryBuffer& MBuffer, FileManager& FMgr) {
@ -202,48 +165,7 @@ TranslationUnit* TranslationUnit::Create(llvm::Deserializer& Dezr,
// Create the translation unit object.
TranslationUnit* TU = new TranslationUnit();
// ===---------------------------------------------------===/
// Deserialize the "Translation Unit" metadata.
// ===---------------------------------------------------===/
// Skip to the BasicMetaDataBlock. First jump to ASTContextBlock
// (which will appear earlier) and record its location.
bool FoundBlock = Dezr.SkipToBlock(ASTContextBlock);
assert (FoundBlock);
llvm::Deserializer::Location ASTContextBlockLoc =
Dezr.getCurrentBlockLocation();
FoundBlock = Dezr.SkipToBlock(BasicMetadataBlock);
assert (FoundBlock);
// Read the SourceManager.
SourceManager::CreateAndRegister(Dezr,FMgr);
{ // Read the TargetInfo.
llvm::SerializedPtrID PtrID = Dezr.ReadPtrID();
char* triple = Dezr.ReadCStr(NULL,0,true);
Dezr.RegisterPtr(PtrID, TargetInfo::CreateTargetInfo(std::string(triple)));
delete [] triple;
}
// For Selectors, we must read the identifier table first because the
// SelectorTable depends on the identifiers being already deserialized.
llvm::Deserializer::Location SelectorBlkLoc = Dezr.getCurrentBlockLocation();
Dezr.SkipBlock();
// Read the identifier table.
IdentifierTable::CreateAndRegister(Dezr);
// Now jump back and read the selectors.
Dezr.JumpTo(SelectorBlkLoc);
SelectorTable::CreateAndRegister(Dezr);
// Now jump back to ASTContextBlock and read the ASTContext.
Dezr.JumpTo(ASTContextBlockLoc);
TU->Context = Dezr.ReadOwnedPtr<ASTContext>();
TU->Context = ASTContext.CreateAll(Dezr, FmMgr);
return TU;
}

View File

@ -659,8 +659,7 @@ public:
DeclContextPrinter() : Out(llvm::errs()) {}
void HandleTranslationUnit(TranslationUnit& TU) {
TranslationUnitDecl* TUD = TU.getContext().getTranslationUnitDecl();
PrintDeclContext(TUD, 4);
PrintDeclContext(TU.getContext().getTranslationUnitDecl(), 4);
}
void PrintDeclContext(const DeclContext* DC, unsigned Indentation);