diff options
author | Patrick Jenkins <pjenkins@apple.com> | 2006-08-15 16:40:49 +0000 |
---|---|---|
committer | Patrick Jenkins <pjenkins@apple.com> | 2006-08-15 16:40:49 +0000 |
commit | 6a3f31cb707972ebde1e45a61fa8f5bcff132eba (patch) | |
tree | 4d27d945a930f13d72bd80f3a45b8fd3acf7cf11 /tools/bugpoint/BugDriver.cpp | |
parent | 19af0e1b499b3e9d27b8865aa0634f771591cb43 (diff) |
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.cpp | 30 |
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()) { |