From 7faef23f02b4566640994f42831377521d7e21f1 Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Thu, 14 Sep 2006 03:49:54 +0000 Subject: [PATCH] Add --enable-valgrind option to run optimizations through valgrind to pick up on memory errors. llvm-svn: 30311 --- llvm/tools/bugpoint/OptimizerDriver.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/llvm/tools/bugpoint/OptimizerDriver.cpp b/llvm/tools/bugpoint/OptimizerDriver.cpp index 43d973eb4b0c..8087ddb26a74 100644 --- a/llvm/tools/bugpoint/OptimizerDriver.cpp +++ b/llvm/tools/bugpoint/OptimizerDriver.cpp @@ -41,6 +41,8 @@ namespace { // ChildOutput - This option captures the name of the child output file that // is set up by the parent bugpoint process cl::opt ChildOutput("child-output", cl::ReallyHidden); + cl::opt UseValgrind("enable-valgrind", + cl::desc("Run optimizations through valgrind")); } /// writeProgramToFile - This writes the current "Program" to the named bytecode @@ -124,7 +126,7 @@ int BugDriver::runPassesAsChild(const std::vector &Passes) { /// bool BugDriver::runPasses(const std::vector &Passes, std::string &OutputFilename, bool DeleteOutput, - bool Quiet) const{ + bool Quiet) const { // setup the output file name std::cout << std::flush; sys::Path uniqueFilename("bugpoint-output.bc"); @@ -158,7 +160,14 @@ bool BugDriver::runPasses(const std::vector &Passes, alloca(sizeof(const char*) * (Passes.size()+10+2*PluginLoader::getNumPlugins())); int n = 0; - args[n++] = ToolName.c_str(); + if (UseValgrind) { + args[n++] = "valgrind"; + args[n++] = "--error-exitcode=1"; + args[n++] = "-q"; + args[n++] = sys::Program::FindProgramByName(ToolName).c_str(); + } else + args[n++] = ToolName.c_str(); + args[n++] = "-as-child"; args[n++] = "-child-output"; args[n++] = OutputFilename.c_str(); @@ -176,7 +185,11 @@ bool BugDriver::runPasses(const std::vector &Passes, args[n++] = inputFilename.c_str(); args[n++] = 0; - sys::Path prog(sys::Program::FindProgramByName(ToolName)); + sys::Path prog; + if (UseValgrind) + prog = sys::Program::FindProgramByName("valgrind"); + else + prog = sys::Program::FindProgramByName(ToolName); int result = sys::Program::ExecuteAndWait(prog,args,0,0,Timeout,&ErrMsg); // If we are supposed to delete the bytecode file or if the passes crashed,