From: Chris Lattner Date: Sat, 28 Mar 2009 04:27:18 +0000 (+0000) Subject: push more ASTContext goodness out through interfaces that use X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=557c5b1717bc8919b1b40cf2064b51491ec53a44;p=clang push more ASTContext goodness out through interfaces that use TranslationUnit git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67913 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/ASTContext.h b/include/clang/AST/ASTContext.h index 2c239b255a..bb2d80e7d1 100644 --- a/include/clang/AST/ASTContext.h +++ b/include/clang/AST/ASTContext.h @@ -676,12 +676,12 @@ public: // Serialization //===--------------------------------------------------------------------===// - void EmitAll(llvm::Serializer& S) const; - static ASTContext* CreateAll(llvm::Deserializer &D, - FileManager &FMgr); + void EmitASTBitcodeBuffer(std::vector &Buffer) const; + static ASTContext *ReadASTBitcodeBuffer(llvm::MemoryBuffer &MBuffer, + FileManager &FMgr); void Emit(llvm::Serializer& S) const; - static ASTContext* Create(llvm::Deserializer& D); + static ASTContext *Create(llvm::Deserializer& D); //===--------------------------------------------------------------------===// // Integer Values diff --git a/include/clang/AST/TranslationUnit.h b/include/clang/AST/TranslationUnit.h index 5ebcfa649d..bd282cf0eb 100644 --- a/include/clang/AST/TranslationUnit.h +++ b/include/clang/AST/TranslationUnit.h @@ -45,7 +45,7 @@ public: const std::string& getSourceFile() const; /// Create - Reconsititute a translation unit from a bitcode stream. - static TranslationUnit* Create(llvm::Deserializer& D, FileManager& FMgr); + //static TranslationUnit* Create(llvm::Deserializer& D, FileManager& FMgr); // Accessors const LangOptions& getLangOptions() const { return Context->getLangOptions();} @@ -60,15 +60,6 @@ public: iterator end() const { return Context->getTranslationUnitDecl()->decls_end(); } }; -/// EmitASTBitcodeBuffer - Emit a translation unit to a buffer. -bool EmitASTBitcodeBuffer(const ASTContext &Ctx, - std::vector& Buffer); - -/// ReadASTBitcodeBuffer - Reconsitute a translation unit from a buffer. -TranslationUnit* ReadASTBitcodeBuffer(llvm::MemoryBuffer& MBuffer, - FileManager& FMgr); - - } // end namespace clang #endif diff --git a/lib/AST/ASTConsumer.cpp b/lib/AST/ASTConsumer.cpp index b3919f1771..6c44d1ab7b 100644 --- a/lib/AST/ASTConsumer.cpp +++ b/lib/AST/ASTConsumer.cpp @@ -13,7 +13,6 @@ #include "clang/AST/ASTConsumer.h" #include "clang/AST/Decl.h" -#include "clang/AST/TranslationUnit.h" using namespace clang; ASTConsumer::~ASTConsumer() {} diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 9f8630f58f..f3cf6b18eb 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -23,6 +23,7 @@ #include "llvm/Bitcode/Serialize.h" #include "llvm/Bitcode/Deserialize.h" #include "llvm/Support/MathExtras.h" +#include "llvm/Support/MemoryBuffer.h" using namespace clang; enum FloatingRank { @@ -3086,7 +3087,21 @@ enum { DeclsBlock = 3 }; -void ASTContext::EmitAll(llvm::Serializer &S) const { +void ASTContext::EmitASTBitcodeBuffer(std::vector &Buffer) const{ + // Create bitstream. + llvm::BitstreamWriter Stream(Buffer); + + // Emit the preamble. + Stream.Emit((unsigned)'B', 8); + Stream.Emit((unsigned)'C', 8); + Stream.Emit(0xC, 4); + Stream.Emit(0xF, 4); + Stream.Emit(0xE, 4); + Stream.Emit(0x0, 4); + + // Create serializer. + llvm::Serializer S(Stream); + // ===---------------------------------------------------===/ // Serialize the "Translation Unit" metadata. // ===---------------------------------------------------===/ @@ -3142,8 +3157,32 @@ void ASTContext::Emit(llvm::Serializer& S) const { // FIXME: S.EmitOwnedPtr(CFConstantStringTypeDecl); } -ASTContext* ASTContext::CreateAll(llvm::Deserializer &Dezr, - FileManager &FMgr) { + +ASTContext *ASTContext::ReadASTBitcodeBuffer(llvm::MemoryBuffer &Buffer, + FileManager &FMgr) { + // Check if the file is of the proper length. + if (Buffer.getBufferSize() & 0x3) { + // FIXME: Provide diagnostic: "Length should be a multiple of 4 bytes." + return 0; + } + + // Create the bitstream reader. + unsigned char *BufPtr = (unsigned char *)Buffer.getBufferStart(); + llvm::BitstreamReader Stream(BufPtr, BufPtr+Buffer.getBufferSize()); + + if (Stream.Read(8) != 'B' || + Stream.Read(8) != 'C' || + Stream.Read(4) != 0xC || + Stream.Read(4) != 0xF || + Stream.Read(4) != 0xE || + Stream.Read(4) != 0x0) { + // FIXME: Provide diagnostic. + return NULL; + } + + // Create the deserializer. + llvm::Deserializer Dezr(Stream); + // ===---------------------------------------------------===/ // Deserialize the "Translation Unit" metadata. // ===---------------------------------------------------===/ diff --git a/lib/AST/TranslationUnit.cpp b/lib/AST/TranslationUnit.cpp index 57f9f4ebc8..0c69432014 100644 --- a/lib/AST/TranslationUnit.cpp +++ b/lib/AST/TranslationUnit.cpp @@ -29,68 +29,3 @@ using namespace clang; TranslationUnit::~TranslationUnit() { } - -bool clang::EmitASTBitcodeBuffer(const ASTContext &Ctx, - std::vector& Buffer) { - // Create bitstream. - llvm::BitstreamWriter Stream(Buffer); - - // Emit the preamble. - Stream.Emit((unsigned)'B', 8); - Stream.Emit((unsigned)'C', 8); - Stream.Emit(0xC, 4); - Stream.Emit(0xF, 4); - Stream.Emit(0xE, 4); - Stream.Emit(0x0, 4); - - { - // Create serializer. Placing it in its own scope assures any necessary - // finalization of bits to the buffer in the serializer's dstor. - llvm::Serializer Sezr(Stream); - - // Emit the translation unit. - Ctx.EmitAll(Sezr); - } - - return true; -} - -TranslationUnit* -clang::ReadASTBitcodeBuffer(llvm::MemoryBuffer& MBuffer, FileManager& FMgr) { - - // Check if the file is of the proper length. - if (MBuffer.getBufferSize() & 0x3) { - // FIXME: Provide diagnostic: "Length should be a multiple of 4 bytes." - return NULL; - } - - // Create the bitstream reader. - unsigned char *BufPtr = (unsigned char *) MBuffer.getBufferStart(); - llvm::BitstreamReader Stream(BufPtr,BufPtr+MBuffer.getBufferSize()); - - if (Stream.Read(8) != 'B' || - Stream.Read(8) != 'C' || - Stream.Read(4) != 0xC || - Stream.Read(4) != 0xF || - Stream.Read(4) != 0xE || - Stream.Read(4) != 0x0) { - // FIXME: Provide diagnostic. - return NULL; - } - - // Create the deserializer. - llvm::Deserializer Dezr(Stream); - - return TranslationUnit::Create(Dezr,FMgr); -} - -TranslationUnit* TranslationUnit::Create(llvm::Deserializer& Dezr, - FileManager& FMgr) { - - // Create the translation unit object. - TranslationUnit* TU = new TranslationUnit(); - - TU->Context = ASTContext::CreateAll(Dezr, FMgr); - - return TU; -} diff --git a/lib/Sema/ParseAST.cpp b/lib/Sema/ParseAST.cpp index bcff1c8cfb..fdc57b6e24 100644 --- a/lib/Sema/ParseAST.cpp +++ b/lib/Sema/ParseAST.cpp @@ -15,7 +15,6 @@ #include "clang/Sema/ParseAST.h" #include "clang/AST/ASTConsumer.h" #include "clang/AST/Stmt.h" -#include "clang/AST/TranslationUnit.h" #include "Sema.h" #include "clang/Parse/Parser.h" using namespace clang; diff --git a/tools/clang-cc/ASTConsumers.cpp b/tools/clang-cc/ASTConsumers.cpp index 18b4246cb6..5b4287a2bd 100644 --- a/tools/clang-cc/ASTConsumers.cpp +++ b/tools/clang-cc/ASTConsumers.cpp @@ -13,18 +13,18 @@ #include "ASTConsumers.h" #include "clang/Frontend/PathDiagnosticClients.h" -#include "clang/AST/TranslationUnit.h" #include "clang/Basic/Diagnostic.h" #include "clang/Basic/SourceManager.h" #include "clang/Basic/FileManager.h" #include "clang/AST/AST.h" #include "clang/AST/ASTConsumer.h" +#include "clang/AST/ASTContext.h" #include "clang/CodeGen/ModuleBuilder.h" #include "llvm/Module.h" #include "llvm/Support/Streams.h" #include "llvm/Support/Timer.h" #include "llvm/Support/raw_ostream.h" - +#include "llvm/System/Path.h" using namespace clang; //===----------------------------------------------------------------------===// @@ -981,7 +981,7 @@ public: std::vector Buffer; Buffer.reserve(256*1024); - EmitASTBitcodeBuffer(Ctx, Buffer); + Ctx.EmitASTBitcodeBuffer(Buffer); // Write the bits to disk. if (FILE* fp = fopen(FName.c_str(),"wb")) { @@ -1032,7 +1032,7 @@ public: std::vector Buffer; Buffer.reserve(256*1024); - EmitASTBitcodeBuffer(Ctx, Buffer); + Ctx.EmitASTBitcodeBuffer(Buffer); // Write the bits to disk. if (FILE* fp = fopen(FName.c_str(),"wb")) { diff --git a/tools/clang-cc/Backend.cpp b/tools/clang-cc/Backend.cpp index ee2d0c56b2..0faabbe8d5 100644 --- a/tools/clang-cc/Backend.cpp +++ b/tools/clang-cc/Backend.cpp @@ -10,7 +10,6 @@ #include "ASTConsumers.h" #include "clang/AST/ASTContext.h" #include "clang/AST/ASTConsumer.h" -#include "clang/AST/TranslationUnit.h" #include "clang/Basic/TargetInfo.h" #include "clang/CodeGen/ModuleBuilder.h" #include "clang/Frontend/CompileOptions.h" diff --git a/tools/clang-cc/SerializationTest.cpp b/tools/clang-cc/SerializationTest.cpp index d12a0af306..a39811fd90 100644 --- a/tools/clang-cc/SerializationTest.cpp +++ b/tools/clang-cc/SerializationTest.cpp @@ -81,7 +81,7 @@ bool SerializationTest::Serialize(llvm::sys::Path& Filename, std::vector Buffer; Buffer.reserve(256*1024); - EmitASTBitcodeBuffer(Ctx, Buffer); + Ctx.EmitASTBitcodeBuffer(Buffer); // Write the bits to disk. if (FILE* fp = fopen(Filename.c_str(),"wb")) { @@ -97,7 +97,7 @@ bool SerializationTest::Deserialize(llvm::sys::Path& Filename, llvm::sys::Path& FNameDeclPrint) { // Deserialize the translation unit. - TranslationUnit* NewTU; + ASTContext *NewCtx; { // Create the memory buffer that contains the contents of the file. @@ -107,10 +107,10 @@ bool SerializationTest::Deserialize(llvm::sys::Path& Filename, if (!MBuffer) return false; - NewTU = ReadASTBitcodeBuffer(*MBuffer, FMgr); + NewCtx = ASTContext::ReadASTBitcodeBuffer(*MBuffer, FMgr); } - if (!NewTU) + if (!NewCtx) return false; { @@ -120,11 +120,13 @@ bool SerializationTest::Deserialize(llvm::sys::Path& Filename, assert (Err.empty() && "Could not open file for printing out decls."); llvm::OwningPtr FilePrinter(CreateASTPrinter(&DeclPP)); - for (TranslationUnit::iterator I=NewTU->begin(), E=NewTU->end(); I!=E; ++I) + TranslationUnitDecl *TUD = NewCtx->getTranslationUnitDecl(); + for (DeclContext::decl_iterator I = TUD->decls_begin(), E = TUD->decls_end(); + I != E; ++I) FilePrinter->HandleTopLevelDecl(*I); } - delete NewTU; + delete NewCtx; return true; } diff --git a/tools/clang-cc/clang.cpp b/tools/clang-cc/clang.cpp index 9ab1dd39a4..31a3958766 100644 --- a/tools/clang-cc/clang.cpp +++ b/tools/clang-cc/clang.cpp @@ -1531,16 +1531,16 @@ static void ProcessSerializedFile(const std::string& InFile, Diagnostic& Diag, exit (1); } - llvm::OwningPtr TU; + llvm::OwningPtr Ctx; // Create the memory buffer that contains the contents of the file. llvm::OwningPtr MBuffer(llvm::MemoryBuffer::getFile(Filename.c_str())); if (MBuffer) - TU.reset(ReadASTBitcodeBuffer(*MBuffer, FileMgr)); + Ctx.reset(ASTContext::ReadASTBitcodeBuffer(*MBuffer, FileMgr)); - if (!TU) { + if (!Ctx) { fprintf(stderr, "error: file '%s' could not be deserialized\n", InFile.c_str()); exit (1); @@ -1549,7 +1549,7 @@ static void ProcessSerializedFile(const std::string& InFile, Diagnostic& Diag, // Observe that we use the source file name stored in the deserialized // translation unit, rather than InFile. llvm::OwningPtr - Consumer(CreateASTConsumer(InFile, Diag, FileMgr, TU->getLangOptions(), + Consumer(CreateASTConsumer(InFile, Diag, FileMgr, Ctx->getLangOptions(), 0, 0)); if (!Consumer) { @@ -1557,10 +1557,12 @@ static void ProcessSerializedFile(const std::string& InFile, Diagnostic& Diag, exit (1); } - Consumer->Initialize(TU->getContext()); + Consumer->Initialize(*Ctx); // FIXME: We need to inform Consumer about completed TagDecls as well. - for (TranslationUnit::iterator I=TU->begin(), E=TU->end(); I!=E; ++I) + TranslationUnitDecl *TUD = Ctx->getTranslationUnitDecl(); + for (DeclContext::decl_iterator I = TUD->decls_begin(), E = TUD->decls_end(); + I != E; ++I) Consumer->HandleTopLevelDecl(*I); }