opt.cpp revision 263508
1//===- opt.cpp - The LLVM Modular Optimizer -------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Optimizations may be specified an arbitrary number of times on the command
11// line, They are run in the order specified.
12//
13//===----------------------------------------------------------------------===//
14
15#include "llvm/IR/LLVMContext.h"
16#include "llvm/ADT/StringSet.h"
17#include "llvm/ADT/Triple.h"
18#include "llvm/Analysis/CallGraph.h"
19#include "llvm/Analysis/CallGraphSCCPass.h"
20#include "llvm/Analysis/LoopPass.h"
21#include "llvm/Analysis/RegionPass.h"
22#include "llvm/Analysis/Verifier.h"
23#include "llvm/Assembly/PrintModulePass.h"
24#include "llvm/Bitcode/ReaderWriter.h"
25#include "llvm/CodeGen/CommandFlags.h"
26#include "llvm/DebugInfo.h"
27#include "llvm/IR/DataLayout.h"
28#include "llvm/IR/Module.h"
29#include "llvm/IRReader/IRReader.h"
30#include "llvm/LinkAllIR.h"
31#include "llvm/LinkAllPasses.h"
32#include "llvm/MC/SubtargetFeature.h"
33#include "llvm/PassManager.h"
34#include "llvm/Support/Debug.h"
35#include "llvm/Support/ManagedStatic.h"
36#include "llvm/Support/PassNameParser.h"
37#include "llvm/Support/PluginLoader.h"
38#include "llvm/Support/PrettyStackTrace.h"
39#include "llvm/Support/Signals.h"
40#include "llvm/Support/SourceMgr.h"
41#include "llvm/Support/SystemUtils.h"
42#include "llvm/Support/TargetRegistry.h"
43#include "llvm/Support/TargetSelect.h"
44#include "llvm/Support/ToolOutputFile.h"
45#include "llvm/Target/TargetLibraryInfo.h"
46#include "llvm/Target/TargetMachine.h"
47#include "llvm/Transforms/IPO/PassManagerBuilder.h"
48#include <algorithm>
49#include <memory>
50using namespace llvm;
51
52// The OptimizationList is automatically populated with registered Passes by the
53// PassNameParser.
54//
55static cl::list<const PassInfo*, bool, PassNameParser>
56PassList(cl::desc("Optimizations available:"));
57
58// Other command line options...
59//
60static cl::opt<std::string>
61InputFilename(cl::Positional, cl::desc("<input bitcode file>"),
62    cl::init("-"), cl::value_desc("filename"));
63
64static cl::opt<std::string>
65OutputFilename("o", cl::desc("Override output filename"),
66               cl::value_desc("filename"));
67
68static cl::opt<bool>
69Force("f", cl::desc("Enable binary output on terminals"));
70
71static cl::opt<bool>
72PrintEachXForm("p", cl::desc("Print module after each transformation"));
73
74static cl::opt<bool>
75NoOutput("disable-output",
76         cl::desc("Do not write result bitcode file"), cl::Hidden);
77
78static cl::opt<bool>
79OutputAssembly("S", cl::desc("Write output as LLVM assembly"));
80
81static cl::opt<bool>
82NoVerify("disable-verify", cl::desc("Do not verify result module"), cl::Hidden);
83
84static cl::opt<bool>
85VerifyEach("verify-each", cl::desc("Verify after each transform"));
86
87static cl::opt<bool>
88StripDebug("strip-debug",
89           cl::desc("Strip debugger symbol info from translation unit"));
90
91static cl::opt<bool>
92DisableInline("disable-inlining", cl::desc("Do not run the inliner pass"));
93
94static cl::opt<bool>
95DisableOptimizations("disable-opt",
96                     cl::desc("Do not run any optimization passes"));
97
98static cl::opt<bool>
99DisableInternalize("disable-internalize",
100                   cl::desc("Do not mark all symbols as internal"));
101
102static cl::opt<bool>
103StandardCompileOpts("std-compile-opts",
104                   cl::desc("Include the standard compile time optimizations"));
105
106static cl::opt<bool>
107StandardLinkOpts("std-link-opts",
108                 cl::desc("Include the standard link time optimizations"));
109
110static cl::opt<bool>
111OptLevelO1("O1",
112           cl::desc("Optimization level 1. Similar to clang -O1"));
113
114static cl::opt<bool>
115OptLevelO2("O2",
116           cl::desc("Optimization level 2. Similar to clang -O2"));
117
118static cl::opt<bool>
119OptLevelOs("Os",
120           cl::desc("Like -O2 with extra optimizations for size. Similar to clang -Os"));
121
122static cl::opt<bool>
123OptLevelOz("Oz",
124           cl::desc("Like -Os but reduces code size further. Similar to clang -Oz"));
125
126static cl::opt<bool>
127OptLevelO3("O3",
128           cl::desc("Optimization level 3. Similar to clang -O3"));
129
130static cl::opt<std::string>
131TargetTriple("mtriple", cl::desc("Override target triple for module"));
132
133static cl::opt<bool>
134UnitAtATime("funit-at-a-time",
135            cl::desc("Enable IPO. This is same as llvm-gcc's -funit-at-a-time"),
136            cl::init(true));
137
138static cl::opt<bool>
139DisableLoopUnrolling("disable-loop-unrolling",
140                     cl::desc("Disable loop unrolling in all relevant passes"),
141                     cl::init(false));
142static cl::opt<bool>
143DisableLoopVectorization("disable-loop-vectorization",
144                     cl::desc("Disable the loop vectorization pass"),
145                     cl::init(false));
146
147static cl::opt<bool>
148DisableSLPVectorization("disable-slp-vectorization",
149                        cl::desc("Disable the slp vectorization pass"),
150                        cl::init(false));
151
152
153static cl::opt<bool>
154DisableSimplifyLibCalls("disable-simplify-libcalls",
155                        cl::desc("Disable simplify-libcalls"));
156
157static cl::opt<bool>
158Quiet("q", cl::desc("Obsolete option"), cl::Hidden);
159
160static cl::alias
161QuietA("quiet", cl::desc("Alias for -q"), cl::aliasopt(Quiet));
162
163static cl::opt<bool>
164AnalyzeOnly("analyze", cl::desc("Only perform analysis, no optimization"));
165
166static cl::opt<bool>
167PrintBreakpoints("print-breakpoints-for-testing",
168                 cl::desc("Print select breakpoints location for testing"));
169
170static cl::opt<std::string>
171DefaultDataLayout("default-data-layout",
172          cl::desc("data layout string to use if not specified by module"),
173          cl::value_desc("layout-string"), cl::init(""));
174
175// ---------- Define Printers for module and function passes ------------
176namespace {
177
178struct CallGraphSCCPassPrinter : public CallGraphSCCPass {
179  static char ID;
180  const PassInfo *PassToPrint;
181  raw_ostream &Out;
182  std::string PassName;
183
184  CallGraphSCCPassPrinter(const PassInfo *PI, raw_ostream &out) :
185    CallGraphSCCPass(ID), PassToPrint(PI), Out(out) {
186      std::string PassToPrintName =  PassToPrint->getPassName();
187      PassName = "CallGraphSCCPass Printer: " + PassToPrintName;
188    }
189
190  virtual bool runOnSCC(CallGraphSCC &SCC) {
191    if (!Quiet)
192      Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
193
194    // Get and print pass...
195    for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
196      Function *F = (*I)->getFunction();
197      if (F)
198        getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out,
199                                                              F->getParent());
200    }
201    return false;
202  }
203
204  virtual const char *getPassName() const { return PassName.c_str(); }
205
206  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
207    AU.addRequiredID(PassToPrint->getTypeInfo());
208    AU.setPreservesAll();
209  }
210};
211
212char CallGraphSCCPassPrinter::ID = 0;
213
214struct ModulePassPrinter : public ModulePass {
215  static char ID;
216  const PassInfo *PassToPrint;
217  raw_ostream &Out;
218  std::string PassName;
219
220  ModulePassPrinter(const PassInfo *PI, raw_ostream &out)
221    : ModulePass(ID), PassToPrint(PI), Out(out) {
222      std::string PassToPrintName =  PassToPrint->getPassName();
223      PassName = "ModulePass Printer: " + PassToPrintName;
224    }
225
226  virtual bool runOnModule(Module &M) {
227    if (!Quiet)
228      Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
229
230    // Get and print pass...
231    getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, &M);
232    return false;
233  }
234
235  virtual const char *getPassName() const { return PassName.c_str(); }
236
237  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
238    AU.addRequiredID(PassToPrint->getTypeInfo());
239    AU.setPreservesAll();
240  }
241};
242
243char ModulePassPrinter::ID = 0;
244struct FunctionPassPrinter : public FunctionPass {
245  const PassInfo *PassToPrint;
246  raw_ostream &Out;
247  static char ID;
248  std::string PassName;
249
250  FunctionPassPrinter(const PassInfo *PI, raw_ostream &out)
251    : FunctionPass(ID), PassToPrint(PI), Out(out) {
252      std::string PassToPrintName =  PassToPrint->getPassName();
253      PassName = "FunctionPass Printer: " + PassToPrintName;
254    }
255
256  virtual bool runOnFunction(Function &F) {
257    if (!Quiet)
258      Out << "Printing analysis '" << PassToPrint->getPassName()
259          << "' for function '" << F.getName() << "':\n";
260
261    // Get and print pass...
262    getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out,
263            F.getParent());
264    return false;
265  }
266
267  virtual const char *getPassName() const { return PassName.c_str(); }
268
269  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
270    AU.addRequiredID(PassToPrint->getTypeInfo());
271    AU.setPreservesAll();
272  }
273};
274
275char FunctionPassPrinter::ID = 0;
276
277struct LoopPassPrinter : public LoopPass {
278  static char ID;
279  const PassInfo *PassToPrint;
280  raw_ostream &Out;
281  std::string PassName;
282
283  LoopPassPrinter(const PassInfo *PI, raw_ostream &out) :
284    LoopPass(ID), PassToPrint(PI), Out(out) {
285      std::string PassToPrintName =  PassToPrint->getPassName();
286      PassName = "LoopPass Printer: " + PassToPrintName;
287    }
288
289
290  virtual bool runOnLoop(Loop *L, LPPassManager &LPM) {
291    if (!Quiet)
292      Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
293
294    // Get and print pass...
295    getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out,
296                        L->getHeader()->getParent()->getParent());
297    return false;
298  }
299
300  virtual const char *getPassName() const { return PassName.c_str(); }
301
302  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
303    AU.addRequiredID(PassToPrint->getTypeInfo());
304    AU.setPreservesAll();
305  }
306};
307
308char LoopPassPrinter::ID = 0;
309
310struct RegionPassPrinter : public RegionPass {
311  static char ID;
312  const PassInfo *PassToPrint;
313  raw_ostream &Out;
314  std::string PassName;
315
316  RegionPassPrinter(const PassInfo *PI, raw_ostream &out) : RegionPass(ID),
317    PassToPrint(PI), Out(out) {
318    std::string PassToPrintName =  PassToPrint->getPassName();
319    PassName = "RegionPass Printer: " + PassToPrintName;
320  }
321
322  virtual bool runOnRegion(Region *R, RGPassManager &RGM) {
323    if (!Quiet) {
324      Out << "Printing analysis '" << PassToPrint->getPassName() << "' for "
325          << "region: '" << R->getNameStr() << "' in function '"
326          << R->getEntry()->getParent()->getName() << "':\n";
327    }
328    // Get and print pass...
329   getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out,
330                       R->getEntry()->getParent()->getParent());
331    return false;
332  }
333
334  virtual const char *getPassName() const { return PassName.c_str(); }
335
336  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
337    AU.addRequiredID(PassToPrint->getTypeInfo());
338    AU.setPreservesAll();
339  }
340};
341
342char RegionPassPrinter::ID = 0;
343
344struct BasicBlockPassPrinter : public BasicBlockPass {
345  const PassInfo *PassToPrint;
346  raw_ostream &Out;
347  static char ID;
348  std::string PassName;
349
350  BasicBlockPassPrinter(const PassInfo *PI, raw_ostream &out)
351    : BasicBlockPass(ID), PassToPrint(PI), Out(out) {
352      std::string PassToPrintName =  PassToPrint->getPassName();
353      PassName = "BasicBlockPass Printer: " + PassToPrintName;
354    }
355
356  virtual bool runOnBasicBlock(BasicBlock &BB) {
357    if (!Quiet)
358      Out << "Printing Analysis info for BasicBlock '" << BB.getName()
359          << "': Pass " << PassToPrint->getPassName() << ":\n";
360
361    // Get and print pass...
362    getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out,
363            BB.getParent()->getParent());
364    return false;
365  }
366
367  virtual const char *getPassName() const { return PassName.c_str(); }
368
369  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
370    AU.addRequiredID(PassToPrint->getTypeInfo());
371    AU.setPreservesAll();
372  }
373};
374
375char BasicBlockPassPrinter::ID = 0;
376
377struct BreakpointPrinter : public ModulePass {
378  raw_ostream &Out;
379  static char ID;
380  DITypeIdentifierMap TypeIdentifierMap;
381
382  BreakpointPrinter(raw_ostream &out)
383    : ModulePass(ID), Out(out) {
384    }
385
386  void getContextName(DIDescriptor Context, std::string &N) {
387    if (Context.isNameSpace()) {
388      DINameSpace NS(Context);
389      if (!NS.getName().empty()) {
390        getContextName(NS.getContext(), N);
391        N = N + NS.getName().str() + "::";
392      }
393    } else if (Context.isType()) {
394      DIType TY(Context);
395      if (!TY.getName().empty()) {
396        getContextName(TY.getContext().resolve(TypeIdentifierMap), N);
397        N = N + TY.getName().str() + "::";
398      }
399    }
400  }
401
402  virtual bool runOnModule(Module &M) {
403    TypeIdentifierMap.clear();
404    NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu");
405    if (CU_Nodes)
406      TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
407
408    StringSet<> Processed;
409    if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.sp"))
410      for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
411        std::string Name;
412        DISubprogram SP(NMD->getOperand(i));
413        assert((!SP || SP.isSubprogram()) &&
414          "A MDNode in llvm.dbg.sp should be null or a DISubprogram.");
415        if (!SP)
416          continue;
417        getContextName(SP.getContext().resolve(TypeIdentifierMap), Name);
418        Name = Name + SP.getDisplayName().str();
419        if (!Name.empty() && Processed.insert(Name)) {
420          Out << Name << "\n";
421        }
422      }
423    return false;
424  }
425
426  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
427    AU.setPreservesAll();
428  }
429};
430
431} // anonymous namespace
432
433char BreakpointPrinter::ID = 0;
434
435static inline void addPass(PassManagerBase &PM, Pass *P) {
436  // Add the pass to the pass manager...
437  PM.add(P);
438
439  // If we are verifying all of the intermediate steps, add the verifier...
440  if (VerifyEach) PM.add(createVerifierPass());
441}
442
443/// AddOptimizationPasses - This routine adds optimization passes
444/// based on selected optimization level, OptLevel. This routine
445/// duplicates llvm-gcc behaviour.
446///
447/// OptLevel - Optimization Level
448static void AddOptimizationPasses(PassManagerBase &MPM,FunctionPassManager &FPM,
449                                  unsigned OptLevel, unsigned SizeLevel) {
450  FPM.add(createVerifierPass());                  // Verify that input is correct
451
452  PassManagerBuilder Builder;
453  Builder.OptLevel = OptLevel;
454  Builder.SizeLevel = SizeLevel;
455
456  if (DisableInline) {
457    // No inlining pass
458  } else if (OptLevel > 1) {
459    unsigned Threshold = 225;
460    if (SizeLevel == 1)      // -Os
461      Threshold = 75;
462    else if (SizeLevel == 2) // -Oz
463      Threshold = 25;
464    if (OptLevel > 2)
465      Threshold = 275;
466    Builder.Inliner = createFunctionInliningPass(Threshold);
467  } else {
468    Builder.Inliner = createAlwaysInlinerPass();
469  }
470  Builder.DisableUnitAtATime = !UnitAtATime;
471  Builder.DisableUnrollLoops = (DisableLoopUnrolling.getNumOccurrences() > 0) ?
472                               DisableLoopUnrolling : OptLevel == 0;
473
474  Builder.LoopVectorize =
475      DisableLoopVectorization ? false : OptLevel > 1 && SizeLevel < 2;
476  Builder.SLPVectorize =
477      DisableSLPVectorization ? false : OptLevel > 1 && SizeLevel < 2;
478
479  Builder.populateFunctionPassManager(FPM);
480  Builder.populateModulePassManager(MPM);
481}
482
483static void AddStandardCompilePasses(PassManagerBase &PM) {
484  PM.add(createVerifierPass());                  // Verify that input is correct
485
486  // If the -strip-debug command line option was specified, do it.
487  if (StripDebug)
488    addPass(PM, createStripSymbolsPass(true));
489
490  if (DisableOptimizations) return;
491
492  // -std-compile-opts adds the same module passes as -O3.
493  PassManagerBuilder Builder;
494  if (!DisableInline)
495    Builder.Inliner = createFunctionInliningPass();
496  Builder.OptLevel = 3;
497  Builder.populateModulePassManager(PM);
498}
499
500static void AddStandardLinkPasses(PassManagerBase &PM) {
501  PM.add(createVerifierPass());                  // Verify that input is correct
502
503  // If the -strip-debug command line option was specified, do it.
504  if (StripDebug)
505    addPass(PM, createStripSymbolsPass(true));
506
507  if (DisableOptimizations) return;
508
509  PassManagerBuilder Builder;
510  Builder.populateLTOPassManager(PM, /*Internalize=*/ !DisableInternalize,
511                                 /*RunInliner=*/ !DisableInline);
512}
513
514//===----------------------------------------------------------------------===//
515// CodeGen-related helper functions.
516//
517static TargetOptions GetTargetOptions() {
518  TargetOptions Options;
519  Options.LessPreciseFPMADOption = EnableFPMAD;
520  Options.NoFramePointerElim = DisableFPElim;
521  Options.AllowFPOpFusion = FuseFPOps;
522  Options.UnsafeFPMath = EnableUnsafeFPMath;
523  Options.NoInfsFPMath = EnableNoInfsFPMath;
524  Options.NoNaNsFPMath = EnableNoNaNsFPMath;
525  Options.HonorSignDependentRoundingFPMathOption =
526  EnableHonorSignDependentRoundingFPMath;
527  Options.UseSoftFloat = GenerateSoftFloatCalls;
528  if (FloatABIForCalls != FloatABI::Default)
529    Options.FloatABIType = FloatABIForCalls;
530  Options.NoZerosInBSS = DontPlaceZerosInBSS;
531  Options.GuaranteedTailCallOpt = EnableGuaranteedTailCallOpt;
532  Options.DisableTailCalls = DisableTailCalls;
533  Options.StackAlignmentOverride = OverrideStackAlignment;
534  Options.TrapFuncName = TrapFuncName;
535  Options.PositionIndependentExecutable = EnablePIE;
536  Options.EnableSegmentedStacks = SegmentedStacks;
537  Options.UseInitArray = UseInitArray;
538  return Options;
539}
540
541CodeGenOpt::Level GetCodeGenOptLevel() {
542  if (OptLevelO1)
543    return CodeGenOpt::Less;
544  if (OptLevelO2)
545    return CodeGenOpt::Default;
546  if (OptLevelO3)
547    return CodeGenOpt::Aggressive;
548  return CodeGenOpt::None;
549}
550
551// Returns the TargetMachine instance or zero if no triple is provided.
552static TargetMachine* GetTargetMachine(Triple TheTriple) {
553  std::string Error;
554  const Target *TheTarget = TargetRegistry::lookupTarget(MArch, TheTriple,
555                                                         Error);
556  // Some modules don't specify a triple, and this is okay.
557  if (!TheTarget) {
558    return 0;
559  }
560
561  // Package up features to be passed to target/subtarget
562  std::string FeaturesStr;
563  if (MAttrs.size()) {
564    SubtargetFeatures Features;
565    for (unsigned i = 0; i != MAttrs.size(); ++i)
566      Features.AddFeature(MAttrs[i]);
567    FeaturesStr = Features.getString();
568  }
569
570  return TheTarget->createTargetMachine(TheTriple.getTriple(),
571                                        MCPU, FeaturesStr, GetTargetOptions(),
572                                        RelocModel, CMModel,
573                                        GetCodeGenOptLevel());
574}
575
576//===----------------------------------------------------------------------===//
577// main for opt
578//
579int main(int argc, char **argv) {
580  sys::PrintStackTraceOnErrorSignal();
581  llvm::PrettyStackTraceProgram X(argc, argv);
582
583  // Enable debug stream buffering.
584  EnableDebugBuffering = true;
585
586  llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.
587  LLVMContext &Context = getGlobalContext();
588
589  InitializeAllTargets();
590  InitializeAllTargetMCs();
591
592  // Initialize passes
593  PassRegistry &Registry = *PassRegistry::getPassRegistry();
594  initializeCore(Registry);
595  initializeDebugIRPass(Registry);
596  initializeScalarOpts(Registry);
597  initializeObjCARCOpts(Registry);
598  initializeVectorization(Registry);
599  initializeIPO(Registry);
600  initializeAnalysis(Registry);
601  initializeIPA(Registry);
602  initializeTransformUtils(Registry);
603  initializeInstCombine(Registry);
604  initializeInstrumentation(Registry);
605  initializeTarget(Registry);
606
607  cl::ParseCommandLineOptions(argc, argv,
608    "llvm .bc -> .bc modular optimizer and analysis printer\n");
609
610  if (AnalyzeOnly && NoOutput) {
611    errs() << argv[0] << ": analyze mode conflicts with no-output mode.\n";
612    return 1;
613  }
614
615  SMDiagnostic Err;
616
617  // Load the input module...
618  OwningPtr<Module> M;
619  M.reset(ParseIRFile(InputFilename, Err, Context));
620
621  if (M.get() == 0) {
622    Err.print(argv[0], errs());
623    return 1;
624  }
625
626  // If we are supposed to override the target triple, do so now.
627  if (!TargetTriple.empty())
628    M->setTargetTriple(Triple::normalize(TargetTriple));
629
630  // Figure out what stream we are supposed to write to...
631  OwningPtr<tool_output_file> Out;
632  if (NoOutput) {
633    if (!OutputFilename.empty())
634      errs() << "WARNING: The -o (output filename) option is ignored when\n"
635                "the --disable-output option is used.\n";
636  } else {
637    // Default to standard output.
638    if (OutputFilename.empty())
639      OutputFilename = "-";
640
641    std::string ErrorInfo;
642    Out.reset(new tool_output_file(OutputFilename.c_str(), ErrorInfo,
643                                   sys::fs::F_Binary));
644    if (!ErrorInfo.empty()) {
645      errs() << ErrorInfo << '\n';
646      return 1;
647    }
648  }
649
650  // If the output is set to be emitted to standard out, and standard out is a
651  // console, print out a warning message and refuse to do it.  We don't
652  // impress anyone by spewing tons of binary goo to a terminal.
653  if (!Force && !NoOutput && !AnalyzeOnly && !OutputAssembly)
654    if (CheckBitcodeOutputToConsole(Out->os(), !Quiet))
655      NoOutput = true;
656
657  // Create a PassManager to hold and optimize the collection of passes we are
658  // about to build.
659  //
660  PassManager Passes;
661
662  // Add an appropriate TargetLibraryInfo pass for the module's triple.
663  TargetLibraryInfo *TLI = new TargetLibraryInfo(Triple(M->getTargetTriple()));
664
665  // The -disable-simplify-libcalls flag actually disables all builtin optzns.
666  if (DisableSimplifyLibCalls)
667    TLI->disableAllFunctions();
668  Passes.add(TLI);
669
670  // Add an appropriate DataLayout instance for this module.
671  DataLayout *TD = 0;
672  const std::string &ModuleDataLayout = M.get()->getDataLayout();
673  if (!ModuleDataLayout.empty())
674    TD = new DataLayout(ModuleDataLayout);
675  else if (!DefaultDataLayout.empty())
676    TD = new DataLayout(DefaultDataLayout);
677
678  if (TD)
679    Passes.add(TD);
680
681  Triple ModuleTriple(M->getTargetTriple());
682  TargetMachine *Machine = 0;
683  if (ModuleTriple.getArch())
684    Machine = GetTargetMachine(Triple(ModuleTriple));
685  OwningPtr<TargetMachine> TM(Machine);
686
687  // Add internal analysis passes from the target machine.
688  if (TM.get())
689    TM->addAnalysisPasses(Passes);
690
691  OwningPtr<FunctionPassManager> FPasses;
692  if (OptLevelO1 || OptLevelO2 || OptLevelOs || OptLevelOz || OptLevelO3) {
693    FPasses.reset(new FunctionPassManager(M.get()));
694    if (TD)
695      FPasses->add(new DataLayout(*TD));
696    if (TM.get())
697      TM->addAnalysisPasses(*FPasses);
698
699  }
700
701  if (PrintBreakpoints) {
702    // Default to standard output.
703    if (!Out) {
704      if (OutputFilename.empty())
705        OutputFilename = "-";
706
707      std::string ErrorInfo;
708      Out.reset(new tool_output_file(OutputFilename.c_str(), ErrorInfo,
709                                     sys::fs::F_Binary));
710      if (!ErrorInfo.empty()) {
711        errs() << ErrorInfo << '\n';
712        return 1;
713      }
714    }
715    Passes.add(new BreakpointPrinter(Out->os()));
716    NoOutput = true;
717  }
718
719  // If the -strip-debug command line option was specified, add it.  If
720  // -std-compile-opts was also specified, it will handle StripDebug.
721  if (StripDebug && !StandardCompileOpts)
722    addPass(Passes, createStripSymbolsPass(true));
723
724  // Create a new optimization pass for each one specified on the command line
725  for (unsigned i = 0; i < PassList.size(); ++i) {
726    // Check to see if -std-compile-opts was specified before this option.  If
727    // so, handle it.
728    if (StandardCompileOpts &&
729        StandardCompileOpts.getPosition() < PassList.getPosition(i)) {
730      AddStandardCompilePasses(Passes);
731      StandardCompileOpts = false;
732    }
733
734    if (StandardLinkOpts &&
735        StandardLinkOpts.getPosition() < PassList.getPosition(i)) {
736      AddStandardLinkPasses(Passes);
737      StandardLinkOpts = false;
738    }
739
740    if (OptLevelO1 && OptLevelO1.getPosition() < PassList.getPosition(i)) {
741      AddOptimizationPasses(Passes, *FPasses, 1, 0);
742      OptLevelO1 = false;
743    }
744
745    if (OptLevelO2 && OptLevelO2.getPosition() < PassList.getPosition(i)) {
746      AddOptimizationPasses(Passes, *FPasses, 2, 0);
747      OptLevelO2 = false;
748    }
749
750    if (OptLevelOs && OptLevelOs.getPosition() < PassList.getPosition(i)) {
751      AddOptimizationPasses(Passes, *FPasses, 2, 1);
752      OptLevelOs = false;
753    }
754
755    if (OptLevelOz && OptLevelOz.getPosition() < PassList.getPosition(i)) {
756      AddOptimizationPasses(Passes, *FPasses, 2, 2);
757      OptLevelOz = false;
758    }
759
760    if (OptLevelO3 && OptLevelO3.getPosition() < PassList.getPosition(i)) {
761      AddOptimizationPasses(Passes, *FPasses, 3, 0);
762      OptLevelO3 = false;
763    }
764
765    const PassInfo *PassInf = PassList[i];
766    Pass *P = 0;
767    if (PassInf->getNormalCtor())
768      P = PassInf->getNormalCtor()();
769    else
770      errs() << argv[0] << ": cannot create pass: "
771             << PassInf->getPassName() << "\n";
772    if (P) {
773      PassKind Kind = P->getPassKind();
774      addPass(Passes, P);
775
776      if (AnalyzeOnly) {
777        switch (Kind) {
778        case PT_BasicBlock:
779          Passes.add(new BasicBlockPassPrinter(PassInf, Out->os()));
780          break;
781        case PT_Region:
782          Passes.add(new RegionPassPrinter(PassInf, Out->os()));
783          break;
784        case PT_Loop:
785          Passes.add(new LoopPassPrinter(PassInf, Out->os()));
786          break;
787        case PT_Function:
788          Passes.add(new FunctionPassPrinter(PassInf, Out->os()));
789          break;
790        case PT_CallGraphSCC:
791          Passes.add(new CallGraphSCCPassPrinter(PassInf, Out->os()));
792          break;
793        default:
794          Passes.add(new ModulePassPrinter(PassInf, Out->os()));
795          break;
796        }
797      }
798    }
799
800    if (PrintEachXForm)
801      Passes.add(createPrintModulePass(&errs()));
802  }
803
804  // If -std-compile-opts was specified at the end of the pass list, add them.
805  if (StandardCompileOpts) {
806    AddStandardCompilePasses(Passes);
807    StandardCompileOpts = false;
808  }
809
810  if (StandardLinkOpts) {
811    AddStandardLinkPasses(Passes);
812    StandardLinkOpts = false;
813  }
814
815  if (OptLevelO1)
816    AddOptimizationPasses(Passes, *FPasses, 1, 0);
817
818  if (OptLevelO2)
819    AddOptimizationPasses(Passes, *FPasses, 2, 0);
820
821  if (OptLevelOs)
822    AddOptimizationPasses(Passes, *FPasses, 2, 1);
823
824  if (OptLevelOz)
825    AddOptimizationPasses(Passes, *FPasses, 2, 2);
826
827  if (OptLevelO3)
828    AddOptimizationPasses(Passes, *FPasses, 3, 0);
829
830  if (OptLevelO1 || OptLevelO2 || OptLevelOs || OptLevelOz || OptLevelO3) {
831    FPasses->doInitialization();
832    for (Module::iterator F = M->begin(), E = M->end(); F != E; ++F)
833      FPasses->run(*F);
834    FPasses->doFinalization();
835  }
836
837  // Check that the module is well formed on completion of optimization
838  if (!NoVerify && !VerifyEach)
839    Passes.add(createVerifierPass());
840
841  // Write bitcode or assembly to the output as the last step...
842  if (!NoOutput && !AnalyzeOnly) {
843    if (OutputAssembly)
844      Passes.add(createPrintModulePass(&Out->os()));
845    else
846      Passes.add(createBitcodeWriterPass(Out->os()));
847  }
848
849  // Before executing passes, print the final values of the LLVM options.
850  cl::PrintOptionValues();
851
852  // Now that we have all of the passes ready, run them.
853  Passes.run(*M.get());
854
855  // Declare success.
856  if (!NoOutput || PrintBreakpoints)
857    Out->keep();
858
859  return 0;
860}
861