1943211187d72eb27d4f54de9ac7e5786e72b38e1Chris Lattner//===- bugpoint.cpp - The LLVM Bugpoint utility ---------------------------===// 23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// The LLVM Compiler Infrastructure 47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// 521c62da287237d39d0d95004881ea4baae3be6daChris Lattner// This file is distributed under the University of Illinois Open Source 621c62da287237d39d0d95004881ea4baae3be6daChris Lattner// License. See LICENSE.TXT for details. 73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 87c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//===----------------------------------------------------------------------===// 9afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner// 10afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner// This program is an automated compiler debugger tool. It is used to narrow 11afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner// down miscompilations and crash problems to a specific pass in the compiler, 12afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner// and the specific Module or Function input that is causing the problem. 13afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner// 14afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner//===----------------------------------------------------------------------===// 15afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner 16afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner#include "BugDriver.h" 17f1b20d8620b05abaa52f40ac6d21f839b265fb00Chris Lattner#include "ToolRunner.h" 1862c5105adc4f51c6dd07be3471ea2462c8e00c82Reid Spencer#include "llvm/LinkAllPasses.h" 198b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson#include "llvm/LLVMContext.h" 20c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola#include "llvm/PassManager.h" 21afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner#include "llvm/Support/PassNameParser.h" 22551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/CommandLine.h" 23c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattner#include "llvm/Support/ManagedStatic.h" 24551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/PluginLoader.h" 25cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner#include "llvm/Support/PrettyStackTrace.h" 261f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Process.h" 271f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Signals.h" 281f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Valgrind.h" 29e3f056154537194afd06c1940de72d4b6f2f4147Reid Spencer#include "llvm/LinkAllVMCore.h" 303d453ac1317f910b0589d87c061f056be29e36cdRafael Espindola#include "llvm/Transforms/IPO/PassManagerBuilder.h" 31bc8d5f11e7c34e4dff86b8cbcfa5f8be70ff69ddDevang Patel 323f84a4537dbad2d11adcadbfc6fe7a93c9b3526cDevang Patel//Enable this macro to debug bugpoint itself. 333f84a4537dbad2d11adcadbfc6fe7a93c9b3526cDevang Patel//#define DEBUG_BUGPOINT 1 34bc8d5f11e7c34e4dff86b8cbcfa5f8be70ff69ddDevang Patel 35d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm; 36d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 376a3f31cb707972ebde1e45a61fa8f5bcff132ebaPatrick Jenkinsstatic cl::opt<bool> 3839564499c4b3d19af6e42f7718317443808e714fDan GohmanFindBugs("find-bugs", cl::desc("Run many different optimization sequences " 396a3f31cb707972ebde1e45a61fa8f5bcff132ebaPatrick Jenkins "on program to find bugs"), cl::init(false)); 40c4bb052ecccfafa0ffa928d0b061db35734ee2eeReid Spencer 41afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattnerstatic cl::list<std::string> 42afade9294af43c6b947b9aeaa1555883d5f853e3Chris LattnerInputFilenames(cl::Positional, cl::OneOrMore, 43afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner cl::desc("<input llvm ll/bc files>")); 44afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner 459686ae7f4ea5f19ce77e31e64e0916db41a82662Chris Lattnerstatic cl::opt<unsigned> 469686ae7f4ea5f19ce77e31e64e0916db41a82662Chris LattnerTimeoutValue("timeout", cl::init(300), cl::value_desc("seconds"), 479686ae7f4ea5f19ce77e31e64e0916db41a82662Chris Lattner cl::desc("Number of seconds program is allowed to run before it " 489686ae7f4ea5f19ce77e31e64e0916db41a82662Chris Lattner "is killed (default is 300s), 0 disables timeout")); 499686ae7f4ea5f19ce77e31e64e0916db41a82662Chris Lattner 50c3e6859d8dc9014fee8023497153add9a2148f22Jeffrey Yasskinstatic cl::opt<int> 51c3e6859d8dc9014fee8023497153add9a2148f22Jeffrey YasskinMemoryLimit("mlimit", cl::init(-1), cl::value_desc("MBytes"), 52c3e6859d8dc9014fee8023497153add9a2148f22Jeffrey Yasskin cl::desc("Maximum amount of memory to use. 0 disables check." 53c3e6859d8dc9014fee8023497153add9a2148f22Jeffrey Yasskin " Defaults to 100MB (800MB under valgrind).")); 54c3e6859d8dc9014fee8023497153add9a2148f22Jeffrey Yasskin 55c3e6859d8dc9014fee8023497153add9a2148f22Jeffrey Yasskinstatic cl::opt<bool> 56c3e6859d8dc9014fee8023497153add9a2148f22Jeffrey YasskinUseValgrind("enable-valgrind", 57c3e6859d8dc9014fee8023497153add9a2148f22Jeffrey Yasskin cl::desc("Run optimizations through valgrind")); 589ba8a76f8baaa1092d60ccfbc04e7efdc207c98fAnton Korobeynikov 59afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner// The AnalysesList is automatically populated with registered Passes by the 60afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner// PassNameParser. 61afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner// 628be3291f5942e3ae4a5d66c480e7aabe2f771031Owen Andersonstatic cl::list<const PassInfo*, bool, PassNameParser> 635073336cd4da5df4ae13a167582d1dc90f32e4e0Misha BrukmanPassList(cl::desc("Passes available:"), cl::ZeroOrMore); 64afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner 651488670076908261af145778c23cb9aca30904e5Daniel Dunbarstatic cl::opt<bool> 661488670076908261af145778c23cb9aca30904e5Daniel DunbarStandardCompileOpts("std-compile-opts", 671488670076908261af145778c23cb9aca30904e5Daniel Dunbar cl::desc("Include the standard compile time optimizations")); 681488670076908261af145778c23cb9aca30904e5Daniel Dunbar 691488670076908261af145778c23cb9aca30904e5Daniel Dunbarstatic cl::opt<bool> 701488670076908261af145778c23cb9aca30904e5Daniel DunbarStandardLinkOpts("std-link-opts", 711488670076908261af145778c23cb9aca30904e5Daniel Dunbar cl::desc("Include the standard link time optimizations")); 721488670076908261af145778c23cb9aca30904e5Daniel Dunbar 73be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedmanstatic cl::opt<bool> 74be2d1239a40db5efd25e3f306ae15390d9db35c6Eli FriedmanOptLevelO1("O1", 75be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman cl::desc("Optimization level 1. Similar to llvm-gcc -O1")); 76be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman 77be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedmanstatic cl::opt<bool> 78be2d1239a40db5efd25e3f306ae15390d9db35c6Eli FriedmanOptLevelO2("O2", 79be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman cl::desc("Optimization level 2. Similar to llvm-gcc -O2")); 80be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman 81be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedmanstatic cl::opt<bool> 82be2d1239a40db5efd25e3f306ae15390d9db35c6Eli FriedmanOptLevelO3("O3", 83be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman cl::desc("Optimization level 3. Similar to llvm-gcc -O3")); 84be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman 85ca7409664273fed4b473127295af3af0836b3077Daniel Dunbarstatic cl::opt<std::string> 86ca7409664273fed4b473127295af3af0836b3077Daniel DunbarOverrideTriple("mtriple", cl::desc("Override target triple for module")); 87ca7409664273fed4b473127295af3af0836b3077Daniel Dunbar 88f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner/// BugpointIsInterrupted - Set to true when the user presses ctrl-c. 89f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattnerbool llvm::BugpointIsInterrupted = false; 90f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner 91bc8d5f11e7c34e4dff86b8cbcfa5f8be70ff69ddDevang Patel#ifndef DEBUG_BUGPOINT 92f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattnerstatic void BugpointInterruptFunction() { 93f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner BugpointIsInterrupted = true; 94f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner} 95bc8d5f11e7c34e4dff86b8cbcfa5f8be70ff69ddDevang Patel#endif 96f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner 971488670076908261af145778c23cb9aca30904e5Daniel Dunbar// Hack to capture a pass list. 981488670076908261af145778c23cb9aca30904e5Daniel Dunbarnamespace { 99be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman class AddToDriver : public FunctionPassManager { 1001488670076908261af145778c23cb9aca30904e5Daniel Dunbar BugDriver &D; 1011488670076908261af145778c23cb9aca30904e5Daniel Dunbar public: 102be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman AddToDriver(BugDriver &_D) : FunctionPassManager(0), D(_D) {} 1031488670076908261af145778c23cb9aca30904e5Daniel Dunbar 1041488670076908261af145778c23cb9aca30904e5Daniel Dunbar virtual void add(Pass *P) { 10590c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson const void *ID = P->getPassID(); 10690c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson const PassInfo *PI = PassRegistry::getPassRegistry()->getPassInfo(ID); 1078261dfed05e32302469ef707cc881fed2c31f85fRafael Espindola D.addPass(PI->getPassArgument()); 1081488670076908261af145778c23cb9aca30904e5Daniel Dunbar } 1091488670076908261af145778c23cb9aca30904e5Daniel Dunbar }; 1101488670076908261af145778c23cb9aca30904e5Daniel Dunbar} 1111488670076908261af145778c23cb9aca30904e5Daniel Dunbar 112afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattnerint main(int argc, char **argv) { 113bc8d5f11e7c34e4dff86b8cbcfa5f8be70ff69ddDevang Patel#ifndef DEBUG_BUGPOINT 114cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner llvm::sys::PrintStackTraceOnErrorSignal(); 115cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner llvm::PrettyStackTraceProgram X(argc, argv); 116cc14d25dd99e891c586bd56aa41796abbe4ac3d8Chris Lattner llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 117bc8d5f11e7c34e4dff86b8cbcfa5f8be70ff69ddDevang Patel#endif 118081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson 119081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson // Initialize passes 120081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson PassRegistry &Registry = *PassRegistry::getPassRegistry(); 121081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeCore(Registry); 122081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeScalarOpts(Registry); 1230ae2510ea00454af29c6fc3f4b012e35d5f5d431Hal Finkel initializeVectorization(Registry); 124081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeIPO(Registry); 125081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeAnalysis(Registry); 126081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeIPA(Registry); 127081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeTransformUtils(Registry); 128081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeInstCombine(Registry); 129081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeInstrumentation(Registry); 130081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeTarget(Registry); 131081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson 132670406d269283c8a7045a5b55c78049222cd3a07Chris Lattner cl::ParseCommandLineOptions(argc, argv, 13382a13c9c4811e40d0ff858c508cb54d672ee926eDan Gohman "LLVM automatic testcase reducer. See\nhttp://" 1343a4baf1951dd1767c5b6380f5c5f3739929f8215Chris Lattner "llvm.org/cmds/bugpoint.html" 135670406d269283c8a7045a5b55c78049222cd3a07Chris Lattner " for more information.\n"); 136bc8d5f11e7c34e4dff86b8cbcfa5f8be70ff69ddDevang Patel#ifndef DEBUG_BUGPOINT 137f9aaae06cd2109082cda2b09ef3f23e0e1cff47bChris Lattner sys::SetInterruptFunction(BugpointInterruptFunction); 138bc8d5f11e7c34e4dff86b8cbcfa5f8be70ff69ddDevang Patel#endif 1398b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson 1400d7c695c74ae6d5f68cc07378c17491915e607d3Owen Anderson LLVMContext& Context = getGlobalContext(); 141ca7409664273fed4b473127295af3af0836b3077Daniel Dunbar // If we have an override, set it and then track the triple we want Modules 142ca7409664273fed4b473127295af3af0836b3077Daniel Dunbar // to use. 143306110845ade031f56bf50245357d6e18a929659Chris Lattner if (!OverrideTriple.empty()) { 14475ebbceeeda1e7a78efe1848bb90e034f0c6ba61Duncan Sands TargetTriple.setTriple(Triple::normalize(OverrideTriple)); 14575ebbceeeda1e7a78efe1848bb90e034f0c6ba61Duncan Sands outs() << "Override triple set to '" << TargetTriple.getTriple() << "'\n"; 146306110845ade031f56bf50245357d6e18a929659Chris Lattner } 147ca7409664273fed4b473127295af3af0836b3077Daniel Dunbar 148c3e6859d8dc9014fee8023497153add9a2148f22Jeffrey Yasskin if (MemoryLimit < 0) { 149c3e6859d8dc9014fee8023497153add9a2148f22Jeffrey Yasskin // Set the default MemoryLimit. Be sure to update the flag's description if 150c3e6859d8dc9014fee8023497153add9a2148f22Jeffrey Yasskin // you change this. 151c3e6859d8dc9014fee8023497153add9a2148f22Jeffrey Yasskin if (sys::RunningOnValgrind() || UseValgrind) 152c3e6859d8dc9014fee8023497153add9a2148f22Jeffrey Yasskin MemoryLimit = 800; 153c3e6859d8dc9014fee8023497153add9a2148f22Jeffrey Yasskin else 154c3e6859d8dc9014fee8023497153add9a2148f22Jeffrey Yasskin MemoryLimit = 100; 155c3e6859d8dc9014fee8023497153add9a2148f22Jeffrey Yasskin } 156c3e6859d8dc9014fee8023497153add9a2148f22Jeffrey Yasskin 1577f99f74b7fc298dad4c61c15b064dc951d2b3cbbRafael Espindola BugDriver D(argv[0], FindBugs, TimeoutValue, MemoryLimit, 158c3e6859d8dc9014fee8023497153add9a2148f22Jeffrey Yasskin UseValgrind, Context); 159afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner if (D.addSources(InputFilenames)) return 1; 160ca7409664273fed4b473127295af3af0836b3077Daniel Dunbar 1611488670076908261af145778c23cb9aca30904e5Daniel Dunbar AddToDriver PM(D); 1621488670076908261af145778c23cb9aca30904e5Daniel Dunbar if (StandardCompileOpts) { 163817a01ffb24504f5b00fdac9d79aa034c918f28bChris Lattner PassManagerBuilder Builder; 164817a01ffb24504f5b00fdac9d79aa034c918f28bChris Lattner Builder.OptLevel = 3; 165817a01ffb24504f5b00fdac9d79aa034c918f28bChris Lattner Builder.Inliner = createFunctionInliningPass(); 166817a01ffb24504f5b00fdac9d79aa034c918f28bChris Lattner Builder.populateModulePassManager(PM); 1671488670076908261af145778c23cb9aca30904e5Daniel Dunbar } 1681488670076908261af145778c23cb9aca30904e5Daniel Dunbar 169817a01ffb24504f5b00fdac9d79aa034c918f28bChris Lattner if (StandardLinkOpts) { 170817a01ffb24504f5b00fdac9d79aa034c918f28bChris Lattner PassManagerBuilder Builder; 171817a01ffb24504f5b00fdac9d79aa034c918f28bChris Lattner Builder.populateLTOPassManager(PM, /*Internalize=*/true, 172817a01ffb24504f5b00fdac9d79aa034c918f28bChris Lattner /*RunInliner=*/true); 173817a01ffb24504f5b00fdac9d79aa034c918f28bChris Lattner } 1741488670076908261af145778c23cb9aca30904e5Daniel Dunbar 175be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman if (OptLevelO1 || OptLevelO2 || OptLevelO3) { 176be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman PassManagerBuilder Builder; 177be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman if (OptLevelO1) 178be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman Builder.Inliner = createAlwaysInlinerPass(); 179be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman else if (OptLevelO2) 180be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman Builder.Inliner = createFunctionInliningPass(225); 181be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman else 182be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman Builder.Inliner = createFunctionInliningPass(275); 183be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman 184be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman // Note that although clang/llvm-gcc use two separate passmanagers 185be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman // here, it shouldn't normally make a difference. 186be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman Builder.populateFunctionPassManager(PM); 187be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman Builder.populateModulePassManager(PM); 188be2d1239a40db5efd25e3f306ae15390d9db35c6Eli Friedman } 1898261dfed05e32302469ef707cc881fed2c31f85fRafael Espindola 1908261dfed05e32302469ef707cc881fed2c31f85fRafael Espindola for (std::vector<const PassInfo*>::iterator I = PassList.begin(), 1918261dfed05e32302469ef707cc881fed2c31f85fRafael Espindola E = PassList.end(); 1928261dfed05e32302469ef707cc881fed2c31f85fRafael Espindola I != E; ++I) { 1938261dfed05e32302469ef707cc881fed2c31f85fRafael Espindola const PassInfo* PI = *I; 1948261dfed05e32302469ef707cc881fed2c31f85fRafael Espindola D.addPass(PI->getPassArgument()); 1958261dfed05e32302469ef707cc881fed2c31f85fRafael Espindola } 196afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner 19767b36e4a2fba4931747cad61979aa92d43002cccMisha Brukman // Bugpoint has the ability of generating a plethora of core files, so to 198551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer // avoid filling up the disk, we prevent it 199bc8d5f11e7c34e4dff86b8cbcfa5f8be70ff69ddDevang Patel#ifndef DEBUG_BUGPOINT 20051163306ab0c51f1103139200cadb8e3fa6bfd18Reid Spencer sys::Process::PreventCoreFiles(); 201bc8d5f11e7c34e4dff86b8cbcfa5f8be70ff69ddDevang Patel#endif 20267b36e4a2fba4931747cad61979aa92d43002cccMisha Brukman 20322ff748712b348300e51248339b6e8cf9b59e2c6Nick Lewycky std::string Error; 20422ff748712b348300e51248339b6e8cf9b59e2c6Nick Lewycky bool Failure = D.run(Error); 20522ff748712b348300e51248339b6e8cf9b59e2c6Nick Lewycky if (!Error.empty()) { 20622ff748712b348300e51248339b6e8cf9b59e2c6Nick Lewycky errs() << Error; 20722ff748712b348300e51248339b6e8cf9b59e2c6Nick Lewycky return 1; 20874d4527e4038bf0e9a0e11edf09adf80c38eed85Chris Lattner } 20922ff748712b348300e51248339b6e8cf9b59e2c6Nick Lewycky return Failure; 210afade9294af43c6b947b9aeaa1555883d5f853e3Chris Lattner} 211