aboutsummaryrefslogtreecommitdiff
path: root/tools/bugpoint/Miscompilation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/bugpoint/Miscompilation.cpp')
-rw-r--r--tools/bugpoint/Miscompilation.cpp55
1 files changed, 8 insertions, 47 deletions
diff --git a/tools/bugpoint/Miscompilation.cpp b/tools/bugpoint/Miscompilation.cpp
index 333eb13244..833dd437b6 100644
--- a/tools/bugpoint/Miscompilation.cpp
+++ b/tools/bugpoint/Miscompilation.cpp
@@ -11,21 +11,6 @@
#include "llvm/Module.h"
#include "llvm/Transforms/Utils/Cloning.h"
#include "llvm/Transforms/Utils/Linker.h"
-#include "Support/CommandLine.h"
-
-// Anonymous namespace to define command line options for miscompilation
-// debugging.
-//
-namespace {
- // Output - The user can specify a file containing the expected output of the
- // program. If this filename is set, it is used as the reference diff source,
- // otherwise the raw input run through an interpreter is used as the reference
- // source.
- //
- cl::opt<std::string>
- Output("output", cl::desc("Specify a reference program output "
- "(for miscompilation detection)"));
-}
class ReduceMiscompilingPasses : public ListReducer<const PassInfo*> {
BugDriver &BD;
@@ -33,7 +18,7 @@ public:
ReduceMiscompilingPasses(BugDriver &bd) : BD(bd) {}
virtual TestResult doTest(std::vector<const PassInfo*> &Prefix,
- std::vector<const PassInfo*> &Kept);
+ std::vector<const PassInfo*> &Suffix);
};
ReduceMiscompilingPasses::TestResult
@@ -52,7 +37,7 @@ ReduceMiscompilingPasses::doTest(std::vector<const PassInfo*> &Prefix,
}
// Check to see if the finished program matches the reference output...
- if (BD.diffProgram(Output, BytecodeResult, true /*delete bytecode*/)) {
+ if (BD.diffProgram(BytecodeResult, "", true /*delete bytecode*/)) {
std::cout << "nope.\n";
return KeepSuffix; // Miscompilation detected!
}
@@ -78,7 +63,7 @@ ReduceMiscompilingPasses::doTest(std::vector<const PassInfo*> &Prefix,
}
// If the prefix maintains the predicate by itself, only keep the prefix!
- if (BD.diffProgram(Output, BytecodeResult)) {
+ if (BD.diffProgram(BytecodeResult)) {
std::cout << "nope.\n";
removeFile(BytecodeResult);
return KeepPrefix;
@@ -109,7 +94,7 @@ ReduceMiscompilingPasses::doTest(std::vector<const PassInfo*> &Prefix,
}
// Run the result...
- if (BD.diffProgram(Output, BytecodeResult, true/*delete bytecode*/)) {
+ if (BD.diffProgram(BytecodeResult, "", true/*delete bytecode*/)) {
std::cout << "nope.\n";
delete OriginalInput; // We pruned down the original input...
return KeepSuffix;
@@ -122,14 +107,6 @@ ReduceMiscompilingPasses::doTest(std::vector<const PassInfo*> &Prefix,
return NoFailure;
}
-static void PrintFunctionList(const std::vector<Function*> &Funcs) {
- for (unsigned i = 0, e = Funcs.size(); i != e; ++i) {
- if (i) std::cout << ", ";
- std::cout << Funcs[i]->getName();
- }
-}
-
-
class ReduceMiscompilingFunctions : public ListReducer<Function*> {
BugDriver &BD;
public:
@@ -154,7 +131,7 @@ bool ReduceMiscompilingFunctions::TestFuncs(const std::vector<Function*> &Funcs,
if (!EmitBytecode) {
std::cout << "Checking to see if the program is misoptimized when these "
<< "functions are run\nthrough the passes: ";
- PrintFunctionList(Funcs);
+ BD.PrintFunctionList(Funcs);
std::cout << "\n";
} else {
std::cout <<"Outputting reduced bytecode files which expose the problem:\n";
@@ -269,7 +246,7 @@ bool ReduceMiscompilingFunctions::TestFuncs(const std::vector<Function*> &Funcs,
// Eighth step: Execute the program. If it does not match the expected
// output, then 'Funcs' are being misoptimized!
- bool Broken = BD.diffProgram(Output);
+ bool Broken = BD.diffProgram();
delete BD.Program; // Delete the hacked up program
BD.Program = OldProgram; // Restore the original
@@ -284,24 +261,10 @@ bool ReduceMiscompilingFunctions::TestFuncs(const std::vector<Function*> &Funcs,
/// input.
///
bool BugDriver::debugMiscompilation() {
- std::cout << "*** Debugging miscompilation!\n";
- // Set up the execution environment, selecting a method to run LLVM bytecode.
- if (initializeExecutionEnvironment()) return true;
-
- // Run the raw input to see where we are coming from. If a reference output
- // was specified, make sure that the raw output matches it. If not, it's a
- // problem in the front-end or whatever produced the input code.
- //
- bool CreatedOutput = false;
- if (Output.empty()) {
- std::cout << "Generating reference output from raw program...";
- Output = executeProgram("bugpoint.reference.out");
- CreatedOutput = true;
- std::cout << " done! Reference output is: " << Output << "\n";
- } else if (diffProgram(Output)) {
+ if (diffProgram()) {
std::cout << "\n*** Input program does not match reference diff!\n"
- << " Must be problem with input source!\n";
+ << " Must be problem with input source!\n";
return false; // Problem found
}
@@ -321,7 +284,6 @@ bool BugDriver::debugMiscompilation() {
<< getPassesString(PassesToRun) << "\n";
EmitProgressBytecode("passinput");
-
// Okay, now that we have reduced the list of passes which are causing the
// failure, see if we can pin down which functions are being
// miscompiled... first build a list of all of the non-external functions in
@@ -341,6 +303,5 @@ bool BugDriver::debugMiscompilation() {
// Output a bunch of bytecode files for the user...
ReduceMiscompilingFunctions(*this).TestFuncs(MiscompiledFunctions, true);
- if (CreatedOutput) removeFile(Output);
return false;
}