Bugpoint will be throwing exceptions soon, perpare for the worst.
[oota-llvm.git] / tools / bugpoint / bugpoint.cpp
index ea4408894735e92f57dde8440d880e101480221d..779359e73c52d073a59ae65447f4b8fe416918a2 100644 (file)
@@ -1,4 +1,11 @@
-//===- bugpoint.cpp - The LLVM BugPoint utility ---------------------------===//
+//===- bugpoint.cpp - The LLVM Bugpoint utility ---------------------------===//
+// 
+//                     The LLVM Compiler Infrastructure
+//
+// This file was developed by the LLVM research group and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// 
+//===----------------------------------------------------------------------===//
 //
 // This program is an automated compiler debugger tool.  It is used to narrow
 // down miscompilations and crash problems to a specific pass in the compiler,
@@ -7,8 +14,11 @@
 //===----------------------------------------------------------------------===//
 
 #include "BugDriver.h"
-#include "Support/CommandLine.h"
 #include "llvm/Support/PassNameParser.h"
+#include "Support/CommandLine.h"
+#include "Config/unistd.h"
+#include <sys/resource.h>
+using namespace llvm;
 
 static cl::list<std::string>
 InputFilenames(cl::Positional, cl::OneOrMore,
@@ -21,11 +31,30 @@ static cl::list<const PassInfo*, bool, PassNameParser>
 PassList(cl::desc("Passes available:"), cl::ZeroOrMore);
 
 int main(int argc, char **argv) {
-  cl::ParseCommandLineOptions(argc, argv);
+  cl::ParseCommandLineOptions(argc, argv,
+                              " LLVM automatic testcase reducer. See\nhttp://"
+                              "llvm.cs.uiuc.edu/docs/CommandGuide/bugpoint.html"
+                              " for more information.\n");
 
   BugDriver D(argv[0]);
   if (D.addSources(InputFilenames)) return 1;
   D.addPasses(PassList.begin(), PassList.end());
 
-  return D.run();
+  // Bugpoint has the ability of generating a plethora of core files, so to
+  // avoid filling up the disk, set the max core file size to 0.
+  struct rlimit rlim;
+  rlim.rlim_cur = rlim.rlim_max = 0;
+  int res = setrlimit(RLIMIT_CORE, &rlim);
+  if (res < 0) {
+    // setrlimit() may have failed, but we're not going to let that stop us
+    perror("setrlimit: RLIMIT_CORE");
+  }
+
+  try {
+    return D.run();
+  } catch (...) {
+    std::cerr << "Whoops, an exception leaked out of bugpoint.  "
+              << "This is a bug in bugpoint!\n";
+    return 1;
+  }
 }