aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-06-13 03:10:48 +0000
committerChris Lattner <sabre@nondot.org>2006-06-13 03:10:48 +0000
commit9686ae7f4ea5f19ce77e31e64e0916db41a82662 (patch)
tree956f930211eeff054037c07267d14662bb4d862f
parent81c01f0d2cab55e9bd2a723f1015e1cc06b314d2 (diff)
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
-rw-r--r--tools/bugpoint/BugDriver.cpp5
-rw-r--r--tools/bugpoint/BugDriver.h3
-rw-r--r--tools/bugpoint/ExecutionDriver.cpp9
-rw-r--r--tools/bugpoint/OptimizerDriver.cpp2
-rw-r--r--tools/bugpoint/bugpoint.cpp7
5 files changed, 14 insertions, 12 deletions
diff --git a/tools/bugpoint/BugDriver.cpp b/tools/bugpoint/BugDriver.cpp
index 8251ee4e3f..f8beb2a64c 100644
--- a/tools/bugpoint/BugDriver.cpp
+++ b/tools/bugpoint/BugDriver.cpp
@@ -62,9 +62,10 @@ std::string llvm::getPassesString(const std::vector<const PassInfo*> &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 565a382d20..ec687b3c7b 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 72e564ec3c..5743804a14 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<unsigned>
- 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<std::string>
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<std::string>(),
- SharedObjs, TimeoutValue);
+ SharedObjs, Timeout);
if (RetVal == -1) {
std::cerr << "<timeout>";
diff --git a/tools/bugpoint/OptimizerDriver.cpp b/tools/bugpoint/OptimizerDriver.cpp
index 37e2f74f45..6caced779b 100644
--- a/tools/bugpoint/OptimizerDriver.cpp
+++ b/tools/bugpoint/OptimizerDriver.cpp
@@ -179,7 +179,7 @@ bool BugDriver::runPasses(const std::vector<const PassInfo*> &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 21a4623181..cc05fea650 100644
--- a/tools/bugpoint/bugpoint.cpp
+++ b/tools/bugpoint/bugpoint.cpp
@@ -36,6 +36,11 @@ static cl::list<std::string>
InputFilenames(cl::Positional, cl::OneOrMore,
cl::desc("<input llvm ll/bc files>"));
+static cl::opt<unsigned>
+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());