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