LTOCodeGenerator.cpp revision 0b95a9949ba6d9823be202c384c60ab9ef9404d8
1cf5933a716e7eb6bd5ff49aa62f3e76379ebaf51Chris Lattner//===-LTOCodeGenerator.cpp - LLVM Link Time Optimizer ---------------------===// 2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 9237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner// 10befa499d45ffcc32bd9902518aec18589464e47cChris Lattner// This file implements the Link Time Optimization library. This library is 11befa499d45ffcc32bd9902518aec18589464e47cChris Lattner// intended to be used by linker to optimize code at link time. 12befa499d45ffcc32bd9902518aec18589464e47cChris Lattner// 13237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner//===----------------------------------------------------------------------===// 14237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner 15237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner#include "LTOCodeGenerator.h" 1686453c52ba02e743d29c08456e51006500041456Chris Lattner#include "LTOModule.h" 17237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner#include "llvm/Constants.h" 1847b14a4a6a455c7be169cfd312fcbe796f0ad426Misha Brukman#include "llvm/DerivedTypes.h" 191f67ce4aa3f65619f54c8a3072539da5b0022841Dale Johannesen#include "llvm/Linker.h" 20237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner#include "llvm/LLVMContext.h" 21e4aeec003f82a5263ffb168e175e6fca8b6f681dDan Gohman#include "llvm/Module.h" 22ff2dad312883e5da91fb9f4e3619b7d095867f3bChris Lattner#include "llvm/PassManager.h" 236f7426ec2e46bb19cc9f9e75f1c355b35cf12d7dTanya Lattner#include "llvm/Analysis/Passes.h" 24237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner#include "llvm/Analysis/Verifier.h" 254ff4141a9ee9ce705f2a709f3372acaf58d86ea3Chris Lattner#include "llvm/Bitcode/ReaderWriter.h" 264ff4141a9ee9ce705f2a709f3372acaf58d86ea3Chris Lattner#include "llvm/Config/config.h" 27551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/MC/MCAsmInfo.h" 28551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/MC/MCContext.h" 29ce63ffb52f249b62cdf2d250c128007b13f27e71Daniel Dunbar#include "llvm/MC/SubtargetFeature.h" 3012f0babca4459c253675700e1d707652d5b6ba17Chris Lattner#include "llvm/Target/Mangler.h" 31551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Target/TargetOptions.h" 32befa499d45ffcc32bd9902518aec18589464e47cChris Lattner#include "llvm/Target/TargetData.h" 33a51bcb50b0c74adc741361824ef81dbefb715c53Chris Lattner#include "llvm/Target/TargetMachine.h" 34d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke#include "llvm/Target/TargetRegisterInfo.h" 3586453c52ba02e743d29c08456e51006500041456Chris Lattner#include "llvm/Transforms/IPO.h" 36dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner#include "llvm/Transforms/IPO/PassManagerBuilder.h" 3786453c52ba02e743d29c08456e51006500041456Chris Lattner#include "llvm/Support/CommandLine.h" 38199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner#include "llvm/Support/FormattedStream.h" 3986453c52ba02e743d29c08456e51006500041456Chris Lattner#include "llvm/Support/MemoryBuffer.h" 40844731a7f1909f55935e3514c9e713a62d67662eDan Gohman#include "llvm/Support/ToolOutputFile.h" 415fee49eff92c2ae2f70eb84d136c31a706560750Dale Johannesen#include "llvm/Support/Host.h" 42cbfdf9644ce38fd3404469c26ac3c8466c940b6eDale Johannesen#include "llvm/Support/Signals.h" 43237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner#include "llvm/Support/TargetRegistry.h" 44ae73dc1448d25b02cabc7c64c86c64371453dda8Dan Gohman#include "llvm/Support/TargetSelect.h" 45ae73dc1448d25b02cabc7c64c86c64371453dda8Dan Gohman#include "llvm/Support/system_error.h" 46237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner#include "llvm/ADT/StringExtras.h" 47ae73dc1448d25b02cabc7c64c86c64371453dda8Dan Gohmanusing namespace llvm; 48ae73dc1448d25b02cabc7c64c86c64371453dda8Dan Gohman 49120d053e3ba810b44047fbcb719824bed5673ca9Chris Lattnerstatic cl::opt<bool> 50ff2dad312883e5da91fb9f4e3619b7d095867f3bChris LattnerDisableInline("disable-inlining", cl::init(false), 51ff2dad312883e5da91fb9f4e3619b7d095867f3bChris Lattner cl::desc("Do not run the inliner pass")); 52ff2dad312883e5da91fb9f4e3619b7d095867f3bChris Lattner 53ff2dad312883e5da91fb9f4e3619b7d095867f3bChris Lattnerstatic cl::opt<bool> 54ff2dad312883e5da91fb9f4e3619b7d095867f3bChris LattnerDisableGVNLoadPRE("disable-gvn-loadpre", cl::init(false), 55ff2dad312883e5da91fb9f4e3619b7d095867f3bChris Lattner cl::desc("Do not run the GVN load PRE pass")); 56ff2dad312883e5da91fb9f4e3619b7d095867f3bChris Lattner 57199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattnerconst char* LTOCodeGenerator::getVersionString() { 58199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner#ifdef LLVM_VERSION_INFO 59199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner return PACKAGE_NAME " version " PACKAGE_VERSION ", " LLVM_VERSION_INFO; 60199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner#else 61199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner return PACKAGE_NAME " version " PACKAGE_VERSION; 62199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner#endif 63199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner} 64199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner 65cc0a0299d96676e0a51e9b8f5bf617d8025f09a7Chris LattnerLTOCodeGenerator::LTOCodeGenerator() 66cc0a0299d96676e0a51e9b8f5bf617d8025f09a7Chris Lattner : _context(getGlobalContext()), 67cc0a0299d96676e0a51e9b8f5bf617d8025f09a7Chris Lattner _linker("LinkTimeOptimizer", "ld-temp.o", _context), _target(NULL), 68cc0a0299d96676e0a51e9b8f5bf617d8025f09a7Chris Lattner _emitDwarfDebugInfo(false), _scopeRestrictionsDone(false), 69199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner _codeModel(LTO_CODEGEN_PIC_MODEL_DYNAMIC), 70199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner _nativeObjectFile(NULL) { 71199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner InitializeAllTargets(); 72befa499d45ffcc32bd9902518aec18589464e47cChris Lattner InitializeAllTargetMCs(); 7366c75aaa028683c389c55b377ee2411b61081677Bill Wendling InitializeAllAsmPrinters(); 7466c75aaa028683c389c55b377ee2411b61081677Bill Wendling} 75199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner 76199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris LattnerLTOCodeGenerator::~LTOCodeGenerator() { 77199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner delete _target; 78199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner delete _nativeObjectFile; 7912f0babca4459c253675700e1d707652d5b6ba17Chris Lattner 80fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman for (std::vector<char*>::iterator I = _codegenOptions.begin(), 818c1604e7d617622cb391f1c679ddf70ea03baedcBill Wendling E = _codegenOptions.end(); I != E; ++I) 828c1604e7d617622cb391f1c679ddf70ea03baedcBill Wendling free(*I); 838c1604e7d617622cb391f1c679ddf70ea03baedcBill Wendling} 848c1604e7d617622cb391f1c679ddf70ea03baedcBill Wendling 858c1604e7d617622cb391f1c679ddf70ea03baedcBill Wendlingbool LTOCodeGenerator::addModule(LTOModule* mod, std::string& errMsg) { 868c1604e7d617622cb391f1c679ddf70ea03baedcBill Wendling bool ret = _linker.LinkInModule(mod->getLLVVMModule(), &errMsg); 878c1604e7d617622cb391f1c679ddf70ea03baedcBill Wendling 888c1604e7d617622cb391f1c679ddf70ea03baedcBill Wendling const std::vector<const char*> &undefs = mod->getAsmUndefinedRefs(); 89199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner for (int i = 0, e = undefs.size(); i != e; ++i) 90199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner _asmUndefinedRefs[undefs[i]] = 1; 91199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner 92199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner return ret; 93199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner} 94199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner 95199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattnerbool LTOCodeGenerator::setDebugInfo(lto_debug_model debug, 96199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner std::string& errMsg) { 97199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner switch (debug) { 98199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner case LTO_DEBUG_MODEL_NONE: 99199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner _emitDwarfDebugInfo = false; 100199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner return false; 101199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner 102199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner case LTO_DEBUG_MODEL_DWARF: 103199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner _emitDwarfDebugInfo = true; 104199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner return false; 105199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner } 106199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner llvm_unreachable("Unknown debug format!"); 107199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner} 108199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner 109199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattnerbool LTOCodeGenerator::setCodePICModel(lto_codegen_model model, 110199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner std::string& errMsg) { 111199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner switch (model) { 112199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner case LTO_CODEGEN_PIC_MODEL_STATIC: 113199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner case LTO_CODEGEN_PIC_MODEL_DYNAMIC: 114199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner case LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC: 115199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner _codeModel = model; 116199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner return false; 117199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner } 118199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner llvm_unreachable("Unknown PIC model!"); 119199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner} 120199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner 121199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattnerbool LTOCodeGenerator::writeMergedModules(const char *path, 122199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner std::string &errMsg) { 123199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner if (determineTarget(errMsg)) 124199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner return true; 125199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner 126199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner // mark which symbols can not be internalized 127199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner applyScopeRestrictions(); 128199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner 129199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner // create output file 130199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner std::string ErrInfo; 131199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner tool_output_file Out(path, ErrInfo, 132199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner raw_fd_ostream::F_Binary); 133199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner if (!ErrInfo.empty()) { 134199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner errMsg = "could not open bitcode file for writing: "; 135199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner errMsg += path; 136199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner return true; 137199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner } 138199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner 139199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner // write bitcode to it 140199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner WriteBitcodeToFile(_linker.getModule(), Out.os()); 141199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner Out.os().close(); 142199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner 143199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner if (Out.os().has_error()) { 144199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner errMsg = "could not write bitcode file: "; 145199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner errMsg += path; 146199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner Out.os().clear_error(); 147199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner return true; 148199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner } 149199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner 150c0aa67950ae0f6e9611240d8f0e3ac49dc8195c0David Greene Out.keep(); 151199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner return false; 152199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner} 153199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner 154199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattnerbool LTOCodeGenerator::compile_to_file(const char** name, std::string& errMsg) { 155199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner // make unique temp .o file to put generated object file 156199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner sys::PathWithStatus uniqueObjPath("lto-llvm.o"); 157199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner if (uniqueObjPath.createTemporaryFileOnDisk(false, &errMsg)) { 158fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman uniqueObjPath.eraseFromDisk(); 159199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner return true; 160199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner } 161199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner sys::RemoveFileOnSignal(uniqueObjPath); 1621f67ce4aa3f65619f54c8a3072539da5b0022841Dale Johannesen 163199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner // generate object file 164199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner bool genResult = false; 165199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner tool_output_file objFile(uniqueObjPath.c_str(), errMsg); 166199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner if (!errMsg.empty()) { 167199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner uniqueObjPath.eraseFromDisk(); 168199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner return true; 169199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner } 170befa499d45ffcc32bd9902518aec18589464e47cChris Lattner 171199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner genResult = this->generateObjectFile(objFile.os(), errMsg); 172befa499d45ffcc32bd9902518aec18589464e47cChris Lattner objFile.os().close(); 173237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner if (objFile.os().has_error()) { 1741a99dbfe3b70c83d3f3e4648b5868c04697cd77cDaniel Dunbar objFile.os().clear_error(); 1751a99dbfe3b70c83d3f3e4648b5868c04697cd77cDaniel Dunbar uniqueObjPath.eraseFromDisk(); 1761a99dbfe3b70c83d3f3e4648b5868c04697cd77cDaniel Dunbar return true; 1771a99dbfe3b70c83d3f3e4648b5868c04697cd77cDaniel Dunbar } 178c5e1ec47c719806fcc882470595960512edc7441Daniel Dunbar 1791a99dbfe3b70c83d3f3e4648b5868c04697cd77cDaniel Dunbar objFile.keep(); 180c5e1ec47c719806fcc882470595960512edc7441Daniel Dunbar if (genResult) { 181c0aa67950ae0f6e9611240d8f0e3ac49dc8195c0David Greene uniqueObjPath.eraseFromDisk(); 18284a832f9272ed7f1a47c3e019c770b62e373cc6cBill Wendling return true; 183c5e1ec47c719806fcc882470595960512edc7441Daniel Dunbar } 184c5e1ec47c719806fcc882470595960512edc7441Daniel Dunbar 185c5e1ec47c719806fcc882470595960512edc7441Daniel Dunbar _nativeObjectPath = uniqueObjPath.str(); 186c5e1ec47c719806fcc882470595960512edc7441Daniel Dunbar *name = _nativeObjectPath.c_str(); 187c0aa67950ae0f6e9611240d8f0e3ac49dc8195c0David Greene return false; 18884a832f9272ed7f1a47c3e019c770b62e373cc6cBill Wendling} 189c5e1ec47c719806fcc882470595960512edc7441Daniel Dunbar 190c5e1ec47c719806fcc882470595960512edc7441Daniel Dunbarconst void* LTOCodeGenerator::compile(size_t* length, std::string& errMsg) { 191c5e1ec47c719806fcc882470595960512edc7441Daniel Dunbar const char *name; 192c5e1ec47c719806fcc882470595960512edc7441Daniel Dunbar if (compile_to_file(&name, errMsg)) 1931a99dbfe3b70c83d3f3e4648b5868c04697cd77cDaniel Dunbar return NULL; 194e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen 195e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen // remove old buffer if compile() called twice 196e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen delete _nativeObjectFile; 197a0479e53323ade402272ddf8302c8aa2c496c775Evan Cheng 19884a832f9272ed7f1a47c3e019c770b62e373cc6cBill Wendling // read .o file into memory buffer 1991a99dbfe3b70c83d3f3e4648b5868c04697cd77cDaniel Dunbar OwningPtr<MemoryBuffer> BuffPtr; 2001a99dbfe3b70c83d3f3e4648b5868c04697cd77cDaniel Dunbar if (error_code ec = MemoryBuffer::getFile(name, BuffPtr, -1, false)) { 201135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner errMsg = ec.message(); 2021a99dbfe3b70c83d3f3e4648b5868c04697cd77cDaniel Dunbar sys::Path(_nativeObjectPath).eraseFromDisk(); 203c0aa67950ae0f6e9611240d8f0e3ac49dc8195c0David Greene return NULL; 20484a832f9272ed7f1a47c3e019c770b62e373cc6cBill Wendling } 2051a99dbfe3b70c83d3f3e4648b5868c04697cd77cDaniel Dunbar _nativeObjectFile = BuffPtr.take(); 2061a99dbfe3b70c83d3f3e4648b5868c04697cd77cDaniel Dunbar 207135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner // remove temp files 208e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen sys::Path(_nativeObjectPath).eraseFromDisk(); 209e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen 210e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen // return buffer, unless error 211e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen if (_nativeObjectFile == NULL) 212e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen return NULL; 213e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen *length = _nativeObjectFile->getBufferSize(); 214e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen return _nativeObjectFile->getBufferStart(); 215e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen} 216e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen 217e91b9a3b59688023e20cee8441179300b87c844eDale Johannesenbool LTOCodeGenerator::determineTarget(std::string& errMsg) { 218e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen if (_target != NULL) 219e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen return false; 220e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen 221e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen std::string Triple = _linker.getModule()->getTargetTriple(); 222e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen if (Triple.empty()) 223e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen Triple = sys::getDefaultTargetTriple(); 224e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen 225e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen // create target machine from info for merged modules 226e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen const Target *march = TargetRegistry::lookupTarget(Triple, errMsg); 227e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen if (march == NULL) 228e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen return true; 229e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen 230e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen // The relocation model is actually a static member of TargetMachine and 231e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen // needs to be set before the TargetMachine is instantiated. 232e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen Reloc::Model RelocModel = Reloc::Default; 233e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen switch (_codeModel) { 234e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen case LTO_CODEGEN_PIC_MODEL_STATIC: 235e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen RelocModel = Reloc::Static; 236e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen break; 237e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen case LTO_CODEGEN_PIC_MODEL_DYNAMIC: 238e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen RelocModel = Reloc::PIC_; 239e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen break; 240e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen case LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC: 241e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen RelocModel = Reloc::DynamicNoPIC; 242e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen break; 243e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen } 244e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen 245e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen // construct LTOModule, hand over ownership of module and target 246e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen SubtargetFeatures Features; 247e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen Features.getDefaultSubtargetFeatures(llvm::Triple(Triple)); 248bdb984bc2757114bc706026603ed40d7f508c4c1Dale Johannesen std::string FeatureStr = Features.getString(); 249e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen TargetOptions Options; 250e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen LTOModule::getTargetOptions(Options); 251bdb984bc2757114bc706026603ed40d7f508c4c1Dale Johannesen _target = march->createTargetMachine(Triple, _mCpu, FeatureStr, Options, 252bdb984bc2757114bc706026603ed40d7f508c4c1Dale Johannesen RelocModel, CodeModel::Default, 253e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen CodeGenOpt::Aggressive); 254e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen return false; 255e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen} 256e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen 257e91b9a3b59688023e20cee8441179300b87c844eDale Johannesenvoid LTOCodeGenerator:: 258e91b9a3b59688023e20cee8441179300b87c844eDale JohannesenapplyRestriction(GlobalValue &GV, 259e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen std::vector<const char*> &mustPreserveList, 260e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen SmallPtrSet<GlobalValue*, 8> &asmUsed, 261e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen Mangler &mangler) { 262bdb984bc2757114bc706026603ed40d7f508c4c1Dale Johannesen SmallString<64> Buffer; 263e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen mangler.getNameWithPrefix(Buffer, &GV, false); 264e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen 265e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen if (GV.isDeclaration()) 266c0aa67950ae0f6e9611240d8f0e3ac49dc8195c0David Greene return; 267e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen if (_mustPreserveSymbols.count(Buffer)) 268e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen mustPreserveList.push_back(GV.getName().data()); 269e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen if (_asmUndefinedRefs.count(Buffer)) 270e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen asmUsed.insert(&GV); 271e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen} 272e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen 273c0aa67950ae0f6e9611240d8f0e3ac49dc8195c0David Greenestatic void findUsedValues(GlobalVariable *LLVMUsed, 274e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen SmallPtrSet<GlobalValue*, 8> &UsedValues) { 275135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner if (LLVMUsed == 0) return; 2761a99dbfe3b70c83d3f3e4648b5868c04697cd77cDaniel Dunbar 277237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner ConstantArray *Inits = dyn_cast<ConstantArray>(LLVMUsed->getInitializer()); 2785095e3d1d1caef8d573534d369e37277c623064cChris Lattner if (Inits == 0) return; 279237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner 28002a436c48ecff9e34d50ce0a2f861e5acdd9bf3fDan Gohman for (unsigned i = 0, e = Inits->getNumOperands(); i != e; ++i) 281237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner if (GlobalValue *GV = 28216581bf931c0ccf2f8993397acfa4e1d509a68dcDale Johannesen dyn_cast<GlobalValue>(Inits->getOperand(i)->stripPointerCasts())) 283c0aa67950ae0f6e9611240d8f0e3ac49dc8195c0David Greene UsedValues.insert(GV); 284237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner} 285befa499d45ffcc32bd9902518aec18589464e47cChris Lattner 286befa499d45ffcc32bd9902518aec18589464e47cChris Lattnervoid LTOCodeGenerator::applyScopeRestrictions() { 287c0aa67950ae0f6e9611240d8f0e3ac49dc8195c0David Greene if (_scopeRestrictionsDone) return; 288237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner Module *mergedModule = _linker.getModule(); 289237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner 290befa499d45ffcc32bd9902518aec18589464e47cChris Lattner // Start off with a verification pass. 291befa499d45ffcc32bd9902518aec18589464e47cChris Lattner PassManager passes; 292befa499d45ffcc32bd9902518aec18589464e47cChris Lattner passes.add(createVerifierPass()); 293199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner 294befa499d45ffcc32bd9902518aec18589464e47cChris Lattner // mark which symbols can not be internalized 295135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner MCContext Context(*_target->getMCAsmInfo(), *_target->getRegisterInfo(),NULL); 296135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner Mangler mangler(Context, *_target->getTargetData()); 297135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner std::vector<const char*> mustPreserveList; 298135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner SmallPtrSet<GlobalValue*, 8> asmUsed; 299135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner 300135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner for (Module::iterator f = mergedModule->begin(), 301135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner e = mergedModule->end(); f != e; ++f) 302e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen applyRestriction(*f, mustPreserveList, asmUsed, mangler); 303d43d5e832f756c9d2c0c8ff4d2f51807a27cab8dChris Lattner for (Module::global_iterator v = mergedModule->global_begin(), 304d43d5e832f756c9d2c0c8ff4d2f51807a27cab8dChris Lattner e = mergedModule->global_end(); v != e; ++v) 305135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner applyRestriction(*v, mustPreserveList, asmUsed, mangler); 306135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner for (Module::alias_iterator a = mergedModule->alias_begin(), 307d43d5e832f756c9d2c0c8ff4d2f51807a27cab8dChris Lattner e = mergedModule->alias_end(); a != e; ++a) 308d43d5e832f756c9d2c0c8ff4d2f51807a27cab8dChris Lattner applyRestriction(*a, mustPreserveList, asmUsed, mangler); 309d43d5e832f756c9d2c0c8ff4d2f51807a27cab8dChris Lattner 310d43d5e832f756c9d2c0c8ff4d2f51807a27cab8dChris Lattner GlobalVariable *LLVMCompilerUsed = 311d43d5e832f756c9d2c0c8ff4d2f51807a27cab8dChris Lattner mergedModule->getGlobalVariable("llvm.compiler.used"); 312d43d5e832f756c9d2c0c8ff4d2f51807a27cab8dChris Lattner findUsedValues(LLVMCompilerUsed, asmUsed); 313d43d5e832f756c9d2c0c8ff4d2f51807a27cab8dChris Lattner if (LLVMCompilerUsed) 314135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner LLVMCompilerUsed->eraseFromParent(); 315135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner 316237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner llvm::Type *i8PTy = llvm::Type::getInt8PtrTy(_context); 317c0aa67950ae0f6e9611240d8f0e3ac49dc8195c0David Greene std::vector<Constant*> asmUsed2; 318fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman for (SmallPtrSet<GlobalValue*, 16>::const_iterator i = asmUsed.begin(), 319befa499d45ffcc32bd9902518aec18589464e47cChris Lattner e = asmUsed.end(); i !=e; ++i) { 320befa499d45ffcc32bd9902518aec18589464e47cChris Lattner GlobalValue *GV = *i; 321befa499d45ffcc32bd9902518aec18589464e47cChris Lattner Constant *c = ConstantExpr::getBitCast(GV, i8PTy); 322befa499d45ffcc32bd9902518aec18589464e47cChris Lattner asmUsed2.push_back(c); 323befa499d45ffcc32bd9902518aec18589464e47cChris Lattner } 324befa499d45ffcc32bd9902518aec18589464e47cChris Lattner 325befa499d45ffcc32bd9902518aec18589464e47cChris Lattner llvm::ArrayType *ATy = llvm::ArrayType::get(i8PTy, asmUsed2.size()); 326fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman LLVMCompilerUsed = 327199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner new llvm::GlobalVariable(*mergedModule, ATy, false, 328199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner llvm::GlobalValue::AppendingLinkage, 329199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner llvm::ConstantArray::get(ATy, asmUsed2), 330befa499d45ffcc32bd9902518aec18589464e47cChris Lattner "llvm.compiler.used"); 331befa499d45ffcc32bd9902518aec18589464e47cChris Lattner 332befa499d45ffcc32bd9902518aec18589464e47cChris Lattner LLVMCompilerUsed->setSection("llvm.metadata"); 333befa499d45ffcc32bd9902518aec18589464e47cChris Lattner 334befa499d45ffcc32bd9902518aec18589464e47cChris Lattner passes.add(createInternalizePass(mustPreserveList)); 335befa499d45ffcc32bd9902518aec18589464e47cChris Lattner 336befa499d45ffcc32bd9902518aec18589464e47cChris Lattner // apply scope restrictions 337befa499d45ffcc32bd9902518aec18589464e47cChris Lattner passes.run(*mergedModule); 338135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner 339199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner _scopeRestrictionsDone = true; 340199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner} 341dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner 342199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner/// Optimize merged modules using various IPO passes 343dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattnerbool LTOCodeGenerator::generateObjectFile(raw_ostream &out, 344dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner std::string &errMsg) { 345dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner if (this->determineTarget(errMsg)) 346dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner return true; 347dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner 3484ff4141a9ee9ce705f2a709f3372acaf58d86ea3Chris Lattner Module* mergedModule = _linker.getModule(); 349c0aa67950ae0f6e9611240d8f0e3ac49dc8195c0David Greene 350dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner // if options were requested, set them 351dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner if (!_codegenOptions.empty()) 352dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner cl::ParseCommandLineOptions(_codegenOptions.size(), 353dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner const_cast<char **>(&_codegenOptions[0])); 354dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner 355dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner // mark which symbols can not be internalized 356dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner this->applyScopeRestrictions(); 357dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner 358135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner // Instantiate the pass manager to organize the passes. 359dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner PassManager passes; 360dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner 361dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner // Start off with a verification pass. 362dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner passes.add(createVerifierPass()); 363e91b9a3b59688023e20cee8441179300b87c844eDale Johannesen 364dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner // Add an appropriate TargetData instance for this module... 365dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner passes.add(new TargetData(*_target->getTargetData())); 366dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner 367dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner // Enabling internalize here would use its AllButMain variant. It 368dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner // keeps only main if it exists and does nothing for libraries. Instead 369135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner // we create the pass ourselves with the symbol list provided by the linker. 370dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner PassManagerBuilder().populateLTOPassManager(passes, /*Internalize=*/false, 371dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner !DisableInline, 372dbab4dc942e0c3286415908762de71a9447f9dfaChris Lattner DisableGVNLoadPRE); 373d43d5e832f756c9d2c0c8ff4d2f51807a27cab8dChris Lattner 374b374b90e81d0ce6b5d02041ba4f7b15a945b38d8Chris Lattner // Make sure everything is still good. 375d43d5e832f756c9d2c0c8ff4d2f51807a27cab8dChris Lattner passes.add(createVerifierPass()); 376b374b90e81d0ce6b5d02041ba4f7b15a945b38d8Chris Lattner 377b374b90e81d0ce6b5d02041ba4f7b15a945b38d8Chris Lattner FunctionPassManager *codeGenPasses = new FunctionPassManager(mergedModule); 378b374b90e81d0ce6b5d02041ba4f7b15a945b38d8Chris Lattner 379b374b90e81d0ce6b5d02041ba4f7b15a945b38d8Chris Lattner codeGenPasses->add(new TargetData(*_target->getTargetData())); 380c0aa67950ae0f6e9611240d8f0e3ac49dc8195c0David Greene 381199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner formatted_raw_ostream Out(out); 382199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner 383199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner if (_target->addPassesToEmitFile(*codeGenPasses, Out, 384199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner TargetMachine::CGFT_ObjectFile)) { 385199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner errMsg = "target file type not supported"; 386199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner return true; 387199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner } 388199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner 389199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner // Run our queue of passes all at once now, efficiently. 390199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner passes.run(*mergedModule); 391199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner 392199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner // Run the code generator, and write assembly file 393199ba42cbf56b2fc9c708edb4f08f97dd99ddd49Chris Lattner codeGenPasses->doInitialization(); 394135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner 395135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner for (Module::iterator 396135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner it = mergedModule->begin(), e = mergedModule->end(); it != e; ++it) 397135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner if (!it->isDeclaration()) 398135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner codeGenPasses->run(*it); 399135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner 400135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner codeGenPasses->doFinalization(); 401135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner delete codeGenPasses; 402135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner 403135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner return false; // success 404135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner} 405135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner 406135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner/// setCodeGenDebugOptions - Set codegen debugging options to aid in debugging 407135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner/// LTO problems. 408237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattnervoid LTOCodeGenerator::setCodeGenDebugOptions(const char *options) { 409135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner for (std::pair<StringRef, StringRef> o = getToken(options); 410135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner !o.first.empty(); o = getToken(o.second)) { 411135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner // ParseCommandLineOptions() expects argv[0] to be program name. Lazily add 412135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner // that. 413135755dae4c3fa8003b76150689d5064aa4612eeChris Lattner if (_codegenOptions.empty()) 414befa499d45ffcc32bd9902518aec18589464e47cChris Lattner _codegenOptions.push_back(strdup("libLTO")); 415237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner _codegenOptions.push_back(strdup(o.first.str().c_str())); 416775cbdd51a3b33dd5eb343689f65ab5cc8ac7118Chris Lattner } 417237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner} 418d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke