xref: /aosp_15_r20/external/llvm/tools/opt/opt.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- opt.cpp - The LLVM Modular Optimizer -------------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // Optimizations may be specified an arbitrary number of times on the command
11*9880d681SAndroid Build Coastguard Worker // line, They are run in the order specified.
12*9880d681SAndroid Build Coastguard Worker //
13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker 
15*9880d681SAndroid Build Coastguard Worker #include "BreakpointPrinter.h"
16*9880d681SAndroid Build Coastguard Worker #include "NewPMDriver.h"
17*9880d681SAndroid Build Coastguard Worker #include "PassPrinters.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Triple.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/CallGraph.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/CallGraphSCCPass.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/LoopPass.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/RegionPass.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/TargetLibraryInfo.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/TargetTransformInfo.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/Bitcode/BitcodeWriterPass.h"
26*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/CommandFlags.h"
27*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DataLayout.h"
28*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DebugInfo.h"
29*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/IRPrintingPasses.h"
30*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
31*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LegacyPassManager.h"
32*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LegacyPassNameParser.h"
33*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
34*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Verifier.h"
35*9880d681SAndroid Build Coastguard Worker #include "llvm/IRReader/IRReader.h"
36*9880d681SAndroid Build Coastguard Worker #include "llvm/InitializePasses.h"
37*9880d681SAndroid Build Coastguard Worker #include "llvm/LinkAllIR.h"
38*9880d681SAndroid Build Coastguard Worker #include "llvm/LinkAllPasses.h"
39*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/SubtargetFeature.h"
40*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
41*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/FileSystem.h"
42*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Host.h"
43*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ManagedStatic.h"
44*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/PluginLoader.h"
45*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/PrettyStackTrace.h"
46*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Signals.h"
47*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/SourceMgr.h"
48*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/SystemUtils.h"
49*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetRegistry.h"
50*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetSelect.h"
51*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ToolOutputFile.h"
52*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetMachine.h"
53*9880d681SAndroid Build Coastguard Worker #include "llvm/Transforms/IPO/PassManagerBuilder.h"
54*9880d681SAndroid Build Coastguard Worker #include "llvm/Transforms/Utils/Cloning.h"
55*9880d681SAndroid Build Coastguard Worker #include <algorithm>
56*9880d681SAndroid Build Coastguard Worker #include <memory>
57*9880d681SAndroid Build Coastguard Worker using namespace llvm;
58*9880d681SAndroid Build Coastguard Worker using namespace opt_tool;
59*9880d681SAndroid Build Coastguard Worker 
60*9880d681SAndroid Build Coastguard Worker // The OptimizationList is automatically populated with registered Passes by the
61*9880d681SAndroid Build Coastguard Worker // PassNameParser.
62*9880d681SAndroid Build Coastguard Worker //
63*9880d681SAndroid Build Coastguard Worker static cl::list<const PassInfo*, bool, PassNameParser>
64*9880d681SAndroid Build Coastguard Worker PassList(cl::desc("Optimizations available:"));
65*9880d681SAndroid Build Coastguard Worker 
66*9880d681SAndroid Build Coastguard Worker // This flag specifies a textual description of the optimization pass pipeline
67*9880d681SAndroid Build Coastguard Worker // to run over the module. This flag switches opt to use the new pass manager
68*9880d681SAndroid Build Coastguard Worker // infrastructure, completely disabling all of the flags specific to the old
69*9880d681SAndroid Build Coastguard Worker // pass management.
70*9880d681SAndroid Build Coastguard Worker static cl::opt<std::string> PassPipeline(
71*9880d681SAndroid Build Coastguard Worker     "passes",
72*9880d681SAndroid Build Coastguard Worker     cl::desc("A textual description of the pass pipeline for optimizing"),
73*9880d681SAndroid Build Coastguard Worker     cl::Hidden);
74*9880d681SAndroid Build Coastguard Worker 
75*9880d681SAndroid Build Coastguard Worker // Other command line options...
76*9880d681SAndroid Build Coastguard Worker //
77*9880d681SAndroid Build Coastguard Worker static cl::opt<std::string>
78*9880d681SAndroid Build Coastguard Worker InputFilename(cl::Positional, cl::desc("<input bitcode file>"),
79*9880d681SAndroid Build Coastguard Worker     cl::init("-"), cl::value_desc("filename"));
80*9880d681SAndroid Build Coastguard Worker 
81*9880d681SAndroid Build Coastguard Worker static cl::opt<std::string>
82*9880d681SAndroid Build Coastguard Worker OutputFilename("o", cl::desc("Override output filename"),
83*9880d681SAndroid Build Coastguard Worker                cl::value_desc("filename"));
84*9880d681SAndroid Build Coastguard Worker 
85*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
86*9880d681SAndroid Build Coastguard Worker Force("f", cl::desc("Enable binary output on terminals"));
87*9880d681SAndroid Build Coastguard Worker 
88*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
89*9880d681SAndroid Build Coastguard Worker PrintEachXForm("p", cl::desc("Print module after each transformation"));
90*9880d681SAndroid Build Coastguard Worker 
91*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
92*9880d681SAndroid Build Coastguard Worker NoOutput("disable-output",
93*9880d681SAndroid Build Coastguard Worker          cl::desc("Do not write result bitcode file"), cl::Hidden);
94*9880d681SAndroid Build Coastguard Worker 
95*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
96*9880d681SAndroid Build Coastguard Worker OutputAssembly("S", cl::desc("Write output as LLVM assembly"));
97*9880d681SAndroid Build Coastguard Worker 
98*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
99*9880d681SAndroid Build Coastguard Worker NoVerify("disable-verify", cl::desc("Do not run the verifier"), cl::Hidden);
100*9880d681SAndroid Build Coastguard Worker 
101*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
102*9880d681SAndroid Build Coastguard Worker VerifyEach("verify-each", cl::desc("Verify after each transform"));
103*9880d681SAndroid Build Coastguard Worker 
104*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
105*9880d681SAndroid Build Coastguard Worker     DisableDITypeMap("disable-debug-info-type-map",
106*9880d681SAndroid Build Coastguard Worker                      cl::desc("Don't use a uniquing type map for debug info"));
107*9880d681SAndroid Build Coastguard Worker 
108*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
109*9880d681SAndroid Build Coastguard Worker StripDebug("strip-debug",
110*9880d681SAndroid Build Coastguard Worker            cl::desc("Strip debugger symbol info from translation unit"));
111*9880d681SAndroid Build Coastguard Worker 
112*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
113*9880d681SAndroid Build Coastguard Worker DisableInline("disable-inlining", cl::desc("Do not run the inliner pass"));
114*9880d681SAndroid Build Coastguard Worker 
115*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
116*9880d681SAndroid Build Coastguard Worker DisableOptimizations("disable-opt",
117*9880d681SAndroid Build Coastguard Worker                      cl::desc("Do not run any optimization passes"));
118*9880d681SAndroid Build Coastguard Worker 
119*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
120*9880d681SAndroid Build Coastguard Worker StandardLinkOpts("std-link-opts",
121*9880d681SAndroid Build Coastguard Worker                  cl::desc("Include the standard link time optimizations"));
122*9880d681SAndroid Build Coastguard Worker 
123*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
124*9880d681SAndroid Build Coastguard Worker OptLevelO1("O1",
125*9880d681SAndroid Build Coastguard Worker            cl::desc("Optimization level 1. Similar to clang -O1"));
126*9880d681SAndroid Build Coastguard Worker 
127*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
128*9880d681SAndroid Build Coastguard Worker OptLevelO2("O2",
129*9880d681SAndroid Build Coastguard Worker            cl::desc("Optimization level 2. Similar to clang -O2"));
130*9880d681SAndroid Build Coastguard Worker 
131*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
132*9880d681SAndroid Build Coastguard Worker OptLevelOs("Os",
133*9880d681SAndroid Build Coastguard Worker            cl::desc("Like -O2 with extra optimizations for size. Similar to clang -Os"));
134*9880d681SAndroid Build Coastguard Worker 
135*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
136*9880d681SAndroid Build Coastguard Worker OptLevelOz("Oz",
137*9880d681SAndroid Build Coastguard Worker            cl::desc("Like -Os but reduces code size further. Similar to clang -Oz"));
138*9880d681SAndroid Build Coastguard Worker 
139*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
140*9880d681SAndroid Build Coastguard Worker OptLevelO3("O3",
141*9880d681SAndroid Build Coastguard Worker            cl::desc("Optimization level 3. Similar to clang -O3"));
142*9880d681SAndroid Build Coastguard Worker 
143*9880d681SAndroid Build Coastguard Worker static cl::opt<unsigned>
144*9880d681SAndroid Build Coastguard Worker CodeGenOptLevel("codegen-opt-level",
145*9880d681SAndroid Build Coastguard Worker                 cl::desc("Override optimization level for codegen hooks"));
146*9880d681SAndroid Build Coastguard Worker 
147*9880d681SAndroid Build Coastguard Worker static cl::opt<std::string>
148*9880d681SAndroid Build Coastguard Worker TargetTriple("mtriple", cl::desc("Override target triple for module"));
149*9880d681SAndroid Build Coastguard Worker 
150*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
151*9880d681SAndroid Build Coastguard Worker UnitAtATime("funit-at-a-time",
152*9880d681SAndroid Build Coastguard Worker             cl::desc("Enable IPO. This corresponds to gcc's -funit-at-a-time"),
153*9880d681SAndroid Build Coastguard Worker             cl::init(true));
154*9880d681SAndroid Build Coastguard Worker 
155*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
156*9880d681SAndroid Build Coastguard Worker DisableLoopUnrolling("disable-loop-unrolling",
157*9880d681SAndroid Build Coastguard Worker                      cl::desc("Disable loop unrolling in all relevant passes"),
158*9880d681SAndroid Build Coastguard Worker                      cl::init(false));
159*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
160*9880d681SAndroid Build Coastguard Worker DisableLoopVectorization("disable-loop-vectorization",
161*9880d681SAndroid Build Coastguard Worker                      cl::desc("Disable the loop vectorization pass"),
162*9880d681SAndroid Build Coastguard Worker                      cl::init(false));
163*9880d681SAndroid Build Coastguard Worker 
164*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
165*9880d681SAndroid Build Coastguard Worker DisableSLPVectorization("disable-slp-vectorization",
166*9880d681SAndroid Build Coastguard Worker                         cl::desc("Disable the slp vectorization pass"),
167*9880d681SAndroid Build Coastguard Worker                         cl::init(false));
168*9880d681SAndroid Build Coastguard Worker 
169*9880d681SAndroid Build Coastguard Worker static cl::opt<bool> EmitSummaryIndex("module-summary",
170*9880d681SAndroid Build Coastguard Worker                                       cl::desc("Emit module summary index"),
171*9880d681SAndroid Build Coastguard Worker                                       cl::init(false));
172*9880d681SAndroid Build Coastguard Worker 
173*9880d681SAndroid Build Coastguard Worker static cl::opt<bool> EmitModuleHash("module-hash", cl::desc("Emit module hash"),
174*9880d681SAndroid Build Coastguard Worker                                     cl::init(false));
175*9880d681SAndroid Build Coastguard Worker 
176*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
177*9880d681SAndroid Build Coastguard Worker DisableSimplifyLibCalls("disable-simplify-libcalls",
178*9880d681SAndroid Build Coastguard Worker                         cl::desc("Disable simplify-libcalls"));
179*9880d681SAndroid Build Coastguard Worker 
180*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
181*9880d681SAndroid Build Coastguard Worker Quiet("q", cl::desc("Obsolete option"), cl::Hidden);
182*9880d681SAndroid Build Coastguard Worker 
183*9880d681SAndroid Build Coastguard Worker static cl::alias
184*9880d681SAndroid Build Coastguard Worker QuietA("quiet", cl::desc("Alias for -q"), cl::aliasopt(Quiet));
185*9880d681SAndroid Build Coastguard Worker 
186*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
187*9880d681SAndroid Build Coastguard Worker AnalyzeOnly("analyze", cl::desc("Only perform analysis, no optimization"));
188*9880d681SAndroid Build Coastguard Worker 
189*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
190*9880d681SAndroid Build Coastguard Worker PrintBreakpoints("print-breakpoints-for-testing",
191*9880d681SAndroid Build Coastguard Worker                  cl::desc("Print select breakpoints location for testing"));
192*9880d681SAndroid Build Coastguard Worker 
193*9880d681SAndroid Build Coastguard Worker static cl::opt<std::string>
194*9880d681SAndroid Build Coastguard Worker DefaultDataLayout("default-data-layout",
195*9880d681SAndroid Build Coastguard Worker           cl::desc("data layout string to use if not specified by module"),
196*9880d681SAndroid Build Coastguard Worker           cl::value_desc("layout-string"), cl::init(""));
197*9880d681SAndroid Build Coastguard Worker 
198*9880d681SAndroid Build Coastguard Worker static cl::opt<bool> PreserveBitcodeUseListOrder(
199*9880d681SAndroid Build Coastguard Worker     "preserve-bc-uselistorder",
200*9880d681SAndroid Build Coastguard Worker     cl::desc("Preserve use-list order when writing LLVM bitcode."),
201*9880d681SAndroid Build Coastguard Worker     cl::init(true), cl::Hidden);
202*9880d681SAndroid Build Coastguard Worker 
203*9880d681SAndroid Build Coastguard Worker static cl::opt<bool> PreserveAssemblyUseListOrder(
204*9880d681SAndroid Build Coastguard Worker     "preserve-ll-uselistorder",
205*9880d681SAndroid Build Coastguard Worker     cl::desc("Preserve use-list order when writing LLVM assembly."),
206*9880d681SAndroid Build Coastguard Worker     cl::init(false), cl::Hidden);
207*9880d681SAndroid Build Coastguard Worker 
208*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
209*9880d681SAndroid Build Coastguard Worker     RunTwice("run-twice",
210*9880d681SAndroid Build Coastguard Worker              cl::desc("Run all passes twice, re-using the same pass manager."),
211*9880d681SAndroid Build Coastguard Worker              cl::init(false), cl::Hidden);
212*9880d681SAndroid Build Coastguard Worker 
213*9880d681SAndroid Build Coastguard Worker static cl::opt<bool> DiscardValueNames(
214*9880d681SAndroid Build Coastguard Worker     "discard-value-names",
215*9880d681SAndroid Build Coastguard Worker     cl::desc("Discard names from Value (other than GlobalValue)."),
216*9880d681SAndroid Build Coastguard Worker     cl::init(false), cl::Hidden);
217*9880d681SAndroid Build Coastguard Worker 
addPass(legacy::PassManagerBase & PM,Pass * P)218*9880d681SAndroid Build Coastguard Worker static inline void addPass(legacy::PassManagerBase &PM, Pass *P) {
219*9880d681SAndroid Build Coastguard Worker   // Add the pass to the pass manager...
220*9880d681SAndroid Build Coastguard Worker   PM.add(P);
221*9880d681SAndroid Build Coastguard Worker 
222*9880d681SAndroid Build Coastguard Worker   // If we are verifying all of the intermediate steps, add the verifier...
223*9880d681SAndroid Build Coastguard Worker   if (VerifyEach)
224*9880d681SAndroid Build Coastguard Worker     PM.add(createVerifierPass());
225*9880d681SAndroid Build Coastguard Worker }
226*9880d681SAndroid Build Coastguard Worker 
227*9880d681SAndroid Build Coastguard Worker /// This routine adds optimization passes based on selected optimization level,
228*9880d681SAndroid Build Coastguard Worker /// OptLevel.
229*9880d681SAndroid Build Coastguard Worker ///
230*9880d681SAndroid Build Coastguard Worker /// OptLevel - Optimization Level
AddOptimizationPasses(legacy::PassManagerBase & MPM,legacy::FunctionPassManager & FPM,TargetMachine * TM,unsigned OptLevel,unsigned SizeLevel)231*9880d681SAndroid Build Coastguard Worker static void AddOptimizationPasses(legacy::PassManagerBase &MPM,
232*9880d681SAndroid Build Coastguard Worker                                   legacy::FunctionPassManager &FPM,
233*9880d681SAndroid Build Coastguard Worker                                   TargetMachine *TM, unsigned OptLevel,
234*9880d681SAndroid Build Coastguard Worker                                   unsigned SizeLevel) {
235*9880d681SAndroid Build Coastguard Worker   if (!NoVerify || VerifyEach)
236*9880d681SAndroid Build Coastguard Worker     FPM.add(createVerifierPass()); // Verify that input is correct
237*9880d681SAndroid Build Coastguard Worker 
238*9880d681SAndroid Build Coastguard Worker   PassManagerBuilder Builder;
239*9880d681SAndroid Build Coastguard Worker   Builder.OptLevel = OptLevel;
240*9880d681SAndroid Build Coastguard Worker   Builder.SizeLevel = SizeLevel;
241*9880d681SAndroid Build Coastguard Worker 
242*9880d681SAndroid Build Coastguard Worker   if (DisableInline) {
243*9880d681SAndroid Build Coastguard Worker     // No inlining pass
244*9880d681SAndroid Build Coastguard Worker   } else if (OptLevel > 1) {
245*9880d681SAndroid Build Coastguard Worker     Builder.Inliner = createFunctionInliningPass(OptLevel, SizeLevel);
246*9880d681SAndroid Build Coastguard Worker   } else {
247*9880d681SAndroid Build Coastguard Worker     Builder.Inliner = createAlwaysInlinerPass();
248*9880d681SAndroid Build Coastguard Worker   }
249*9880d681SAndroid Build Coastguard Worker   Builder.DisableUnitAtATime = !UnitAtATime;
250*9880d681SAndroid Build Coastguard Worker   Builder.DisableUnrollLoops = (DisableLoopUnrolling.getNumOccurrences() > 0) ?
251*9880d681SAndroid Build Coastguard Worker                                DisableLoopUnrolling : OptLevel == 0;
252*9880d681SAndroid Build Coastguard Worker 
253*9880d681SAndroid Build Coastguard Worker   // This is final, unless there is a #pragma vectorize enable
254*9880d681SAndroid Build Coastguard Worker   if (DisableLoopVectorization)
255*9880d681SAndroid Build Coastguard Worker     Builder.LoopVectorize = false;
256*9880d681SAndroid Build Coastguard Worker   // If option wasn't forced via cmd line (-vectorize-loops, -loop-vectorize)
257*9880d681SAndroid Build Coastguard Worker   else if (!Builder.LoopVectorize)
258*9880d681SAndroid Build Coastguard Worker     Builder.LoopVectorize = OptLevel > 1 && SizeLevel < 2;
259*9880d681SAndroid Build Coastguard Worker 
260*9880d681SAndroid Build Coastguard Worker   // When #pragma vectorize is on for SLP, do the same as above
261*9880d681SAndroid Build Coastguard Worker   Builder.SLPVectorize =
262*9880d681SAndroid Build Coastguard Worker       DisableSLPVectorization ? false : OptLevel > 1 && SizeLevel < 2;
263*9880d681SAndroid Build Coastguard Worker 
264*9880d681SAndroid Build Coastguard Worker   // Add target-specific passes that need to run as early as possible.
265*9880d681SAndroid Build Coastguard Worker   if (TM)
266*9880d681SAndroid Build Coastguard Worker     Builder.addExtension(
267*9880d681SAndroid Build Coastguard Worker         PassManagerBuilder::EP_EarlyAsPossible,
268*9880d681SAndroid Build Coastguard Worker         [&](const PassManagerBuilder &, legacy::PassManagerBase &PM) {
269*9880d681SAndroid Build Coastguard Worker           TM->addEarlyAsPossiblePasses(PM);
270*9880d681SAndroid Build Coastguard Worker         });
271*9880d681SAndroid Build Coastguard Worker 
272*9880d681SAndroid Build Coastguard Worker   Builder.populateFunctionPassManager(FPM);
273*9880d681SAndroid Build Coastguard Worker   Builder.populateModulePassManager(MPM);
274*9880d681SAndroid Build Coastguard Worker }
275*9880d681SAndroid Build Coastguard Worker 
AddStandardLinkPasses(legacy::PassManagerBase & PM)276*9880d681SAndroid Build Coastguard Worker static void AddStandardLinkPasses(legacy::PassManagerBase &PM) {
277*9880d681SAndroid Build Coastguard Worker   PassManagerBuilder Builder;
278*9880d681SAndroid Build Coastguard Worker   Builder.VerifyInput = true;
279*9880d681SAndroid Build Coastguard Worker   if (DisableOptimizations)
280*9880d681SAndroid Build Coastguard Worker     Builder.OptLevel = 0;
281*9880d681SAndroid Build Coastguard Worker 
282*9880d681SAndroid Build Coastguard Worker   if (!DisableInline)
283*9880d681SAndroid Build Coastguard Worker     Builder.Inliner = createFunctionInliningPass();
284*9880d681SAndroid Build Coastguard Worker   Builder.populateLTOPassManager(PM);
285*9880d681SAndroid Build Coastguard Worker }
286*9880d681SAndroid Build Coastguard Worker 
287*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
288*9880d681SAndroid Build Coastguard Worker // CodeGen-related helper functions.
289*9880d681SAndroid Build Coastguard Worker //
290*9880d681SAndroid Build Coastguard Worker 
GetCodeGenOptLevel()291*9880d681SAndroid Build Coastguard Worker static CodeGenOpt::Level GetCodeGenOptLevel() {
292*9880d681SAndroid Build Coastguard Worker   if (CodeGenOptLevel.getNumOccurrences())
293*9880d681SAndroid Build Coastguard Worker     return static_cast<CodeGenOpt::Level>(unsigned(CodeGenOptLevel));
294*9880d681SAndroid Build Coastguard Worker   if (OptLevelO1)
295*9880d681SAndroid Build Coastguard Worker     return CodeGenOpt::Less;
296*9880d681SAndroid Build Coastguard Worker   if (OptLevelO2)
297*9880d681SAndroid Build Coastguard Worker     return CodeGenOpt::Default;
298*9880d681SAndroid Build Coastguard Worker   if (OptLevelO3)
299*9880d681SAndroid Build Coastguard Worker     return CodeGenOpt::Aggressive;
300*9880d681SAndroid Build Coastguard Worker   return CodeGenOpt::None;
301*9880d681SAndroid Build Coastguard Worker }
302*9880d681SAndroid Build Coastguard Worker 
303*9880d681SAndroid Build Coastguard Worker // Returns the TargetMachine instance or zero if no triple is provided.
GetTargetMachine(Triple TheTriple,StringRef CPUStr,StringRef FeaturesStr,const TargetOptions & Options)304*9880d681SAndroid Build Coastguard Worker static TargetMachine* GetTargetMachine(Triple TheTriple, StringRef CPUStr,
305*9880d681SAndroid Build Coastguard Worker                                        StringRef FeaturesStr,
306*9880d681SAndroid Build Coastguard Worker                                        const TargetOptions &Options) {
307*9880d681SAndroid Build Coastguard Worker   std::string Error;
308*9880d681SAndroid Build Coastguard Worker   const Target *TheTarget = TargetRegistry::lookupTarget(MArch, TheTriple,
309*9880d681SAndroid Build Coastguard Worker                                                          Error);
310*9880d681SAndroid Build Coastguard Worker   // Some modules don't specify a triple, and this is okay.
311*9880d681SAndroid Build Coastguard Worker   if (!TheTarget) {
312*9880d681SAndroid Build Coastguard Worker     return nullptr;
313*9880d681SAndroid Build Coastguard Worker   }
314*9880d681SAndroid Build Coastguard Worker 
315*9880d681SAndroid Build Coastguard Worker   return TheTarget->createTargetMachine(TheTriple.getTriple(), CPUStr,
316*9880d681SAndroid Build Coastguard Worker                                         FeaturesStr, Options, getRelocModel(),
317*9880d681SAndroid Build Coastguard Worker                                         CMModel, GetCodeGenOptLevel());
318*9880d681SAndroid Build Coastguard Worker }
319*9880d681SAndroid Build Coastguard Worker 
320*9880d681SAndroid Build Coastguard Worker #ifdef LINK_POLLY_INTO_TOOLS
321*9880d681SAndroid Build Coastguard Worker namespace polly {
322*9880d681SAndroid Build Coastguard Worker void initializePollyPasses(llvm::PassRegistry &Registry);
323*9880d681SAndroid Build Coastguard Worker }
324*9880d681SAndroid Build Coastguard Worker #endif
325*9880d681SAndroid Build Coastguard Worker 
326*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
327*9880d681SAndroid Build Coastguard Worker // main for opt
328*9880d681SAndroid Build Coastguard Worker //
main(int argc,char ** argv)329*9880d681SAndroid Build Coastguard Worker int main(int argc, char **argv) {
330*9880d681SAndroid Build Coastguard Worker   sys::PrintStackTraceOnErrorSignal(argv[0]);
331*9880d681SAndroid Build Coastguard Worker   llvm::PrettyStackTraceProgram X(argc, argv);
332*9880d681SAndroid Build Coastguard Worker 
333*9880d681SAndroid Build Coastguard Worker   // Enable debug stream buffering.
334*9880d681SAndroid Build Coastguard Worker   EnableDebugBuffering = true;
335*9880d681SAndroid Build Coastguard Worker 
336*9880d681SAndroid Build Coastguard Worker   llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.
337*9880d681SAndroid Build Coastguard Worker   LLVMContext Context;
338*9880d681SAndroid Build Coastguard Worker 
339*9880d681SAndroid Build Coastguard Worker   InitializeAllTargets();
340*9880d681SAndroid Build Coastguard Worker   InitializeAllTargetMCs();
341*9880d681SAndroid Build Coastguard Worker   InitializeAllAsmPrinters();
342*9880d681SAndroid Build Coastguard Worker 
343*9880d681SAndroid Build Coastguard Worker   // Initialize passes
344*9880d681SAndroid Build Coastguard Worker   PassRegistry &Registry = *PassRegistry::getPassRegistry();
345*9880d681SAndroid Build Coastguard Worker   initializeCore(Registry);
346*9880d681SAndroid Build Coastguard Worker   initializeScalarOpts(Registry);
347*9880d681SAndroid Build Coastguard Worker   initializeObjCARCOpts(Registry);
348*9880d681SAndroid Build Coastguard Worker   initializeVectorization(Registry);
349*9880d681SAndroid Build Coastguard Worker   initializeIPO(Registry);
350*9880d681SAndroid Build Coastguard Worker   initializeAnalysis(Registry);
351*9880d681SAndroid Build Coastguard Worker   initializeTransformUtils(Registry);
352*9880d681SAndroid Build Coastguard Worker   initializeInstCombine(Registry);
353*9880d681SAndroid Build Coastguard Worker   initializeInstrumentation(Registry);
354*9880d681SAndroid Build Coastguard Worker   initializeTarget(Registry);
355*9880d681SAndroid Build Coastguard Worker   // For codegen passes, only passes that do IR to IR transformation are
356*9880d681SAndroid Build Coastguard Worker   // supported.
357*9880d681SAndroid Build Coastguard Worker   initializeCodeGenPreparePass(Registry);
358*9880d681SAndroid Build Coastguard Worker   initializeAtomicExpandPass(Registry);
359*9880d681SAndroid Build Coastguard Worker   initializeRewriteSymbolsPass(Registry);
360*9880d681SAndroid Build Coastguard Worker   initializeWinEHPreparePass(Registry);
361*9880d681SAndroid Build Coastguard Worker   initializeDwarfEHPreparePass(Registry);
362*9880d681SAndroid Build Coastguard Worker   initializeSafeStackPass(Registry);
363*9880d681SAndroid Build Coastguard Worker   initializeSjLjEHPreparePass(Registry);
364*9880d681SAndroid Build Coastguard Worker   initializePreISelIntrinsicLoweringLegacyPassPass(Registry);
365*9880d681SAndroid Build Coastguard Worker   initializeGlobalMergePass(Registry);
366*9880d681SAndroid Build Coastguard Worker   initializeInterleavedAccessPass(Registry);
367*9880d681SAndroid Build Coastguard Worker   initializeUnreachableBlockElimLegacyPassPass(Registry);
368*9880d681SAndroid Build Coastguard Worker 
369*9880d681SAndroid Build Coastguard Worker #ifdef LINK_POLLY_INTO_TOOLS
370*9880d681SAndroid Build Coastguard Worker   polly::initializePollyPasses(Registry);
371*9880d681SAndroid Build Coastguard Worker #endif
372*9880d681SAndroid Build Coastguard Worker 
373*9880d681SAndroid Build Coastguard Worker   cl::ParseCommandLineOptions(argc, argv,
374*9880d681SAndroid Build Coastguard Worker     "llvm .bc -> .bc modular optimizer and analysis printer\n");
375*9880d681SAndroid Build Coastguard Worker 
376*9880d681SAndroid Build Coastguard Worker   if (AnalyzeOnly && NoOutput) {
377*9880d681SAndroid Build Coastguard Worker     errs() << argv[0] << ": analyze mode conflicts with no-output mode.\n";
378*9880d681SAndroid Build Coastguard Worker     return 1;
379*9880d681SAndroid Build Coastguard Worker   }
380*9880d681SAndroid Build Coastguard Worker 
381*9880d681SAndroid Build Coastguard Worker   SMDiagnostic Err;
382*9880d681SAndroid Build Coastguard Worker 
383*9880d681SAndroid Build Coastguard Worker   Context.setDiscardValueNames(DiscardValueNames);
384*9880d681SAndroid Build Coastguard Worker   if (!DisableDITypeMap)
385*9880d681SAndroid Build Coastguard Worker     Context.enableDebugTypeODRUniquing();
386*9880d681SAndroid Build Coastguard Worker 
387*9880d681SAndroid Build Coastguard Worker   // Load the input module...
388*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<Module> M = parseIRFile(InputFilename, Err, Context);
389*9880d681SAndroid Build Coastguard Worker 
390*9880d681SAndroid Build Coastguard Worker   if (!M) {
391*9880d681SAndroid Build Coastguard Worker     Err.print(argv[0], errs());
392*9880d681SAndroid Build Coastguard Worker     return 1;
393*9880d681SAndroid Build Coastguard Worker   }
394*9880d681SAndroid Build Coastguard Worker 
395*9880d681SAndroid Build Coastguard Worker   // Strip debug info before running the verifier.
396*9880d681SAndroid Build Coastguard Worker   if (StripDebug)
397*9880d681SAndroid Build Coastguard Worker     StripDebugInfo(*M);
398*9880d681SAndroid Build Coastguard Worker 
399*9880d681SAndroid Build Coastguard Worker   // Immediately run the verifier to catch any problems before starting up the
400*9880d681SAndroid Build Coastguard Worker   // pass pipelines.  Otherwise we can crash on broken code during
401*9880d681SAndroid Build Coastguard Worker   // doInitialization().
402*9880d681SAndroid Build Coastguard Worker   if (!NoVerify && verifyModule(*M, &errs())) {
403*9880d681SAndroid Build Coastguard Worker     errs() << argv[0] << ": " << InputFilename
404*9880d681SAndroid Build Coastguard Worker            << ": error: input module is broken!\n";
405*9880d681SAndroid Build Coastguard Worker     return 1;
406*9880d681SAndroid Build Coastguard Worker   }
407*9880d681SAndroid Build Coastguard Worker 
408*9880d681SAndroid Build Coastguard Worker   // If we are supposed to override the target triple, do so now.
409*9880d681SAndroid Build Coastguard Worker   if (!TargetTriple.empty())
410*9880d681SAndroid Build Coastguard Worker     M->setTargetTriple(Triple::normalize(TargetTriple));
411*9880d681SAndroid Build Coastguard Worker 
412*9880d681SAndroid Build Coastguard Worker   // Figure out what stream we are supposed to write to...
413*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<tool_output_file> Out;
414*9880d681SAndroid Build Coastguard Worker   if (NoOutput) {
415*9880d681SAndroid Build Coastguard Worker     if (!OutputFilename.empty())
416*9880d681SAndroid Build Coastguard Worker       errs() << "WARNING: The -o (output filename) option is ignored when\n"
417*9880d681SAndroid Build Coastguard Worker                 "the --disable-output option is used.\n";
418*9880d681SAndroid Build Coastguard Worker   } else {
419*9880d681SAndroid Build Coastguard Worker     // Default to standard output.
420*9880d681SAndroid Build Coastguard Worker     if (OutputFilename.empty())
421*9880d681SAndroid Build Coastguard Worker       OutputFilename = "-";
422*9880d681SAndroid Build Coastguard Worker 
423*9880d681SAndroid Build Coastguard Worker     std::error_code EC;
424*9880d681SAndroid Build Coastguard Worker     Out.reset(new tool_output_file(OutputFilename, EC, sys::fs::F_None));
425*9880d681SAndroid Build Coastguard Worker     if (EC) {
426*9880d681SAndroid Build Coastguard Worker       errs() << EC.message() << '\n';
427*9880d681SAndroid Build Coastguard Worker       return 1;
428*9880d681SAndroid Build Coastguard Worker     }
429*9880d681SAndroid Build Coastguard Worker   }
430*9880d681SAndroid Build Coastguard Worker 
431*9880d681SAndroid Build Coastguard Worker   Triple ModuleTriple(M->getTargetTriple());
432*9880d681SAndroid Build Coastguard Worker   std::string CPUStr, FeaturesStr;
433*9880d681SAndroid Build Coastguard Worker   TargetMachine *Machine = nullptr;
434*9880d681SAndroid Build Coastguard Worker   const TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
435*9880d681SAndroid Build Coastguard Worker 
436*9880d681SAndroid Build Coastguard Worker   if (ModuleTriple.getArch()) {
437*9880d681SAndroid Build Coastguard Worker     CPUStr = getCPUStr();
438*9880d681SAndroid Build Coastguard Worker     FeaturesStr = getFeaturesStr();
439*9880d681SAndroid Build Coastguard Worker     Machine = GetTargetMachine(ModuleTriple, CPUStr, FeaturesStr, Options);
440*9880d681SAndroid Build Coastguard Worker   }
441*9880d681SAndroid Build Coastguard Worker 
442*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<TargetMachine> TM(Machine);
443*9880d681SAndroid Build Coastguard Worker 
444*9880d681SAndroid Build Coastguard Worker   // Override function attributes based on CPUStr, FeaturesStr, and command line
445*9880d681SAndroid Build Coastguard Worker   // flags.
446*9880d681SAndroid Build Coastguard Worker   setFunctionAttributes(CPUStr, FeaturesStr, *M);
447*9880d681SAndroid Build Coastguard Worker 
448*9880d681SAndroid Build Coastguard Worker   // If the output is set to be emitted to standard out, and standard out is a
449*9880d681SAndroid Build Coastguard Worker   // console, print out a warning message and refuse to do it.  We don't
450*9880d681SAndroid Build Coastguard Worker   // impress anyone by spewing tons of binary goo to a terminal.
451*9880d681SAndroid Build Coastguard Worker   if (!Force && !NoOutput && !AnalyzeOnly && !OutputAssembly)
452*9880d681SAndroid Build Coastguard Worker     if (CheckBitcodeOutputToConsole(Out->os(), !Quiet))
453*9880d681SAndroid Build Coastguard Worker       NoOutput = true;
454*9880d681SAndroid Build Coastguard Worker 
455*9880d681SAndroid Build Coastguard Worker   if (PassPipeline.getNumOccurrences() > 0) {
456*9880d681SAndroid Build Coastguard Worker     OutputKind OK = OK_NoOutput;
457*9880d681SAndroid Build Coastguard Worker     if (!NoOutput)
458*9880d681SAndroid Build Coastguard Worker       OK = OutputAssembly ? OK_OutputAssembly : OK_OutputBitcode;
459*9880d681SAndroid Build Coastguard Worker 
460*9880d681SAndroid Build Coastguard Worker     VerifierKind VK = VK_VerifyInAndOut;
461*9880d681SAndroid Build Coastguard Worker     if (NoVerify)
462*9880d681SAndroid Build Coastguard Worker       VK = VK_NoVerifier;
463*9880d681SAndroid Build Coastguard Worker     else if (VerifyEach)
464*9880d681SAndroid Build Coastguard Worker       VK = VK_VerifyEachPass;
465*9880d681SAndroid Build Coastguard Worker 
466*9880d681SAndroid Build Coastguard Worker     // The user has asked to use the new pass manager and provided a pipeline
467*9880d681SAndroid Build Coastguard Worker     // string. Hand off the rest of the functionality to the new code for that
468*9880d681SAndroid Build Coastguard Worker     // layer.
469*9880d681SAndroid Build Coastguard Worker     return runPassPipeline(argv[0], Context, *M, TM.get(), Out.get(),
470*9880d681SAndroid Build Coastguard Worker                            PassPipeline, OK, VK, PreserveAssemblyUseListOrder,
471*9880d681SAndroid Build Coastguard Worker                            PreserveBitcodeUseListOrder)
472*9880d681SAndroid Build Coastguard Worker                ? 0
473*9880d681SAndroid Build Coastguard Worker                : 1;
474*9880d681SAndroid Build Coastguard Worker   }
475*9880d681SAndroid Build Coastguard Worker 
476*9880d681SAndroid Build Coastguard Worker   // Create a PassManager to hold and optimize the collection of passes we are
477*9880d681SAndroid Build Coastguard Worker   // about to build.
478*9880d681SAndroid Build Coastguard Worker   //
479*9880d681SAndroid Build Coastguard Worker   legacy::PassManager Passes;
480*9880d681SAndroid Build Coastguard Worker 
481*9880d681SAndroid Build Coastguard Worker   // Add an appropriate TargetLibraryInfo pass for the module's triple.
482*9880d681SAndroid Build Coastguard Worker   TargetLibraryInfoImpl TLII(ModuleTriple);
483*9880d681SAndroid Build Coastguard Worker 
484*9880d681SAndroid Build Coastguard Worker   // The -disable-simplify-libcalls flag actually disables all builtin optzns.
485*9880d681SAndroid Build Coastguard Worker   if (DisableSimplifyLibCalls)
486*9880d681SAndroid Build Coastguard Worker     TLII.disableAllFunctions();
487*9880d681SAndroid Build Coastguard Worker   Passes.add(new TargetLibraryInfoWrapperPass(TLII));
488*9880d681SAndroid Build Coastguard Worker 
489*9880d681SAndroid Build Coastguard Worker   // Add an appropriate DataLayout instance for this module.
490*9880d681SAndroid Build Coastguard Worker   const DataLayout &DL = M->getDataLayout();
491*9880d681SAndroid Build Coastguard Worker   if (DL.isDefault() && !DefaultDataLayout.empty()) {
492*9880d681SAndroid Build Coastguard Worker     M->setDataLayout(DefaultDataLayout);
493*9880d681SAndroid Build Coastguard Worker   }
494*9880d681SAndroid Build Coastguard Worker 
495*9880d681SAndroid Build Coastguard Worker   // Add internal analysis passes from the target machine.
496*9880d681SAndroid Build Coastguard Worker   Passes.add(createTargetTransformInfoWrapperPass(TM ? TM->getTargetIRAnalysis()
497*9880d681SAndroid Build Coastguard Worker                                                      : TargetIRAnalysis()));
498*9880d681SAndroid Build Coastguard Worker 
499*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<legacy::FunctionPassManager> FPasses;
500*9880d681SAndroid Build Coastguard Worker   if (OptLevelO1 || OptLevelO2 || OptLevelOs || OptLevelOz || OptLevelO3) {
501*9880d681SAndroid Build Coastguard Worker     FPasses.reset(new legacy::FunctionPassManager(M.get()));
502*9880d681SAndroid Build Coastguard Worker     FPasses->add(createTargetTransformInfoWrapperPass(
503*9880d681SAndroid Build Coastguard Worker         TM ? TM->getTargetIRAnalysis() : TargetIRAnalysis()));
504*9880d681SAndroid Build Coastguard Worker   }
505*9880d681SAndroid Build Coastguard Worker 
506*9880d681SAndroid Build Coastguard Worker   if (PrintBreakpoints) {
507*9880d681SAndroid Build Coastguard Worker     // Default to standard output.
508*9880d681SAndroid Build Coastguard Worker     if (!Out) {
509*9880d681SAndroid Build Coastguard Worker       if (OutputFilename.empty())
510*9880d681SAndroid Build Coastguard Worker         OutputFilename = "-";
511*9880d681SAndroid Build Coastguard Worker 
512*9880d681SAndroid Build Coastguard Worker       std::error_code EC;
513*9880d681SAndroid Build Coastguard Worker       Out = llvm::make_unique<tool_output_file>(OutputFilename, EC,
514*9880d681SAndroid Build Coastguard Worker                                                 sys::fs::F_None);
515*9880d681SAndroid Build Coastguard Worker       if (EC) {
516*9880d681SAndroid Build Coastguard Worker         errs() << EC.message() << '\n';
517*9880d681SAndroid Build Coastguard Worker         return 1;
518*9880d681SAndroid Build Coastguard Worker       }
519*9880d681SAndroid Build Coastguard Worker     }
520*9880d681SAndroid Build Coastguard Worker     Passes.add(createBreakpointPrinter(Out->os()));
521*9880d681SAndroid Build Coastguard Worker     NoOutput = true;
522*9880d681SAndroid Build Coastguard Worker   }
523*9880d681SAndroid Build Coastguard Worker 
524*9880d681SAndroid Build Coastguard Worker   // Create a new optimization pass for each one specified on the command line
525*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0; i < PassList.size(); ++i) {
526*9880d681SAndroid Build Coastguard Worker     if (StandardLinkOpts &&
527*9880d681SAndroid Build Coastguard Worker         StandardLinkOpts.getPosition() < PassList.getPosition(i)) {
528*9880d681SAndroid Build Coastguard Worker       AddStandardLinkPasses(Passes);
529*9880d681SAndroid Build Coastguard Worker       StandardLinkOpts = false;
530*9880d681SAndroid Build Coastguard Worker     }
531*9880d681SAndroid Build Coastguard Worker 
532*9880d681SAndroid Build Coastguard Worker     if (OptLevelO1 && OptLevelO1.getPosition() < PassList.getPosition(i)) {
533*9880d681SAndroid Build Coastguard Worker       AddOptimizationPasses(Passes, *FPasses, TM.get(), 1, 0);
534*9880d681SAndroid Build Coastguard Worker       OptLevelO1 = false;
535*9880d681SAndroid Build Coastguard Worker     }
536*9880d681SAndroid Build Coastguard Worker 
537*9880d681SAndroid Build Coastguard Worker     if (OptLevelO2 && OptLevelO2.getPosition() < PassList.getPosition(i)) {
538*9880d681SAndroid Build Coastguard Worker       AddOptimizationPasses(Passes, *FPasses, TM.get(), 2, 0);
539*9880d681SAndroid Build Coastguard Worker       OptLevelO2 = false;
540*9880d681SAndroid Build Coastguard Worker     }
541*9880d681SAndroid Build Coastguard Worker 
542*9880d681SAndroid Build Coastguard Worker     if (OptLevelOs && OptLevelOs.getPosition() < PassList.getPosition(i)) {
543*9880d681SAndroid Build Coastguard Worker       AddOptimizationPasses(Passes, *FPasses, TM.get(), 2, 1);
544*9880d681SAndroid Build Coastguard Worker       OptLevelOs = false;
545*9880d681SAndroid Build Coastguard Worker     }
546*9880d681SAndroid Build Coastguard Worker 
547*9880d681SAndroid Build Coastguard Worker     if (OptLevelOz && OptLevelOz.getPosition() < PassList.getPosition(i)) {
548*9880d681SAndroid Build Coastguard Worker       AddOptimizationPasses(Passes, *FPasses, TM.get(), 2, 2);
549*9880d681SAndroid Build Coastguard Worker       OptLevelOz = false;
550*9880d681SAndroid Build Coastguard Worker     }
551*9880d681SAndroid Build Coastguard Worker 
552*9880d681SAndroid Build Coastguard Worker     if (OptLevelO3 && OptLevelO3.getPosition() < PassList.getPosition(i)) {
553*9880d681SAndroid Build Coastguard Worker       AddOptimizationPasses(Passes, *FPasses, TM.get(), 3, 0);
554*9880d681SAndroid Build Coastguard Worker       OptLevelO3 = false;
555*9880d681SAndroid Build Coastguard Worker     }
556*9880d681SAndroid Build Coastguard Worker 
557*9880d681SAndroid Build Coastguard Worker     const PassInfo *PassInf = PassList[i];
558*9880d681SAndroid Build Coastguard Worker     Pass *P = nullptr;
559*9880d681SAndroid Build Coastguard Worker     if (PassInf->getTargetMachineCtor())
560*9880d681SAndroid Build Coastguard Worker       P = PassInf->getTargetMachineCtor()(TM.get());
561*9880d681SAndroid Build Coastguard Worker     else if (PassInf->getNormalCtor())
562*9880d681SAndroid Build Coastguard Worker       P = PassInf->getNormalCtor()();
563*9880d681SAndroid Build Coastguard Worker     else
564*9880d681SAndroid Build Coastguard Worker       errs() << argv[0] << ": cannot create pass: "
565*9880d681SAndroid Build Coastguard Worker              << PassInf->getPassName() << "\n";
566*9880d681SAndroid Build Coastguard Worker     if (P) {
567*9880d681SAndroid Build Coastguard Worker       PassKind Kind = P->getPassKind();
568*9880d681SAndroid Build Coastguard Worker       addPass(Passes, P);
569*9880d681SAndroid Build Coastguard Worker 
570*9880d681SAndroid Build Coastguard Worker       if (AnalyzeOnly) {
571*9880d681SAndroid Build Coastguard Worker         switch (Kind) {
572*9880d681SAndroid Build Coastguard Worker         case PT_BasicBlock:
573*9880d681SAndroid Build Coastguard Worker           Passes.add(createBasicBlockPassPrinter(PassInf, Out->os(), Quiet));
574*9880d681SAndroid Build Coastguard Worker           break;
575*9880d681SAndroid Build Coastguard Worker         case PT_Region:
576*9880d681SAndroid Build Coastguard Worker           Passes.add(createRegionPassPrinter(PassInf, Out->os(), Quiet));
577*9880d681SAndroid Build Coastguard Worker           break;
578*9880d681SAndroid Build Coastguard Worker         case PT_Loop:
579*9880d681SAndroid Build Coastguard Worker           Passes.add(createLoopPassPrinter(PassInf, Out->os(), Quiet));
580*9880d681SAndroid Build Coastguard Worker           break;
581*9880d681SAndroid Build Coastguard Worker         case PT_Function:
582*9880d681SAndroid Build Coastguard Worker           Passes.add(createFunctionPassPrinter(PassInf, Out->os(), Quiet));
583*9880d681SAndroid Build Coastguard Worker           break;
584*9880d681SAndroid Build Coastguard Worker         case PT_CallGraphSCC:
585*9880d681SAndroid Build Coastguard Worker           Passes.add(createCallGraphPassPrinter(PassInf, Out->os(), Quiet));
586*9880d681SAndroid Build Coastguard Worker           break;
587*9880d681SAndroid Build Coastguard Worker         default:
588*9880d681SAndroid Build Coastguard Worker           Passes.add(createModulePassPrinter(PassInf, Out->os(), Quiet));
589*9880d681SAndroid Build Coastguard Worker           break;
590*9880d681SAndroid Build Coastguard Worker         }
591*9880d681SAndroid Build Coastguard Worker       }
592*9880d681SAndroid Build Coastguard Worker     }
593*9880d681SAndroid Build Coastguard Worker 
594*9880d681SAndroid Build Coastguard Worker     if (PrintEachXForm)
595*9880d681SAndroid Build Coastguard Worker       Passes.add(
596*9880d681SAndroid Build Coastguard Worker           createPrintModulePass(errs(), "", PreserveAssemblyUseListOrder));
597*9880d681SAndroid Build Coastguard Worker   }
598*9880d681SAndroid Build Coastguard Worker 
599*9880d681SAndroid Build Coastguard Worker   if (StandardLinkOpts) {
600*9880d681SAndroid Build Coastguard Worker     AddStandardLinkPasses(Passes);
601*9880d681SAndroid Build Coastguard Worker     StandardLinkOpts = false;
602*9880d681SAndroid Build Coastguard Worker   }
603*9880d681SAndroid Build Coastguard Worker 
604*9880d681SAndroid Build Coastguard Worker   if (OptLevelO1)
605*9880d681SAndroid Build Coastguard Worker     AddOptimizationPasses(Passes, *FPasses, TM.get(), 1, 0);
606*9880d681SAndroid Build Coastguard Worker 
607*9880d681SAndroid Build Coastguard Worker   if (OptLevelO2)
608*9880d681SAndroid Build Coastguard Worker     AddOptimizationPasses(Passes, *FPasses, TM.get(), 2, 0);
609*9880d681SAndroid Build Coastguard Worker 
610*9880d681SAndroid Build Coastguard Worker   if (OptLevelOs)
611*9880d681SAndroid Build Coastguard Worker     AddOptimizationPasses(Passes, *FPasses, TM.get(), 2, 1);
612*9880d681SAndroid Build Coastguard Worker 
613*9880d681SAndroid Build Coastguard Worker   if (OptLevelOz)
614*9880d681SAndroid Build Coastguard Worker     AddOptimizationPasses(Passes, *FPasses, TM.get(), 2, 2);
615*9880d681SAndroid Build Coastguard Worker 
616*9880d681SAndroid Build Coastguard Worker   if (OptLevelO3)
617*9880d681SAndroid Build Coastguard Worker     AddOptimizationPasses(Passes, *FPasses, TM.get(), 3, 0);
618*9880d681SAndroid Build Coastguard Worker 
619*9880d681SAndroid Build Coastguard Worker   if (FPasses) {
620*9880d681SAndroid Build Coastguard Worker     FPasses->doInitialization();
621*9880d681SAndroid Build Coastguard Worker     for (Function &F : *M)
622*9880d681SAndroid Build Coastguard Worker       FPasses->run(F);
623*9880d681SAndroid Build Coastguard Worker     FPasses->doFinalization();
624*9880d681SAndroid Build Coastguard Worker   }
625*9880d681SAndroid Build Coastguard Worker 
626*9880d681SAndroid Build Coastguard Worker   // Check that the module is well formed on completion of optimization
627*9880d681SAndroid Build Coastguard Worker   if (!NoVerify && !VerifyEach)
628*9880d681SAndroid Build Coastguard Worker     Passes.add(createVerifierPass());
629*9880d681SAndroid Build Coastguard Worker 
630*9880d681SAndroid Build Coastguard Worker   // In run twice mode, we want to make sure the output is bit-by-bit
631*9880d681SAndroid Build Coastguard Worker   // equivalent if we run the pass manager again, so setup two buffers and
632*9880d681SAndroid Build Coastguard Worker   // a stream to write to them. Note that llc does something similar and it
633*9880d681SAndroid Build Coastguard Worker   // may be worth to abstract this out in the future.
634*9880d681SAndroid Build Coastguard Worker   SmallVector<char, 0> Buffer;
635*9880d681SAndroid Build Coastguard Worker   SmallVector<char, 0> CompileTwiceBuffer;
636*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<raw_svector_ostream> BOS;
637*9880d681SAndroid Build Coastguard Worker   raw_ostream *OS = nullptr;
638*9880d681SAndroid Build Coastguard Worker 
639*9880d681SAndroid Build Coastguard Worker   // Write bitcode or assembly to the output as the last step...
640*9880d681SAndroid Build Coastguard Worker   if (!NoOutput && !AnalyzeOnly) {
641*9880d681SAndroid Build Coastguard Worker     assert(Out);
642*9880d681SAndroid Build Coastguard Worker     OS = &Out->os();
643*9880d681SAndroid Build Coastguard Worker     if (RunTwice) {
644*9880d681SAndroid Build Coastguard Worker       BOS = make_unique<raw_svector_ostream>(Buffer);
645*9880d681SAndroid Build Coastguard Worker       OS = BOS.get();
646*9880d681SAndroid Build Coastguard Worker     }
647*9880d681SAndroid Build Coastguard Worker     if (OutputAssembly) {
648*9880d681SAndroid Build Coastguard Worker       if (EmitSummaryIndex)
649*9880d681SAndroid Build Coastguard Worker         report_fatal_error("Text output is incompatible with -module-summary");
650*9880d681SAndroid Build Coastguard Worker       if (EmitModuleHash)
651*9880d681SAndroid Build Coastguard Worker         report_fatal_error("Text output is incompatible with -module-hash");
652*9880d681SAndroid Build Coastguard Worker       Passes.add(createPrintModulePass(*OS, "", PreserveAssemblyUseListOrder));
653*9880d681SAndroid Build Coastguard Worker     } else
654*9880d681SAndroid Build Coastguard Worker       Passes.add(createBitcodeWriterPass(*OS, PreserveBitcodeUseListOrder,
655*9880d681SAndroid Build Coastguard Worker                                          EmitSummaryIndex, EmitModuleHash));
656*9880d681SAndroid Build Coastguard Worker   }
657*9880d681SAndroid Build Coastguard Worker 
658*9880d681SAndroid Build Coastguard Worker   // Before executing passes, print the final values of the LLVM options.
659*9880d681SAndroid Build Coastguard Worker   cl::PrintOptionValues();
660*9880d681SAndroid Build Coastguard Worker 
661*9880d681SAndroid Build Coastguard Worker   // If requested, run all passes again with the same pass manager to catch
662*9880d681SAndroid Build Coastguard Worker   // bugs caused by persistent state in the passes
663*9880d681SAndroid Build Coastguard Worker   if (RunTwice) {
664*9880d681SAndroid Build Coastguard Worker       std::unique_ptr<Module> M2(CloneModule(M.get()));
665*9880d681SAndroid Build Coastguard Worker       Passes.run(*M2);
666*9880d681SAndroid Build Coastguard Worker       CompileTwiceBuffer = Buffer;
667*9880d681SAndroid Build Coastguard Worker       Buffer.clear();
668*9880d681SAndroid Build Coastguard Worker   }
669*9880d681SAndroid Build Coastguard Worker 
670*9880d681SAndroid Build Coastguard Worker   // Now that we have all of the passes ready, run them.
671*9880d681SAndroid Build Coastguard Worker   Passes.run(*M);
672*9880d681SAndroid Build Coastguard Worker 
673*9880d681SAndroid Build Coastguard Worker   // Compare the two outputs and make sure they're the same
674*9880d681SAndroid Build Coastguard Worker   if (RunTwice) {
675*9880d681SAndroid Build Coastguard Worker     assert(Out);
676*9880d681SAndroid Build Coastguard Worker     if (Buffer.size() != CompileTwiceBuffer.size() ||
677*9880d681SAndroid Build Coastguard Worker         (memcmp(Buffer.data(), CompileTwiceBuffer.data(), Buffer.size()) !=
678*9880d681SAndroid Build Coastguard Worker          0)) {
679*9880d681SAndroid Build Coastguard Worker       errs() << "Running the pass manager twice changed the output.\n"
680*9880d681SAndroid Build Coastguard Worker                 "Writing the result of the second run to the specified output.\n"
681*9880d681SAndroid Build Coastguard Worker                 "To generate the one-run comparison binary, just run without\n"
682*9880d681SAndroid Build Coastguard Worker                 "the compile-twice option\n";
683*9880d681SAndroid Build Coastguard Worker       Out->os() << BOS->str();
684*9880d681SAndroid Build Coastguard Worker       Out->keep();
685*9880d681SAndroid Build Coastguard Worker       return 1;
686*9880d681SAndroid Build Coastguard Worker     }
687*9880d681SAndroid Build Coastguard Worker     Out->os() << BOS->str();
688*9880d681SAndroid Build Coastguard Worker   }
689*9880d681SAndroid Build Coastguard Worker 
690*9880d681SAndroid Build Coastguard Worker   // Declare success.
691*9880d681SAndroid Build Coastguard Worker   if (!NoOutput || PrintBreakpoints)
692*9880d681SAndroid Build Coastguard Worker     Out->keep();
693*9880d681SAndroid Build Coastguard Worker 
694*9880d681SAndroid Build Coastguard Worker   return 0;
695*9880d681SAndroid Build Coastguard Worker }
696