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