Change the verifier to never throw an exception.  Instead verifyModule canoptionally return the string error, which is an easier api for clients touse anyway.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29017 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Bytecode/Reader/Analyzer.cpp b/lib/Bytecode/Reader/Analyzer.cpp
index 0152104..ce20ac2 100644
--- a/lib/Bytecode/Reader/Analyzer.cpp
+++ b/lib/Bytecode/Reader/Analyzer.cpp
@@ -117,12 +117,10 @@
     bca.functionDensity = double(bca.BlockSizes[BytecodeFormat::FunctionBlockID]) /
       double(bca.numFunctions);
 
-    if ( bca.progressiveVerify ) {
-      try {
-        verifyModule(*M, ThrowExceptionAction);
-      } catch ( std::string& msg ) {
+    if (bca.progressiveVerify) {
+      std::string msg;
+      if (verifyModule(*M, ReturnStatusAction, &msg))
         bca.VerifyInfo += "Verify@Finish: " + msg + "\n";
-      }
     }
   }
 
@@ -135,12 +133,10 @@
   virtual void handleModuleEnd(const std::string& id) {
     if (os)
       *os << "  } End Module " << id << "\n";
-    if ( bca.progressiveVerify ) {
-      try {
-        verifyModule(*M, ThrowExceptionAction);
-      } catch ( std::string& msg ) {
+    if (bca.progressiveVerify) {
+      std::string msg;
+      if (verifyModule(*M, ReturnStatusAction, &msg))
         bca.VerifyInfo += "Verify@EndModule: " + msg + "\n";
-      }
     }
   }
 
@@ -232,12 +228,10 @@
   virtual void handleModuleGlobalsEnd() {
     if (os)
       *os << "    } END BLOCK: ModuleGlobalInfo\n";
-    if ( bca.progressiveVerify ) {
-      try {
-        verifyModule(*M, ThrowExceptionAction);
-      } catch ( std::string& msg ) {
+    if (bca.progressiveVerify) {
+      std::string msg;
+      if (verifyModule(*M, ReturnStatusAction, &msg))
         bca.VerifyInfo += "Verify@EndModuleGlobalInfo: " + msg + "\n";
-      }
     }
   }
 
@@ -346,12 +340,10 @@
     currFunc->density = double(currFunc->byteSize) /
       double(currFunc->numInstructions);
 
-    if ( bca.progressiveVerify ) {
-      try {
-        verifyModule(*M, ThrowExceptionAction);
-      } catch ( std::string& msg ) {
+    if (bca.progressiveVerify) {
+      std::string msg;
+      if (verifyModule(*M, ReturnStatusAction, &msg))
         bca.VerifyInfo += "Verify@EndFunction: " + msg + "\n";
-      }
     }
   }
 
@@ -522,12 +514,10 @@
     if (os)
       *os << "    } END BLOCK: GlobalConstants\n";
 
-    if ( bca.progressiveVerify ) {
-      try {
-        verifyModule(*M, ThrowExceptionAction);
-      } catch ( std::string& msg ) {
+    if (bca.progressiveVerify) {
+      std::string msg;
+      if (verifyModule(*M, ReturnStatusAction, &msg))
         bca.VerifyInfo += "Verify@EndGlobalConstants: " + msg + "\n";
-      }
     }
   }
 
diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp
index d07345e..9379abc 100644
--- a/lib/VMCore/Verifier.cpp
+++ b/lib/VMCore/Verifier.cpp
@@ -152,18 +152,13 @@
     /// this condition, do so.
     ///
     void abortIfBroken() {
-      if (Broken)
-      {
+      if (Broken) {
         msgs << "Broken module found, ";
-        switch (action)
-        {
+        switch (action) {
           case AbortProcessAction:
             msgs << "compilation aborted!\n";
             std::cerr << msgs.str();
             abort();
-          case ThrowExceptionAction:
-            msgs << "verification terminated.\n";
-            throw msgs.str();
           case PrintMessageAction:
             msgs << "verification continues.\n";
             std::cerr << msgs.str();
@@ -799,11 +794,15 @@
 /// verifyModule - Check a module for errors, printing messages on stderr.
 /// Return true if the module is corrupt.
 ///
-bool llvm::verifyModule(const Module &M, VerifierFailureAction action) {
+bool llvm::verifyModule(const Module &M, VerifierFailureAction action,
+                        std::string *ErrorInfo) {
   PassManager PM;
   Verifier *V = new Verifier(action);
   PM.add(V);
   PM.run((Module&)M);
+  
+  if (ErrorInfo && V->Broken)
+    *ErrorInfo = V->msgs.str();
   return V->Broken;
 }
 
diff --git a/tools/llvm-as/llvm-as.cpp b/tools/llvm-as/llvm-as.cpp
index 1dbcd1d..9547ad1 100644
--- a/tools/llvm-as/llvm-as.cpp
+++ b/tools/llvm-as/llvm-as.cpp
@@ -63,14 +63,14 @@
       return 1;
     }
 
-    try {
-      if (!DisableVerify)
-        verifyModule(*M.get(), ThrowExceptionAction);
-    } catch (const std::string &Err) {
-      std::cerr << argv[0]
-                << ": assembly parsed, but does not verify as correct!\n";
-      std::cerr << Err;
-      return 1;
+    if (!DisableVerify) {
+      std::string Err;
+      if (verifyModule(*M.get(), ReturnStatusAction, &Err)) {
+        std::cerr << argv[0]
+                  << ": assembly parsed, but does not verify as correct!\n";
+        std::cerr << Err;
+        return 1;
+      } 
     }
 
     if (DumpAsm) std::cerr << "Here's the assembly:\n" << *M.get();
diff --git a/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp b/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp
index 39131cf..2ac7834 100644
--- a/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp
+++ b/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp
@@ -73,23 +73,10 @@
 
     if ( M && Verify ) {
       std::string verificationMsg;
-      try {
-        verifyModule( *M, ThrowExceptionAction );
-      } catch (std::string& errmsg ) {
-        verificationMsg = errmsg;
-      }
-      if ( verificationMsg.length() > 0 )
+      if (verifyModule(*M, ReturnStatusAction, &verificationMsg))
         std::cerr << "Final Verification Message: " << verificationMsg << "\n";
     }
 
-
-    // If there was an error, print it and stop.
-    if ( ErrorMessage.size() ) {
-      std::cerr << argv[0] << ": " << ErrorMessage << "\n";
-      return 1;
-    }
-
-
     if (Out != &std::cout) {
       ((std::ofstream*)Out)->close();
       delete Out;
diff --git a/tools/llvm2cpp/llvm2cpp.cpp b/tools/llvm2cpp/llvm2cpp.cpp
index 9035e71..7e322db 100644
--- a/tools/llvm2cpp/llvm2cpp.cpp
+++ b/tools/llvm2cpp/llvm2cpp.cpp
@@ -59,14 +59,16 @@
       return 1;
     }
 
-    try {
-      if (!DisableVerify)
-        verifyModule(*M.get(), ThrowExceptionAction);
-    } catch (const std::string &Err) {
-      std::cerr << argv[0]
-                << ": assembly parsed, but does not verify as correct!\n";
-      std::cerr << Err;
-      return 1;
+    // FIXME: llvm2cpp should read .bc files and thus not run the verifier
+    // explicitly!
+    if (!DisableVerify) {
+      std::string Err;
+      if (verifyModule(*M.get(), ReturnStatusAction, &Err)) {
+        std::cerr << argv[0]
+                  << ": assembly parsed, but does not verify as correct!\n";
+        std::cerr << Err;
+        return 1;
+      } 
     }
 
     if (OutputFilename != "") {   // Specified an output filename?