summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Bytecode/Reader/Analyzer.cpp40
-rw-r--r--lib/VMCore/Verifier.cpp15
-rw-r--r--tools/llvm-as/llvm-as.cpp16
-rw-r--r--tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp15
-rw-r--r--tools/llvm2cpp/llvm2cpp.cpp18
5 files changed, 41 insertions, 63 deletions
diff --git a/lib/Bytecode/Reader/Analyzer.cpp b/lib/Bytecode/Reader/Analyzer.cpp
index 0152104acb..ce20ac2e3a 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 d07345e932..9379abcfd1 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 1dbcd1d1b8..9547ad13e2 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 39131cfb3c..2ac78344c6 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 9035e71c07..7e322dbef8 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?