bugpoint.cpp revision 263508
1250003Sadrian//===- bugpoint.cpp - The LLVM Bugpoint utility ---------------------------===// 2250003Sadrian// 3250003Sadrian// The LLVM Compiler Infrastructure 4250003Sadrian// 5250003Sadrian// This file is distributed under the University of Illinois Open Source 6250003Sadrian// License. See LICENSE.TXT for details. 7250003Sadrian// 8250003Sadrian//===----------------------------------------------------------------------===// 9250003Sadrian// 10250003Sadrian// This program is an automated compiler debugger tool. It is used to narrow 11250003Sadrian// down miscompilations and crash problems to a specific pass in the compiler, 12250003Sadrian// and the specific Module or Function input that is causing the problem. 13250003Sadrian// 14250003Sadrian//===----------------------------------------------------------------------===// 15250003Sadrian 16250003Sadrian#include "BugDriver.h" 17250003Sadrian#include "ToolRunner.h" 18250003Sadrian#include "llvm/IR/LLVMContext.h" 19250003Sadrian#include "llvm/LinkAllIR.h" 20250003Sadrian#include "llvm/LinkAllPasses.h" 21250003Sadrian#include "llvm/PassManager.h" 22250003Sadrian#include "llvm/Support/CommandLine.h" 23250003Sadrian#include "llvm/Support/ManagedStatic.h" 24250003Sadrian#include "llvm/Support/PassNameParser.h" 25250003Sadrian#include "llvm/Support/PluginLoader.h" 26250003Sadrian#include "llvm/Support/PrettyStackTrace.h" 27250003Sadrian#include "llvm/Support/Process.h" 28250003Sadrian#include "llvm/Support/Signals.h" 29250003Sadrian#include "llvm/Support/Valgrind.h" 30250003Sadrian#include "llvm/Transforms/IPO/PassManagerBuilder.h" 31250003Sadrian 32250003Sadrian//Enable this macro to debug bugpoint itself. 33250003Sadrian//#define DEBUG_BUGPOINT 1 34250003Sadrian 35250003Sadrianusing namespace llvm; 36250003Sadrian 37250003Sadrianstatic cl::opt<bool> 38250003SadrianFindBugs("find-bugs", cl::desc("Run many different optimization sequences " 39250003Sadrian "on program to find bugs"), cl::init(false)); 40250003Sadrian 41250003Sadrianstatic cl::list<std::string> 42250003SadrianInputFilenames(cl::Positional, cl::OneOrMore, 43250003Sadrian cl::desc("<input llvm ll/bc files>")); 44250003Sadrian 45250003Sadrianstatic cl::opt<unsigned> 46250003SadrianTimeoutValue("timeout", cl::init(300), cl::value_desc("seconds"), 47250003Sadrian cl::desc("Number of seconds program is allowed to run before it " 48250008Sadrian "is killed (default is 300s), 0 disables timeout")); 49250003Sadrian 50250003Sadrianstatic cl::opt<int> 51250003SadrianMemoryLimit("mlimit", cl::init(-1), cl::value_desc("MBytes"), 52250003Sadrian cl::desc("Maximum amount of memory to use. 0 disables check." 53250003Sadrian " Defaults to 300MB (800MB under valgrind).")); 54250003Sadrian 55250003Sadrianstatic cl::opt<bool> 56250003SadrianUseValgrind("enable-valgrind", 57250003Sadrian cl::desc("Run optimizations through valgrind")); 58250003Sadrian 59250003Sadrian// The AnalysesList is automatically populated with registered Passes by the 60250003Sadrian// PassNameParser. 61250003Sadrian// 62250003Sadrianstatic cl::list<const PassInfo*, bool, PassNameParser> 63250003SadrianPassList(cl::desc("Passes available:"), cl::ZeroOrMore); 64250003Sadrian 65250003Sadrianstatic cl::opt<bool> 66250003SadrianStandardCompileOpts("std-compile-opts", 67250003Sadrian cl::desc("Include the standard compile time optimizations")); 68250003Sadrian 69250003Sadrianstatic cl::opt<bool> 70250003SadrianStandardLinkOpts("std-link-opts", 71250003Sadrian cl::desc("Include the standard link time optimizations")); 72250003Sadrian 73250003Sadrianstatic cl::opt<bool> 74250003SadrianOptLevelO1("O1", 75250003Sadrian cl::desc("Optimization level 1. Similar to llvm-gcc -O1")); 76250003Sadrian 77250003Sadrianstatic cl::opt<bool> 78250003SadrianOptLevelO2("O2", 79250003Sadrian cl::desc("Optimization level 2. Similar to llvm-gcc -O2")); 80250003Sadrian 81250003Sadrianstatic cl::opt<bool> 82250003SadrianOptLevelO3("O3", 83250003Sadrian cl::desc("Optimization level 3. Similar to llvm-gcc -O3")); 84250003Sadrian 85250003Sadrianstatic cl::opt<std::string> 86250003SadrianOverrideTriple("mtriple", cl::desc("Override target triple for module")); 87250003Sadrian 88250003Sadrian/// BugpointIsInterrupted - Set to true when the user presses ctrl-c. 89250003Sadrianbool llvm::BugpointIsInterrupted = false; 90250003Sadrian 91250003Sadrian#ifndef DEBUG_BUGPOINT 92250003Sadrianstatic void BugpointInterruptFunction() { 93250003Sadrian BugpointIsInterrupted = true; 94250003Sadrian} 95250003Sadrian#endif 96250003Sadrian 97250003Sadrian// Hack to capture a pass list. 98250003Sadriannamespace { 99250003Sadrian class AddToDriver : public FunctionPassManager { 100250003Sadrian BugDriver &D; 101250003Sadrian public: 102250003Sadrian AddToDriver(BugDriver &_D) : FunctionPassManager(0), D(_D) {} 103250003Sadrian 104250003Sadrian virtual void add(Pass *P) { 105250003Sadrian const void *ID = P->getPassID(); 106250003Sadrian const PassInfo *PI = PassRegistry::getPassRegistry()->getPassInfo(ID); 107250003Sadrian D.addPass(PI->getPassArgument()); 108250003Sadrian } 109250003Sadrian }; 110250003Sadrian} 111250003Sadrian 112250003Sadrianint main(int argc, char **argv) { 113250003Sadrian#ifndef DEBUG_BUGPOINT 114250003Sadrian llvm::sys::PrintStackTraceOnErrorSignal(); 115250003Sadrian llvm::PrettyStackTraceProgram X(argc, argv); 116250003Sadrian llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 117250003Sadrian#endif 118250003Sadrian 119250003Sadrian // Initialize passes 120250003Sadrian PassRegistry &Registry = *PassRegistry::getPassRegistry(); 121250003Sadrian initializeCore(Registry); 122250003Sadrian initializeScalarOpts(Registry); 123250003Sadrian initializeObjCARCOpts(Registry); 124250003Sadrian initializeVectorization(Registry); 125250003Sadrian initializeIPO(Registry); 126250003Sadrian initializeAnalysis(Registry); 127250003Sadrian initializeIPA(Registry); 128250003Sadrian initializeTransformUtils(Registry); 129250003Sadrian initializeInstCombine(Registry); 130250003Sadrian initializeInstrumentation(Registry); 131250003Sadrian initializeTarget(Registry); 132250003Sadrian 133250003Sadrian cl::ParseCommandLineOptions(argc, argv, 134250003Sadrian "LLVM automatic testcase reducer. See\nhttp://" 135250003Sadrian "llvm.org/cmds/bugpoint.html" 136250003Sadrian " for more information.\n"); 137250003Sadrian#ifndef DEBUG_BUGPOINT 138250003Sadrian sys::SetInterruptFunction(BugpointInterruptFunction); 139250003Sadrian#endif 140250003Sadrian 141250003Sadrian LLVMContext& Context = getGlobalContext(); 142250003Sadrian // If we have an override, set it and then track the triple we want Modules 143250003Sadrian // to use. 144250003Sadrian if (!OverrideTriple.empty()) { 145250003Sadrian TargetTriple.setTriple(Triple::normalize(OverrideTriple)); 146250003Sadrian outs() << "Override triple set to '" << TargetTriple.getTriple() << "'\n"; 147250003Sadrian } 148250003Sadrian 149250003Sadrian if (MemoryLimit < 0) { 150250003Sadrian // Set the default MemoryLimit. Be sure to update the flag's description if 151250003Sadrian // you change this. 152250003Sadrian if (sys::RunningOnValgrind() || UseValgrind) 153250003Sadrian MemoryLimit = 800; 154250003Sadrian else 155250003Sadrian MemoryLimit = 300; 156250003Sadrian } 157250003Sadrian 158250003Sadrian BugDriver D(argv[0], FindBugs, TimeoutValue, MemoryLimit, 159250003Sadrian UseValgrind, Context); 160250003Sadrian if (D.addSources(InputFilenames)) return 1; 161250003Sadrian 162250003Sadrian AddToDriver PM(D); 163250003Sadrian if (StandardCompileOpts) { 164250003Sadrian PassManagerBuilder Builder; 165250003Sadrian Builder.OptLevel = 3; 166250003Sadrian Builder.Inliner = createFunctionInliningPass(); 167250003Sadrian Builder.populateModulePassManager(PM); 168250003Sadrian } 169250003Sadrian 170250003Sadrian if (StandardLinkOpts) { 171250003Sadrian PassManagerBuilder Builder; 172250003Sadrian Builder.populateLTOPassManager(PM, /*Internalize=*/true, 173250003Sadrian /*RunInliner=*/true); 174250003Sadrian } 175250003Sadrian 176250003Sadrian if (OptLevelO1 || OptLevelO2 || OptLevelO3) { 177250003Sadrian PassManagerBuilder Builder; 178250003Sadrian if (OptLevelO1) 179250003Sadrian Builder.Inliner = createAlwaysInlinerPass(); 180250003Sadrian else if (OptLevelO2) 181250003Sadrian Builder.Inliner = createFunctionInliningPass(225); 182250003Sadrian else 183250003Sadrian Builder.Inliner = createFunctionInliningPass(275); 184250003Sadrian 185250003Sadrian // Note that although clang/llvm-gcc use two separate passmanagers 186250003Sadrian // here, it shouldn't normally make a difference. 187250003Sadrian Builder.populateFunctionPassManager(PM); 188250003Sadrian Builder.populateModulePassManager(PM); 189250003Sadrian } 190250003Sadrian 191250003Sadrian for (std::vector<const PassInfo*>::iterator I = PassList.begin(), 192250003Sadrian E = PassList.end(); 193250003Sadrian I != E; ++I) { 194250003Sadrian const PassInfo* PI = *I; 195250003Sadrian D.addPass(PI->getPassArgument()); 196250003Sadrian } 197250003Sadrian 198250003Sadrian // Bugpoint has the ability of generating a plethora of core files, so to 199250003Sadrian // avoid filling up the disk, we prevent it 200250003Sadrian#ifndef DEBUG_BUGPOINT 201250003Sadrian sys::Process::PreventCoreFiles(); 202250003Sadrian#endif 203250003Sadrian 204250003Sadrian std::string Error; 205250003Sadrian bool Failure = D.run(Error); 206250003Sadrian if (!Error.empty()) { 207250003Sadrian errs() << Error; 208250003Sadrian return 1; 209250003Sadrian } 210250003Sadrian return Failure; 211250003Sadrian} 212250003Sadrian