Add --enable-valgrind option to run optimizations through valgrind to
authorNick Lewycky <nicholas@mxc.ca>
Thu, 14 Sep 2006 03:49:54 +0000 (03:49 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Thu, 14 Sep 2006 03:49:54 +0000 (03:49 +0000)
pick up on memory errors.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30311 91177308-0d34-0410-b5e6-96231b3b80d8

tools/bugpoint/OptimizerDriver.cpp

index 43d973eb4b0c6c003ed136f70b023d584d03871f..8087ddb26a7410464b92c318e6f4a7804775b8b5 100644 (file)
@@ -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<std::string> ChildOutput("child-output", cl::ReallyHidden);
+  cl::opt<bool> 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<const PassInfo*> &Passes) {
 ///
 bool BugDriver::runPasses(const std::vector<const PassInfo*> &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<const PassInfo*> &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<const PassInfo*> &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,