From 05ac92ca7d448ff9270cdeecd182653477708517 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 6 Jul 2006 18:02:27 +0000 Subject: [PATCH] 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 --- lib/Bytecode/Reader/Analyzer.cpp | 40 +++++++++-------------- lib/VMCore/Verifier.cpp | 15 ++++----- tools/llvm-as/llvm-as.cpp | 16 ++++----- tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp | 15 +-------- tools/llvm2cpp/llvm2cpp.cpp | 18 +++++----- 5 files changed, 41 insertions(+), 63 deletions(-) diff --git a/lib/Bytecode/Reader/Analyzer.cpp b/lib/Bytecode/Reader/Analyzer.cpp index 0152104acb8..ce20ac2e3a5 100644 --- a/lib/Bytecode/Reader/Analyzer.cpp +++ b/lib/Bytecode/Reader/Analyzer.cpp @@ -117,12 +117,10 @@ public: 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 @@ public: 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 @@ public: 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 @@ public: 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 @@ public: 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 d07345e9329..9379abcfd18 100644 --- a/lib/VMCore/Verifier.cpp +++ b/lib/VMCore/Verifier.cpp @@ -152,18 +152,13 @@ namespace { // Anonymous namespace for class /// 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 @@ bool llvm::verifyFunction(const Function &f, VerifierFailureAction action) { /// 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 1dbcd1d1b83..9547ad13e25 100644 --- a/tools/llvm-as/llvm-as.cpp +++ b/tools/llvm-as/llvm-as.cpp @@ -63,14 +63,14 @@ int main(int argc, char **argv) { 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 39131cfb3c4..2ac78344c69 100644 --- a/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp +++ b/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp @@ -73,23 +73,10 @@ main(int argc, char **argv) { 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 9035e71c075..7e322dbef81 100644 --- a/tools/llvm2cpp/llvm2cpp.cpp +++ b/tools/llvm2cpp/llvm2cpp.cpp @@ -59,14 +59,16 @@ int main(int argc, char **argv) { 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?