diff --git a/tools/bugpoint/BugDriver.h b/tools/bugpoint/BugDriver.h index b1cc3e830ba..f5ef51763e3 100644 --- a/tools/bugpoint/BugDriver.h +++ b/tools/bugpoint/BugDriver.h @@ -192,8 +192,11 @@ public: /// runPassesOn - Carefully run the specified set of pass on the specified /// module, returning the transformed module on success, or a null pointer on - /// failure. - Module *runPassesOn(Module *M, const std::vector &Passes); + /// failure. If AutoDebugCrashes is set to true, then bugpoint will + /// automatically attempt to track down a crashing pass if one exists, and + /// this method will never return null. + Module *runPassesOn(Module *M, const std::vector &Passes, + bool AutoDebugCrashes = false); /// runPasses - Run the specified passes on Program, outputting a bytecode /// file and writting the filename into OutputFile if successful. If the diff --git a/tools/bugpoint/OptimizerDriver.cpp b/tools/bugpoint/OptimizerDriver.cpp index d741265606a..14ca7c832c3 100644 --- a/tools/bugpoint/OptimizerDriver.cpp +++ b/tools/bugpoint/OptimizerDriver.cpp @@ -16,6 +16,7 @@ //===----------------------------------------------------------------------===// #include "BugDriver.h" +#include "llvm/Module.h" #include "llvm/PassManager.h" #include "llvm/Analysis/Verifier.h" #include "llvm/Bytecode/WriteBytecodePass.h" @@ -166,11 +167,20 @@ bool BugDriver::runPasses(const std::vector &Passes, /// module, returning the transformed module on success, or a null pointer on /// failure. Module *BugDriver::runPassesOn(Module *M, - const std::vector &Passes) { + const std::vector &Passes, + bool AutoDebugCrashes) { Module *OldProgram = swapProgramIn(M); std::string BytecodeResult; - if (runPasses(Passes, BytecodeResult, false/*delete*/, true/*quiet*/)) + if (runPasses(Passes, BytecodeResult, false/*delete*/, true/*quiet*/)) { + if (AutoDebugCrashes) { + std::cerr << " Error running this sequence of passes" + << " on the input program!\n"; + delete OldProgram; + EmitProgressBytecode("pass-error", false); + exit(debugOptimizerCrash()); + } return 0; + } // Restore the current program. swapProgramIn(OldProgram);