forked from OSchip/llvm-project
Change the verifier to never throw an exception. Instead verifyModule canoptionally return the string error, which is an easier api for clients touse anyway.
llvm-svn: 29017
This commit is contained in:
parent
6cf27be54d
commit
5734e8d7c3
|
@ -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";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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?
|
||||
|
|
Loading…
Reference in New Issue