bugpoint.cpp revision 327952
1193323Sed//===- bugpoint.cpp - The LLVM Bugpoint utility ---------------------------===//
2193323Sed//
3193323Sed//                     The LLVM Compiler Infrastructure
4193323Sed//
5193323Sed// This file is distributed under the University of Illinois Open Source
6193323Sed// License. See LICENSE.TXT for details.
7193323Sed//
8193323Sed//===----------------------------------------------------------------------===//
9193323Sed//
10193323Sed// This program is an automated compiler debugger tool.  It is used to narrow
11193323Sed// down miscompilations and crash problems to a specific pass in the compiler,
12193323Sed// and the specific Module or Function input that is causing the problem.
13193323Sed//
14193323Sed//===----------------------------------------------------------------------===//
15193323Sed
16193323Sed#include "BugDriver.h"
17193323Sed#include "ToolRunner.h"
18249423Sdim#include "llvm/IR/LLVMContext.h"
19288943Sdim#include "llvm/IR/LegacyPassManager.h"
20276479Sdim#include "llvm/IR/LegacyPassNameParser.h"
21249423Sdim#include "llvm/LinkAllIR.h"
22193323Sed#include "llvm/LinkAllPasses.h"
23193323Sed#include "llvm/Support/CommandLine.h"
24193323Sed#include "llvm/Support/ManagedStatic.h"
25193323Sed#include "llvm/Support/PluginLoader.h"
26193323Sed#include "llvm/Support/PrettyStackTrace.h"
27218885Sdim#include "llvm/Support/Process.h"
28218885Sdim#include "llvm/Support/Signals.h"
29321369Sdim#include "llvm/Support/TargetSelect.h"
30218885Sdim#include "llvm/Support/Valgrind.h"
31314564Sdim#include "llvm/Transforms/IPO/AlwaysInliner.h"
32226584Sdim#include "llvm/Transforms/IPO/PassManagerBuilder.h"
33218885Sdim
34314564Sdim// Enable this macro to debug bugpoint itself.
35218885Sdim//#define DEBUG_BUGPOINT 1
36218885Sdim
37193323Sedusing namespace llvm;
38193323Sed
39276479Sdimstatic cl::opt<bool>
40314564Sdim    FindBugs("find-bugs", cl::desc("Run many different optimization sequences "
41314564Sdim                                   "on program to find bugs"),
42314564Sdim             cl::init(false));
43193323Sed
44193323Sedstatic cl::list<std::string>
45314564Sdim    InputFilenames(cl::Positional, cl::OneOrMore,
46314564Sdim                   cl::desc("<input llvm ll/bc files>"));
47193323Sed
48314564Sdimstatic cl::opt<unsigned> TimeoutValue(
49314564Sdim    "timeout", cl::init(300), cl::value_desc("seconds"),
50314564Sdim    cl::desc("Number of seconds program is allowed to run before it "
51314564Sdim             "is killed (default is 300s), 0 disables timeout"));
52193323Sed
53327952Sdimstatic cl::opt<int> MemoryLimit(
54327952Sdim    "mlimit", cl::init(-1), cl::value_desc("MBytes"),
55327952Sdim    cl::desc("Maximum amount of memory to use. 0 disables check. Defaults to "
56327952Sdim             "400MB (800MB under valgrind, 0 with sanitizers)."));
57193323Sed
58205407Srdivackystatic cl::opt<bool>
59314564Sdim    UseValgrind("enable-valgrind",
60314564Sdim                cl::desc("Run optimizations through valgrind"));
61205407Srdivacky
62193323Sed// The AnalysesList is automatically populated with registered Passes by the
63193323Sed// PassNameParser.
64193323Sed//
65314564Sdimstatic cl::list<const PassInfo *, bool, PassNameParser>
66314564Sdim    PassList(cl::desc("Passes available:"), cl::ZeroOrMore);
67193323Sed
68198090Srdivackystatic cl::opt<bool>
69314564Sdim    StandardLinkOpts("std-link-opts",
70314564Sdim                     cl::desc("Include the standard link time optimizations"));
71198090Srdivacky
72223013Sdimstatic cl::opt<bool>
73314564Sdim    OptLevelO1("O1", cl::desc("Optimization level 1. Identical to 'opt -O1'"));
74223013Sdim
75223013Sdimstatic cl::opt<bool>
76314564Sdim    OptLevelO2("O2", cl::desc("Optimization level 2. Identical to 'opt -O2'"));
77223013Sdim
78314564Sdimstatic cl::opt<bool> OptLevelOs(
79314564Sdim    "Os",
80314564Sdim    cl::desc(
81314564Sdim        "Like -O2 with extra optimizations for size. Similar to clang -Os"));
82314564Sdim
83223013Sdimstatic cl::opt<bool>
84314564Sdim    OptLevelO3("O3", cl::desc("Optimization level 3. Identical to 'opt -O3'"));
85223013Sdim
86198090Srdivackystatic cl::opt<std::string>
87314564Sdim    OverrideTriple("mtriple", cl::desc("Override target triple for module"));
88198090Srdivacky
89193323Sed/// BugpointIsInterrupted - Set to true when the user presses ctrl-c.
90193323Sedbool llvm::BugpointIsInterrupted = false;
91193323Sed
92218885Sdim#ifndef DEBUG_BUGPOINT
93314564Sdimstatic void BugpointInterruptFunction() { BugpointIsInterrupted = true; }
94218885Sdim#endif
95193323Sed
96198090Srdivacky// Hack to capture a pass list.
97198090Srdivackynamespace {
98314564Sdimclass AddToDriver : public legacy::FunctionPassManager {
99314564Sdim  BugDriver &D;
100276479Sdim
101314564Sdimpublic:
102314564Sdim  AddToDriver(BugDriver &_D) : FunctionPassManager(nullptr), D(_D) {}
103314564Sdim
104314564Sdim  void add(Pass *P) override {
105314564Sdim    const void *ID = P->getPassID();
106314564Sdim    const PassInfo *PI = PassRegistry::getPassRegistry()->getPassInfo(ID);
107314564Sdim    D.addPass(PI->getPassArgument());
108314564Sdim  }
109314564Sdim};
110198090Srdivacky}
111198090Srdivacky
112276479Sdim#ifdef LINK_POLLY_INTO_TOOLS
113276479Sdimnamespace polly {
114276479Sdimvoid initializePollyPasses(llvm::PassRegistry &Registry);
115276479Sdim}
116276479Sdim#endif
117276479Sdim
118193323Sedint main(int argc, char **argv) {
119218885Sdim#ifndef DEBUG_BUGPOINT
120309124Sdim  llvm::sys::PrintStackTraceOnErrorSignal(argv[0]);
121193323Sed  llvm::PrettyStackTraceProgram X(argc, argv);
122314564Sdim  llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
123218885Sdim#endif
124276479Sdim
125218885Sdim  // Initialize passes
126218885Sdim  PassRegistry &Registry = *PassRegistry::getPassRegistry();
127218885Sdim  initializeCore(Registry);
128218885Sdim  initializeScalarOpts(Registry);
129249423Sdim  initializeObjCARCOpts(Registry);
130234353Sdim  initializeVectorization(Registry);
131218885Sdim  initializeIPO(Registry);
132218885Sdim  initializeAnalysis(Registry);
133218885Sdim  initializeTransformUtils(Registry);
134218885Sdim  initializeInstCombine(Registry);
135218885Sdim  initializeInstrumentation(Registry);
136218885Sdim  initializeTarget(Registry);
137276479Sdim
138276479Sdim#ifdef LINK_POLLY_INTO_TOOLS
139276479Sdim  polly::initializePollyPasses(Registry);
140276479Sdim#endif
141276479Sdim
142321369Sdim  if (std::getenv("bar") == (char*) -1) {
143321369Sdim    InitializeAllTargets();
144321369Sdim    InitializeAllTargetMCs();
145321369Sdim    InitializeAllAsmPrinters();
146321369Sdim    InitializeAllAsmParsers();
147321369Sdim  }
148321369Sdim
149193323Sed  cl::ParseCommandLineOptions(argc, argv,
150193323Sed                              "LLVM automatic testcase reducer. See\nhttp://"
151193323Sed                              "llvm.org/cmds/bugpoint.html"
152193323Sed                              " for more information.\n");
153218885Sdim#ifndef DEBUG_BUGPOINT
154193323Sed  sys::SetInterruptFunction(BugpointInterruptFunction);
155218885Sdim#endif
156195340Sed
157309124Sdim  LLVMContext Context;
158198090Srdivacky  // If we have an override, set it and then track the triple we want Modules
159198090Srdivacky  // to use.
160198090Srdivacky  if (!OverrideTriple.empty()) {
161212793Sdim    TargetTriple.setTriple(Triple::normalize(OverrideTriple));
162212793Sdim    outs() << "Override triple set to '" << TargetTriple.getTriple() << "'\n";
163198090Srdivacky  }
164198090Srdivacky
165205407Srdivacky  if (MemoryLimit < 0) {
166205407Srdivacky    // Set the default MemoryLimit.  Be sure to update the flag's description if
167205407Srdivacky    // you change this.
168205407Srdivacky    if (sys::RunningOnValgrind() || UseValgrind)
169205407Srdivacky      MemoryLimit = 800;
170205407Srdivacky    else
171288943Sdim      MemoryLimit = 400;
172327952Sdim#if (LLVM_ADDRESS_SANITIZER_BUILD || LLVM_MEMORY_SANITIZER_BUILD ||            \
173327952Sdim     LLVM_THREAD_SANITIZER_BUILD)
174327952Sdim    // Starting from kernel 4.9 memory allocated with mmap is counted against
175327952Sdim    // RLIMIT_DATA. Sanitizers need to allocate tens of terabytes for shadow.
176327952Sdim    MemoryLimit = 0;
177327952Sdim#endif
178205407Srdivacky  }
179205407Srdivacky
180314564Sdim  BugDriver D(argv[0], FindBugs, TimeoutValue, MemoryLimit, UseValgrind,
181314564Sdim              Context);
182314564Sdim  if (D.addSources(InputFilenames))
183314564Sdim    return 1;
184276479Sdim
185198090Srdivacky  AddToDriver PM(D);
186276479Sdim
187223013Sdim  if (StandardLinkOpts) {
188223013Sdim    PassManagerBuilder Builder;
189280031Sdim    Builder.Inliner = createFunctionInliningPass();
190280031Sdim    Builder.populateLTOPassManager(PM);
191223013Sdim  }
192198090Srdivacky
193223013Sdim  if (OptLevelO1 || OptLevelO2 || OptLevelO3) {
194223013Sdim    PassManagerBuilder Builder;
195223013Sdim    if (OptLevelO1)
196314564Sdim      Builder.Inliner = createAlwaysInlinerLegacyPass();
197314564Sdim    else if (OptLevelOs || OptLevelO2)
198321369Sdim      Builder.Inliner = createFunctionInliningPass(
199321369Sdim          2, OptLevelOs ? 1 : 0, false);
200223013Sdim    else
201223013Sdim      Builder.Inliner = createFunctionInliningPass(275);
202223013Sdim    Builder.populateFunctionPassManager(PM);
203223013Sdim    Builder.populateModulePassManager(PM);
204223013Sdim  }
205223013Sdim
206296417Sdim  for (const PassInfo *PI : PassList)
207212793Sdim    D.addPass(PI->getPassArgument());
208212793Sdim
209314564Sdim// Bugpoint has the ability of generating a plethora of core files, so to
210314564Sdim// avoid filling up the disk, we prevent it
211218885Sdim#ifndef DEBUG_BUGPOINT
212193323Sed  sys::Process::PreventCoreFiles();
213218885Sdim#endif
214193323Sed
215314564Sdim  if (Error E = D.run()) {
216314564Sdim    errs() << toString(std::move(E));
217207618Srdivacky    return 1;
218193323Sed  }
219314564Sdim  return 0;
220193323Sed}
221