Make sure that we abort if an error happens as early as neccesary. Before
authorChris Lattner <sabre@nondot.org>
Thu, 19 Sep 2002 16:12:19 +0000 (16:12 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 19 Sep 2002 16:12:19 +0000 (16:12 +0000)
it was possible for the passmanager to continue running passes after the
verifier even if the module was not well formed.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3820 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/Verifier.cpp

index 456d19291b1deb659a01ed38667bf1456d8148f1..51e0d2ddddb8ce79bde4d2e60659736e259407f8 100644 (file)
@@ -48,7 +48,6 @@
 #include "llvm/Support/InstVisitor.h"
 #include "Support/STLExtras.h"
 #include <algorithm>
-#include <iostream>
 
 namespace {  // Anonymous namespace for class
 
@@ -67,6 +66,13 @@ namespace {  // Anonymous namespace for class
 
     bool doInitialization(Module &M) {
       verifySymbolTable(M.getSymbolTable());
+
+      // If this is a real pass, in a pass manager, we must abort before
+      // returning back to the pass manager, or else the pass manager may try to
+      // run other passes on the broken module.
+      //
+      if (RealPass)
+        abortIfBroken();
       return false;
     }
 
@@ -74,6 +80,14 @@ namespace {  // Anonymous namespace for class
       // Get dominator information if we are being run by PassManager
       if (RealPass) DS = &getAnalysis<DominatorSet>();
       visit(F);
+
+      // If this is a real pass, in a pass manager, we must abort before
+      // returning back to the pass manager, or else the pass manager may try to
+      // run other passes on the broken module.
+      //
+      if (RealPass)
+        abortIfBroken();
+
       return false;
     }
 
@@ -83,10 +97,8 @@ namespace {  // Anonymous namespace for class
         if (I->isExternal() && I->hasInternalLinkage())
           CheckFailed("Function Declaration has Internal Linkage!", I);
 
-      if (Broken && AbortBroken) {
-        std::cerr << "Broken module found, compilation aborted!\n";
-        abort();
-      }
+      // If the module is broken, abort at this time.
+      abortIfBroken();
       return false;
     }
 
@@ -96,6 +108,16 @@ namespace {  // Anonymous namespace for class
         AU.addRequired<DominatorSet>();
     }
 
+    // abortIfBroken - If the module is broken and we are supposed to abort on
+    // this condition, do so.
+    //
+    void abortIfBroken() const {
+      if (Broken && AbortBroken) {
+        std::cerr << "Broken module found, compilation aborted!\n";
+        abort();
+      }
+    }
+
     // Verification methods...
     void verifySymbolTable(SymbolTable *ST);
     void visitFunction(Function &F);