opt.cpp revision e9dcd033e4aa4c276d45b48ddae6728a4725addd
176351aa57e99ab9a947b899e0677933f3a385b4dChris Lattner//===- opt.cpp - The LLVM Modular Optimizer -------------------------------===//
23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//                     The LLVM Compiler Infrastructure
47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//
521c62da287237d39d0d95004881ea4baae3be6daChris Lattner// This file is distributed under the University of Illinois Open Source
621c62da287237d39d0d95004881ea4baae3be6daChris Lattner// License. See LICENSE.TXT for details.
73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
87c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//===----------------------------------------------------------------------===//
9009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//
10009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// Optimizations may be specified an arbitrary number of times on the command
11fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer// line, They are run in the order specified.
12009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//
130eafc31684d6c512c6a56868031b8c1cc4ab4ed6Chris Lattner//===----------------------------------------------------------------------===//
14009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
158b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson#include "llvm/LLVMContext.h"
16009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#include "llvm/Module.h"
17fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner#include "llvm/PassManager.h"
1828552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel#include "llvm/CallGraphSCCPass.h"
19b330e38f4ab1096403ade60028456cae9d0c67f3Chris Lattner#include "llvm/Bitcode/ReaderWriter.h"
20ffa6f9ca062d410ff25c8d11907f182d022f274dChris Lattner#include "llvm/Assembly/PrintModulePass.h"
2122d26d7c7d7c9666d0da0e51250586da5a0744daChris Lattner#include "llvm/Analysis/Verifier.h"
221bc89361c2ba023f305bf00edd4b5d95b021cac6Devang Patel#include "llvm/Analysis/LoopPass.h"
2328552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel#include "llvm/Analysis/CallGraph.h"
2407000c6f01d8f57170f2d4c77a86d934bdc5c696Owen Anderson#include "llvm/Target/TargetData.h"
2518fdfc4eed5466e0a7e16cac594804c82aa4442bVikram S. Adve#include "llvm/Target/TargetMachine.h"
262053a2a2720ea93550b230da6ceac371014c20c2Chris Lattner#include "llvm/Support/PassNameParser.h"
27bed85ff010b95923646ed4e187a5d432cedf67daChris Lattner#include "llvm/System/Signals.h"
2808fc0d30267340ef46751615cf6978336a25d0f8David Greene#include "llvm/Support/Debug.h"
2999ed416787e73b7965d9c183f23f9d78f996187fDan Gohman#include "llvm/Support/IRReader.h"
30c30598bc3ad792eb8cc75b188eb872a28c62ab71Chris Lattner#include "llvm/Support/ManagedStatic.h"
31551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/PluginLoader.h"
32c0d91b75f0fc78cd19603ca6cd756aa392d7b293Chris Lattner#include "llvm/Support/PrettyStackTrace.h"
33ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar#include "llvm/Support/StandardPasses.h"
34551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/SystemUtils.h"
353b0da26e202cbbeb22508231f4278bda8e995391Daniel Dunbar#include "llvm/Support/raw_ostream.h"
3662c5105adc4f51c6dd07be3471ea2462c8e00c82Reid Spencer#include "llvm/LinkAllPasses.h"
37af303d53e6013417d189621c75179df6c7cbdcdeReid Spencer#include "llvm/LinkAllVMCore.h"
3863202328d3dac33322f564889cd44126912102e6Chris Lattner#include <memory>
39c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner#include <algorithm>
40d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm;
4130af36808263fc256ead4fc50b639420b016a58dChris Lattner
42c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// The OptimizationList is automatically populated with registered Passes by the
43c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// PassNameParser.
44fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner//
457f500f7f2a156cd7e5be1543e1f1e9e51f39396bChris Lattnerstatic cl::list<const PassInfo*, bool, PassNameParser>
467f500f7f2a156cd7e5be1543e1f1e9e51f39396bChris LattnerPassList(cl::desc("Optimizations available:"));
47009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
48c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// Other command line options...
49fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner//
506c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattnerstatic cl::opt<std::string>
51a887ae4608c97f75feae6c89af33ecc2eadbc210Eric ChristopherInputFilename(cl::Positional, cl::desc("<input bitcode file>"),
52fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer    cl::init("-"), cl::value_desc("filename"));
535ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
546c8103f7ddb734d128739a463bcd0667d73c62aaChris Lattnerstatic cl::opt<std::string>
555ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerOutputFilename("o", cl::desc("Override output filename"),
5686cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman               cl::value_desc("filename"));
575ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
585ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool>
59baa26395ccf17fc988bb9cf62d6659ca8415ece9Dan GohmanForce("f", cl::desc("Enable binary output on terminals"));
605ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
615ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool>
625ff62e90d0bc321206023897edc1e2691cb0fbb6Chris LattnerPrintEachXForm("p", cl::desc("Print module after each transformation"));
635ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
645ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattnerstatic cl::opt<bool>
65ddd5b417c6eb7ee480976ec479e7c9e6a466f176Chris LattnerNoOutput("disable-output",
66a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif         cl::desc("Do not write result bitcode file"), cl::Hidden);
67d70b68ebd01baf2c5308ee7bc0881bb3fb999c56Chris Lattner
68d70b68ebd01baf2c5308ee7bc0881bb3fb999c56Chris Lattnerstatic cl::opt<bool>
6981b0b64298fb06f225a9544440bb7b230ccf3c35Duncan SandsOutputAssembly("S", cl::desc("Write output as LLVM assembly"));
708c042c2337948e5a6051f34a2d6263fe19737e14Daniel Dunbar
718c042c2337948e5a6051f34a2d6263fe19737e14Daniel Dunbarstatic cl::opt<bool>
72ddd5b417c6eb7ee480976ec479e7c9e6a466f176Chris LattnerNoVerify("disable-verify", cl::desc("Do not verify result module"), cl::Hidden);
73f3bafc10438a70d5a65d65b7bc42d7798b7fe14bChris Lattner
74f3bafc10438a70d5a65d65b7bc42d7798b7fe14bChris Lattnerstatic cl::opt<bool>
7574ed997d527d35d27690feb5c648489c638947c9Reid SpencerVerifyEach("verify-each", cl::desc("Verify after each transform"));
7674ed997d527d35d27690feb5c648489c638947c9Reid Spencer
7774ed997d527d35d27690feb5c648489c638947c9Reid Spencerstatic cl::opt<bool>
7874ed997d527d35d27690feb5c648489c638947c9Reid SpencerStripDebug("strip-debug",
7974ed997d527d35d27690feb5c648489c638947c9Reid Spencer           cl::desc("Strip debugger symbol info from translation unit"));
8074ed997d527d35d27690feb5c648489c638947c9Reid Spencer
8174ed997d527d35d27690feb5c648489c638947c9Reid Spencerstatic cl::opt<bool>
8274ed997d527d35d27690feb5c648489c638947c9Reid SpencerDisableInline("disable-inlining", cl::desc("Do not run the inliner pass"));
8374ed997d527d35d27690feb5c648489c638947c9Reid Spencer
84a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopherstatic cl::opt<bool>
85a887ae4608c97f75feae6c89af33ecc2eadbc210Eric ChristopherDisableOptimizations("disable-opt",
8674ed997d527d35d27690feb5c648489c638947c9Reid Spencer                     cl::desc("Do not run any optimization passes"));
8774ed997d527d35d27690feb5c648489c638947c9Reid Spencer
88a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopherstatic cl::opt<bool>
89adc82888b5be1d43caa94e9247f19927ef70f621Daniel DunbarDisableInternalize("disable-internalize",
90adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar                   cl::desc("Do not mark all symbols as internal"));
91adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar
9274ed997d527d35d27690feb5c648489c638947c9Reid Spencerstatic cl::opt<bool>
93a887ae4608c97f75feae6c89af33ecc2eadbc210Eric ChristopherStandardCompileOpts("std-compile-opts",
9474ed997d527d35d27690feb5c648489c638947c9Reid Spencer                   cl::desc("Include the standard compile time optimizations"));
9574ed997d527d35d27690feb5c648489c638947c9Reid Spencer
9674ed997d527d35d27690feb5c648489c638947c9Reid Spencerstatic cl::opt<bool>
97a887ae4608c97f75feae6c89af33ecc2eadbc210Eric ChristopherStandardLinkOpts("std-link-opts",
98adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar                 cl::desc("Include the standard link time optimizations"));
99adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar
100adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbarstatic cl::opt<bool>
1012d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelOptLevelO1("O1",
1022d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel           cl::desc("Optimization level 1. Similar to llvm-gcc -O1"));
1032d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
1042d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool>
1052d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelOptLevelO2("O2",
106d9424edf94158e3189e94d6925e034e46004ebd7Devang Patel           cl::desc("Optimization level 2. Similar to llvm-gcc -O2"));
1072d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
1082d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool>
1092d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelOptLevelO3("O3",
110d9424edf94158e3189e94d6925e034e46004ebd7Devang Patel           cl::desc("Optimization level 3. Similar to llvm-gcc -O3"));
1112d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
1122d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool>
1132d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelUnitAtATime("funit-at-a-time",
114c4769ba20432c19eff68d7802c9a836ada2424e6Eric Christopher            cl::desc("Enable IPO. This is same as llvm-gcc's -funit-at-a-time"),
1153472766f9eb7d66f234c390ce1b3a8b76f0ee9ceDuncan Sands            cl::init(true));
1162d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
1172d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool>
1182d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang PatelDisableSimplifyLibCalls("disable-simplify-libcalls",
119442b1aa94b4544555aceb9a5d5f2a72f2a9132c6Devang Patel                        cl::desc("Disable simplify-libcalls"));
1202d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
1212d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patelstatic cl::opt<bool>
1223153e4fc80badcd3f7f87d20df86027d20964469Chris LattnerQuiet("q", cl::desc("Obsolete option"), cl::Hidden);
1235ff62e90d0bc321206023897edc1e2691cb0fbb6Chris Lattner
124ec7eb45926dc40a80534bad729be825bf129a126Reid Spencerstatic cl::alias
125ec7eb45926dc40a80534bad729be825bf129a126Reid SpencerQuietA("quiet", cl::desc("Alias for -q"), cl::aliasopt(Quiet));
126ec7eb45926dc40a80534bad729be825bf129a126Reid Spencer
127fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencerstatic cl::opt<bool>
128fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid SpencerAnalyzeOnly("analyze", cl::desc("Only perform analysis, no optimization"));
129fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
130d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris Lattnerstatic cl::opt<std::string>
131d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris LattnerDefaultDataLayout("default-data-layout",
132d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris Lattner          cl::desc("data layout string to use if not specified by module"),
133d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris Lattner          cl::value_desc("layout-string"), cl::init(""));
134d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris Lattner
135fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer// ---------- Define Printers for module and function passes ------------
136fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencernamespace {
137fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
13828552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patelstruct CallGraphSCCPassPrinter : public CallGraphSCCPass {
13928552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel  static char ID;
14028552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel  const PassInfo *PassToPrint;
1414931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman  raw_ostream &Out;
1424207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser  std::string PassName;
1434207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser
1444931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman  CallGraphSCCPassPrinter(const PassInfo *PI, raw_ostream &out) :
1454207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser    CallGraphSCCPass(ID), PassToPrint(PI), Out(out) {
1464207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser      std::string PassToPrintName =  PassToPrint->getPassName();
1474207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser      PassName = "CallGraphSCCPass Printer: " + PassToPrintName;
1484207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser    }
14928552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel
1502decb22222cac46bb1d9163e7b89d7e5be8ef65fChris Lattner  virtual bool runOnSCC(CallGraphSCC &SCC) {
151e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser    if (!Quiet)
1524931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman      Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
15328552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel
15428552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel    // Get and print pass...
155e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser    for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
156e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser      Function *F = (*I)->getFunction();
157e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser      if (F)
158e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser        getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out,
159e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser                                                              F->getParent());
160e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser    }
16128552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel    return false;
16228552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel  }
163a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher
1644207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser  virtual const char *getPassName() const { return PassName.c_str(); }
16528552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel
16628552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
16790c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson    AU.addRequiredID(PassToPrint->getTypeInfo());
16828552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel    AU.setPreservesAll();
16928552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel  }
17028552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel};
17128552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel
17228552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patelchar CallGraphSCCPassPrinter::ID = 0;
17328552da9c3c8bc9865b9cff4fe64dad9da7a57a3Devang Patel
174fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencerstruct ModulePassPrinter : public ModulePass {
1751997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel  static char ID;
176fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer  const PassInfo *PassToPrint;
1774931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman  raw_ostream &Out;
1784207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser  std::string PassName;
1794207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser
1804931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman  ModulePassPrinter(const PassInfo *PI, raw_ostream &out)
1814207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser    : ModulePass(ID), PassToPrint(PI), Out(out) {
1824207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser      std::string PassToPrintName =  PassToPrint->getPassName();
1834207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser      PassName = "ModulePass Printer: " + PassToPrintName;
1844207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser    }
185fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
186fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer  virtual bool runOnModule(Module &M) {
187e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser    if (!Quiet)
1884931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman      Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
189fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
190fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer    // Get and print pass...
191e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser    getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, &M);
192fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer    return false;
193fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer  }
194fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
1954207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser  virtual const char *getPassName() const { return PassName.c_str(); }
196fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
197fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
19890c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson    AU.addRequiredID(PassToPrint->getTypeInfo());
199fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer    AU.setPreservesAll();
200fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer  }
201fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer};
202fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
2031997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patelchar ModulePassPrinter::ID = 0;
204fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencerstruct FunctionPassPrinter : public FunctionPass {
205fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer  const PassInfo *PassToPrint;
2064931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman  raw_ostream &Out;
2071997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel  static char ID;
2084207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser  std::string PassName;
2094207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser
2104931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman  FunctionPassPrinter(const PassInfo *PI, raw_ostream &out)
2114207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser    : FunctionPass(ID), PassToPrint(PI), Out(out) {
2124207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser      std::string PassToPrintName =  PassToPrint->getPassName();
2134207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser      PassName = "FunctionPass Printer: " + PassToPrintName;
2144207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser    }
215fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
216fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer  virtual bool runOnFunction(Function &F) {
217e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser    if (!Quiet)
2184931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman      Out << "Printing analysis '" << PassToPrint->getPassName()
2194931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman          << "' for function '" << F.getName() << "':\n";
220e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser
221fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer    // Get and print pass...
2224931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman    getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out,
22390c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson            F.getParent());
224fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer    return false;
225fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer  }
226fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
2274207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser  virtual const char *getPassName() const { return PassName.c_str(); }
228fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
229fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
23090c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson    AU.addRequiredID(PassToPrint->getTypeInfo());
231fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer    AU.setPreservesAll();
232fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer  }
233fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer};
234fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
2351997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patelchar FunctionPassPrinter::ID = 0;
23656fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel
23756fb16454066f9a901ffb7573f44c9008b0f3117Devang Patelstruct LoopPassPrinter : public LoopPass {
23856fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel  static char ID;
23956fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel  const PassInfo *PassToPrint;
2404931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman  raw_ostream &Out;
2414207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser  std::string PassName;
2424207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser
2434931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman  LoopPassPrinter(const PassInfo *PI, raw_ostream &out) :
2444207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser    LoopPass(ID), PassToPrint(PI), Out(out) {
2454207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser      std::string PassToPrintName =  PassToPrint->getPassName();
2464207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser      PassName = "LoopPass Printer: " + PassToPrintName;
2474207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser    }
2484207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser
24956fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel
25056fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel  virtual bool runOnLoop(Loop *L, LPPassManager &LPM) {
251e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser    if (!Quiet)
2524931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman      Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
253e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser
25456fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel    // Get and print pass...
255e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser    getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out,
256e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser                        L->getHeader()->getParent()->getParent());
25756fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel    return false;
25856fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel  }
259a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher
2604207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser  virtual const char *getPassName() const { return PassName.c_str(); }
26156fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel
26256fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
26390c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson    AU.addRequiredID(PassToPrint->getTypeInfo());
26456fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel    AU.setPreservesAll();
26556fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel  }
26656fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel};
26756fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel
26856fb16454066f9a901ffb7573f44c9008b0f3117Devang Patelchar LoopPassPrinter::ID = 0;
26956fb16454066f9a901ffb7573f44c9008b0f3117Devang Patel
270fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencerstruct BasicBlockPassPrinter : public BasicBlockPass {
271fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer  const PassInfo *PassToPrint;
2724931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman  raw_ostream &Out;
2731997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel  static char ID;
2744207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser  std::string PassName;
2754207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser
2764931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman  BasicBlockPassPrinter(const PassInfo *PI, raw_ostream &out)
2774207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser    : BasicBlockPass(ID), PassToPrint(PI), Out(out) {
2784207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser      std::string PassToPrintName =  PassToPrint->getPassName();
2794207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser      PassName = "BasicBlockPass Printer: " + PassToPrintName;
2804207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser    }
281fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
282fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer  virtual bool runOnBasicBlock(BasicBlock &BB) {
283e9dcd033e4aa4c276d45b48ddae6728a4725adddTobias Grosser    if (!Quiet)
2844931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman      Out << "Printing Analysis info for BasicBlock '" << BB.getName()
2854931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman          << "': Pass " << PassToPrint->getPassName() << ":\n";
286fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
287fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer    // Get and print pass...
2884931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman    getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out,
28990c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson            BB.getParent()->getParent());
290fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer    return false;
291fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer  }
292fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
2934207d6f7856f50b79a43dd3cb4c60fae322fd142Tobias Grosser  virtual const char *getPassName() const { return PassName.c_str(); }
294fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
295fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
29690c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson    AU.addRequiredID(PassToPrint->getTypeInfo());
297fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer    AU.setPreservesAll();
298fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer  }
299fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer};
300fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
3011997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patelchar BasicBlockPassPrinter::ID = 0;
3029cc1c18b7bab97fe93f38ee51d8d91d073936c35Dan Gohmaninline void addPass(PassManagerBase &PM, Pass *P) {
30374ed997d527d35d27690feb5c648489c638947c9Reid Spencer  // Add the pass to the pass manager...
30474ed997d527d35d27690feb5c648489c638947c9Reid Spencer  PM.add(P);
30574ed997d527d35d27690feb5c648489c638947c9Reid Spencer
30674ed997d527d35d27690feb5c648489c638947c9Reid Spencer  // If we are verifying all of the intermediate steps, add the verifier...
30774ed997d527d35d27690feb5c648489c638947c9Reid Spencer  if (VerifyEach) PM.add(createVerifierPass());
30874ed997d527d35d27690feb5c648489c638947c9Reid Spencer}
30974ed997d527d35d27690feb5c648489c638947c9Reid Spencer
310a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher/// AddOptimizationPasses - This routine adds optimization passes
311a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher/// based on selected optimization level, OptLevel. This routine
3122d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel/// duplicates llvm-gcc behaviour.
3132d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel///
3142d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel/// OptLevel - Optimization Level
3159cc1c18b7bab97fe93f38ee51d8d91d073936c35Dan Gohmanvoid AddOptimizationPasses(PassManagerBase &MPM, PassManagerBase &FPM,
3163253f4c9795edcef2406ae9fb502ffc993ba04f8Zhongxing Xu                           unsigned OptLevel) {
317ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar  createStandardFunctionPasses(&FPM, OptLevel);
318ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar
31974733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman  llvm::Pass *InliningPass = 0;
32074733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman  if (DisableInline) {
32174733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman    // No inlining pass
32274733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman  } else if (OptLevel) {
32374733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman    unsigned Threshold = 200;
32474733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman    if (OptLevel > 2)
32574733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman      Threshold = 250;
32674733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman    InliningPass = createFunctionInliningPass(Threshold);
32774733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman  } else {
32874733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman    InliningPass = createAlwaysInlinerPass();
32974733a7e46553e37295de9014c5d8a4bd59a0355Eli Friedman  }
330ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar  createStandardModulePasses(&MPM, OptLevel,
331ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar                             /*OptimizeSize=*/ false,
332ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar                             UnitAtATime,
333ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar                             /*UnrollLoops=*/ OptLevel > 1,
334ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar                             !DisableSimplifyLibCalls,
335ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar                             /*HaveExceptions=*/ true,
336ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar                             InliningPass);
3372d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel}
3382d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
3399cc1c18b7bab97fe93f38ee51d8d91d073936c35Dan Gohmanvoid AddStandardCompilePasses(PassManagerBase &PM) {
34074ed997d527d35d27690feb5c648489c638947c9Reid Spencer  PM.add(createVerifierPass());                  // Verify that input is correct
34174ed997d527d35d27690feb5c648489c638947c9Reid Spencer
34274ed997d527d35d27690feb5c648489c638947c9Reid Spencer  addPass(PM, createLowerSetJmpPass());          // Lower llvm.setjmp/.longjmp
34374ed997d527d35d27690feb5c648489c638947c9Reid Spencer
34474ed997d527d35d27690feb5c648489c638947c9Reid Spencer  // If the -strip-debug command line option was specified, do it.
34574ed997d527d35d27690feb5c648489c638947c9Reid Spencer  if (StripDebug)
34674ed997d527d35d27690feb5c648489c638947c9Reid Spencer    addPass(PM, createStripSymbolsPass(true));
34774ed997d527d35d27690feb5c648489c638947c9Reid Spencer
34874ed997d527d35d27690feb5c648489c638947c9Reid Spencer  if (DisableOptimizations) return;
34974ed997d527d35d27690feb5c648489c638947c9Reid Spencer
350ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar  llvm::Pass *InliningPass = !DisableInline ? createFunctionInliningPass() : 0;
351ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar
352ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar  // -std-compile-opts adds the same module passes as -O3.
353a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher  createStandardModulePasses(&PM, 3,
354ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar                             /*OptimizeSize=*/ false,
355ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar                             /*UnitAtATime=*/ true,
356ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar                             /*UnrollLoops=*/ true,
357ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar                             /*SimplifyLibCalls=*/ true,
358ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar                             /*HaveExceptions=*/ true,
359ca8131ebac116e8a8ba1ba08317af4298ba102b7Daniel Dunbar                             InliningPass);
36074ed997d527d35d27690feb5c648489c638947c9Reid Spencer}
36174ed997d527d35d27690feb5c648489c638947c9Reid Spencer
3629cc1c18b7bab97fe93f38ee51d8d91d073936c35Dan Gohmanvoid AddStandardLinkPasses(PassManagerBase &PM) {
363adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar  PM.add(createVerifierPass());                  // Verify that input is correct
364adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar
365adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar  // If the -strip-debug command line option was specified, do it.
366adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar  if (StripDebug)
367adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar    addPass(PM, createStripSymbolsPass(true));
368adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar
369adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar  if (DisableOptimizations) return;
370adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar
371adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar  createStandardLTOPasses(&PM, /*Internalize=*/ !DisableInternalize,
372adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar                          /*RunInliner=*/ !DisableInline,
373adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar                          /*VerifyEach=*/ VerifyEach);
374adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar}
375adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar
376fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer} // anonymous namespace
377fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
378009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
379c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner//===----------------------------------------------------------------------===//
380c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner// main for opt
381c0ce68bf4a497dac2e5b22d54de68e6ad495815fChris Lattner//
3828f367bd3c0f56b7b318c46cee04f77735f617777Chris Lattnerint main(int argc, char **argv) {
383c0d91b75f0fc78cd19603ca6cd756aa392d7b293Chris Lattner  sys::PrintStackTraceOnErrorSignal();
384c0d91b75f0fc78cd19603ca6cd756aa392d7b293Chris Lattner  llvm::PrettyStackTraceProgram X(argc, argv);
385d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman
386d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman  if (AnalyzeOnly && NoOutput) {
387d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman    errs() << argv[0] << ": analyze mode conflicts with no-output mode.\n";
388d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman    return 1;
389d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman  }
390c0d91b75f0fc78cd19603ca6cd756aa392d7b293Chris Lattner
39108fc0d30267340ef46751615cf6978336a25d0f8David Greene  // Enable debug stream buffering.
39208fc0d30267340ef46751615cf6978336a25d0f8David Greene  EnableDebugBuffering = true;
39308fc0d30267340ef46751615cf6978336a25d0f8David Greene
394c0d91b75f0fc78cd19603ca6cd756aa392d7b293Chris Lattner  llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.
3950d7c695c74ae6d5f68cc07378c17491915e607d3Owen Anderson  LLVMContext &Context = getGlobalContext();
39661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
39761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  cl::ParseCommandLineOptions(argc, argv,
39861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    "llvm .bc -> .bc modular optimizer and analysis printer\n");
3991ef8bdaedbd98bee35a573b8bc87149f2182cb5eReid Spencer
40061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Allocate a full target machine description only if necessary.
40161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // FIXME: The choice of target should be controllable on the command line.
40261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  std::auto_ptr<TargetMachine> target;
403ff5d06d797f2423877aea61304e0089353964131Devang Patel
40461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  SMDiagnostic Err;
4051ef8bdaedbd98bee35a573b8bc87149f2182cb5eReid Spencer
40661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Load the input module...
40761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  std::auto_ptr<Module> M;
40861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  M.reset(ParseIRFile(InputFilename, Err, Context));
409a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher
41061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (M.get() == 0) {
41161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    Err.Print(argv[0], errs());
41261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    return 1;
41361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
414697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner
41561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Figure out what stream we are supposed to write to...
416d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman  OwningPtr<tool_output_file> Out;
4174931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman  if (NoOutput) {
41886cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman    if (!OutputFilename.empty())
41986cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman      errs() << "WARNING: The -o (output filename) option is ignored when\n"
4204931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman                "the --disable-output option is used.\n";
42186cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman  } else {
42286cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman    // Default to standard output.
42386cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman    if (OutputFilename.empty())
42486cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman      OutputFilename = "-";
42586cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman
42686cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman    std::string ErrorInfo;
427d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman    Out.reset(new tool_output_file(OutputFilename.c_str(), ErrorInfo,
428d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman                                   raw_fd_ostream::F_Binary));
42986cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman    if (!ErrorInfo.empty()) {
43086cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman      errs() << ErrorInfo << '\n';
43186cbc1bb11c1de74afcd96a421f74429faca4c2fDan Gohman      return 1;
432009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner    }
43361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
43476d12299b5333d71bfc079614031f97c97aa5148Chris Lattner
43561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // If the output is set to be emitted to standard out, and standard out is a
43661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // console, print out a warning message and refuse to do it.  We don't
43761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // impress anyone by spewing tons of binary goo to a terminal.
438b56bf581a3bd8feb3eb454b30ab171bc5131e17cDan Gohman  if (!Force && !NoOutput && !AnalyzeOnly && !OutputAssembly)
439d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman    if (CheckBitcodeOutputToConsole(Out->os(), !Quiet))
44061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      NoOutput = true;
44161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
44261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Create a PassManager to hold and optimize the collection of passes we are
44361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // about to build...
44461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  //
44561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  PassManager Passes;
44661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
44761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Add an appropriate TargetData instance for this module...
44861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  TargetData *TD = 0;
44961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  const std::string &ModuleDataLayout = M.get()->getDataLayout();
45061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (!ModuleDataLayout.empty())
45161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    TD = new TargetData(ModuleDataLayout);
452b908f8ad6a38d989c7f769e329d778e563c398f4Kenneth Uildriks  else if (!DefaultDataLayout.empty())
45361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    TD = new TargetData(DefaultDataLayout);
45461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
45561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (TD)
45661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    Passes.add(TD);
45761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
4589cc1c18b7bab97fe93f38ee51d8d91d073936c35Dan Gohman  OwningPtr<PassManager> FPasses;
45961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (OptLevelO1 || OptLevelO2 || OptLevelO3) {
4609cc1c18b7bab97fe93f38ee51d8d91d073936c35Dan Gohman    FPasses.reset(new PassManager());
461d331cb3fdea8b450f9c2d981e6b59ee6f9cdbd91Chris Lattner    if (TD)
46261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      FPasses->add(new TargetData(*TD));
46361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
464a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher
46561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // If the -strip-debug command line option was specified, add it.  If
46661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // -std-compile-opts was also specified, it will handle StripDebug.
46761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (StripDebug && !StandardCompileOpts)
46861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    addPass(Passes, createStripSymbolsPass(true));
46961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
47061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Create a new optimization pass for each one specified on the command line
47161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  for (unsigned i = 0; i < PassList.size(); ++i) {
47261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    // Check to see if -std-compile-opts was specified before this option.  If
47361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    // so, handle it.
47461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (StandardCompileOpts &&
47561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner        StandardCompileOpts.getPosition() < PassList.getPosition(i)) {
4763dda08ad5d52a510ba2239cc4b73757db303a095Chris Lattner      AddStandardCompilePasses(Passes);
4773dda08ad5d52a510ba2239cc4b73757db303a095Chris Lattner      StandardCompileOpts = false;
478a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher    }
479fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner
48061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (StandardLinkOpts &&
48161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner        StandardLinkOpts.getPosition() < PassList.getPosition(i)) {
482adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar      AddStandardLinkPasses(Passes);
483adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar      StandardLinkOpts = false;
484a887ae4608c97f75feae6c89af33ecc2eadbc210Eric Christopher    }
485adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar
48661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (OptLevelO1 && OptLevelO1.getPosition() < PassList.getPosition(i)) {
487adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar      AddOptimizationPasses(Passes, *FPasses, 1);
48861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      OptLevelO1 = false;
489adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar    }
4902d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
49161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (OptLevelO2 && OptLevelO2.getPosition() < PassList.getPosition(i)) {
492adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar      AddOptimizationPasses(Passes, *FPasses, 2);
49361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      OptLevelO2 = false;
494adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar    }
4952d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
49661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (OptLevelO3 && OptLevelO3.getPosition() < PassList.getPosition(i)) {
497adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar      AddOptimizationPasses(Passes, *FPasses, 3);
49861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      OptLevelO3 = false;
499adc82888b5be1d43caa94e9247f19927ef70f621Daniel Dunbar    }
5002d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
50161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    const PassInfo *PassInf = PassList[i];
50261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    Pass *P = 0;
50361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (PassInf->getNormalCtor())
50461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      P = PassInf->getNormalCtor()();
50561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    else
50661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      errs() << argv[0] << ": cannot create pass: "
50761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner             << PassInf->getPassName() << "\n";
50861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (P) {
5093460f221cd9d3329aefb3f10a0f9d0800d8db70aBenjamin Kramer      PassKind Kind = P->getPassKind();
51061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      addPass(Passes, P);
51161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
51261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      if (AnalyzeOnly) {
5133460f221cd9d3329aefb3f10a0f9d0800d8db70aBenjamin Kramer        switch (Kind) {
514476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner        case PT_BasicBlock:
515d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman          Passes.add(new BasicBlockPassPrinter(PassInf, Out->os()));
516476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner          break;
517476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner        case PT_Loop:
518d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman          Passes.add(new LoopPassPrinter(PassInf, Out->os()));
519476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner          break;
520476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner        case PT_Function:
521d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman          Passes.add(new FunctionPassPrinter(PassInf, Out->os()));
522476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner          break;
523476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner        case PT_CallGraphSCC:
524d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman          Passes.add(new CallGraphSCCPassPrinter(PassInf, Out->os()));
525476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner          break;
526476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner        default:
527d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman          Passes.add(new ModulePassPrinter(PassInf, Out->os()));
528476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner          break;
529476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner        }
53061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      }
5312d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel    }
5322d7551ced2ddfe4b8e7adf9eb7f12e32537abaefDevang Patel
53361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (PrintEachXForm)
53461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner      Passes.add(createPrintModulePass(&errs()));
53561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
53622d26d7c7d7c9666d0da0e51250586da5a0744daChris Lattner
53761db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // If -std-compile-opts was specified at the end of the pass list, add them.
53861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (StandardCompileOpts) {
53961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    AddStandardCompilePasses(Passes);
54061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    StandardCompileOpts = false;
54161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
542fb1b3f119df25de495fcd53e675d6c9991f5664eChris Lattner
54361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (StandardLinkOpts) {
54461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    AddStandardLinkPasses(Passes);
54561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    StandardLinkOpts = false;
54661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
547009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
54861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (OptLevelO1)
54961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    AddOptimizationPasses(Passes, *FPasses, 1);
55061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
55161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (OptLevelO2)
55261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    AddOptimizationPasses(Passes, *FPasses, 2);
553fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02Reid Spencer
55461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (OptLevelO3)
55561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    AddOptimizationPasses(Passes, *FPasses, 3);
55661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
5579cc1c18b7bab97fe93f38ee51d8d91d073936c35Dan Gohman  if (OptLevelO1 || OptLevelO2 || OptLevelO3)
5589cc1c18b7bab97fe93f38ee51d8d91d073936c35Dan Gohman    FPasses->run(*M.get());
55961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
56061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Check that the module is well formed on completion of optimization
56161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (!NoVerify && !VerifyEach)
56261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    Passes.add(createVerifierPass());
56361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
5644931b312c06d89b14d54fdd6c3cdd374d76af7b8Dan Gohman  // Write bitcode or assembly to the output as the last step...
56561db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  if (!NoOutput && !AnalyzeOnly) {
56661db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    if (OutputAssembly)
567d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman      Passes.add(createPrintModulePass(&Out->os()));
56861db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner    else
569d4c454317a38d65957edebe62bfc69fc8d9885e8Dan Gohman      Passes.add(createBitcodeWriterPass(Out->os()));
57061db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  }
57161db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
57261db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  // Now that we have all of the passes ready, run them.
57361db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  Passes.run(*M.get());
57461db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner
575d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman  // Declare success.
576d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman  if (!NoOutput)
577d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman    Out->keep();
578d5826a33a5a7c298a8934541d11cda042028be3bDan Gohman
57961db1a1b6a02b868f63bccefc17a31a21ac3a871Chris Lattner  return 0;
580009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner}
581