diff options
-rw-r--r-- | Driver/ASTConsumers.cpp | 22 | ||||
-rw-r--r-- | Driver/SerializationTest.cpp | 13 | ||||
-rw-r--r-- | Driver/clang.cpp | 4 | ||||
-rw-r--r-- | include/clang/AST/TranslationUnit.h | 18 | ||||
-rw-r--r-- | lib/AST/TranslationUnit.cpp | 21 |
5 files changed, 54 insertions, 24 deletions
diff --git a/Driver/ASTConsumers.cpp b/Driver/ASTConsumers.cpp index eaee94e51d..2f04ab78d4 100644 --- a/Driver/ASTConsumers.cpp +++ b/Driver/ASTConsumers.cpp @@ -826,20 +826,24 @@ namespace { class ASTSerializer : public ASTConsumer { protected: Diagnostic &Diags; - TranslationUnit TU; + const LangOptions& lang; + TranslationUnit* TU; + public: ASTSerializer(Diagnostic& diags, const LangOptions& LO) - : Diags(diags), TU(LO) {} + : Diags(diags), lang(LO), TU(0) {} + + virtual ~ASTSerializer() { delete TU; } virtual void Initialize(ASTContext &Context) { - TU.setContext(&Context); + if (!TU) TU = new TranslationUnit(Context, lang); } virtual void HandleTopLevelDecl(Decl *D) { if (Diags.hasErrorOccurred()) return; - TU.AddTopLevelDecl(D); + if (TU) TU->AddTopLevelDecl(D); } }; @@ -851,7 +855,7 @@ public: : ASTSerializer(diags,LO), FName(F) {} ~SingleFileSerializer() { - EmitASTBitcodeFile(TU,FName); + EmitASTBitcodeFile(TU, FName); } }; @@ -863,7 +867,11 @@ public: : ASTSerializer(diags,LO), EmitDir(dir) {} ~BuildSerializer() { - SourceManager& SourceMgr = TU.getASTContext()->getSourceManager(); + + if (!TU) + return; + + SourceManager& SourceMgr = TU->getContext().getSourceManager(); unsigned ID = SourceMgr.getMainFileID(); assert (ID && "MainFileID not set!"); const FileEntry* FE = SourceMgr.getFileEntryForID(ID); @@ -887,7 +895,7 @@ public: sprintf(&buf[0], "%s-%llX.ast", FE->getName(), (uint64_t) FE->getInode()); FName.appendComponent(&buf[0]); - EmitASTBitcodeFile(TU,FName); + EmitASTBitcodeFile(TU, FName); // Now emit the sources. diff --git a/Driver/SerializationTest.cpp b/Driver/SerializationTest.cpp index 086d5587e9..6e9309dc28 100644 --- a/Driver/SerializationTest.cpp +++ b/Driver/SerializationTest.cpp @@ -33,21 +33,22 @@ using namespace clang; namespace { class SerializationTest : public ASTConsumer { - TranslationUnit TU; + llvm::OwningPtr<TranslationUnit> TU; Diagnostic &Diags; FileManager &FMgr; + const LangOptions& lopts; public: SerializationTest(Diagnostic &d, FileManager& fmgr, const LangOptions& LOpts) - : TU(LOpts), Diags(d), FMgr(fmgr) {} + : Diags(d), FMgr(fmgr), lopts(LOpts) {} ~SerializationTest(); virtual void Initialize(ASTContext& context) { - TU.setContext(&context); + if (!TU) TU.reset(new TranslationUnit(context, lopts)); } virtual void HandleTopLevelDecl(Decl *D) { - TU.AddTopLevelDecl(D); + TU->AddTopLevelDecl(D); } private: @@ -73,12 +74,12 @@ bool SerializationTest::Serialize(llvm::sys::Path& Filename, assert (DeclPP && "Could not open file for printing out decls."); llvm::OwningPtr<ASTConsumer> FilePrinter(CreateASTPrinter(&DeclPP)); - for (TranslationUnit::iterator I=TU.begin(), E=TU.end(); I!=E; ++I) + for (TranslationUnit::iterator I=TU->begin(), E=TU->end(); I!=E; ++I) FilePrinter->HandleTopLevelDecl(*I); } // Serialize the translation unit. - return EmitASTBitcodeFile(TU,Filename); + return EmitASTBitcodeFile(*TU,Filename); } bool SerializationTest::Deserialize(llvm::sys::Path& Filename, diff --git a/Driver/clang.cpp b/Driver/clang.cpp index 144ab4e65a..f077952ea2 100644 --- a/Driver/clang.cpp +++ b/Driver/clang.cpp @@ -1274,7 +1274,7 @@ static void ProcessSerializedFile(const std::string& InFile, Diagnostic& Diag, exit (1); } - llvm::OwningPtr<TranslationUnit> TU(ReadASTBitcodeFile(Filename,FileMgr)); + llvm::OwningPtr<TranslationUnit> TU(ReadASTBitcodeFile(Filename, FileMgr)); if (!TU) { fprintf(stderr, "error: file '%s' could not be deserialized\n", @@ -1294,7 +1294,7 @@ static void ProcessSerializedFile(const std::string& InFile, Diagnostic& Diag, exit (1); } - Consumer->Initialize(*TU->getContext()); + Consumer->Initialize(TU->getContext()); // FIXME: We need to inform Consumer about completed TagDecls as well. for (TranslationUnit::iterator I=TU->begin(), E=TU->end(); I!=E; ++I) diff --git a/include/clang/AST/TranslationUnit.h b/include/clang/AST/TranslationUnit.h index 0c7d0348da..6aa3a40b87 100644 --- a/include/clang/AST/TranslationUnit.h +++ b/include/clang/AST/TranslationUnit.h @@ -34,19 +34,17 @@ class TranslationUnit { LangOptions LangOpts; ASTContext* Context; std::vector<Decl*> TopLevelDecls; + bool OwnsMetaData; // The default ctor is only invoked during deserialization. - explicit TranslationUnit() : Context(NULL) {} + explicit TranslationUnit() : Context(NULL), OwnsMetaData(true) {} public: - explicit TranslationUnit(const LangOptions& lopt) - : LangOpts(lopt), Context(NULL) {} + explicit TranslationUnit(ASTContext& Ctx, const LangOptions& lopt) + : LangOpts(lopt), Context(&Ctx), OwnsMetaData(false) {} ~TranslationUnit(); - void setContext(ASTContext* context) { Context = context; } - ASTContext* getContext() const { return Context; } - const LangOptions& getLangOpts() const { return LangOpts; } const std::string& getSourceFile() const; @@ -58,9 +56,12 @@ public: // Accessors const LangOptions& getLangOptions() const { return LangOpts; } - ASTContext* getASTContext() { return Context; } + + ASTContext& getContext() { return *Context; } + const ASTContext& getContext() const { return *Context; } /// AddTopLevelDecl - Add a top-level declaration to the translation unit. + /// Ownership of the Decl is transfered to the TranslationUnit object. void AddTopLevelDecl(Decl* d) { TopLevelDecls.push_back(d); } @@ -77,6 +78,9 @@ public: /// EmitASTBitcodeFile - Emit a translation unit to a bitcode file. bool EmitASTBitcodeFile(const TranslationUnit& TU, const llvm::sys::Path& Filename); + +bool EmitASTBitcodeFile(const TranslationUnit* TU, + const llvm::sys::Path& Filename); /// ReadASTBitcodeFile - Reconsitute a translation unit from a bitcode file. TranslationUnit* ReadASTBitcodeFile(const llvm::sys::Path& Filename, diff --git a/lib/AST/TranslationUnit.cpp b/lib/AST/TranslationUnit.cpp index 0198f6f1cf..5c043efeb3 100644 --- a/lib/AST/TranslationUnit.cpp +++ b/lib/AST/TranslationUnit.cpp @@ -33,11 +33,28 @@ enum { BasicMetadataBlock = 1, TranslationUnit::~TranslationUnit() { for (iterator I=begin(), E=end(); I!=E; ++I) (*I)->Destroy(*Context); + + if (OwnsMetaData && Context) { + // The ASTContext object has the sole references to the IdentifierTable + // Selectors, and the Target information. Go and delete them, since + // the TranslationUnit effectively owns them. + + delete &(Context->Idents); + delete &(Context->Selectors); + delete &(Context->Target); + delete Context; + } } +bool clang::EmitASTBitcodeFile(const TranslationUnit* TU, + const llvm::sys::Path& Filename) { + + return TU ? EmitASTBitcodeFile(*TU, Filename) : false; +} + bool clang::EmitASTBitcodeFile(const TranslationUnit& TU, const llvm::sys::Path& Filename) { - + // Reserve 256K for bitstream buffer. std::vector<unsigned char> Buffer; Buffer.reserve(256*1024); @@ -194,7 +211,7 @@ TranslationUnit* TranslationUnit::Create(llvm::Deserializer& Dezr, { // Read the TargetInfo. llvm::SerializedPtrID PtrID = Dezr.ReadPtrID(); char* triple = Dezr.ReadCStr(NULL,0,true); - Dezr.RegisterPtr(PtrID,TargetInfo::CreateTargetInfo(std::string(triple))); + Dezr.RegisterPtr(PtrID, TargetInfo::CreateTargetInfo(std::string(triple))); delete [] triple; } |