aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/VMCore/Verifier.cpp32
1 files changed, 27 insertions, 5 deletions
diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp
index 456d192..51e0d2d 100644
--- a/lib/VMCore/Verifier.cpp
+++ b/lib/VMCore/Verifier.cpp
@@ -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);