]> granicus.if.org Git - clang/commitdiff
Do not crash with -serialize.
authorNico Weber <nicolasweber@gmx.de>
Sun, 10 Aug 2008 19:20:05 +0000 (19:20 +0000)
committerNico Weber <nicolasweber@gmx.de>
Sun, 10 Aug 2008 19:20:05 +0000 (19:20 +0000)
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

Driver/ASTConsumers.cpp

index 38251775d2e7cc289c77a99cdae7e837620ee872..ea6dc3f76511c99ab2f639059f808d98b5fc7af0 100644 (file)
@@ -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.