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