From: Nico Weber Date: Sun, 10 Aug 2008 19:20:05 +0000 (+0000) Subject: Do not crash with -serialize. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=be1eb5c9194a4b465e55f7f3920cbee2d94952b0;p=clang Do not crash with -serialize. This happened because seralization was done in the constructor, and at that time the TranslationUnit is no longer valid. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54618 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Driver/ASTConsumers.cpp b/Driver/ASTConsumers.cpp index 38251775d2..ea6dc3f765 100644 --- a/Driver/ASTConsumers.cpp +++ b/Driver/ASTConsumers.cpp @@ -526,16 +526,10 @@ namespace { class ASTSerializer : public ASTConsumer { protected: - TranslationUnit* TU; Diagnostic& Diags; public: - ASTSerializer(Diagnostic& diags) : TU(0), Diags(diags) {} - - virtual void InitializeTU(TranslationUnit &tu) { - TU = &tu; - } - + ASTSerializer(Diagnostic& diags) : Diags(diags) {} }; class SingleFileSerializer : public ASTSerializer { @@ -544,10 +538,10 @@ public: SingleFileSerializer(const llvm::sys::Path& F, Diagnostic& diags) : ASTSerializer(diags), FName(F) {} - ~SingleFileSerializer() { + virtual void HandleTranslationUnit(TranslationUnit& TU) { if (Diags.hasErrorOccurred()) return; - EmitASTBitcodeFile(TU, FName); + EmitASTBitcodeFile(&TU, FName); } }; @@ -557,12 +551,11 @@ public: BuildSerializer(const llvm::sys::Path& dir, Diagnostic& diags) : ASTSerializer(diags), EmitDir(dir) {} - ~BuildSerializer() { - - if (!TU || Diags.hasErrorOccurred()) + virtual void HandleTranslationUnit(TranslationUnit& TU) { + if (Diags.hasErrorOccurred()) return; - SourceManager& SourceMgr = TU->getContext().getSourceManager(); + SourceManager& SourceMgr = TU.getContext().getSourceManager(); unsigned ID = SourceMgr.getMainFileID(); assert (ID && "MainFileID not set!"); const FileEntry* FE = SourceMgr.getFileEntryForID(ID); @@ -586,7 +579,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.