Add a stub for debugging code generator crashes
authorChris Lattner <sabre@nondot.org>
Wed, 18 Feb 2004 21:02:04 +0000 (21:02 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 18 Feb 2004 21:02:04 +0000 (21:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11602 91177308-0d34-0410-b5e6-96231b3b80d8

tools/bugpoint/BugDriver.cpp
tools/bugpoint/BugDriver.h
tools/bugpoint/CrashDebugger.cpp
tools/bugpoint/Miscompilation.cpp

index 08f2bb5a0b1abac8648f7622ed9409afc5eaf93c..14e5606f6c669da7247c9dd7b4e967df53dc6e7d 100644 (file)
@@ -19,6 +19,7 @@
 #include "llvm/Assembly/Parser.h"
 #include "llvm/Bytecode/Reader.h"
 #include "llvm/Transforms/Utils/Linker.h"
+#include "llvm/Support/ToolRunner.h"
 #include "Support/CommandLine.h"
 #include "Support/FileUtilities.h"
 #include <memory>
@@ -131,7 +132,7 @@ bool BugDriver::run() {
   if (!PassesToRun.empty()) {
     std::cout << "Running selected passes on program to test for crash: ";
     if (runPasses(PassesToRun))
-      return debugCrash();
+      return debugOptimizerCrash();
   }
 
   // Set up the execution environment, selecting a method to run LLVM bytecode.
@@ -144,9 +145,20 @@ bool BugDriver::run() {
   bool CreatedOutput = false;
   if (ReferenceOutputFile.empty()) {
     std::cout << "Generating reference output from raw program...";
-    ReferenceOutputFile = executeProgramWithCBE("bugpoint.reference.out");
-    CreatedOutput = true;
-    std::cout << "Reference output is: " << ReferenceOutputFile << "\n";
+    try {
+      ReferenceOutputFile = executeProgramWithCBE("bugpoint.reference.out");
+      CreatedOutput = true;
+      std::cout << "Reference output is: " << ReferenceOutputFile << "\n";
+    } catch (ToolExecutionError &TEE) {
+      std::cerr << TEE.getMessage();
+      if (Interpreter != cbe) {
+        std::cerr << "*** There is a bug running the C backend.  Either debug"
+                  << " it (use the -run-cbe bugpoint option), or fix the error"
+                  << " some other way.\n";
+        return 1;
+      }
+      return debugCodeGeneratorCrash();
+    }
   }
 
   // Make sure the reference output file gets deleted on exit from this
@@ -156,9 +168,14 @@ bool BugDriver::run() {
   // Diff the output of the raw program against the reference output.  If it
   // matches, then we have a miscompilation bug.
   std::cout << "*** Checking the code generator...\n";
-  if (!diffProgram()) {
-    std::cout << "\n*** Debugging miscompilation!\n";
-    return debugMiscompilation();
+  try {
+    if (!diffProgram()) {
+      std::cout << "\n*** Debugging miscompilation!\n";
+      return debugMiscompilation();
+    }
+  } catch (ToolExecutionError &TEE) {
+    std::cerr << TEE.getMessage() << "*** Debugging code generator crash!\n";
+    return debugCodeGeneratorCrash();
   }
 
   std::cout << "\n*** Input program does not match reference diff!\n";
index 2dd4f3712774546a5a2988c183ca7f3b0abe8197..4d6754aa7cd997fc6b10170ac1304ceb59a95113 100644 (file)
@@ -75,11 +75,16 @@ public:
   ///
   bool run();
 
-  /// debugCrash - This method is called when some pass crashes on input.  It
-  /// attempts to prune down the testcase to something reasonable, and figure
-  /// out exactly which pass is crashing.
+  /// debugOptimizerCrash - This method is called when some optimizer pass
+  /// crashes on input.  It attempts to prune down the testcase to something
+  /// reasonable, and figure out exactly which pass is crashing.
   ///
-  bool debugCrash();
+  bool debugOptimizerCrash();
+  
+  /// debugCodeGeneratorCrash - This method is called when the code generator
+  /// crashes on an input.  It attempts to reduce the input as much as possible
+  /// while still causing the code generator to crash.
+  bool debugCodeGeneratorCrash();
 
   /// debugMiscompilation - This method is used when the passes selected are not
   /// crashing, but the generated output is semantically different from the
index ecb17342cb71210fb17b0ab224af8fc504fc0f25..92b8f7c12c832cf49b425dcaa97a866d64834df5 100644 (file)
@@ -257,11 +257,11 @@ bool ReduceCrashingBlocks::TestBlocks(std::vector<BasicBlock*> &BBs) {
   return false;
 }
 
-/// debugCrash - This method is called when some pass crashes on input.  It
-/// attempts to prune down the testcase to something reasonable, and figure
+/// debugOptimizerCrash - This method is called when some pass crashes on input.
+/// It attempts to prune down the testcase to something reasonable, and figure
 /// out exactly which pass is crashing.
 ///
-bool BugDriver::debugCrash() {
+bool BugDriver::debugOptimizerCrash() {
   bool AnyReduction = false;
   std::cout << "\n*** Debugging optimizer crash!\n";
 
@@ -408,3 +408,12 @@ bool BugDriver::debugCrash() {
   return false;
 }
 
+
+
+/// debugCodeGeneratorCrash - This method is called when the code generator
+/// crashes on an input.  It attempts to reduce the input as much as possible
+/// while still causing the code generator to crash.
+bool BugDriver::debugCodeGeneratorCrash() {
+
+  return false;
+}
index 715860839db78c2bd9e71a6489b17570c04ac43f..0884ad97d1dd78ae0d72ee519c2023e2ec2cc997 100644 (file)
@@ -46,7 +46,7 @@ ReduceMiscompilingPasses::doTest(std::vector<const PassInfo*> &Prefix,
               << " on the input program!\n";
     BD.setPassesToRun(Suffix);
     BD.EmitProgressBytecode("pass-error",  false);
-    exit(BD.debugCrash());
+    exit(BD.debugOptimizerCrash());
   }
 
   // Check to see if the finished program matches the reference output...
@@ -74,7 +74,7 @@ ReduceMiscompilingPasses::doTest(std::vector<const PassInfo*> &Prefix,
               << " on the input program!\n";
     BD.setPassesToRun(Prefix);
     BD.EmitProgressBytecode("pass-error",  false);
-    exit(BD.debugCrash());
+    exit(BD.debugOptimizerCrash());
   }
 
   // If the prefix maintains the predicate by itself, only keep the prefix!
@@ -107,7 +107,7 @@ ReduceMiscompilingPasses::doTest(std::vector<const PassInfo*> &Prefix,
               << " on the input program!\n";
     BD.setPassesToRun(Suffix);
     BD.EmitProgressBytecode("pass-error",  false);
-    exit(BD.debugCrash());
+    exit(BD.debugOptimizerCrash());
   }
 
   // Run the result...
@@ -225,7 +225,7 @@ bool ReduceMiscompilingFunctions::TestFuncs(const std::vector<Function*> &Funcs,
     std::cerr << " Error running this sequence of passes" 
               << " on the input program!\n";
     BD.EmitProgressBytecode("pass-error",  false);
-    exit(BD.debugCrash());
+    exit(BD.debugOptimizerCrash());
   }
 
   if (!EmitBytecode)