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