Miscompilation.cpp revision 640f22e66d90439857a97a83896ee68c4f7128c9
14a10645c70199c8d8567fbc46312158c419720abChris Lattner//===- Miscompilation.cpp - Debug program miscompilations -----------------===// 24a10645c70199c8d8567fbc46312158c419720abChris Lattner// 34a10645c70199c8d8567fbc46312158c419720abChris Lattner// This file implements program miscompilation debugging support. 44a10645c70199c8d8567fbc46312158c419720abChris Lattner// 54a10645c70199c8d8567fbc46312158c419720abChris Lattner//===----------------------------------------------------------------------===// 64a10645c70199c8d8567fbc46312158c419720abChris Lattner 74a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "BugDriver.h" 84a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "SystemUtils.h" 94a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "llvm/Pass.h" 104a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "llvm/Module.h" 11640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner#include "llvm/Transforms/Utils/Cloning.h" 12640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner#include "llvm/Transforms/Utils/Linker.h" 134a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "Support/CommandLine.h" 144a10645c70199c8d8567fbc46312158c419720abChris Lattner 154a10645c70199c8d8567fbc46312158c419720abChris Lattner// Anonymous namespace to define command line options for miscompilation 164a10645c70199c8d8567fbc46312158c419720abChris Lattner// debugging. 174a10645c70199c8d8567fbc46312158c419720abChris Lattner// 184a10645c70199c8d8567fbc46312158c419720abChris Lattnernamespace { 194a10645c70199c8d8567fbc46312158c419720abChris Lattner // Output - The user can specify a file containing the expected output of the 204a10645c70199c8d8567fbc46312158c419720abChris Lattner // program. If this filename is set, it is used as the reference diff source, 214a10645c70199c8d8567fbc46312158c419720abChris Lattner // otherwise the raw input run through an interpreter is used as the reference 224a10645c70199c8d8567fbc46312158c419720abChris Lattner // source. 234a10645c70199c8d8567fbc46312158c419720abChris Lattner // 244a10645c70199c8d8567fbc46312158c419720abChris Lattner cl::opt<std::string> 254a10645c70199c8d8567fbc46312158c419720abChris Lattner Output("output", cl::desc("Specify a reference program output " 264a10645c70199c8d8567fbc46312158c419720abChris Lattner "(for miscompilation detection)")); 274a10645c70199c8d8567fbc46312158c419720abChris Lattner} 284a10645c70199c8d8567fbc46312158c419720abChris Lattner 29640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattnertemplate<typename ElTy> 30640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattnerstruct ListReducer { 31640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner enum TestResult { 32640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner NoFailure, // No failure of the predicate was detected 33640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner KeepSuffix, // The suffix alone satisfies the predicate 34640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner KeepPrefix, // The prefix alone satisfies the predicate 35640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner }; 36640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 37640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // doTest - This virtual function should be overriden by subclasses to 38640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // implement the test desired. The testcase is only required to test to see 39640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // if the Kept list still satisfies the property, but if it is going to check 40640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // the prefix anyway, it can. 41640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // 42640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner virtual TestResult doTest(const std::vector<ElTy> &Prefix, 43640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner const std::vector<ElTy> &Kept) = 0; 44640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 45640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // reduceList - This function attempts to reduce the length of the specified 46640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // list while still maintaining the "test" property. This is the core of the 47640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // "work" that bugpoint does. 48640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // 49640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner void reduceList(std::vector<ElTy> &TheList) { 50640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner unsigned MidTop = TheList.size(); 51640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner while (MidTop > 1) { 52640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner unsigned Mid = MidTop / 2; 53640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::vector<ElTy> Prefix(TheList.begin()+Mid, TheList.end()); 54640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::vector<ElTy> Kept (TheList.begin(), TheList.begin()+Mid); 55640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 56640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner switch (doTest(Prefix, Kept)) { 57640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner case KeepSuffix: 58640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // The property still holds. We can just drop the prefix elements, and 59640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // shorten the list to the "kept" elements. 60640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner TheList.swap(Kept); 61640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner MidTop = TheList.size(); 62640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner break; 63640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner case KeepPrefix: 64640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // The predicate still holds, shorten the list to the prefix elements. 65640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner TheList.swap(Prefix); 66640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner MidTop = TheList.size(); 67640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner break; 68640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner case NoFailure: 69640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Otherwise the property doesn't hold. Some of the elements we removed 70640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // must be neccesary to maintain the property. 71640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner MidTop = Mid; 72640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner break; 73640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 74640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 75640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 76640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner}; 77640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 78640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattnerclass ReduceMiscompilingPasses : public ListReducer<const PassInfo*> { 79640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner BugDriver &BD; 80640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattnerpublic: 81640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner ReduceMiscompilingPasses(BugDriver &bd) : BD(bd) {} 82640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 83640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner virtual TestResult doTest(const std::vector<const PassInfo*> &Prefix, 84640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner const std::vector<const PassInfo*> &Kept); 85640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner}; 86640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 87640f22e66d90439857a97a83896ee68c4f7128c9Chris LattnerReduceMiscompilingPasses::TestResult 88640f22e66d90439857a97a83896ee68c4f7128c9Chris LattnerReduceMiscompilingPasses::doTest(const std::vector<const PassInfo*> &Prefix, 89640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner const std::vector<const PassInfo*> &Kept) { 90640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // First, run the program with just the Kept passes. If it is still broken 91640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // with JUST the kept passes, discard the prefix passes. 92640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << "Checking to see if '" << getPassesString(Kept) 93640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << "' compile correctly: "; 94640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 95640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::string BytecodeResult; 96640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (BD.runPasses(Kept, BytecodeResult, false/*delete*/, true/*quiet*/)) { 97640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cerr << BD.getToolName() << ": Error running this sequence of passes" 98640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << " on the input program!\n"; 99640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner exit(1); 100640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 101640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 102640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Check to see if the finished program matches the reference output... 103640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (BD.diffProgram(Output, BytecodeResult, true /*delete bytecode*/)) { 104640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << "nope.\n"; 105640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner return KeepSuffix; // Miscompilation detected! 106640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 107640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << "yup.\n"; // No miscompilation! 108640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 109640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (Prefix.empty()) return NoFailure; 110640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 111640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // First, run the program with just the Kept passes. If it is still broken 112640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // with JUST the kept passes, discard the prefix passes. 113640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << "Checking to see if '" << getPassesString(Prefix) 114640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << "' compile correctly: "; 115640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 116640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // If it is not broken with the kept passes, it's possible that the prefix 117640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // passes must be run before the kept passes to break it. If the program 118640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // WORKS after the prefix passes, but then fails if running the prefix AND 119640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // kept passes, we can update our bytecode file to include the result of the 120640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // prefix passes, then discard the prefix passes. 121640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // 122640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (BD.runPasses(Prefix, BytecodeResult, false/*delete*/, true/*quiet*/)) { 123640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cerr << BD.getToolName() << ": Error running this sequence of passes" 124640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << " on the input program!\n"; 125640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner exit(1); 126640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 127640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 128640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // If the prefix maintains the predicate by itself, only keep the prefix! 129640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (BD.diffProgram(Output, BytecodeResult)) { 130640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << "nope.\n"; 131640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner removeFile(BytecodeResult); 132640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner return KeepPrefix; 133640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 134640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << "yup.\n"; // No miscompilation! 135640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 136640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Ok, so now we know that the prefix passes work, try running the suffix 137640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // passes on the result of the prefix passes. 138640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // 139640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner Module *PrefixOutput = BD.ParseInputFile(BytecodeResult); 140640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (PrefixOutput == 0) { 141640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cerr << BD.getToolName() << ": Error reading bytecode file '" 142640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << BytecodeResult << "'!\n"; 143640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner exit(1); 144640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 145640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner removeFile(BytecodeResult); // No longer need the file on disk 146640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 147640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << "Checking to see if '" << getPassesString(Kept) 148640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << "' passes compile correctly after the '" 149640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << getPassesString(Prefix) << "' passes: "; 150640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 151640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner Module *OriginalInput = BD.Program; 152640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner BD.Program = PrefixOutput; 153640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (BD.runPasses(Kept, BytecodeResult, false/*delete*/, true/*quiet*/)) { 154640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cerr << BD.getToolName() << ": Error running this sequence of passes" 155640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << " on the input program!\n"; 156640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner exit(1); 157640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 158640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 159640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Run the result... 160640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (BD.diffProgram(Output, BytecodeResult, true/*delete bytecode*/)) { 161640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << "nope.\n"; 162640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner delete OriginalInput; // We pruned down the original input... 163640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner return KeepPrefix; 164640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 165640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 166640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Otherwise, we must not be running the bad pass anymore. 167640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << "yup.\n"; // No miscompilation! 168640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner BD.Program = OriginalInput; // Restore original program 169640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner delete PrefixOutput; // Free experiment 170640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner return NoFailure; 171640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner} 172640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 173640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattnerstatic void PrintFunctionList(const std::vector<Function*> &Funcs) { 174640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner for (unsigned i = 0, e = Funcs.size(); i != e; ++i) { 175640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (i) std::cout << ", "; 176640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << Funcs[i]->getName(); 177640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 178640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner} 179640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 180640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 181640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattnerclass ReduceMiscompilingFunctions : public ListReducer<Function*> { 182640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner BugDriver &BD; 183640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattnerpublic: 184640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner ReduceMiscompilingFunctions(BugDriver &bd) : BD(bd) {} 185640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 186640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner virtual TestResult doTest(const std::vector<Function*> &Prefix, 187640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner const std::vector<Function*> &Kept) { 188640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (TestFuncs(Kept, false)) 189640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner return KeepSuffix; 190640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (TestFuncs(Prefix, false)) 191640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner return KeepPrefix; 192640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner return NoFailure; 193640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 194640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 195640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner bool TestFuncs(const std::vector<Function*> &Prefix, bool EmitBytecode); 196640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner}; 197640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 198640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner// DeleteFunctionBody - "Remove" the function by deleting all of it's basic 199640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner// blocks, making it external. 200640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner// 201640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattnerstatic void DeleteFunctionBody(Function *F) { 202640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // First, break circular use/def chain references... 203640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) 204640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner I->dropAllReferences(); 205640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 206640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Next, delete all of the basic blocks. 207640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner F->getBasicBlockList().clear(); 208640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 209640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner assert(F->isExternal() && "This didn't make the function external!"); 210640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner} 211640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 212640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 213640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattnerbool ReduceMiscompilingFunctions::TestFuncs(const std::vector<Function*> &Funcs, 214640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner bool EmitBytecode) { 215640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Test to see if the function is misoptimized if we ONLY run it on the 216640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // functions listed in Funcs. 217640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (!EmitBytecode) { 218640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << "Checking to see if the program is misoptimized when these " 219640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << "functions are run\nthrough the passes: "; 220640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner PrintFunctionList(Funcs); 221640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << "\n"; 222640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } else { 223640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout <<"Outputting reduced bytecode files which expose the problem:\n"; 224640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 225640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 226640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // First step: clone the module for the two halves of the program we want. 227640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner Module *ToOptimize = CloneModule(BD.Program); 228640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 229640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Second step: Make sure functions & globals are all external so that linkage 230640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // between the two modules will work. 231640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner for (Module::iterator I = ToOptimize->begin(), E = ToOptimize->end();I!=E;++I) 232640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner I->setLinkage(GlobalValue::ExternalLinkage); 233640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner for (Module::giterator I = ToOptimize->gbegin(), E = ToOptimize->gend(); 234640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner I != E; ++I) 235640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner I->setLinkage(GlobalValue::ExternalLinkage); 236640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 237640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Third step: make a clone of the externalized program for the non-optimized 238640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // part. 239640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner Module *ToNotOptimize = CloneModule(ToOptimize); 240640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 241640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Fourth step: Remove the test functions from the ToNotOptimize module, and 242640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // all of the global variables. 243640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner for (unsigned i = 0, e = Funcs.size(); i != e; ++i) { 244640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner Function *TNOF = ToNotOptimize->getFunction(Funcs[i]->getName(), 245640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner Funcs[i]->getFunctionType()); 246640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner assert(TNOF && "Function doesn't exist in module!"); 247640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner DeleteFunctionBody(TNOF); // Function is now external in this module! 248640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 249640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner for (Module::giterator I = ToNotOptimize->gbegin(), E = ToNotOptimize->gend(); 250640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner I != E; ++I) 251640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner I->setInitializer(0); // Delete the initializer to make it external 252640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 253640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (EmitBytecode) { 254640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << " Non-optimized portion: "; 255640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::swap(BD.Program, ToNotOptimize); 256640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner BD.EmitProgressBytecode("tonotoptimize", true); 257640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::swap(BD.Program, ToNotOptimize); 258640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 259640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 260640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Fifth step: Remove all functions from the ToOptimize module EXCEPT for the 261640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // ones specified in Funcs. We know which ones these are because they are 262640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // non-external in ToOptimize, but external in ToNotOptimize. 263640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // 264640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner for (Module::iterator I = ToOptimize->begin(), E = ToOptimize->end();I!=E;++I) 265640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (!I->isExternal()) { 266640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner Function *TNOF = ToNotOptimize->getFunction(I->getName(), 267640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner I->getFunctionType()); 268640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner assert(TNOF && "Function doesn't exist in ToNotOptimize module??"); 269640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (!TNOF->isExternal()) 270640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner DeleteFunctionBody(I); 271640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 272640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 273640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (EmitBytecode) { 274640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << " Portion that is input to optimizer: "; 275640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::swap(BD.Program, ToOptimize); 276640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner BD.EmitProgressBytecode("tooptimize"); 277640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::swap(BD.Program, ToOptimize); 278640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 279640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 280640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Sixth step: Run the optimization passes on ToOptimize, producing a 281640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // transformed version of the functions being tested. 282640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner Module *OldProgram = BD.Program; 283640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner BD.Program = ToOptimize; 284640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 285640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (!EmitBytecode) 286640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << " Optimizing functions being tested: "; 287640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::string BytecodeResult; 288640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (BD.runPasses(BD.PassesToRun, BytecodeResult, false/*delete*/, 289640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner true/*quiet*/)) { 290640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cerr << BD.getToolName() << ": Error running this sequence of passes" 291640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << " on the input program!\n"; 292640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner exit(1); 293640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 294640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 295640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (!EmitBytecode) 296640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << "done.\n"; 297640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 298640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner delete BD.Program; // Delete the old "ToOptimize" module 299640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner BD.Program = BD.ParseInputFile(BytecodeResult); 300640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 301640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (EmitBytecode) { 302640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << " 'tooptimize' after being optimized: "; 303640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner BD.EmitProgressBytecode("optimized", true); 304640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 305640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 306640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (BD.Program == 0) { 307640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cerr << BD.getToolName() << ": Error reading bytecode file '" 308640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << BytecodeResult << "'!\n"; 309640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner exit(1); 310640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 311640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner removeFile(BytecodeResult); // No longer need the file on disk 312640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 313640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Seventh step: Link the optimized part of the program back to the 314640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // unoptimized part of the program. 315640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // 316640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (LinkModules(BD.Program, ToNotOptimize, &BytecodeResult)) { 317640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cerr << BD.getToolName() << ": Error linking modules together:" 318640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << BytecodeResult << "\n"; 319640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner exit(1); 320640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 321640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner delete ToNotOptimize; // We are done with this module... 322640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 323640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (EmitBytecode) { 324640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << " Program as tested: "; 325640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner BD.EmitProgressBytecode("linked", true); 326640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner delete BD.Program; 327640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner BD.Program = OldProgram; 328640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner return false; // We don't need to actually execute the program here. 329640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 330640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 331640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << " Checking to see if the merged program executes correctly: "; 332640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 333640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Eighth step: Execute the program. If it does not match the expected 334640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // output, then 'Funcs' are being misoptimized! 335640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner bool Broken = BD.diffProgram(Output); 336640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 337640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner delete BD.Program; // Delete the hacked up program 338640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner BD.Program = OldProgram; // Restore the original 339640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 340640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << (Broken ? "nope.\n" : "yup.\n"); 341640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner return Broken; 342640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner} 343640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 344640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 3454a10645c70199c8d8567fbc46312158c419720abChris Lattner/// debugMiscompilation - This method is used when the passes selected are not 3464a10645c70199c8d8567fbc46312158c419720abChris Lattner/// crashing, but the generated output is semantically different from the 3474a10645c70199c8d8567fbc46312158c419720abChris Lattner/// input. 3484a10645c70199c8d8567fbc46312158c419720abChris Lattner/// 3494a10645c70199c8d8567fbc46312158c419720abChris Lattnerbool BugDriver::debugMiscompilation() { 3504a10645c70199c8d8567fbc46312158c419720abChris Lattner std::cout << "*** Debugging miscompilation!\n"; 3514a10645c70199c8d8567fbc46312158c419720abChris Lattner 3524a10645c70199c8d8567fbc46312158c419720abChris Lattner // Set up the execution environment, selecting a method to run LLVM bytecode. 3534a10645c70199c8d8567fbc46312158c419720abChris Lattner if (initializeExecutionEnvironment()) return true; 3544a10645c70199c8d8567fbc46312158c419720abChris Lattner 3554a10645c70199c8d8567fbc46312158c419720abChris Lattner // Run the raw input to see where we are coming from. If a reference output 3564a10645c70199c8d8567fbc46312158c419720abChris Lattner // was specified, make sure that the raw output matches it. If not, it's a 3574a10645c70199c8d8567fbc46312158c419720abChris Lattner // problem in the front-end or whatever produced the input code. 3584a10645c70199c8d8567fbc46312158c419720abChris Lattner // 3594a10645c70199c8d8567fbc46312158c419720abChris Lattner bool CreatedOutput = false; 3604a10645c70199c8d8567fbc46312158c419720abChris Lattner if (Output.empty()) { 3614a10645c70199c8d8567fbc46312158c419720abChris Lattner std::cout << "Generating reference output from raw program..."; 3624a10645c70199c8d8567fbc46312158c419720abChris Lattner Output = executeProgram("bugpoint.reference.out"); 3634a10645c70199c8d8567fbc46312158c419720abChris Lattner CreatedOutput = true; 364eea21dd91c5d79b406a2a73d9c4769e272a34aabChris Lattner std::cout << " done! Reference output is: bugpoint.reference.out.\n"; 3654a10645c70199c8d8567fbc46312158c419720abChris Lattner } else if (diffProgram(Output)) { 3664a10645c70199c8d8567fbc46312158c419720abChris Lattner std::cout << "\n*** Input program does not match reference diff!\n" 3674a10645c70199c8d8567fbc46312158c419720abChris Lattner << " Must be problem with input source!\n"; 3684a10645c70199c8d8567fbc46312158c419720abChris Lattner return false; // Problem found 3694a10645c70199c8d8567fbc46312158c419720abChris Lattner } 3704a10645c70199c8d8567fbc46312158c419720abChris Lattner 371640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Figure out which transformations miscompile the input program. 372640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner unsigned OldSize = PassesToRun.size(); 373640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner ReduceMiscompilingPasses(*this).reduceList(PassesToRun); 3744a10645c70199c8d8567fbc46312158c419720abChris Lattner 3754a10645c70199c8d8567fbc46312158c419720abChris Lattner // Make sure something was miscompiled... 376640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (PassesToRun.size() == OldSize) { 3774a10645c70199c8d8567fbc46312158c419720abChris Lattner std::cerr << "*** Optimized program matches reference output! No problem " 3784a10645c70199c8d8567fbc46312158c419720abChris Lattner << "detected...\nbugpoint can't help you with your problem!\n"; 3794a10645c70199c8d8567fbc46312158c419720abChris Lattner return false; 3804a10645c70199c8d8567fbc46312158c419720abChris Lattner } 3814a10645c70199c8d8567fbc46312158c419720abChris Lattner 382640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << "\n*** Found miscompiling pass" 383640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << (PassesToRun.size() == 1 ? "" : "es") << ": " 384640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << getPassesString(PassesToRun) << "\n"; 385640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner EmitProgressBytecode("passinput"); 3864a10645c70199c8d8567fbc46312158c419720abChris Lattner 3874a10645c70199c8d8567fbc46312158c419720abChris Lattner 388640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Okay, now that we have reduced the list of passes which are causing the 389640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // failure, see if we can pin down which functions are being 390640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // miscompiled... first build a list of all of the non-external functions in 391640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // the program. 392640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::vector<Function*> MiscompiledFunctions; 393640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner for (Module::iterator I = Program->begin(), E = Program->end(); I != E; ++I) 394640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (!I->isExternal()) 395640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner MiscompiledFunctions.push_back(I); 3964a10645c70199c8d8567fbc46312158c419720abChris Lattner 397640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Do the reduction... 398640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner ReduceMiscompilingFunctions(*this).reduceList(MiscompiledFunctions); 399640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 400640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << "\n*** The following functions are being miscompiled: "; 401640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner PrintFunctionList(MiscompiledFunctions); 402640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << "\n"; 4034a10645c70199c8d8567fbc46312158c419720abChris Lattner 404640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Output a bunch of bytecode files for the user... 405640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner ReduceMiscompilingFunctions(*this).TestFuncs(MiscompiledFunctions, true); 4064a10645c70199c8d8567fbc46312158c419720abChris Lattner 407640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (CreatedOutput) removeFile(Output); 4084a10645c70199c8d8567fbc46312158c419720abChris Lattner return false; 4094a10645c70199c8d8567fbc46312158c419720abChris Lattner} 410