From: Chris Lattner Date: Tue, 13 Jun 2006 03:10:48 +0000 (+0000) Subject: Teach bugpoint to kill optimization passes that run over the timeout limit, X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=9686ae7f4ea5f19ce77e31e64e0916db41a82662;p=oota-llvm.git Teach bugpoint to kill optimization passes that run over the timeout limit, which allows it to debug optimizer infinite loops. This patch is contributed by Nick Lewycky, thanks! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28763 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/bugpoint/BugDriver.cpp b/tools/bugpoint/BugDriver.cpp index 8251ee4e3fa..f8beb2a64c2 100644 --- a/tools/bugpoint/BugDriver.cpp +++ b/tools/bugpoint/BugDriver.cpp @@ -62,9 +62,10 @@ std::string llvm::getPassesString(const std::vector &Passes) { return Result; } -BugDriver::BugDriver(const char *toolname, bool as_child) +BugDriver::BugDriver(const char *toolname, bool as_child, unsigned timeout) : ToolName(toolname), ReferenceOutputFile(OutputFile), - Program(0), Interpreter(0), cbe(0), gcc(0), run_as_child(as_child) {} + Program(0), Interpreter(0), cbe(0), gcc(0), run_as_child(as_child), + Timeout(timeout) {} /// ParseInputFile - Given a bytecode or assembly input filename, parse and diff --git a/tools/bugpoint/BugDriver.h b/tools/bugpoint/BugDriver.h index 565a382d20a..ec687b3c7bc 100644 --- a/tools/bugpoint/BugDriver.h +++ b/tools/bugpoint/BugDriver.h @@ -48,13 +48,14 @@ class BugDriver { CBE *cbe; GCC *gcc; bool run_as_child; + unsigned Timeout; // FIXME: sort out public/private distinctions... friend class ReducePassList; friend class ReduceMisCodegenFunctions; public: - BugDriver(const char *toolname, bool as_child); + BugDriver(const char *toolname, bool as_child, unsigned timeout); const std::string &getToolName() const { return ToolName; } diff --git a/tools/bugpoint/ExecutionDriver.cpp b/tools/bugpoint/ExecutionDriver.cpp index 72e564ec3c0..5743804a146 100644 --- a/tools/bugpoint/ExecutionDriver.cpp +++ b/tools/bugpoint/ExecutionDriver.cpp @@ -63,11 +63,6 @@ namespace { cl::desc("Additional shared objects to load " "into executing programs")); - cl::opt - TimeoutValue("timeout", cl::init(300), cl::value_desc("seconds"), - cl::desc("Number of seconds program is allowed to run before it " - "is killed (default is 300s), 0 disables timeout")); - cl::list AdditionalLinkerArgs("Xlinker", cl::desc("Additional arguments to pass to the linker")); @@ -231,11 +226,11 @@ std::string BugDriver::executeProgram(std::string OutputFile, if (InterpreterSel == RunLLC || InterpreterSel == RunCBE) RetVal = AI->ExecuteProgram(BytecodeFile, InputArgv, InputFile, OutputFile, AdditionalLinkerArgs, SharedObjs, - TimeoutValue); + Timeout); else RetVal = AI->ExecuteProgram(BytecodeFile, InputArgv, InputFile, OutputFile, std::vector(), - SharedObjs, TimeoutValue); + SharedObjs, Timeout); if (RetVal == -1) { std::cerr << ""; diff --git a/tools/bugpoint/OptimizerDriver.cpp b/tools/bugpoint/OptimizerDriver.cpp index 37e2f74f45d..6caced779b5 100644 --- a/tools/bugpoint/OptimizerDriver.cpp +++ b/tools/bugpoint/OptimizerDriver.cpp @@ -179,7 +179,7 @@ bool BugDriver::runPasses(const std::vector &Passes, args[n++] = 0; sys::Path prog(sys::Program::FindProgramByName(ToolName)); - int result = sys::Program::ExecuteAndWait(prog,args); + int result = sys::Program::ExecuteAndWait(prog,args,0,0,Timeout); // If we are supposed to delete the bytecode file or if the passes crashed, // remove it now. This may fail if the file was never created, but that's ok. diff --git a/tools/bugpoint/bugpoint.cpp b/tools/bugpoint/bugpoint.cpp index 21a46231812..cc05fea6508 100644 --- a/tools/bugpoint/bugpoint.cpp +++ b/tools/bugpoint/bugpoint.cpp @@ -36,6 +36,11 @@ static cl::list InputFilenames(cl::Positional, cl::OneOrMore, cl::desc("")); +static cl::opt +TimeoutValue("timeout", cl::init(300), cl::value_desc("seconds"), + cl::desc("Number of seconds program is allowed to run before it " + "is killed (default is 300s), 0 disables timeout")); + // The AnalysesList is automatically populated with registered Passes by the // PassNameParser. // @@ -57,7 +62,7 @@ int main(int argc, char **argv) { sys::PrintStackTraceOnErrorSignal(); sys::SetInterruptFunction(BugpointInterruptFunction); - BugDriver D(argv[0],AsChild); + BugDriver D(argv[0],AsChild,TimeoutValue); if (D.addSources(InputFilenames)) return 1; D.addPasses(PassList.begin(), PassList.end());