From d286851b57db32006a01da6cee2edd2b5b237c1e Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 28 Mar 2009 03:45:20 +0000 Subject: [PATCH] move serialization logic from TranslationUnit to ASTContext. llvm-svn: 67902 --- clang/include/clang/AST/ASTContext.h | 6 ++ clang/include/clang/AST/TranslationUnit.h | 5 +- clang/lib/AST/ASTContext.cpp | 88 ++++++++++++++++++++++- clang/lib/AST/TranslationUnit.cpp | 82 +-------------------- clang/tools/clang-cc/ASTConsumers.cpp | 3 +- 5 files changed, 97 insertions(+), 87 deletions(-) diff --git a/clang/include/clang/AST/ASTContext.h b/clang/include/clang/AST/ASTContext.h index 308ea5f3fa40..2c239b255a39 100644 --- a/clang/include/clang/AST/ASTContext.h +++ b/clang/include/clang/AST/ASTContext.h @@ -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); diff --git a/clang/include/clang/AST/TranslationUnit.h b/clang/include/clang/AST/TranslationUnit.h index 33cb47b9e5e3..5fff66626b1e 100644 --- a/clang/include/clang/AST/TranslationUnit.h +++ b/clang/include/clang/AST/TranslationUnit.h @@ -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); diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 3fe6db834286..9f8630f58fc8 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -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::Create(llvm::Deserializer& D) { // Read the language options. diff --git a/clang/lib/AST/TranslationUnit.cpp b/clang/lib/AST/TranslationUnit.cpp index ed84241df423..8ceada593ede 100644 --- a/clang/lib/AST/TranslationUnit.cpp +++ b/clang/lib/AST/TranslationUnit.cpp @@ -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(); + TU->Context = ASTContext.CreateAll(Dezr, FmMgr); return TU; } - diff --git a/clang/tools/clang-cc/ASTConsumers.cpp b/clang/tools/clang-cc/ASTConsumers.cpp index 9eba137918ef..c3828a9e2bb9 100644 --- a/clang/tools/clang-cc/ASTConsumers.cpp +++ b/clang/tools/clang-cc/ASTConsumers.cpp @@ -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);