Miscompilation.cpp revision 5cbf985dcbc89fba3208e7baf8b6f488b06d3ec9
14a10645c70199c8d8567fbc46312158c419720abChris Lattner//===- Miscompilation.cpp - Debug program miscompilations -----------------===// 23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// The LLVM Compiler Infrastructure 47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// 57c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// This file was developed by the LLVM research group and is distributed under 67c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 87c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//===----------------------------------------------------------------------===// 94a10645c70199c8d8567fbc46312158c419720abChris Lattner// 10a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner// This file implements optimizer and code generation miscompilation debugging 11a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner// support. 124a10645c70199c8d8567fbc46312158c419720abChris Lattner// 134a10645c70199c8d8567fbc46312158c419720abChris Lattner//===----------------------------------------------------------------------===// 144a10645c70199c8d8567fbc46312158c419720abChris Lattner 154a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "BugDriver.h" 16126840f49e8d49156a342e836d4b2adca46dc3baChris Lattner#include "ListReducer.h" 17a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner#include "llvm/Constants.h" 18a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner#include "llvm/DerivedTypes.h" 19a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner#include "llvm/Instructions.h" 20605b9e2c5bd1b0c151a0b15d01e6df3aba93d52fReid Spencer#include "llvm/Linker.h" 214a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "llvm/Module.h" 22e49603d79d220a795bd50684c8b1f503ee40f97fMisha Brukman#include "llvm/Pass.h" 23a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner#include "llvm/Analysis/Verifier.h" 24a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner#include "llvm/Support/Mangler.h" 25640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner#include "llvm/Transforms/Utils/Cloning.h" 26551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/CommandLine.h" 27551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/FileUtilities.h" 2859615f0f85e2ac99e012cb81934d002faebd405aChris Lattner#include "llvm/Config/config.h" // for HAVE_LINK_R 29fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattnerusing namespace llvm; 304a10645c70199c8d8567fbc46312158c419720abChris Lattner 31a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattnernamespace llvm { 32a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner extern cl::list<std::string> InputArgv; 33a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner} 34a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 35efdc0b505712d1ca4460def27e51c430f033d58dChris Lattnernamespace { 36dc31a8a70cab3b4c180ac1a482855e31d3fe8e6bReid Spencer static llvm::cl::opt<bool> 37dc31a8a70cab3b4c180ac1a482855e31d3fe8e6bReid Spencer DisableLoopExtraction("disable-loop-extraction", 38dc31a8a70cab3b4c180ac1a482855e31d3fe8e6bReid Spencer cl::desc("Don't extract loops when searching for miscompilations"), 39dc31a8a70cab3b4c180ac1a482855e31d3fe8e6bReid Spencer cl::init(false)); 40dc31a8a70cab3b4c180ac1a482855e31d3fe8e6bReid Spencer 41fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner class ReduceMiscompilingPasses : public ListReducer<const PassInfo*> { 42fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner BugDriver &BD; 43fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner public: 44fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner ReduceMiscompilingPasses(BugDriver &bd) : BD(bd) {} 453da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 46fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner virtual TestResult doTest(std::vector<const PassInfo*> &Prefix, 47fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner std::vector<const PassInfo*> &Suffix); 48fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner }; 49fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner} 50640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 518c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// TestResult - After passes have been split into a test group and a control 528c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// group, see if they still break the program. 538c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 54640f22e66d90439857a97a83896ee68c4f7128c9Chris LattnerReduceMiscompilingPasses::TestResult 5539aebca3a2d1dd389a6d9cdfb51a53f625e244f0Chris LattnerReduceMiscompilingPasses::doTest(std::vector<const PassInfo*> &Prefix, 5606943add8b2b764e131979cca064eda9f28826c9Chris Lattner std::vector<const PassInfo*> &Suffix) { 5706943add8b2b764e131979cca064eda9f28826c9Chris Lattner // First, run the program with just the Suffix passes. If it is still broken 58640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // with JUST the kept passes, discard the prefix passes. 5906943add8b2b764e131979cca064eda9f28826c9Chris Lattner std::cout << "Checking to see if '" << getPassesString(Suffix) 60640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << "' compile correctly: "; 61640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 62640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::string BytecodeResult; 6306943add8b2b764e131979cca064eda9f28826c9Chris Lattner if (BD.runPasses(Suffix, BytecodeResult, false/*delete*/, true/*quiet*/)) { 643da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman std::cerr << " Error running this sequence of passes" 65640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << " on the input program!\n"; 665ef681c19de9c675a265211f8fb0ae49cc3a3a66Chris Lattner BD.setPassesToRun(Suffix); 675ef681c19de9c675a265211f8fb0ae49cc3a3a66Chris Lattner BD.EmitProgressBytecode("pass-error", false); 68025262692a6710de29a48e2b3905672cd12d13d2Chris Lattner exit(BD.debugOptimizerCrash()); 69640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 70640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 71640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Check to see if the finished program matches the reference output... 725073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman if (BD.diffProgram(BytecodeResult, "", true /*delete bytecode*/)) { 73123f8fec94d1f22d876382897231868c62f8eabbMisha Brukman std::cout << " nope.\n"; 7459615f0f85e2ac99e012cb81934d002faebd405aChris Lattner if (Suffix.empty()) { 7559615f0f85e2ac99e012cb81934d002faebd405aChris Lattner std::cerr << BD.getToolName() << ": I'm confused: the test fails when " 7659615f0f85e2ac99e012cb81934d002faebd405aChris Lattner << "no passes are run, nondeterministic program?\n"; 7759615f0f85e2ac99e012cb81934d002faebd405aChris Lattner exit(1); 7859615f0f85e2ac99e012cb81934d002faebd405aChris Lattner } 79123f8fec94d1f22d876382897231868c62f8eabbMisha Brukman return KeepSuffix; // Miscompilation detected! 80640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 81123f8fec94d1f22d876382897231868c62f8eabbMisha Brukman std::cout << " yup.\n"; // No miscompilation! 82640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 83640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (Prefix.empty()) return NoFailure; 84640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 8506943add8b2b764e131979cca064eda9f28826c9Chris Lattner // Next, see if the program is broken if we run the "prefix" passes first, 86bc0e998c497446f5448425b3cbd7f8f19a458764Misha Brukman // then separately run the "kept" passes. 87640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cout << "Checking to see if '" << getPassesString(Prefix) 88640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << "' compile correctly: "; 89640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 90640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // If it is not broken with the kept passes, it's possible that the prefix 91640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // passes must be run before the kept passes to break it. If the program 92640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // WORKS after the prefix passes, but then fails if running the prefix AND 93640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // kept passes, we can update our bytecode file to include the result of the 94640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // prefix passes, then discard the prefix passes. 95640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // 96640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (BD.runPasses(Prefix, BytecodeResult, false/*delete*/, true/*quiet*/)) { 973da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman std::cerr << " Error running this sequence of passes" 98640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << " on the input program!\n"; 999c6cfe1bffd37f29a265457b7515839c445b3e6aChris Lattner BD.setPassesToRun(Prefix); 1009c6cfe1bffd37f29a265457b7515839c445b3e6aChris Lattner BD.EmitProgressBytecode("pass-error", false); 101025262692a6710de29a48e2b3905672cd12d13d2Chris Lattner exit(BD.debugOptimizerCrash()); 102640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 103640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 104640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // If the prefix maintains the predicate by itself, only keep the prefix! 1055073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman if (BD.diffProgram(BytecodeResult)) { 106123f8fec94d1f22d876382897231868c62f8eabbMisha Brukman std::cout << " nope.\n"; 107a229c5cce75209047db32c6039aa0b0fd481f049Reid Spencer sys::Path(BytecodeResult).eraseFromDisk(); 108640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner return KeepPrefix; 109640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 110123f8fec94d1f22d876382897231868c62f8eabbMisha Brukman std::cout << " yup.\n"; // No miscompilation! 111640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 112640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Ok, so now we know that the prefix passes work, try running the suffix 113640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // passes on the result of the prefix passes. 114640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // 115efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner Module *PrefixOutput = ParseInputFile(BytecodeResult); 116640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner if (PrefixOutput == 0) { 117640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::cerr << BD.getToolName() << ": Error reading bytecode file '" 118640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << BytecodeResult << "'!\n"; 119640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner exit(1); 120640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 121a229c5cce75209047db32c6039aa0b0fd481f049Reid Spencer sys::Path(BytecodeResult).eraseFromDisk(); // No longer need the file on disk 122f4789e6d04c1fddb40092a1193c4a5eb67387accChris Lattner 123f4789e6d04c1fddb40092a1193c4a5eb67387accChris Lattner // Don't check if there are no passes in the suffix. 124f4789e6d04c1fddb40092a1193c4a5eb67387accChris Lattner if (Suffix.empty()) 125f4789e6d04c1fddb40092a1193c4a5eb67387accChris Lattner return NoFailure; 1263da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 12706943add8b2b764e131979cca064eda9f28826c9Chris Lattner std::cout << "Checking to see if '" << getPassesString(Suffix) 128640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << "' passes compile correctly after the '" 129640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << getPassesString(Prefix) << "' passes: "; 130640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 131efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner Module *OriginalInput = BD.swapProgramIn(PrefixOutput); 13206943add8b2b764e131979cca064eda9f28826c9Chris Lattner if (BD.runPasses(Suffix, BytecodeResult, false/*delete*/, true/*quiet*/)) { 1333da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman std::cerr << " Error running this sequence of passes" 134640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner << " on the input program!\n"; 1355ef681c19de9c675a265211f8fb0ae49cc3a3a66Chris Lattner BD.setPassesToRun(Suffix); 1369c6cfe1bffd37f29a265457b7515839c445b3e6aChris Lattner BD.EmitProgressBytecode("pass-error", false); 137025262692a6710de29a48e2b3905672cd12d13d2Chris Lattner exit(BD.debugOptimizerCrash()); 138640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 139640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 140640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Run the result... 1415073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman if (BD.diffProgram(BytecodeResult, "", true/*delete bytecode*/)) { 142123f8fec94d1f22d876382897231868c62f8eabbMisha Brukman std::cout << " nope.\n"; 143640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner delete OriginalInput; // We pruned down the original input... 14406943add8b2b764e131979cca064eda9f28826c9Chris Lattner return KeepSuffix; 145640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner } 146640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 147640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Otherwise, we must not be running the bad pass anymore. 148123f8fec94d1f22d876382897231868c62f8eabbMisha Brukman std::cout << " yup.\n"; // No miscompilation! 149efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner delete BD.swapProgramIn(OriginalInput); // Restore orig program & free test 150640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner return NoFailure; 151640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner} 152640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 153efdc0b505712d1ca4460def27e51c430f033d58dChris Lattnernamespace { 154fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner class ReduceMiscompilingFunctions : public ListReducer<Function*> { 155fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner BugDriver &BD; 156b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner bool (*TestFn)(BugDriver &, Module *, Module *); 157fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner public: 158b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner ReduceMiscompilingFunctions(BugDriver &bd, 159b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner bool (*F)(BugDriver &, Module *, Module *)) 160b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner : BD(bd), TestFn(F) {} 1613da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 162fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner virtual TestResult doTest(std::vector<Function*> &Prefix, 163fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner std::vector<Function*> &Suffix) { 164be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner if (!Suffix.empty() && TestFuncs(Suffix)) 165fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner return KeepSuffix; 166be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner if (!Prefix.empty() && TestFuncs(Prefix)) 167fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner return KeepPrefix; 168fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner return NoFailure; 169fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner } 1703da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 171be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner bool TestFuncs(const std::vector<Function*> &Prefix); 172fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner }; 173fa76183e8e28985dfd17b1d6291c939dab4cbe1dChris Lattner} 174640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 175efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner/// TestMergedProgram - Given two modules, link them together and run the 176efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner/// program, checking to see if the program matches the diff. If the diff 177a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner/// matches, return false, otherwise return true. If the DeleteInputs argument 178a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner/// is set to true then this function deletes both input modules before it 179a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner/// returns. 1808c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 181a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattnerstatic bool TestMergedProgram(BugDriver &BD, Module *M1, Module *M2, 182a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner bool DeleteInputs) { 183efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner // Link the two portions of the program back to together. 184efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner std::string ErrorMsg; 18590c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner if (!DeleteInputs) { 18690c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner M1 = CloneModule(M1); 18790c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner M2 = CloneModule(M2); 18890c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner } 189e4874029c37c4b14d0646289f18e5f2a1b03fdc2Reid Spencer if (Linker::LinkModules(M1, M2, &ErrorMsg)) { 190efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner std::cerr << BD.getToolName() << ": Error linking modules together:" 191eed80e23751ecc50c1fa5604f67be4b826d5b417Misha Brukman << ErrorMsg << '\n'; 192efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner exit(1); 193efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner } 19490c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner delete M2; // We are done with this module. 195efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner 196efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner Module *OldProgram = BD.swapProgramIn(M1); 197efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner 198efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner // Execute the program. If it does not match the expected output, we must 199efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner // return true. 200efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner bool Broken = BD.diffProgram(); 201efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner 202efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner // Delete the linked module & restore the original 203a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner BD.swapProgramIn(OldProgram); 2045313f23b8c3d22a2028beb731c60fc1a25beb149Chris Lattner delete M1; 205efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner return Broken; 206efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner} 207efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner 2088c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// TestFuncs - split functions in a Module into two groups: those that are 2098c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// under consideration for miscompilation vs. those that are not, and test 2108c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// accordingly. Each group of functions becomes a separate Module. 2118c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 212be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattnerbool ReduceMiscompilingFunctions::TestFuncs(const std::vector<Function*>&Funcs){ 213640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Test to see if the function is misoptimized if we ONLY run it on the 214640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // functions listed in Funcs. 215be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner std::cout << "Checking to see if the program is misoptimized when " 216be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner << (Funcs.size()==1 ? "this function is" : "these functions are") 217be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner << " run through the pass" 218a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner << (BD.getPassesToRun().size() == 1 ? "" : "es") << ":"; 219efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner PrintFunctionList(Funcs); 220eed80e23751ecc50c1fa5604f67be4b826d5b417Misha Brukman std::cout << '\n'; 221640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 222be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner // Split the module into the two halves of the program we want. 223efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner Module *ToNotOptimize = CloneModule(BD.getProgram()); 224efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner Module *ToOptimize = SplitFunctionsOutOfModule(ToNotOptimize, Funcs); 225640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 226b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner // Run the predicate, not that the predicate will delete both input modules. 227b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner return TestFn(BD, ToOptimize, ToNotOptimize); 228640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner} 229640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 2308c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// DisambiguateGlobalSymbols - Mangle symbols to guarantee uniqueness by 2318c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// modifying predominantly internal symbols rather than external ones. 2328c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 23336ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattnerstatic void DisambiguateGlobalSymbols(Module *M) { 23436ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner // Try not to cause collisions by minimizing chances of renaming an 23536ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner // already-external symbol, so take in external globals and functions as-is. 23636ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner // The code should work correctly without disambiguation (assuming the same 23736ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner // mangler is used by the two code generators), but having symbols with the 23836ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner // same name causes warnings to be emitted by the code generator. 23936ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner Mangler Mang(*M); 2400fccc74103dee95d6baa885963b7337ae5daec7eAndrew Lenharth // Agree with the CBE on symbol naming 2410fccc74103dee95d6baa885963b7337ae5daec7eAndrew Lenharth Mang.markCharUnacceptable('.'); 242afd39f0cc452026eac4a9dd4d875e571de6e0a35Chris Lattner Mang.setPreserveAsmNames(true); 24367ef9e43049c28c8fe2c9f70d2ad163045ee5876Chris Lattner for (Module::global_iterator I = M->global_begin(), E = M->global_end(); 24467ef9e43049c28c8fe2c9f70d2ad163045ee5876Chris Lattner I != E; ++I) 24536ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner I->setName(Mang.getValueName(I)); 24636ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I) 24736ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner I->setName(Mang.getValueName(I)); 24836ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner} 24936ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner 250a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner/// ExtractLoops - Given a reduced list of functions that still exposed the bug, 251a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner/// check to see if we can extract the loops in the region without obscuring the 252a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner/// bug. If so, it reduces the amount of code identified. 2538c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 254b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattnerstatic bool ExtractLoops(BugDriver &BD, 255b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner bool (*TestFn)(BugDriver &, Module *, Module *), 256a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner std::vector<Function*> &MiscompiledFunctions) { 257a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner bool MadeChange = false; 258a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner while (1) { 259aed98fa8861a28e5f7ba7c0659e106f2a441e9ffChris Lattner if (BugpointIsInterrupted) return MadeChange; 260aed98fa8861a28e5f7ba7c0659e106f2a441e9ffChris Lattner 261a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner Module *ToNotOptimize = CloneModule(BD.getProgram()); 262a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner Module *ToOptimize = SplitFunctionsOutOfModule(ToNotOptimize, 263a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner MiscompiledFunctions); 264a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner Module *ToOptimizeLoopExtracted = BD.ExtractLoop(ToOptimize); 265a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner if (!ToOptimizeLoopExtracted) { 266a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // If the loop extractor crashed or if there were no extractible loops, 267a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // then this chapter of our odyssey is over with. 268a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner delete ToNotOptimize; 269a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner delete ToOptimize; 270a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner return MadeChange; 271a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner } 272a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner 273a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner std::cerr << "Extracted a loop from the breaking portion of the program.\n"; 274a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner 275a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // Bugpoint is intentionally not very trusting of LLVM transformations. In 276a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // particular, we're not going to assume that the loop extractor works, so 277a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // we're going to test the newly loop extracted program to make sure nothing 278a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // has broken. If something broke, then we'll inform the user and stop 279a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // extraction. 280a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner AbstractInterpreter *AI = BD.switchToCBE(); 281a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner if (TestMergedProgram(BD, ToOptimizeLoopExtracted, ToNotOptimize, false)) { 282a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner BD.switchToInterpreter(AI); 283a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 284a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // Merged program doesn't work anymore! 285a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner std::cerr << " *** ERROR: Loop extraction broke the program. :(" 286a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner << " Please report a bug!\n"; 287a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner std::cerr << " Continuing on with un-loop-extracted version.\n"; 28856c418676a308034e5eecf10d3f96ced2d1fab24Chris Lattner 28956c418676a308034e5eecf10d3f96ced2d1fab24Chris Lattner BD.writeProgramToFile("bugpoint-loop-extract-fail-tno.bc", ToNotOptimize); 29056c418676a308034e5eecf10d3f96ced2d1fab24Chris Lattner BD.writeProgramToFile("bugpoint-loop-extract-fail-to.bc", ToOptimize); 29156c418676a308034e5eecf10d3f96ced2d1fab24Chris Lattner BD.writeProgramToFile("bugpoint-loop-extract-fail-to-le.bc", 29256c418676a308034e5eecf10d3f96ced2d1fab24Chris Lattner ToOptimizeLoopExtracted); 29356c418676a308034e5eecf10d3f96ced2d1fab24Chris Lattner 29456c418676a308034e5eecf10d3f96ced2d1fab24Chris Lattner std::cerr << "Please submit the bugpoint-loop-extract-fail-*.bc files.\n"; 29556c418676a308034e5eecf10d3f96ced2d1fab24Chris Lattner delete ToOptimize; 296a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner delete ToNotOptimize; 297a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner delete ToOptimizeLoopExtracted; 298a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner return MadeChange; 299a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner } 30056c418676a308034e5eecf10d3f96ced2d1fab24Chris Lattner delete ToOptimize; 301a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner BD.switchToInterpreter(AI); 3023da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 303b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner std::cout << " Testing after loop extraction:\n"; 304b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner // Clone modules, the tester function will free them. 305b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner Module *TOLEBackup = CloneModule(ToOptimizeLoopExtracted); 306b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner Module *TNOBackup = CloneModule(ToNotOptimize); 307b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner if (!TestFn(BD, ToOptimizeLoopExtracted, ToNotOptimize)) { 308b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner std::cout << "*** Loop extraction masked the problem. Undoing.\n"; 309a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // If the program is not still broken, then loop extraction did something 310a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // that masked the error. Stop loop extraction now. 311b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner delete TOLEBackup; 312b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner delete TNOBackup; 313a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner return MadeChange; 314a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner } 315b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner ToOptimizeLoopExtracted = TOLEBackup; 316b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner ToNotOptimize = TNOBackup; 317b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner 318b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner std::cout << "*** Loop extraction successful!\n"; 319a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner 32090c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner std::vector<std::pair<std::string, const FunctionType*> > MisCompFunctions; 32190c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner for (Module::iterator I = ToOptimizeLoopExtracted->begin(), 32290c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner E = ToOptimizeLoopExtracted->end(); I != E; ++I) 3235cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer if (!I->isDeclaration()) 324fa1af1344910ee975f50ffdddf605c26f80ef016Chris Lattner MisCompFunctions.push_back(std::make_pair(I->getName(), 325fa1af1344910ee975f50ffdddf605c26f80ef016Chris Lattner I->getFunctionType())); 32690c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner 327a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // Okay, great! Now we know that we extracted a loop and that loop 328a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // extraction both didn't break the program, and didn't mask the problem. 329a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // Replace the current program with the loop extracted version, and try to 330a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // extract another loop. 331a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner std::string ErrorMsg; 332e4874029c37c4b14d0646289f18e5f2a1b03fdc2Reid Spencer if (Linker::LinkModules(ToNotOptimize, ToOptimizeLoopExtracted, &ErrorMsg)){ 333a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner std::cerr << BD.getToolName() << ": Error linking modules together:" 334eed80e23751ecc50c1fa5604f67be4b826d5b417Misha Brukman << ErrorMsg << '\n'; 335a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner exit(1); 336a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner } 33790c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner delete ToOptimizeLoopExtracted; 338d3a533d94dae1e57194001af08763eb3ba199c8fChris Lattner 339d3a533d94dae1e57194001af08763eb3ba199c8fChris Lattner // All of the Function*'s in the MiscompiledFunctions list are in the old 3405313f23b8c3d22a2028beb731c60fc1a25beb149Chris Lattner // module. Update this list to include all of the functions in the 3415313f23b8c3d22a2028beb731c60fc1a25beb149Chris Lattner // optimized and loop extracted module. 3425313f23b8c3d22a2028beb731c60fc1a25beb149Chris Lattner MiscompiledFunctions.clear(); 34390c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) { 34490c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner Function *NewF = ToNotOptimize->getFunction(MisCompFunctions[i].first, 34590c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner MisCompFunctions[i].second); 34690c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner assert(NewF && "Function not found??"); 34790c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner MiscompiledFunctions.push_back(NewF); 348d3a533d94dae1e57194001af08763eb3ba199c8fChris Lattner } 349d3a533d94dae1e57194001af08763eb3ba199c8fChris Lattner 350a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner BD.setNewProgram(ToNotOptimize); 351a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner MadeChange = true; 352a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner } 353a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner} 354a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner 3555e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattnernamespace { 3565e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner class ReduceMiscompiledBlocks : public ListReducer<BasicBlock*> { 3575e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner BugDriver &BD; 3585e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner bool (*TestFn)(BugDriver &, Module *, Module *); 3595e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner std::vector<Function*> FunctionsBeingTested; 3605e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner public: 3615e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner ReduceMiscompiledBlocks(BugDriver &bd, 3625e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner bool (*F)(BugDriver &, Module *, Module *), 3635e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner const std::vector<Function*> &Fns) 3645e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner : BD(bd), TestFn(F), FunctionsBeingTested(Fns) {} 3653da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 3665e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner virtual TestResult doTest(std::vector<BasicBlock*> &Prefix, 3675e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner std::vector<BasicBlock*> &Suffix) { 3685e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner if (!Suffix.empty() && TestFuncs(Suffix)) 3695e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner return KeepSuffix; 3705e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner if (TestFuncs(Prefix)) 3715e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner return KeepPrefix; 3725e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner return NoFailure; 3735e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner } 3743da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 3755e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner bool TestFuncs(const std::vector<BasicBlock*> &Prefix); 3765e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner }; 3775e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner} 3785e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 3795e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner/// TestFuncs - Extract all blocks for the miscompiled functions except for the 3805e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner/// specified blocks. If the problem still exists, return true. 3815e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner/// 3825e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattnerbool ReduceMiscompiledBlocks::TestFuncs(const std::vector<BasicBlock*> &BBs) { 3835e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // Test to see if the function is misoptimized if we ONLY run it on the 3845e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // functions listed in Funcs. 38568bee938e539d884ee89ce4dfebbad777896960eChris Lattner std::cout << "Checking to see if the program is misoptimized when all "; 38668bee938e539d884ee89ce4dfebbad777896960eChris Lattner if (!BBs.empty()) { 38768bee938e539d884ee89ce4dfebbad777896960eChris Lattner std::cout << "but these " << BBs.size() << " blocks are extracted: "; 38868bee938e539d884ee89ce4dfebbad777896960eChris Lattner for (unsigned i = 0, e = BBs.size() < 10 ? BBs.size() : 10; i != e; ++i) 38968bee938e539d884ee89ce4dfebbad777896960eChris Lattner std::cout << BBs[i]->getName() << " "; 39068bee938e539d884ee89ce4dfebbad777896960eChris Lattner if (BBs.size() > 10) std::cout << "..."; 39168bee938e539d884ee89ce4dfebbad777896960eChris Lattner } else { 39268bee938e539d884ee89ce4dfebbad777896960eChris Lattner std::cout << "blocks are extracted."; 39368bee938e539d884ee89ce4dfebbad777896960eChris Lattner } 394eed80e23751ecc50c1fa5604f67be4b826d5b417Misha Brukman std::cout << '\n'; 3955e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 3965e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // Split the module into the two halves of the program we want. 3975e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner Module *ToNotOptimize = CloneModule(BD.getProgram()); 3985e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner Module *ToOptimize = SplitFunctionsOutOfModule(ToNotOptimize, 3995e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner FunctionsBeingTested); 4005e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 4015e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // Try the extraction. If it doesn't work, then the block extractor crashed 4025e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // or something, in which case bugpoint can't chase down this possibility. 4035e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner if (Module *New = BD.ExtractMappedBlocksFromModule(BBs, ToOptimize)) { 4045e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner delete ToOptimize; 4055e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // Run the predicate, not that the predicate will delete both input modules. 4065e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner return TestFn(BD, New, ToNotOptimize); 4075e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner } 4085e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner delete ToOptimize; 4095e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner delete ToNotOptimize; 4105e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner return false; 4115e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner} 4125e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 4135e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 4145e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner/// ExtractBlocks - Given a reduced list of functions that still expose the bug, 4155e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner/// extract as many basic blocks from the region as possible without obscuring 4165e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner/// the bug. 4175e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner/// 4185e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattnerstatic bool ExtractBlocks(BugDriver &BD, 4195e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner bool (*TestFn)(BugDriver &, Module *, Module *), 4205e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner std::vector<Function*> &MiscompiledFunctions) { 421f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner if (BugpointIsInterrupted) return false; 422f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner 4235e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner std::vector<BasicBlock*> Blocks; 4245e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner for (unsigned i = 0, e = MiscompiledFunctions.size(); i != e; ++i) 4255e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner for (Function::iterator I = MiscompiledFunctions[i]->begin(), 4265e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner E = MiscompiledFunctions[i]->end(); I != E; ++I) 4275e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner Blocks.push_back(I); 4285e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 4295e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // Use the list reducer to identify blocks that can be extracted without 4305e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // obscuring the bug. The Blocks list will end up containing blocks that must 4315e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // be retained from the original program. 4325e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner unsigned OldSize = Blocks.size(); 43368bee938e539d884ee89ce4dfebbad777896960eChris Lattner 43468bee938e539d884ee89ce4dfebbad777896960eChris Lattner // Check to see if all blocks are extractible first. 43568bee938e539d884ee89ce4dfebbad777896960eChris Lattner if (ReduceMiscompiledBlocks(BD, TestFn, 43668bee938e539d884ee89ce4dfebbad777896960eChris Lattner MiscompiledFunctions).TestFuncs(std::vector<BasicBlock*>())) { 43768bee938e539d884ee89ce4dfebbad777896960eChris Lattner Blocks.clear(); 43868bee938e539d884ee89ce4dfebbad777896960eChris Lattner } else { 43968bee938e539d884ee89ce4dfebbad777896960eChris Lattner ReduceMiscompiledBlocks(BD, TestFn,MiscompiledFunctions).reduceList(Blocks); 44068bee938e539d884ee89ce4dfebbad777896960eChris Lattner if (Blocks.size() == OldSize) 44168bee938e539d884ee89ce4dfebbad777896960eChris Lattner return false; 44268bee938e539d884ee89ce4dfebbad777896960eChris Lattner } 4435e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 4442290e754061f1393bb96b1808ac33dc03399c939Chris Lattner Module *ProgClone = CloneModule(BD.getProgram()); 4452290e754061f1393bb96b1808ac33dc03399c939Chris Lattner Module *ToExtract = SplitFunctionsOutOfModule(ProgClone, 4462290e754061f1393bb96b1808ac33dc03399c939Chris Lattner MiscompiledFunctions); 4472290e754061f1393bb96b1808ac33dc03399c939Chris Lattner Module *Extracted = BD.ExtractMappedBlocksFromModule(Blocks, ToExtract); 4482290e754061f1393bb96b1808ac33dc03399c939Chris Lattner if (Extracted == 0) { 449da895d63377b421dc50117befb2bec80d2973526Chris Lattner // Weird, extraction should have worked. 4502290e754061f1393bb96b1808ac33dc03399c939Chris Lattner std::cerr << "Nondeterministic problem extracting blocks??\n"; 4512290e754061f1393bb96b1808ac33dc03399c939Chris Lattner delete ProgClone; 4522290e754061f1393bb96b1808ac33dc03399c939Chris Lattner delete ToExtract; 4532290e754061f1393bb96b1808ac33dc03399c939Chris Lattner return false; 4542290e754061f1393bb96b1808ac33dc03399c939Chris Lattner } 4555e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 4562290e754061f1393bb96b1808ac33dc03399c939Chris Lattner // Otherwise, block extraction succeeded. Link the two program fragments back 4572290e754061f1393bb96b1808ac33dc03399c939Chris Lattner // together. 4582290e754061f1393bb96b1808ac33dc03399c939Chris Lattner delete ToExtract; 4595e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 46090c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner std::vector<std::pair<std::string, const FunctionType*> > MisCompFunctions; 46190c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner for (Module::iterator I = Extracted->begin(), E = Extracted->end(); 46290c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner I != E; ++I) 4635cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer if (!I->isDeclaration()) 464fa1af1344910ee975f50ffdddf605c26f80ef016Chris Lattner MisCompFunctions.push_back(std::make_pair(I->getName(), 465fa1af1344910ee975f50ffdddf605c26f80ef016Chris Lattner I->getFunctionType())); 46690c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner 4672290e754061f1393bb96b1808ac33dc03399c939Chris Lattner std::string ErrorMsg; 468e4874029c37c4b14d0646289f18e5f2a1b03fdc2Reid Spencer if (Linker::LinkModules(ProgClone, Extracted, &ErrorMsg)) { 4692290e754061f1393bb96b1808ac33dc03399c939Chris Lattner std::cerr << BD.getToolName() << ": Error linking modules together:" 470eed80e23751ecc50c1fa5604f67be4b826d5b417Misha Brukman << ErrorMsg << '\n'; 4712290e754061f1393bb96b1808ac33dc03399c939Chris Lattner exit(1); 4722290e754061f1393bb96b1808ac33dc03399c939Chris Lattner } 47390c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner delete Extracted; 4745e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 4752290e754061f1393bb96b1808ac33dc03399c939Chris Lattner // Set the new program and delete the old one. 4762290e754061f1393bb96b1808ac33dc03399c939Chris Lattner BD.setNewProgram(ProgClone); 4775e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 4782290e754061f1393bb96b1808ac33dc03399c939Chris Lattner // Update the list of miscompiled functions. 4792290e754061f1393bb96b1808ac33dc03399c939Chris Lattner MiscompiledFunctions.clear(); 4805e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 48190c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) { 48290c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first, 48390c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner MisCompFunctions[i].second); 48490c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner assert(NewF && "Function not found??"); 48590c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner MiscompiledFunctions.push_back(NewF); 48690c18c5c69d9c451e5fdca1e4b4b95e8ed13291aChris Lattner } 4872290e754061f1393bb96b1808ac33dc03399c939Chris Lattner 4882290e754061f1393bb96b1808ac33dc03399c939Chris Lattner return true; 4895e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner} 4905e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 4915e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 492b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner/// DebugAMiscompilation - This is a generic driver to narrow down 493b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner/// miscompilations, either in an optimization or a code generator. 4948c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 495b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattnerstatic std::vector<Function*> 496b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris LattnerDebugAMiscompilation(BugDriver &BD, 497b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner bool (*TestFn)(BugDriver &, Module *, Module *)) { 498640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Okay, now that we have reduced the list of passes which are causing the 499640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // failure, see if we can pin down which functions are being 500640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // miscompiled... first build a list of all of the non-external functions in 501640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // the program. 502640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner std::vector<Function*> MiscompiledFunctions; 503b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner Module *Prog = BD.getProgram(); 504b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner for (Module::iterator I = Prog->begin(), E = Prog->end(); I != E; ++I) 5055cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer if (!I->isDeclaration()) 506640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner MiscompiledFunctions.push_back(I); 5074a10645c70199c8d8567fbc46312158c419720abChris Lattner 508640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Do the reduction... 509f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner if (!BugpointIsInterrupted) 510f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner ReduceMiscompilingFunctions(BD, TestFn).reduceList(MiscompiledFunctions); 511640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner 512de9750def7c5ca6cb789f3bba7c913e237cdf849Chris Lattner std::cout << "\n*** The following function" 513de9750def7c5ca6cb789f3bba7c913e237cdf849Chris Lattner << (MiscompiledFunctions.size() == 1 ? " is" : "s are") 514de9750def7c5ca6cb789f3bba7c913e237cdf849Chris Lattner << " being miscompiled: "; 515640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner PrintFunctionList(MiscompiledFunctions); 516eed80e23751ecc50c1fa5604f67be4b826d5b417Misha Brukman std::cout << '\n'; 5174a10645c70199c8d8567fbc46312158c419720abChris Lattner 518a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // See if we can rip any loops out of the miscompiled functions and still 519a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // trigger the problem. 520dc31a8a70cab3b4c180ac1a482855e31d3fe8e6bReid Spencer 5212803b4cc581af06bf99af5ddc3353836c63d1562Reid Spencer if (!BugpointIsInterrupted && !DisableLoopExtraction && 5222803b4cc581af06bf99af5ddc3353836c63d1562Reid Spencer ExtractLoops(BD, TestFn, MiscompiledFunctions)) { 523a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // Okay, we extracted some loops and the problem still appears. See if we 524a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // can eliminate some of the created functions from being candidates. 525a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner 52636ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner // Loop extraction can introduce functions with the same name (foo_code). 52736ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner // Make sure to disambiguate the symbols so that when the program is split 5285e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // apart that we can link it back together again. 5295e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner DisambiguateGlobalSymbols(BD.getProgram()); 5305e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 5315e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // Do the reduction... 532f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner if (!BugpointIsInterrupted) 533f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner ReduceMiscompilingFunctions(BD, TestFn).reduceList(MiscompiledFunctions); 5343da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 5355e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner std::cout << "\n*** The following function" 5365e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner << (MiscompiledFunctions.size() == 1 ? " is" : "s are") 5375e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner << " being miscompiled: "; 5385e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner PrintFunctionList(MiscompiledFunctions); 539eed80e23751ecc50c1fa5604f67be4b826d5b417Misha Brukman std::cout << '\n'; 5405e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner } 5415e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 542aed98fa8861a28e5f7ba7c0659e106f2a441e9ffChris Lattner if (!BugpointIsInterrupted && 543aed98fa8861a28e5f7ba7c0659e106f2a441e9ffChris Lattner ExtractBlocks(BD, TestFn, MiscompiledFunctions)) { 5445e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // Okay, we extracted some blocks and the problem still appears. See if we 5455e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // can eliminate some of the created functions from being candidates. 5465e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner 5475e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // Block extraction can introduce functions with the same name (foo_code). 5485e783ab0b5fc3407ec59f1a598fdb9ef3b96b287Chris Lattner // Make sure to disambiguate the symbols so that when the program is split 54936ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner // apart that we can link it back together again. 55036ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner DisambiguateGlobalSymbols(BD.getProgram()); 55136ee07ff9d26a2c6ebf9faf9ba90923644db29c5Chris Lattner 552a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner // Do the reduction... 553b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner ReduceMiscompilingFunctions(BD, TestFn).reduceList(MiscompiledFunctions); 5543da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 555a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner std::cout << "\n*** The following function" 556a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner << (MiscompiledFunctions.size() == 1 ? " is" : "s are") 557a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner << " being miscompiled: "; 558a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner PrintFunctionList(MiscompiledFunctions); 559eed80e23751ecc50c1fa5604f67be4b826d5b417Misha Brukman std::cout << '\n'; 560a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner } 561a1cf1c8c87f10f12343ff6ae75f332390e7205abChris Lattner 562b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner return MiscompiledFunctions; 563b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner} 564b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner 565a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner/// TestOptimizer - This is the predicate function used to check to see if the 566a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner/// "Test" portion of the program is misoptimized. If so, return true. In any 567a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner/// case, both module arguments are deleted. 5688c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 569b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattnerstatic bool TestOptimizer(BugDriver &BD, Module *Test, Module *Safe) { 570b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner // Run the optimization passes on ToOptimize, producing a transformed version 571b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner // of the functions being tested. 572b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner std::cout << " Optimizing functions being tested: "; 573b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner Module *Optimized = BD.runPassesOn(Test, BD.getPassesToRun(), 574b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner /*AutoDebugCrashes*/true); 575b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner std::cout << "done.\n"; 576b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner delete Test; 577b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner 578b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner std::cout << " Checking to see if the merged program executes correctly: "; 5792423db0e8577e769ac5ad4e567808e43daf37945Chris Lattner bool Broken = TestMergedProgram(BD, Optimized, Safe, true); 580b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner std::cout << (Broken ? " nope.\n" : " yup.\n"); 581b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner return Broken; 582b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner} 583b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner 584b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner 585b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner/// debugMiscompilation - This method is used when the passes selected are not 586b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner/// crashing, but the generated output is semantically different from the 587b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner/// input. 588b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner/// 589b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattnerbool BugDriver::debugMiscompilation() { 590b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner // Make sure something was miscompiled... 591f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner if (!BugpointIsInterrupted) 592f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner if (!ReduceMiscompilingPasses(*this).reduceList(PassesToRun)) { 593f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner std::cerr << "*** Optimized program matches reference output! No problem" 594f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner << " detected...\nbugpoint can't help you with your problem!\n"; 595f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner return false; 596f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner } 597b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner 598b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner std::cout << "\n*** Found miscompiling pass" 599b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner << (getPassesToRun().size() == 1 ? "" : "es") << ": " 600eed80e23751ecc50c1fa5604f67be4b826d5b417Misha Brukman << getPassesString(getPassesToRun()) << '\n'; 601b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner EmitProgressBytecode("passinput"); 602b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner 603b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner std::vector<Function*> MiscompiledFunctions = 604b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner DebugAMiscompilation(*this, TestOptimizer); 605b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner 606640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner // Output a bunch of bytecode files for the user... 607be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner std::cout << "Outputting reduced bytecode files which expose the problem:\n"; 608efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner Module *ToNotOptimize = CloneModule(getProgram()); 609efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner Module *ToOptimize = SplitFunctionsOutOfModule(ToNotOptimize, 610efdc0b505712d1ca4460def27e51c430f033d58dChris Lattner MiscompiledFunctions); 611be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner 612be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner std::cout << " Non-optimized portion: "; 613b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner ToNotOptimize = swapProgramIn(ToNotOptimize); 614be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner EmitProgressBytecode("tonotoptimize", true); 615be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner setNewProgram(ToNotOptimize); // Delete hacked module. 6163da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 617be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner std::cout << " Portion that is input to optimizer: "; 618b15825b0a29e527b361b63a6e41aff5fdb8fdd5aChris Lattner ToOptimize = swapProgramIn(ToOptimize); 619be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner EmitProgressBytecode("tooptimize"); 620be21ca54e08339ede5dd4bbb882182d22e274988Chris Lattner setNewProgram(ToOptimize); // Delete hacked module. 6214a10645c70199c8d8567fbc46312158c419720abChris Lattner 6224a10645c70199c8d8567fbc46312158c419720abChris Lattner return false; 6234a10645c70199c8d8567fbc46312158c419720abChris Lattner} 624d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 625a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner/// CleanupAndPrepareModules - Get the specified modules ready for code 626a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner/// generator testing. 6278c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 628a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattnerstatic void CleanupAndPrepareModules(BugDriver &BD, Module *&Test, 629a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner Module *Safe) { 630a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Clean up the modules, removing extra cruft that we don't need anymore... 631a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner Test = BD.performFinalCleanups(Test); 632a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 633a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // If we are executing the JIT, we have several nasty issues to take care of. 634a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner if (!BD.isExecutingJIT()) return; 635a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 636a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // First, if the main function is in the Safe module, we must add a stub to 637a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // the Test module to call into it. Thus, we create a new function `main' 638a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // which just calls the old one. 639a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner if (Function *oldMain = Safe->getNamedFunction("main")) 6405cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer if (!oldMain->isDeclaration()) { 641a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Rename it 642a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner oldMain->setName("llvm_bugpoint_old_main"); 643a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Create a NEW `main' function with same type in the test module. 6443da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman Function *newMain = new Function(oldMain->getFunctionType(), 645a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner GlobalValue::ExternalLinkage, 646a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner "main", Test); 647a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Create an `oldmain' prototype in the test module, which will 648a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // corresponds to the real main function in the same module. 6493da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman Function *oldMainProto = new Function(oldMain->getFunctionType(), 650a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner GlobalValue::ExternalLinkage, 651a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner oldMain->getName(), Test); 652a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Set up and remember the argument list for the main function. 653a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::vector<Value*> args; 6545a1c58d0094ff16dcd103f3752046d426ad5dd2cAlkis Evlogimenos for (Function::arg_iterator 6555a1c58d0094ff16dcd103f3752046d426ad5dd2cAlkis Evlogimenos I = newMain->arg_begin(), E = newMain->arg_end(), 6565a1c58d0094ff16dcd103f3752046d426ad5dd2cAlkis Evlogimenos OI = oldMain->arg_begin(); I != E; ++I, ++OI) { 657a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner I->setName(OI->getName()); // Copy argument names from oldMain 658a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner args.push_back(I); 659a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 660a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 661a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Call the old main function and return its result 662a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner BasicBlock *BB = new BasicBlock("entry", newMain); 663fa1af1344910ee975f50ffdddf605c26f80ef016Chris Lattner CallInst *call = new CallInst(oldMainProto, args, "", BB); 6643da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 665a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // If the type of old function wasn't void, return value of call 666fa1af1344910ee975f50ffdddf605c26f80ef016Chris Lattner new ReturnInst(call, BB); 667a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 668a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 669a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // The second nasty issue we must deal with in the JIT is that the Safe 670a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // module cannot directly reference any functions defined in the test 671a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // module. Instead, we use a JIT API call to dynamically resolve the 672a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // symbol. 6733da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 674a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Add the resolver to the Safe module. 675a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Prototype: void *getPointerToNamedFunction(const char* Name) 6762db43c864e8372823d961d961ca520ed20edca82Chris Lattner Constant *resolverFunc = 677a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner Safe->getOrInsertFunction("getPointerToNamedFunction", 67871d2ec9e6d20bd8701471bc6e6db620838ce3539Reid Spencer PointerType::get(Type::Int8Ty), 67971d2ec9e6d20bd8701471bc6e6db620838ce3539Reid Spencer PointerType::get(Type::Int8Ty), (Type *)0); 6803da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman 681a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Use the function we just added to get addresses of functions we need. 682dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman for (Module::iterator F = Safe->begin(), E = Safe->end(); F != E; ++F) { 6835cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer if (F->isDeclaration() && !F->use_empty() && &*F != resolverFunc && 684a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner F->getIntrinsicID() == 0 /* ignore intrinsics */) { 685f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner Function *TestFn = Test->getNamedFunction(F->getName()); 686a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 687a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Don't forward functions which are external in the test module too. 6885cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer if (TestFn && !TestFn->isDeclaration()) { 689a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // 1. Add a string constant with its name to the global file 690a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner Constant *InitArray = ConstantArray::get(F->getName()); 691a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner GlobalVariable *funcName = 692a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner new GlobalVariable(InitArray->getType(), true /*isConstant*/, 6933da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman GlobalValue::InternalLinkage, InitArray, 694a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner F->getName() + "_name", Safe); 695a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 696a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // 2. Use `GetElementPtr *funcName, 0, 0' to convert the string to an 697a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // sbyte* so it matches the signature of the resolver function. 698a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 699a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // GetElementPtr *funcName, ulong 0, ulong 0 70071d2ec9e6d20bd8701471bc6e6db620838ce3539Reid Spencer std::vector<Constant*> GEPargs(2,Constant::getNullValue(Type::Int32Ty)); 701a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner Value *GEP = 702518310cb0d136906ff0a99d7a24cb460794de5bfReid Spencer ConstantExpr::getGetElementPtr(funcName, GEPargs); 703a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::vector<Value*> ResolverArgs; 704a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner ResolverArgs.push_back(GEP); 705a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 706de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman // Rewrite uses of F in global initializers, etc. to uses of a wrapper 707de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman // function that dynamically resolves the calls to F via our JIT API 708a3efca16f2688981672deeb718909cf6acbe474eChris Lattner if (!F->use_empty()) { 709a3efca16f2688981672deeb718909cf6acbe474eChris Lattner // Create a new global to hold the cached function pointer. 710a3efca16f2688981672deeb718909cf6acbe474eChris Lattner Constant *NullPtr = ConstantPointerNull::get(F->getType()); 711a3efca16f2688981672deeb718909cf6acbe474eChris Lattner GlobalVariable *Cache = 712a3efca16f2688981672deeb718909cf6acbe474eChris Lattner new GlobalVariable(F->getType(), false,GlobalValue::InternalLinkage, 713a3efca16f2688981672deeb718909cf6acbe474eChris Lattner NullPtr,F->getName()+".fpcache", F->getParent()); 71400b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 715de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman // Construct a new stub function that will re-route calls to F 716dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman const FunctionType *FuncTy = F->getFunctionType(); 717de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman Function *FuncWrapper = new Function(FuncTy, 718de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman GlobalValue::InternalLinkage, 719dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman F->getName() + "_wrapper", 720dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman F->getParent()); 721a3efca16f2688981672deeb718909cf6acbe474eChris Lattner BasicBlock *EntryBB = new BasicBlock("entry", FuncWrapper); 722a3efca16f2688981672deeb718909cf6acbe474eChris Lattner BasicBlock *DoCallBB = new BasicBlock("usecache", FuncWrapper); 723a3efca16f2688981672deeb718909cf6acbe474eChris Lattner BasicBlock *LookupBB = new BasicBlock("lookupfp", FuncWrapper); 72400b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 725a3efca16f2688981672deeb718909cf6acbe474eChris Lattner // Check to see if we already looked up the value. 726a3efca16f2688981672deeb718909cf6acbe474eChris Lattner Value *CachedVal = new LoadInst(Cache, "fpcache", EntryBB); 727e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer Value *IsNull = new ICmpInst(ICmpInst::ICMP_EQ, CachedVal, 728e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer NullPtr, "isNull", EntryBB); 729a3efca16f2688981672deeb718909cf6acbe474eChris Lattner new BranchInst(LookupBB, DoCallBB, IsNull, EntryBB); 73000b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 731de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman // Resolve the call to function F via the JIT API: 732de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman // 733de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman // call resolver(GetElementPtr...) 734a3efca16f2688981672deeb718909cf6acbe474eChris Lattner CallInst *Resolver = new CallInst(resolverFunc, ResolverArgs, 735a3efca16f2688981672deeb718909cf6acbe474eChris Lattner "resolver", LookupBB); 736de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman // cast the result from the resolver to correctly-typed function 7373da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer CastInst *CastedResolver = new BitCastInst(Resolver, 7383da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer PointerType::get(F->getFunctionType()), "resolverCast", LookupBB); 7393da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer 740a3efca16f2688981672deeb718909cf6acbe474eChris Lattner // Save the value in our cache. 741a3efca16f2688981672deeb718909cf6acbe474eChris Lattner new StoreInst(CastedResolver, Cache, LookupBB); 742a3efca16f2688981672deeb718909cf6acbe474eChris Lattner new BranchInst(DoCallBB, LookupBB); 74300b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 744a3efca16f2688981672deeb718909cf6acbe474eChris Lattner PHINode *FuncPtr = new PHINode(NullPtr->getType(), "fp", DoCallBB); 745a3efca16f2688981672deeb718909cf6acbe474eChris Lattner FuncPtr->addIncoming(CastedResolver, LookupBB); 746a3efca16f2688981672deeb718909cf6acbe474eChris Lattner FuncPtr->addIncoming(CachedVal, EntryBB); 74700b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 748a3efca16f2688981672deeb718909cf6acbe474eChris Lattner // Save the argument list. 749dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman std::vector<Value*> Args; 7505a1c58d0094ff16dcd103f3752046d426ad5dd2cAlkis Evlogimenos for (Function::arg_iterator i = FuncWrapper->arg_begin(), 7515a1c58d0094ff16dcd103f3752046d426ad5dd2cAlkis Evlogimenos e = FuncWrapper->arg_end(); i != e; ++i) 752dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman Args.push_back(i); 753dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman 754dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman // Pass on the arguments to the real function, return its result 755dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman if (F->getReturnType() == Type::VoidTy) { 7563ed469ccd7b028a030b550d84b7336d146f5d8faReid Spencer new CallInst(FuncPtr, Args, "", DoCallBB); 757a3efca16f2688981672deeb718909cf6acbe474eChris Lattner new ReturnInst(DoCallBB); 758dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman } else { 759a3efca16f2688981672deeb718909cf6acbe474eChris Lattner CallInst *Call = new CallInst(FuncPtr, Args, "retval", DoCallBB); 760a3efca16f2688981672deeb718909cf6acbe474eChris Lattner new ReturnInst(Call, DoCallBB); 761dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman } 76200b16889ab461b7ecef1c91ade101186b7f1fce2Jeff Cohen 763de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman // Use the wrapper function instead of the old function 764de4803d0af6824a2d5da41fa09b512084c73ce34Misha Brukman F->replaceAllUsesWith(FuncWrapper); 765dc7fef83dcab053f86119d00478e6b008166fcf5Misha Brukman } 766a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 767a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 768a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 769a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 770a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner if (verifyModule(*Test) || verifyModule(*Safe)) { 771a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::cerr << "Bugpoint has a bug, which corrupted a module!!\n"; 772a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner abort(); 773a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 774a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner} 775a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 776a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 777a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 778a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner/// TestCodeGenerator - This is the predicate function used to check to see if 779a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner/// the "Test" portion of the program is miscompiled by the code generator under 780a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner/// test. If so, return true. In any case, both module arguments are deleted. 7818c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 782a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattnerstatic bool TestCodeGenerator(BugDriver &BD, Module *Test, Module *Safe) { 783a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner CleanupAndPrepareModules(BD, Test, Safe); 784a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 78597182985d530dbef488696c95a39c14fe56c995bReid Spencer sys::Path TestModuleBC("bugpoint.test.bc"); 78651c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer std::string ErrMsg; 78751c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer if (TestModuleBC.makeUnique(true, &ErrMsg)) { 78851c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer std::cerr << BD.getToolName() << "Error making unique filename: " 78951c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer << ErrMsg << "\n"; 79051c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer exit(1); 79151c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer } 79297182985d530dbef488696c95a39c14fe56c995bReid Spencer if (BD.writeProgramToFile(TestModuleBC.toString(), Test)) { 793a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::cerr << "Error writing bytecode to `" << TestModuleBC << "'\nExiting."; 794a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner exit(1); 795a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 796a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner delete Test; 797a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 798a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Make the shared library 79997182985d530dbef488696c95a39c14fe56c995bReid Spencer sys::Path SafeModuleBC("bugpoint.safe.bc"); 80051c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer if (SafeModuleBC.makeUnique(true, &ErrMsg)) { 80151c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer std::cerr << BD.getToolName() << "Error making unique filename: " 80251c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer << ErrMsg << "\n"; 80351c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer exit(1); 80451c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer } 805a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 80697182985d530dbef488696c95a39c14fe56c995bReid Spencer if (BD.writeProgramToFile(SafeModuleBC.toString(), Safe)) { 807a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::cerr << "Error writing bytecode to `" << SafeModuleBC << "'\nExiting."; 808a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner exit(1); 809a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 81097182985d530dbef488696c95a39c14fe56c995bReid Spencer std::string SharedObject = BD.compileSharedObject(SafeModuleBC.toString()); 811a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner delete Safe; 812a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 813a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Run the code generator on the `Test' code, loading the shared library. 814a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // The function returns whether or not the new output differs from reference. 81597182985d530dbef488696c95a39c14fe56c995bReid Spencer int Result = BD.diffProgram(TestModuleBC.toString(), SharedObject, false); 816a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 817a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner if (Result) 818a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::cerr << ": still failing!\n"; 819a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner else 820a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::cerr << ": didn't fail.\n"; 821a229c5cce75209047db32c6039aa0b0fd481f049Reid Spencer TestModuleBC.eraseFromDisk(); 822a229c5cce75209047db32c6039aa0b0fd481f049Reid Spencer SafeModuleBC.eraseFromDisk(); 823a229c5cce75209047db32c6039aa0b0fd481f049Reid Spencer sys::Path(SharedObject).eraseFromDisk(); 824a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 825a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner return Result; 826a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner} 827a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 828a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 8298c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// debugCodeGenerator - debug errors in LLC, LLI, or CBE. 8308c194eaa0577a207bb1ea91bf2c2a5e664fce9eeMisha Brukman/// 831a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattnerbool BugDriver::debugCodeGenerator() { 832a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner if ((void*)cbe == (void*)Interpreter) { 833a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::string Result = executeProgramWithCBE("bugpoint.cbe.out"); 834a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::cout << "\n*** The C backend cannot match the reference diff, but it " 835a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner << "is used as the 'known good'\n code generator, so I can't" 836a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner << " debug it. Perhaps you have a front-end problem?\n As a" 837a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner << " sanity check, I left the result of executing the program " 838a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner << "with the C backend\n in this file for you: '" 839a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner << Result << "'.\n"; 840a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner return true; 841a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 842a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 843a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner DisambiguateGlobalSymbols(Program); 844a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 845a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::vector<Function*> Funcs = DebugAMiscompilation(*this, TestCodeGenerator); 846a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 847a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Split the module into the two halves of the program we want. 848a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner Module *ToNotCodeGen = CloneModule(getProgram()); 849a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner Module *ToCodeGen = SplitFunctionsOutOfModule(ToNotCodeGen, Funcs); 850a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 851a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Condition the modules 852a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner CleanupAndPrepareModules(*this, ToCodeGen, ToNotCodeGen); 853a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 85497182985d530dbef488696c95a39c14fe56c995bReid Spencer sys::Path TestModuleBC("bugpoint.test.bc"); 85551c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer std::string ErrMsg; 85651c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer if (TestModuleBC.makeUnique(true, &ErrMsg)) { 85751c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer std::cerr << getToolName() << "Error making unique filename: " 85851c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer << ErrMsg << "\n"; 85951c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer exit(1); 86051c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer } 86197182985d530dbef488696c95a39c14fe56c995bReid Spencer 86297182985d530dbef488696c95a39c14fe56c995bReid Spencer if (writeProgramToFile(TestModuleBC.toString(), ToCodeGen)) { 863a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::cerr << "Error writing bytecode to `" << TestModuleBC << "'\nExiting."; 864a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner exit(1); 865a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 866a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner delete ToCodeGen; 867a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 868a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner // Make the shared library 86997182985d530dbef488696c95a39c14fe56c995bReid Spencer sys::Path SafeModuleBC("bugpoint.safe.bc"); 87051c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer if (SafeModuleBC.makeUnique(true, &ErrMsg)) { 87151c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer std::cerr << getToolName() << "Error making unique filename: " 87251c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer << ErrMsg << "\n"; 87351c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer exit(1); 87451c5a286bae5ad27ddc49602f44b7ea7253a4cc9Reid Spencer } 87597182985d530dbef488696c95a39c14fe56c995bReid Spencer 87697182985d530dbef488696c95a39c14fe56c995bReid Spencer if (writeProgramToFile(SafeModuleBC.toString(), ToNotCodeGen)) { 877a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::cerr << "Error writing bytecode to `" << SafeModuleBC << "'\nExiting."; 878a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner exit(1); 879a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 88097182985d530dbef488696c95a39c14fe56c995bReid Spencer std::string SharedObject = compileSharedObject(SafeModuleBC.toString()); 881a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner delete ToNotCodeGen; 882a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 883a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::cout << "You can reproduce the problem with the command line: \n"; 884a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner if (isExecutingJIT()) { 885a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::cout << " lli -load " << SharedObject << " " << TestModuleBC; 886a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } else { 88759615f0f85e2ac99e012cb81934d002faebd405aChris Lattner std::cout << " llc -f " << TestModuleBC << " -o " << TestModuleBC<< ".s\n"; 888a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::cout << " gcc " << SharedObject << " " << TestModuleBC 88959615f0f85e2ac99e012cb81934d002faebd405aChris Lattner << ".s -o " << TestModuleBC << ".exe"; 89059615f0f85e2ac99e012cb81934d002faebd405aChris Lattner#if defined (HAVE_LINK_R) 8913bd5fac76f4fcc229d054ef46d5040de9abaa9f4Chris Lattner std::cout << " -Wl,-R."; 89259615f0f85e2ac99e012cb81934d002faebd405aChris Lattner#endif 89359615f0f85e2ac99e012cb81934d002faebd405aChris Lattner std::cout << "\n"; 894a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::cout << " " << TestModuleBC << ".exe"; 895a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner } 896a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner for (unsigned i=0, e = InputArgv.size(); i != e; ++i) 897a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::cout << " " << InputArgv[i]; 898eed80e23751ecc50c1fa5604f67be4b826d5b417Misha Brukman std::cout << '\n'; 899a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner std::cout << "The shared object was created with:\n llc -march=c " 900a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner << SafeModuleBC << " -o temporary.c\n" 901a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner << " gcc -xc temporary.c -O2 -o " << SharedObject 902a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner#if defined(sparc) || defined(__sparc__) || defined(__sparcv9) 903a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner << " -G" // Compile a shared library, `-G' for Sparc 904a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner#else 905a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner << " -shared" // `-shared' for Linux/X86, maybe others 906a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner#endif 907a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner << " -fno-strict-aliasing\n"; 908a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner 909a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner return false; 910a57d86b436549503a7f96c5266444e022bdbaf55Chris Lattner} 911