summaryrefslogtreecommitdiff
path: root/tools/bugpoint/BugDriver.cpp
diff options
context:
space:
mode:
authorPatrick Jenkins <pjenkins@apple.com>2006-08-15 16:40:49 +0000
committerPatrick Jenkins <pjenkins@apple.com>2006-08-15 16:40:49 +0000
commit6a3f31cb707972ebde1e45a61fa8f5bcff132eba (patch)
tree4d27d945a930f13d72bd80f3a45b8fd3acf7cf11 /tools/bugpoint/BugDriver.cpp
parent19af0e1b499b3e9d27b8865aa0634f771591cb43 (diff)
downloadllvm-6a3f31cb707972ebde1e45a61fa8f5bcff132eba.tar.gz
llvm-6a3f31cb707972ebde1e45a61fa8f5bcff132eba.tar.bz2
llvm-6a3f31cb707972ebde1e45a61fa8f5bcff132eba.tar.xz
This commit adds a new feature called find-bugs. The find-bugs option can be invoked on a .bc file from the command like with -find-bugs and a list of passes you wish to test. This procedure takes the set of optimization passes the user specifies, randomizes the passes, runs the passes on the specified .bc file, compiles the program, and finally runs the program checking its output vs the .bc file with no optimizations. This process repeats until either the user kills bugpoint or an error occurs in the optimizations, program complitation, or the running of the program. If an error occurs, bugpoint attempts to diagnose the error by eliminating passes that are not at fault and code that is not needed.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29703 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/bugpoint/BugDriver.cpp')
-rw-r--r--tools/bugpoint/BugDriver.cpp30
1 files changed, 14 insertions, 16 deletions
diff --git a/tools/bugpoint/BugDriver.cpp b/tools/bugpoint/BugDriver.cpp
index f8beb2a64c..9d82e8b3cc 100644
--- a/tools/bugpoint/BugDriver.cpp
+++ b/tools/bugpoint/BugDriver.cpp
@@ -62,10 +62,11 @@ std::string llvm::getPassesString(const std::vector<const PassInfo*> &Passes) {
return Result;
}
-BugDriver::BugDriver(const char *toolname, bool as_child, unsigned timeout)
+BugDriver::BugDriver(const char *toolname, bool as_child, bool find_bugs,
+ unsigned timeout)
: ToolName(toolname), ReferenceOutputFile(OutputFile),
Program(0), Interpreter(0), cbe(0), gcc(0), run_as_child(as_child),
- Timeout(timeout) {}
+ run_find_bugs(find_bugs), Timeout(timeout) {}
/// ParseInputFile - Given a bytecode or assembly input filename, parse and
@@ -140,6 +141,12 @@ bool BugDriver::run() {
// Execute the passes
return runPassesAsChild(PassesToRun);
}
+
+ if (run_find_bugs) {
+ // Rearrange the passes and apply them to the program. Repeat this process
+ // until the user kills the program or we find a bug.
+ return runManyPasses(PassesToRun);
+ }
// If we're not running as a child, the first thing that we must do is
// determine what the problem is. Does the optimization series crash the
@@ -175,20 +182,10 @@ bool BugDriver::run() {
bool CreatedOutput = false;
if (ReferenceOutputFile.empty()) {
std::cout << "Generating reference output from raw program: ";
- try {
- ReferenceOutputFile = executeProgramWithCBE("bugpoint.reference.out");
- CreatedOutput = true;
- std::cout << "Reference output is: " << ReferenceOutputFile << '\n';
- } catch (ToolExecutionError &TEE) {
- std::cerr << TEE.what();
- 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();
+ if(!createReferenceFile(Program)){
+ return debugCodeGeneratorCrash();
}
+ CreatedOutput = true;
}
// Make sure the reference output file gets deleted on exit from this
@@ -197,7 +194,8 @@ bool BugDriver::run() {
FileRemover RemoverInstance(ROF, CreatedOutput);
// Diff the output of the raw program against the reference output. If it
- // matches, then we have a miscompilation bug.
+ // matches, then we assume there is a miscompilation bug and try to
+ // diagnose it.
std::cout << "*** Checking the code generator...\n";
try {
if (!diffProgram()) {