lto.cpp revision 77595fc35642f990bfc5ad05b8e68d4056695eca
1a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel//===-lto.cpp - LLVM Link Time Optimizer ----------------------------------===// 2a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel// 3a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel// The LLVM Compiler Infrastructure 4a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel// 521c62da287237d39d0d95004881ea4baae3be6daChris Lattner// This file is distributed under the University of Illinois Open Source 621c62da287237d39d0d95004881ea4baae3be6daChris Lattner// License. See LICENSE.TXT for details. 7a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel// 8a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel//===----------------------------------------------------------------------===// 9a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel// 1011fdadf407642167c5e2b8a1ed40c66c0c6dbdf2Chris Lattner// This file implements the Link Time Optimization library. This library is 11a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel// intended to be used by linker to optimize code at link time. 12a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel// 13a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel//===----------------------------------------------------------------------===// 14a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 15a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/Module.h" 16a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/PassManager.h" 17a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/Linker.h" 18a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/Constants.h" 19a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/DerivedTypes.h" 20744879ea01779a48f898a801c847677b0bfa824aChris Lattner#include "llvm/ModuleProvider.h" 2168d4922adfde16a5477c84f25f4e84aa4129943eChris Lattner#include "llvm/Bitcode/ReaderWriter.h" 22a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/Support/CommandLine.h" 23a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/Support/FileUtilities.h" 24a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/Support/SystemUtils.h" 2530235dad4b77ed83ca985030aff4fb4767551e5dDevang Patel#include "llvm/Support/Mangler.h" 2668d4922adfde16a5477c84f25f4e84aa4129943eChris Lattner#include "llvm/Support/MemoryBuffer.h" 27a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/System/Program.h" 28a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/System/Signals.h" 29a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/Analysis/Passes.h" 3054959d6cf68a9b575c98c074babe9867682a7271Devang Patel#include "llvm/Analysis/LoopPass.h" 31a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/Analysis/Verifier.h" 32546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling#include "llvm/CodeGen/FileWriters.h" 33a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/Target/SubtargetFeature.h" 3421b70b237d404ebdde190a072d90f630db92f691Devang Patel#include "llvm/Target/TargetOptions.h" 35a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/Target/TargetData.h" 36a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/Target/TargetMachine.h" 37a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/Target/TargetMachineRegistry.h" 386152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel#include "llvm/Target/TargetAsmInfo.h" 39a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/Transforms/IPO.h" 40a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/Transforms/Scalar.h" 41a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/Analysis/LoadValueNumbering.h" 4208fb05c3ac440979021f508bfee073359be46f7eDevang Patel#include "llvm/Support/MathExtras.h" 43a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include "llvm/LinkTimeOptimizer.h" 44a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel#include <fstream> 4568fe61d6a165ea6090008e281330895a21607dafBill Wendling#include <ostream> 46a89d47f54d1f83d328f6169151653bfc742607bfDevang Patelusing namespace llvm; 47a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 48a89d47f54d1f83d328f6169151653bfc742607bfDevang Patelextern "C" 495e563c326490207ebd58d47935fb9efda7638aa2Devang Patelllvm::LinkTimeOptimizer *createLLVMOptimizer(unsigned VERSION) 50a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel{ 515e563c326490207ebd58d47935fb9efda7638aa2Devang Patel // Linker records LLVM_LTO_VERSION based on llvm optimizer available 525e563c326490207ebd58d47935fb9efda7638aa2Devang Patel // during linker build. Match linker's recorded LTO VERSION number 535e563c326490207ebd58d47935fb9efda7638aa2Devang Patel // with installed llvm optimizer version. If these numbers do not match 545e563c326490207ebd58d47935fb9efda7638aa2Devang Patel // then linker may not be able to use llvm optimizer dynamically. 555e563c326490207ebd58d47935fb9efda7638aa2Devang Patel if (VERSION != LLVM_LTO_VERSION) 565e563c326490207ebd58d47935fb9efda7638aa2Devang Patel return NULL; 575e563c326490207ebd58d47935fb9efda7638aa2Devang Patel 58c7cfbc58ad88f127df6949791401969a09da560fDevang Patel llvm::LTO *l = new llvm::LTO(); 59a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel return l; 60a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel} 61a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 62a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel/// If symbol is not used then make it internal and let optimizer takes 63a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel/// care of it. 64a89d47f54d1f83d328f6169151653bfc742607bfDevang Patelvoid LLVMSymbol::mayBeNotUsed() { 65a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel gv->setLinkage(GlobalValue::InternalLinkage); 66a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel} 67a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 68a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel// Map LLVM LinkageType to LTO LinakgeType 69a89d47f54d1f83d328f6169151653bfc742607bfDevang Patelstatic LTOLinkageTypes 70a89d47f54d1f83d328f6169151653bfc742607bfDevang PatelgetLTOLinkageType(GlobalValue *v) 71a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel{ 72a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel LTOLinkageTypes lt; 73a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel if (v->hasExternalLinkage()) 74a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel lt = LTOExternalLinkage; 75a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel else if (v->hasLinkOnceLinkage()) 76a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel lt = LTOLinkOnceLinkage; 77a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel else if (v->hasWeakLinkage()) 78a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel lt = LTOWeakLinkage; 79a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel else 80a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Otherwise it is internal linkage for link time optimizer 81a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel lt = LTOInternalLinkage; 82a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel return lt; 83a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel} 84a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 855e563c326490207ebd58d47935fb9efda7638aa2Devang Patel// MAP LLVM VisibilityType to LTO VisibilityType 865e563c326490207ebd58d47935fb9efda7638aa2Devang Patelstatic LTOVisibilityTypes 875e563c326490207ebd58d47935fb9efda7638aa2Devang PatelgetLTOVisibilityType(GlobalValue *v) 885e563c326490207ebd58d47935fb9efda7638aa2Devang Patel{ 895e563c326490207ebd58d47935fb9efda7638aa2Devang Patel LTOVisibilityTypes vis; 905e563c326490207ebd58d47935fb9efda7638aa2Devang Patel if (v->hasHiddenVisibility()) 915e563c326490207ebd58d47935fb9efda7638aa2Devang Patel vis = LTOHiddenVisibility; 925e563c326490207ebd58d47935fb9efda7638aa2Devang Patel else if (v->hasProtectedVisibility()) 935e563c326490207ebd58d47935fb9efda7638aa2Devang Patel vis = LTOProtectedVisibility; 945e563c326490207ebd58d47935fb9efda7638aa2Devang Patel else 955e563c326490207ebd58d47935fb9efda7638aa2Devang Patel vis = LTODefaultVisibility; 965e563c326490207ebd58d47935fb9efda7638aa2Devang Patel return vis; 975e563c326490207ebd58d47935fb9efda7638aa2Devang Patel} 985e563c326490207ebd58d47935fb9efda7638aa2Devang Patel 99a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel// Find exeternal symbols referenced by VALUE. This is a recursive function. 100a89d47f54d1f83d328f6169151653bfc742607bfDevang Patelstatic void 10130235dad4b77ed83ca985030aff4fb4767551e5dDevang PatelfindExternalRefs(Value *value, std::set<std::string> &references, 1022198f9cec47b4683377d4f4080acb14dd94fad65Devang Patel Mangler &mangler) { 103304d5f2edc954a3ef9904ea6d8f9421f40c9abe4Devang Patel 104304d5f2edc954a3ef9904ea6d8f9421f40c9abe4Devang Patel if (GlobalValue *gv = dyn_cast<GlobalValue>(value)) { 105a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel LTOLinkageTypes lt = getLTOLinkageType(gv); 106a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel if (lt != LTOInternalLinkage && strncmp (gv->getName().c_str(), "llvm.", 5)) 10730235dad4b77ed83ca985030aff4fb4767551e5dDevang Patel references.insert(mangler.getValueName(gv)); 108a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel } 109544ea34a9f7aeef5fa3cbfdaae5933f93f4f68ecDevang Patel 110544ea34a9f7aeef5fa3cbfdaae5933f93f4f68ecDevang Patel // GlobalValue, even with InternalLinkage type, may have operands with 111544ea34a9f7aeef5fa3cbfdaae5933f93f4f68ecDevang Patel // ExternalLinkage type. Do not ignore these operands. 11297d92d50aa52fd7f891ddeaf9e3886305a5a77d9Devang Patel if (Constant *c = dyn_cast<Constant>(value)) 113304d5f2edc954a3ef9904ea6d8f9421f40c9abe4Devang Patel // Handle ConstantExpr, ConstantStruct, ConstantArry etc.. 114304d5f2edc954a3ef9904ea6d8f9421f40c9abe4Devang Patel for (unsigned i = 0, e = c->getNumOperands(); i != e; ++i) 11530235dad4b77ed83ca985030aff4fb4767551e5dDevang Patel findExternalRefs(c->getOperand(i), references, mangler); 116a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel} 117a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 1182a4dd685357e2fd248ab458d3bed4ea21350815bDevang Patel/// If Module with InputFilename is available then remove it from allModules 1192a4dd685357e2fd248ab458d3bed4ea21350815bDevang Patel/// and call delete on it. 120f2ca21f88f4e38996b6804dfa25fe7a72814736dDevang Patelvoid 121f2ca21f88f4e38996b6804dfa25fe7a72814736dDevang PatelLTO::removeModule (const std::string &InputFilename) 122f2ca21f88f4e38996b6804dfa25fe7a72814736dDevang Patel{ 123f2ca21f88f4e38996b6804dfa25fe7a72814736dDevang Patel NameToModuleMap::iterator pos = allModules.find(InputFilename.c_str()); 1242a4dd685357e2fd248ab458d3bed4ea21350815bDevang Patel if (pos == allModules.end()) 1252a4dd685357e2fd248ab458d3bed4ea21350815bDevang Patel return; 1262a4dd685357e2fd248ab458d3bed4ea21350815bDevang Patel 1272a4dd685357e2fd248ab458d3bed4ea21350815bDevang Patel Module *m = pos->second; 1282a4dd685357e2fd248ab458d3bed4ea21350815bDevang Patel allModules.erase(pos); 1292a4dd685357e2fd248ab458d3bed4ea21350815bDevang Patel delete m; 130f2ca21f88f4e38996b6804dfa25fe7a72814736dDevang Patel} 131f2ca21f88f4e38996b6804dfa25fe7a72814736dDevang Patel 132a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif/// InputFilename is a LLVM bitcode file. If Module with InputFilename is 1330701a2f70df66134ead84d4fe86b20b8f28c4fc3Devang Patel/// available then return it. Otherwise parseInputFilename. 1340701a2f70df66134ead84d4fe86b20b8f28c4fc3Devang PatelModule * 135c7cfbc58ad88f127df6949791401969a09da560fDevang PatelLTO::getModule(const std::string &InputFilename) 1360701a2f70df66134ead84d4fe86b20b8f28c4fc3Devang Patel{ 1370701a2f70df66134ead84d4fe86b20b8f28c4fc3Devang Patel Module *m = NULL; 1380701a2f70df66134ead84d4fe86b20b8f28c4fc3Devang Patel 1390701a2f70df66134ead84d4fe86b20b8f28c4fc3Devang Patel NameToModuleMap::iterator pos = allModules.find(InputFilename.c_str()); 1400701a2f70df66134ead84d4fe86b20b8f28c4fc3Devang Patel if (pos != allModules.end()) 1410701a2f70df66134ead84d4fe86b20b8f28c4fc3Devang Patel m = allModules[InputFilename.c_str()]; 142744879ea01779a48f898a801c847677b0bfa824aChris Lattner else { 14368d4922adfde16a5477c84f25f4e84aa4129943eChris Lattner if (MemoryBuffer *Buffer 14468d4922adfde16a5477c84f25f4e84aa4129943eChris Lattner = MemoryBuffer::getFile(&InputFilename[0], InputFilename.size())) { 14568d4922adfde16a5477c84f25f4e84aa4129943eChris Lattner m = ParseBitcodeFile(Buffer); 14668d4922adfde16a5477c84f25f4e84aa4129943eChris Lattner delete Buffer; 14768d4922adfde16a5477c84f25f4e84aa4129943eChris Lattner } 14868d4922adfde16a5477c84f25f4e84aa4129943eChris Lattner allModules[InputFilename.c_str()] = m; 1490701a2f70df66134ead84d4fe86b20b8f28c4fc3Devang Patel } 1500701a2f70df66134ead84d4fe86b20b8f28c4fc3Devang Patel return m; 1510701a2f70df66134ead84d4fe86b20b8f28c4fc3Devang Patel} 1520701a2f70df66134ead84d4fe86b20b8f28c4fc3Devang Patel 153a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif/// InputFilename is a LLVM bitcode file. Reade this bitcode file and 154a291a68161bd37448404dc10c4815d4420cb2d30Devang Patel/// set corresponding target triplet string. 155a291a68161bd37448404dc10c4815d4420cb2d30Devang Patelvoid 156c7cfbc58ad88f127df6949791401969a09da560fDevang PatelLTO::getTargetTriple(const std::string &InputFilename, 15738187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel std::string &targetTriple) 158a291a68161bd37448404dc10c4815d4420cb2d30Devang Patel{ 159a291a68161bd37448404dc10c4815d4420cb2d30Devang Patel Module *m = getModule(InputFilename); 160a291a68161bd37448404dc10c4815d4420cb2d30Devang Patel if (m) 161a291a68161bd37448404dc10c4815d4420cb2d30Devang Patel targetTriple = m->getTargetTriple(); 162a291a68161bd37448404dc10c4815d4420cb2d30Devang Patel} 163a291a68161bd37448404dc10c4815d4420cb2d30Devang Patel 164a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif/// InputFilename is a LLVM bitcode file. Read it using bitcode reader. 165a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel/// Collect global functions and symbol names in symbols vector. 166a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel/// Collect external references in references vector. 167a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel/// Return LTO_READ_SUCCESS if there is no error. 168a89d47f54d1f83d328f6169151653bfc742607bfDevang Patelenum LTOStatus 169c7cfbc58ad88f127df6949791401969a09da560fDevang PatelLTO::readLLVMObjectFile(const std::string &InputFilename, 17038187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel NameToSymbolMap &symbols, 17138187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel std::set<std::string> &references) 172a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel{ 1730701a2f70df66134ead84d4fe86b20b8f28c4fc3Devang Patel Module *m = getModule(InputFilename); 174a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel if (!m) 175a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel return LTO_READ_FAILURE; 17630235dad4b77ed83ca985030aff4fb4767551e5dDevang Patel 1776152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel // Collect Target info 17808fb05c3ac440979021f508bfee073359be46f7eDevang Patel getTarget(m); 1796152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel 1806152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel if (!Target) 1816152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel return LTO_READ_FAILURE; 1826152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel 18330235dad4b77ed83ca985030aff4fb4767551e5dDevang Patel // Use mangler to add GlobalPrefix to names to match linker names. 18430235dad4b77ed83ca985030aff4fb4767551e5dDevang Patel // FIXME : Instead of hard coding "-" use GlobalPrefix. 1856152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel Mangler mangler(*m, Target->getTargetAsmInfo()->getGlobalPrefix()); 186a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel modules.push_back(m); 187a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 188a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel for (Module::iterator f = m->begin(), e = m->end(); f != e; ++f) { 189a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel LTOLinkageTypes lt = getLTOLinkageType(f); 1905e563c326490207ebd58d47935fb9efda7638aa2Devang Patel LTOVisibilityTypes vis = getLTOVisibilityType(f); 1915cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer if (!f->isDeclaration() && lt != LTOInternalLinkage 1922198f9cec47b4683377d4f4080acb14dd94fad65Devang Patel && strncmp (f->getName().c_str(), "llvm.", 5)) { 19308fb05c3ac440979021f508bfee073359be46f7eDevang Patel int alignment = ( 16 > f->getAlignment() ? 16 : f->getAlignment()); 1945e563c326490207ebd58d47935fb9efda7638aa2Devang Patel LLVMSymbol *newSymbol = new LLVMSymbol(lt, vis, f, f->getName(), 19508fb05c3ac440979021f508bfee073359be46f7eDevang Patel mangler.getValueName(f), 19608fb05c3ac440979021f508bfee073359be46f7eDevang Patel Log2_32(alignment)); 19730235dad4b77ed83ca985030aff4fb4767551e5dDevang Patel symbols[newSymbol->getMangledName()] = newSymbol; 19830235dad4b77ed83ca985030aff4fb4767551e5dDevang Patel allSymbols[newSymbol->getMangledName()] = newSymbol; 199a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel } 20030235dad4b77ed83ca985030aff4fb4767551e5dDevang Patel 201a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Collect external symbols referenced by this function. 202a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel for (Function::iterator b = f->begin(), fe = f->end(); b != fe; ++b) 203a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel for (BasicBlock::iterator i = b->begin(), be = b->end(); 2045e563c326490207ebd58d47935fb9efda7638aa2Devang Patel i != be; ++i) { 2052198f9cec47b4683377d4f4080acb14dd94fad65Devang Patel for (unsigned count = 0, total = i->getNumOperands(); 2062198f9cec47b4683377d4f4080acb14dd94fad65Devang Patel count != total; ++count) 2072198f9cec47b4683377d4f4080acb14dd94fad65Devang Patel findExternalRefs(i->getOperand(count), references, mangler); 2085e563c326490207ebd58d47935fb9efda7638aa2Devang Patel } 209a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel } 210a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 211a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel for (Module::global_iterator v = m->global_begin(), e = m->global_end(); 212a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel v != e; ++v) { 213a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel LTOLinkageTypes lt = getLTOLinkageType(v); 2145e563c326490207ebd58d47935fb9efda7638aa2Devang Patel LTOVisibilityTypes vis = getLTOVisibilityType(v); 2155cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer if (!v->isDeclaration() && lt != LTOInternalLinkage 2162198f9cec47b4683377d4f4080acb14dd94fad65Devang Patel && strncmp (v->getName().c_str(), "llvm.", 5)) { 21708fb05c3ac440979021f508bfee073359be46f7eDevang Patel const TargetData *TD = Target->getTargetData(); 2185e563c326490207ebd58d47935fb9efda7638aa2Devang Patel LLVMSymbol *newSymbol = new LLVMSymbol(lt, vis, v, v->getName(), 21908fb05c3ac440979021f508bfee073359be46f7eDevang Patel mangler.getValueName(v), 22008fb05c3ac440979021f508bfee073359be46f7eDevang Patel TD->getPreferredAlignmentLog(v)); 22130235dad4b77ed83ca985030aff4fb4767551e5dDevang Patel symbols[newSymbol->getMangledName()] = newSymbol; 222ed872865d0316ec754d93f703dd39f21745e45caDevang Patel allSymbols[newSymbol->getMangledName()] = newSymbol; 223304d5f2edc954a3ef9904ea6d8f9421f40c9abe4Devang Patel 224304d5f2edc954a3ef9904ea6d8f9421f40c9abe4Devang Patel for (unsigned count = 0, total = v->getNumOperands(); 2252198f9cec47b4683377d4f4080acb14dd94fad65Devang Patel count != total; ++count) 2262198f9cec47b4683377d4f4080acb14dd94fad65Devang Patel findExternalRefs(v->getOperand(count), references, mangler); 227304d5f2edc954a3ef9904ea6d8f9421f40c9abe4Devang Patel 228a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel } 229a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel } 230a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 231a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel return LTO_READ_SUCCESS; 232a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel} 233a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 2346152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel/// Get TargetMachine. 2356152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel/// Use module M to find appropriate Target. 2366152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patelvoid 2376152b7ec25b8d225dc1e146e241d1c6061c8221bDevang PatelLTO::getTarget (Module *M) { 2386152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel 23908fb05c3ac440979021f508bfee073359be46f7eDevang Patel if (Target) 24008fb05c3ac440979021f508bfee073359be46f7eDevang Patel return; 24108fb05c3ac440979021f508bfee073359be46f7eDevang Patel 2426152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel std::string Err; 2434b2b9402c5c369b94b35837470a170f1d0e47e1fGordon Henriksen const TargetMachineRegistry::entry* March = 2446152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel TargetMachineRegistry::getClosestStaticTargetForModule(*M, Err); 2456152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel 2466152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel if (March == 0) 2476152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel return; 2486152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel 2496152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel // Create target 2505252ae6ecad11b578e9bc61806670494efd439c8Devang Patel SubtargetFeatures Features; 2515252ae6ecad11b578e9bc61806670494efd439c8Devang Patel std::string FeatureStr; 2525252ae6ecad11b578e9bc61806670494efd439c8Devang Patel std::string TargetTriple = M->getTargetTriple(); 2535252ae6ecad11b578e9bc61806670494efd439c8Devang Patel 2545252ae6ecad11b578e9bc61806670494efd439c8Devang Patel if (strncmp(TargetTriple.c_str(), "powerpc-apple-", 14) == 0) 2555252ae6ecad11b578e9bc61806670494efd439c8Devang Patel Features.AddFeature("altivec", true); 2565252ae6ecad11b578e9bc61806670494efd439c8Devang Patel else if (strncmp(TargetTriple.c_str(), "powerpc64-apple-", 16) == 0) { 2575252ae6ecad11b578e9bc61806670494efd439c8Devang Patel Features.AddFeature("64bit", true); 2585252ae6ecad11b578e9bc61806670494efd439c8Devang Patel Features.AddFeature("altivec", true); 2595252ae6ecad11b578e9bc61806670494efd439c8Devang Patel } 2605252ae6ecad11b578e9bc61806670494efd439c8Devang Patel 2615252ae6ecad11b578e9bc61806670494efd439c8Devang Patel FeatureStr = Features.getString(); 2625252ae6ecad11b578e9bc61806670494efd439c8Devang Patel Target = March->CtorFn(*M, FeatureStr); 2636152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel} 2646152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel 265a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel/// Optimize module M using various IPO passes. Use exportList to 266a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel/// internalize selected symbols. Target platform is selected 267a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel/// based on information available to module M. No new target 268a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel/// features are selected. 2696152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patelenum LTOStatus 2706152b7ec25b8d225dc1e146e241d1c6061c8221bDevang PatelLTO::optimize(Module *M, std::ostream &Out, 2716152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel std::vector<const char *> &exportList) 272a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel{ 273a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Instantiate the pass manager to organize the passes. 274a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel PassManager Passes; 275a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 276a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Collect Target info 27708fb05c3ac440979021f508bfee073359be46f7eDevang Patel getTarget(M); 2786152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel 2796152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel if (!Target) 280a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel return LTO_NO_TARGET; 28121b70b237d404ebdde190a072d90f630db92f691Devang Patel 28221b70b237d404ebdde190a072d90f630db92f691Devang Patel // If target supports exception handling then enable it now. 28321b70b237d404ebdde190a072d90f630db92f691Devang Patel if (Target->getTargetAsmInfo()->doesSupportExceptionHandling()) 28421b70b237d404ebdde190a072d90f630db92f691Devang Patel ExceptionHandling = true; 28521b70b237d404ebdde190a072d90f630db92f691Devang Patel 286a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Start off with a verification pass. 287a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createVerifierPass()); 288a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 289a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Add an appropriate TargetData instance for this module... 2906152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel Passes.add(new TargetData(*Target->getTargetData())); 291a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 292a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Internalize symbols if export list is nonemty 293a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel if (!exportList.empty()) 294a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createInternalizePass(exportList)); 295a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 296a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Now that we internalized some globals, see if we can hack on them! 297a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createGlobalOptimizerPass()); 298a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 299a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Linking modules together can lead to duplicated global constants, only 300a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // keep one copy of each constant... 301a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createConstantMergePass()); 302a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 303a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // If the -s command line option was specified, strip the symbols out of the 304a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // resulting program to make it smaller. -s is a GLD option that we are 305a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // supporting. 306bc9ed593d7624eb01b498776042eb438137ef007Devang Patel if(!ExceptionHandling) 307bc9ed593d7624eb01b498776042eb438137ef007Devang Patel // FIXME : This causes multiple nameless _.eh symbols on 308bc9ed593d7624eb01b498776042eb438137ef007Devang Patel // darwin when EH is ON. 309bc9ed593d7624eb01b498776042eb438137ef007Devang Patel Passes.add(createStripSymbolsPass()); 310a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 311a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Propagate constants at call sites into the functions they call. 312a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createIPConstantPropagationPass()); 313a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 314a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Remove unused arguments from functions... 315a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createDeadArgEliminationPass()); 316a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 317a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createFunctionInliningPass()); // Inline small functions 318a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 319a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createPruneEHPass()); // Remove dead EH info 320a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 321a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createGlobalDCEPass()); // Remove dead functions 322a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 323a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // If we didn't decide to inline a function, check to see if we can 324a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // transform it to pass arguments by value instead of by reference. 325a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createArgumentPromotionPass()); 326a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 327a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // The IPO passes may leave cruft around. Clean up after them. 328a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createInstructionCombiningPass()); 329a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 330a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createScalarReplAggregatesPass()); // Break up allocas 331a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 332a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Run a few AA driven optimizations here and now, to cleanup the code. 333a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createGlobalsModRefPass()); // IP alias analysis 334a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 335a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createLICMPass()); // Hoist loop invariants 336a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createLoadValueNumberingPass()); // GVN for load instrs 337a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createGCSEPass()); // Remove common subexprs 338a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createDeadStoreEliminationPass()); // Nuke dead stores 339a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 340a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Cleanup and simplify the code after the scalar optimizations. 341a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createInstructionCombiningPass()); 342a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 343a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Delete basic blocks, which optimization passes may have killed... 344a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createCFGSimplificationPass()); 345a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 346a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Now that we have optimized the program, discard unreachable functions... 347a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createGlobalDCEPass()); 348a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 349a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Make sure everything is still good. 350a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.add(createVerifierPass()); 351a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 352998051a2211a5f86b38941de0aca241b34895e1eDevang Patel FunctionPassManager *CodeGenPasses = 353998051a2211a5f86b38941de0aca241b34895e1eDevang Patel new FunctionPassManager(new ExistingModuleProvider(M)); 354998051a2211a5f86b38941de0aca241b34895e1eDevang Patel 3556152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel CodeGenPasses->add(new TargetData(*Target->getTargetData())); 356546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling 357546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling MachineCodeEmitter *MCE = 0; 358546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling 359546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling switch (Target->addPassesToEmitFile(*CodeGenPasses, Out, 36062062b59df4e59d8c08044634c2bb7ef25f964edBill Wendling TargetMachine::AssemblyFile, true)) { 361546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling default: 362546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling case FileModel::Error: 36362062b59df4e59d8c08044634c2bb7ef25f964edBill Wendling return LTO_WRITE_FAILURE; 364546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling case FileModel::AsmFile: 365546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling break; 366546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling case FileModel::MachOFile: 367546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling MCE = AddMachOWriter(*CodeGenPasses, Out, *Target); 368546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling break; 369546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling case FileModel::ElfFile: 370546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling MCE = AddELFWriter(*CodeGenPasses, Out, *Target); 371546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling break; 372546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling } 373546d0fbd9718ea5ad422faaeffea939fe7312408Bill Wendling 37462062b59df4e59d8c08044634c2bb7ef25f964edBill Wendling if (Target->addPassesToEmitFileFinish(*CodeGenPasses, MCE, true)) 37562062b59df4e59d8c08044634c2bb7ef25f964edBill Wendling return LTO_WRITE_FAILURE; 376a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 377a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Run our queue of passes all at once now, efficiently. 378a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Passes.run(*M); 379a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 380998051a2211a5f86b38941de0aca241b34895e1eDevang Patel // Run the code generator, if present. 381998051a2211a5f86b38941de0aca241b34895e1eDevang Patel CodeGenPasses->doInitialization(); 382998051a2211a5f86b38941de0aca241b34895e1eDevang Patel for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I) { 3835cbf985dcbc89fba3208e7baf8b6f488b06d3ec9Reid Spencer if (!I->isDeclaration()) 384998051a2211a5f86b38941de0aca241b34895e1eDevang Patel CodeGenPasses->run(*I); 385998051a2211a5f86b38941de0aca241b34895e1eDevang Patel } 386998051a2211a5f86b38941de0aca241b34895e1eDevang Patel CodeGenPasses->doFinalization(); 387998051a2211a5f86b38941de0aca241b34895e1eDevang Patel 388a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel return LTO_OPT_SUCCESS; 389a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel} 390a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 391a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel///Link all modules together and optimize them using IPO. Generate 392a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel/// native object file using OutputFilename 393a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel/// Return appropriate LTOStatus. 394a89d47f54d1f83d328f6169151653bfc742607bfDevang Patelenum LTOStatus 395c7cfbc58ad88f127df6949791401969a09da560fDevang PatelLTO::optimizeModules(const std::string &OutputFilename, 39638187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel std::vector<const char *> &exportList, 39738187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel std::string &targetTriple, 3985e563c326490207ebd58d47935fb9efda7638aa2Devang Patel bool saveTemps, const char *FinalOutputFilename) 399a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel{ 400a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel if (modules.empty()) 401a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel return LTO_NO_WORK; 402a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 403a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel std::ios::openmode io_mode = 404a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel std::ios::out | std::ios::trunc | std::ios::binary; 405a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel std::string *errMsg = NULL; 406a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Module *bigOne = modules[0]; 407a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel Linker theLinker("LinkTimeOptimizer", bigOne, false); 408a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel for (unsigned i = 1, e = modules.size(); i != e; ++i) 409a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel if (theLinker.LinkModules(bigOne, modules[i], errMsg)) 410a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel return LTO_MODULE_MERGE_FAILURE; 41127376106d94017a72fc602bd9279a6f9fd3018daDevang Patel // all modules have been handed off to the linker. 41227376106d94017a72fc602bd9279a6f9fd3018daDevang Patel modules.clear(); 413a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 41438187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel sys::Path FinalOutputPath(FinalOutputFilename); 41538187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel FinalOutputPath.eraseSuffix(); 41638187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel 4175e563c326490207ebd58d47935fb9efda7638aa2Devang Patel switch(CGModel) { 4185e563c326490207ebd58d47935fb9efda7638aa2Devang Patel case LTO_CGM_Dynamic: 4195e563c326490207ebd58d47935fb9efda7638aa2Devang Patel Target->setRelocationModel(Reloc::PIC_); 4205e563c326490207ebd58d47935fb9efda7638aa2Devang Patel break; 4215e563c326490207ebd58d47935fb9efda7638aa2Devang Patel case LTO_CGM_DynamicNoPIC: 4225e563c326490207ebd58d47935fb9efda7638aa2Devang Patel Target->setRelocationModel(Reloc::DynamicNoPIC); 4235e563c326490207ebd58d47935fb9efda7638aa2Devang Patel break; 4245e563c326490207ebd58d47935fb9efda7638aa2Devang Patel case LTO_CGM_Static: 4255e563c326490207ebd58d47935fb9efda7638aa2Devang Patel Target->setRelocationModel(Reloc::Static); 4265e563c326490207ebd58d47935fb9efda7638aa2Devang Patel break; 4275e563c326490207ebd58d47935fb9efda7638aa2Devang Patel } 4285e563c326490207ebd58d47935fb9efda7638aa2Devang Patel 42938187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel if (saveTemps) { 43038187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel std::string tempFileName(FinalOutputPath.c_str()); 43138187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel tempFileName += "0.bc"; 43238187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel std::ofstream Out(tempFileName.c_str(), io_mode); 433744879ea01779a48f898a801c847677b0bfa824aChris Lattner WriteBitcodeToFile(bigOne, Out); 43438187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel } 435a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 436a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Strip leading underscore because it was added to match names 43794a0ac9bea7411bf98512b44b7e9bba42ee9a07fDevang Patel // seen by linker. 438a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel for (unsigned i = 0, e = exportList.size(); i != e; ++i) { 439a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel const char *name = exportList[i]; 440ed872865d0316ec754d93f703dd39f21745e45caDevang Patel NameToSymbolMap::iterator itr = allSymbols.find(name); 441ed872865d0316ec754d93f703dd39f21745e45caDevang Patel if (itr != allSymbols.end()) 442ed872865d0316ec754d93f703dd39f21745e45caDevang Patel exportList[i] = allSymbols[name]->getName(); 443a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel } 444a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 4453f0e5e205772af1529d980cb1fb2c910ef38417cDevang Patel 446e5c9cb5eb6bce502faaedea04014dab46f6540f4Reid Spencer std::string ErrMsg; 4473f0e5e205772af1529d980cb1fb2c910ef38417cDevang Patel sys::Path TempDir = sys::Path::GetTemporaryDirectory(&ErrMsg); 4489f5d48bcb1c6e72363567089242960bfde5171bbDevang Patel if (TempDir.isEmpty()) { 449e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling cerr << "lto: " << ErrMsg << "\n"; 4509f5d48bcb1c6e72363567089242960bfde5171bbDevang Patel return LTO_WRITE_FAILURE; 4519f5d48bcb1c6e72363567089242960bfde5171bbDevang Patel } 4523f0e5e205772af1529d980cb1fb2c910ef38417cDevang Patel sys::Path tmpAsmFilePath(TempDir); 4533f0e5e205772af1529d980cb1fb2c910ef38417cDevang Patel if (!tmpAsmFilePath.appendComponent("lto")) { 454e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling cerr << "lto: " << ErrMsg << "\n"; 4553f0e5e205772af1529d980cb1fb2c910ef38417cDevang Patel TempDir.eraseFromDisk(true); 4563f0e5e205772af1529d980cb1fb2c910ef38417cDevang Patel return LTO_WRITE_FAILURE; 4573f0e5e205772af1529d980cb1fb2c910ef38417cDevang Patel } 458cbb7ec7396914560e107ff32d4a820774c4392ddReid Spencer if (tmpAsmFilePath.createTemporaryFileOnDisk(true, &ErrMsg)) { 459e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling cerr << "lto: " << ErrMsg << "\n"; 4603f0e5e205772af1529d980cb1fb2c910ef38417cDevang Patel TempDir.eraseFromDisk(true); 461ca64012ac6b21d868ccf2fcc26febd991ef2cc9cDevang Patel return LTO_WRITE_FAILURE; 462e5c9cb5eb6bce502faaedea04014dab46f6540f4Reid Spencer } 463a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel sys::RemoveFileOnSignal(tmpAsmFilePath); 464a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 465a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel std::ofstream asmFile(tmpAsmFilePath.c_str(), io_mode); 466a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel if (!asmFile.is_open() || asmFile.bad()) { 4673f0e5e205772af1529d980cb1fb2c910ef38417cDevang Patel if (tmpAsmFilePath.exists()) { 468a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel tmpAsmFilePath.eraseFromDisk(); 4693f0e5e205772af1529d980cb1fb2c910ef38417cDevang Patel TempDir.eraseFromDisk(true); 4703f0e5e205772af1529d980cb1fb2c910ef38417cDevang Patel } 471a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel return LTO_WRITE_FAILURE; 472a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel } 473a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 4746152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel enum LTOStatus status = optimize(bigOne, asmFile, exportList); 475a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel asmFile.close(); 476a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel if (status != LTO_OPT_SUCCESS) { 477a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel tmpAsmFilePath.eraseFromDisk(); 4783f0e5e205772af1529d980cb1fb2c910ef38417cDevang Patel TempDir.eraseFromDisk(true); 479a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel return status; 480a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel } 481a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 48238187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel if (saveTemps) { 48338187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel std::string tempFileName(FinalOutputPath.c_str()); 48438187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel tempFileName += "1.bc"; 48538187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel std::ofstream Out(tempFileName.c_str(), io_mode); 486744879ea01779a48f898a801c847677b0bfa824aChris Lattner WriteBitcodeToFile(bigOne, Out); 48738187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel } 48838187d6a56326d0d6339f09c1ef21d52174d95a8Devang Patel 4892681023488d70303ec788bc8a0a3f5336257830aDevang Patel targetTriple = bigOne->getTargetTriple(); 4902681023488d70303ec788bc8a0a3f5336257830aDevang Patel 491a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Run GCC to assemble and link the program into native code. 492a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // 493a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // Note: 494a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // We can't just assemble and link the file with the system assembler 495a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // and linker because we don't know where to put the _start symbol. 496a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel // GCC mysteriously knows how to do it. 497dc4c38279f6bf3b001515e6723e7b6d79ed378b0Devang Patel const sys::Path gcc = sys::Program::FindProgramByName("gcc"); 498a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel if (gcc.isEmpty()) { 499a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel tmpAsmFilePath.eraseFromDisk(); 5003f0e5e205772af1529d980cb1fb2c910ef38417cDevang Patel TempDir.eraseFromDisk(true); 501a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel return LTO_ASM_FAILURE; 502a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel } 503a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 504a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel std::vector<const char*> args; 505a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel args.push_back(gcc.c_str()); 50659c8d8ae892f8c9e7ab4054d6be3efd0b66a7e4fDevang Patel if (strncmp(targetTriple.c_str(), "i686-apple-", 11) == 0) { 50759c8d8ae892f8c9e7ab4054d6be3efd0b66a7e4fDevang Patel args.push_back("-arch"); 50859c8d8ae892f8c9e7ab4054d6be3efd0b66a7e4fDevang Patel args.push_back("i386"); 50959c8d8ae892f8c9e7ab4054d6be3efd0b66a7e4fDevang Patel } 51059c8d8ae892f8c9e7ab4054d6be3efd0b66a7e4fDevang Patel if (strncmp(targetTriple.c_str(), "x86_64-apple-", 13) == 0) { 51159c8d8ae892f8c9e7ab4054d6be3efd0b66a7e4fDevang Patel args.push_back("-arch"); 51259c8d8ae892f8c9e7ab4054d6be3efd0b66a7e4fDevang Patel args.push_back("x86_64"); 51359c8d8ae892f8c9e7ab4054d6be3efd0b66a7e4fDevang Patel } 51459c8d8ae892f8c9e7ab4054d6be3efd0b66a7e4fDevang Patel if (strncmp(targetTriple.c_str(), "powerpc-apple-", 14) == 0) { 51559c8d8ae892f8c9e7ab4054d6be3efd0b66a7e4fDevang Patel args.push_back("-arch"); 51659c8d8ae892f8c9e7ab4054d6be3efd0b66a7e4fDevang Patel args.push_back("ppc"); 51759c8d8ae892f8c9e7ab4054d6be3efd0b66a7e4fDevang Patel } 51859c8d8ae892f8c9e7ab4054d6be3efd0b66a7e4fDevang Patel if (strncmp(targetTriple.c_str(), "powerpc64-apple-", 16) == 0) { 51959c8d8ae892f8c9e7ab4054d6be3efd0b66a7e4fDevang Patel args.push_back("-arch"); 52059c8d8ae892f8c9e7ab4054d6be3efd0b66a7e4fDevang Patel args.push_back("ppc64"); 52159c8d8ae892f8c9e7ab4054d6be3efd0b66a7e4fDevang Patel } 522a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel args.push_back("-c"); 523a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel args.push_back("-x"); 524a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel args.push_back("assembler"); 525a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel args.push_back("-o"); 526a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel args.push_back(OutputFilename.c_str()); 527a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel args.push_back(tmpAsmFilePath.c_str()); 528a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel args.push_back(0); 529a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 5300e50128099171b431b05a34f5b98ea1c2f82b867Devang Patel if (sys::Program::ExecuteAndWait(gcc, &args[0], 0, 0, 0, 0, &ErrMsg)) { 531e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling cerr << "lto: " << ErrMsg << "\n"; 5329f5d48bcb1c6e72363567089242960bfde5171bbDevang Patel return LTO_ASM_FAILURE; 5339f5d48bcb1c6e72363567089242960bfde5171bbDevang Patel } 534a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 535a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel tmpAsmFilePath.eraseFromDisk(); 5363f0e5e205772af1529d980cb1fb2c910ef38417cDevang Patel TempDir.eraseFromDisk(true); 537a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel 538a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel return LTO_OPT_SUCCESS; 539a89d47f54d1f83d328f6169151653bfc742607bfDevang Patel} 5406152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel 5413281528de4755f8f4653bf6ff509ec88d795f975Devang Patelvoid LTO::printVersion() { 5423281528de4755f8f4653bf6ff509ec88d795f975Devang Patel cl::PrintVersionMessage(); 5433281528de4755f8f4653bf6ff509ec88d795f975Devang Patel} 5443281528de4755f8f4653bf6ff509ec88d795f975Devang Patel 54540e274b5799b13646914b31c622ac857e5929732Chandler Carruth/// Unused pure-virtual destructor. Must remain empty. 54640e274b5799b13646914b31c622ac857e5929732Chandler CarruthLinkTimeOptimizer::~LinkTimeOptimizer() {} 54740e274b5799b13646914b31c622ac857e5929732Chandler Carruth 5486152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel/// Destruct LTO. Delete all modules, symbols and target. 5496152b7ec25b8d225dc1e146e241d1c6061c8221bDevang PatelLTO::~LTO() { 5506152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel 5516152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel for (std::vector<Module *>::iterator itr = modules.begin(), e = modules.end(); 5526152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel itr != e; ++itr) 5536152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel delete *itr; 5546152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel 5556152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel modules.clear(); 5566152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel 5576152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel for (NameToSymbolMap::iterator itr = allSymbols.begin(), e = allSymbols.end(); 5586152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel itr != e; ++itr) 5596152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel delete itr->second; 5606152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel 5616152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel allSymbols.clear(); 5626152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel 5636152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel delete Target; 5646152b7ec25b8d225dc1e146e241d1c6061c8221bDevang Patel} 565