lto.cpp revision 4c5e43da7792f75567b693105cc53e3f1992ad98
177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik//===-lto.cpp - LLVM Link Time Optimizer ----------------------------------===// 277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// 377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// The LLVM Compiler Infrastructure 477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// 577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// This file is distributed under the University of Illinois Open Source 677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// License. See LICENSE.TXT for details. 78fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling// 877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik//===----------------------------------------------------------------------===// 977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// 108fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling// This file implements the Link Time Optimization library. This library is 1177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// intended to be used by linker to optimize code at link time. 1277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik// 1377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik//===----------------------------------------------------------------------===// 1477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 1577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik#include "llvm-c/lto.h" 164c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/ADT/STLExtras.h" 17c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola#include "llvm/CodeGen/CommandFlags.h" 18ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/LLVMContext.h" 19cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne#include "llvm/LTO/LTOCodeGenerator.h" 20cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne#include "llvm/LTO/LTOModule.h" 21c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "llvm/Support/MemoryBuffer.h" 22ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Support/Signals.h" 23c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "llvm/Support/TargetSelect.h" 2477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 25c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola// extra command-line flags needed for LTOCodeGenerator 264c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstatic cl::opt<char> 274c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga NainarOptLevel("O", 284c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] " 294c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar "(default = '-O2')"), 304c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar cl::Prefix, 314c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar cl::ZeroOrMore, 324c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar cl::init('2')); 33c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola 34c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindolastatic cl::opt<bool> 35c13c9e5a9d288eac494a38f0710d34446167f940Rafael EspindolaDisableInline("disable-inlining", cl::init(false), 36c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola cl::desc("Do not run the inliner pass")); 37c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola 38c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindolastatic cl::opt<bool> 39c13c9e5a9d288eac494a38f0710d34446167f940Rafael EspindolaDisableGVNLoadPRE("disable-gvn-loadpre", cl::init(false), 40c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola cl::desc("Do not run the GVN load PRE pass")); 4177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 4237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstatic cl::opt<bool> 4337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesDisableLTOVectorization("disable-lto-vectorization", cl::init(false), 4437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines cl::desc("Do not run loop or slp vectorization during LTO")); 4537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 468fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling// Holds most recent error string. 478fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling// *** Not thread safe *** 4877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzikstatic std::string sLastErrorString; 4977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 50cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne// Holds the initialization state of the LTO module. 51cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne// *** Not thread safe *** 52cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbournestatic bool initialized = false; 53cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne 540e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola// Holds the command-line option parsing state of the LTO module. 550e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindolastatic bool parsedOptions = false; 560e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola 57cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne// Initialize the configured targets if they have not been initialized. 58cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbournestatic void lto_initialize() { 59cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne if (!initialized) { 60ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#ifdef LLVM_ON_WIN32 61ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // Dialog box on crash disabling doesn't work across DLL boundaries, so do 62ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // it here. 63ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines llvm::sys::DisableSystemDialogsOnCrash(); 64ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#endif 65ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 66c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines InitializeAllTargetInfos(); 67c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines InitializeAllTargets(); 68c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines InitializeAllTargetMCs(); 69c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines InitializeAllAsmParsers(); 70c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines InitializeAllAsmPrinters(); 71c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines InitializeAllDisassemblers(); 72cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne initialized = true; 73cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne } 74cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne} 75cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne 76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesDEFINE_SIMPLE_CONVERSION_FUNCTIONS(LTOCodeGenerator, lto_code_gen_t) 77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesDEFINE_SIMPLE_CONVERSION_FUNCTIONS(LTOModule, lto_module_t) 78dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 79dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// Convert the subtarget features into a string to pass to LTOCodeGenerator. 80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic void lto_add_attrs(lto_code_gen_t cg) { 81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines LTOCodeGenerator *CG = unwrap(cg); 82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (MAttrs.size()) { 83dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::string attrs; 84dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines for (unsigned i = 0; i < MAttrs.size(); ++i) { 85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (i > 0) 86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines attrs.append(","); 87dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines attrs.append(MAttrs[i]); 88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 89dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines CG->setAttr(attrs.c_str()); 91dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 924c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 934c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar if (OptLevel < '0' || OptLevel > '3') 944c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar report_fatal_error("Optimization level must be between 0 and 3"); 954c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar CG->setOptLevel(OptLevel - '0'); 96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 988fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingextern const char* lto_get_version() { 998fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling return LTOCodeGenerator::getVersionString(); 10077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 10177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 1028fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingconst char* lto_get_error_message() { 1038fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling return sLastErrorString.c_str(); 10477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 10577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 10607d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_module_is_object_file(const char* path) { 1078fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling return LTOModule::isBitcodeFile(path); 10877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 10977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 11007d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_module_is_object_file_for_target(const char* path, 1118fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling const char* target_triplet_prefix) { 112c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines ErrorOr<std::unique_ptr<MemoryBuffer>> Buffer = MemoryBuffer::getFile(path); 113c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (!Buffer) 114c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return false; 115c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return LTOModule::isBitcodeForTarget(Buffer->get(), target_triplet_prefix); 11677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 11777595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 11807d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_module_is_object_file_in_memory(const void* mem, size_t length) { 1198fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling return LTOModule::isBitcodeFile(mem, length); 12077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 12177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 12207d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool 1238fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlinglto_module_is_object_file_in_memory_for_target(const void* mem, 1248fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling size_t length, 1258fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling const char* target_triplet_prefix) { 126c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::unique_ptr<MemoryBuffer> buffer(LTOModule::makeBuffer(mem, length)); 127c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (!buffer) 128c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return false; 129c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return LTOModule::isBitcodeForTarget(buffer.get(), target_triplet_prefix); 13077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 13177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 1328fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlinglto_module_t lto_module_create(const char* path) { 133cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne lto_initialize(); 13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 135c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return wrap(LTOModule::createFromFile(path, Options, sLastErrorString)); 13677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 13777595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 1388fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlinglto_module_t lto_module_create_from_fd(int fd, const char *path, size_t size) { 139cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne lto_initialize(); 14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 141dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return wrap( 142c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines LTOModule::createFromOpenFile(fd, path, size, Options, sLastErrorString)); 143b4cc031a3e1306fea74c9211d50c5cde6d9a8cd5Rafael Espindola} 14477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 145f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindolalto_module_t lto_module_create_from_fd_at_offset(int fd, const char *path, 146f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola size_t file_size, 147f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola size_t map_size, 1488fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling off_t offset) { 149cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne lto_initialize(); 15036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 151c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return wrap(LTOModule::createFromOpenFileSlice(fd, path, map_size, offset, 152c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Options, sLastErrorString)); 153f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola} 154f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola 1558fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlinglto_module_t lto_module_create_from_memory(const void* mem, size_t length) { 156cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne lto_initialize(); 15736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 158c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return wrap(LTOModule::createFromBuffer(mem, length, Options, sLastErrorString)); 15977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 16077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 16136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hineslto_module_t lto_module_create_from_memory_with_path(const void* mem, 16236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines size_t length, 16336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const char *path) { 16436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines lto_initialize(); 16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 166dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return wrap( 167c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines LTOModule::createFromBuffer(mem, length, Options, sLastErrorString, path)); 16836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 16936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 17037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hineslto_module_t lto_module_create_in_local_context(const void *mem, size_t length, 17137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const char *path) { 17237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines lto_initialize(); 17337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 17437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return wrap(LTOModule::createInLocalContext(mem, length, Options, 17537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines sLastErrorString, path)); 17637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 17737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 17837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hineslto_module_t lto_module_create_in_codegen_context(const void *mem, 17937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines size_t length, 18037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const char *path, 18137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines lto_code_gen_t cg) { 18237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines lto_initialize(); 18337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 18437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return wrap(LTOModule::createInContext(mem, length, Options, sLastErrorString, 18537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines path, &unwrap(cg)->getContext())); 18637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 18737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 188dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid lto_module_dispose(lto_module_t mod) { delete unwrap(mod); } 18977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 1908fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingconst char* lto_module_get_target_triple(lto_module_t mod) { 191c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return unwrap(mod)->getTargetTriple().c_str(); 19277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 19377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 1948fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingvoid lto_module_set_target_triple(lto_module_t mod, const char *triple) { 195dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->setTargetTriple(triple); 196cbb170d057aa6692b19f577b1e09a6c1c7a26969Rafael Espindola} 197cbb170d057aa6692b19f577b1e09a6c1c7a26969Rafael Espindola 1988fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingunsigned int lto_module_get_num_symbols(lto_module_t mod) { 199dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getSymbolCount(); 20077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 20177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 2028fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingconst char* lto_module_get_symbol_name(lto_module_t mod, unsigned int index) { 203dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getSymbolName(index); 20477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 20577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 2068fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlinglto_symbol_attributes lto_module_get_symbol_attribute(lto_module_t mod, 2078fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling unsigned int index) { 208dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getSymbolAttributes(index); 20977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 21077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 21136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesunsigned int lto_module_get_num_deplibs(lto_module_t mod) { 212dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getDependentLibraryCount(); 21336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 21436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 21536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst char* lto_module_get_deplib(lto_module_t mod, unsigned int index) { 216dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getDependentLibrary(index); 21736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 21836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 21936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesunsigned int lto_module_get_num_linkeropts(lto_module_t mod) { 220dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getLinkerOptCount(); 22136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 22236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 22336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst char* lto_module_get_linkeropt(lto_module_t mod, unsigned int index) { 224dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getLinkerOpt(index); 22536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 22736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid lto_codegen_set_diagnostic_handler(lto_code_gen_t cg, 22836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines lto_diagnostic_handler_t diag_handler, 22936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void *ctxt) { 230dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->setDiagnosticHandler(diag_handler, ctxt); 23136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 23236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 233ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstatic lto_code_gen_t createCodeGen(bool InLocalContext) { 234cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne lto_initialize(); 235c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola 23636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 237c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola 238ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines LTOCodeGenerator *CodeGen = 239ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines InLocalContext ? new LTOCodeGenerator(make_unique<LLVMContext>()) 240ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines : new LTOCodeGenerator(); 241c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola if (CodeGen) 242c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola CodeGen->setTargetOptions(Options); 243dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return wrap(CodeGen); 24477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 24577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 246ebe69fe11e48d322045d5949c83283927a0d790bStephen Hineslto_code_gen_t lto_codegen_create(void) { 247ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return createCodeGen(/* InLocalContext */ false); 248ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 249ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 250ebe69fe11e48d322045d5949c83283927a0d790bStephen Hineslto_code_gen_t lto_codegen_create_in_local_context(void) { 251ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return createCodeGen(/* InLocalContext */ true); 252ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 253ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 254dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid lto_codegen_dispose(lto_code_gen_t cg) { delete unwrap(cg); } 25577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 25607d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_codegen_add_module(lto_code_gen_t cg, lto_module_t mod) { 25737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return !unwrap(cg)->addModule(unwrap(mod)); 25877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 25977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 260ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesvoid lto_codegen_set_module(lto_code_gen_t cg, lto_module_t mod) { 261ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines unwrap(cg)->setModule(unwrap(mod)); 262ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 263ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 26407d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_codegen_set_debug_model(lto_code_gen_t cg, lto_debug_model debug) { 265dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->setDebugInfo(debug); 266235089bdaefabcef9e9cde28eb3b0d8937b12a0dShuxin Yang return false; 26777595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 26877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 26907d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_codegen_set_pic_model(lto_code_gen_t cg, lto_codegen_model model) { 270dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->setCodePICModel(model); 271235089bdaefabcef9e9cde28eb3b0d8937b12a0dShuxin Yang return false; 27277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 27377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 274168f1428346f3d51304db0be64e1d5e4a09ca4c2Bill Wendlingvoid lto_codegen_set_cpu(lto_code_gen_t cg, const char *cpu) { 275dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(cg)->setCpu(cpu); 276dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 277dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2788fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingvoid lto_codegen_set_assembler_path(lto_code_gen_t cg, const char *path) { 279e9efea1194691580c74520aad48887d95fd0ce1bRafael Espindola // In here only for backwards compatibility. We use MC now. 280cbad58624090933cb8fb85587e03be613a481309Nick Kledzik} 281cbad58624090933cb8fb85587e03be613a481309Nick Kledzik 282168f1428346f3d51304db0be64e1d5e4a09ca4c2Bill Wendlingvoid lto_codegen_set_assembler_args(lto_code_gen_t cg, const char **args, 2838fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling int nargs) { 284e9efea1194691580c74520aad48887d95fd0ce1bRafael Espindola // In here only for backwards compatibility. We use MC now. 28598197e55c10176c3ef9100f7d852abbd2347225fRafael Espindola} 28698197e55c10176c3ef9100f7d852abbd2347225fRafael Espindola 2878fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingvoid lto_codegen_add_must_preserve_symbol(lto_code_gen_t cg, 288168f1428346f3d51304db0be64e1d5e4a09ca4c2Bill Wendling const char *symbol) { 289dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->addMustPreserveSymbol(symbol); 29077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 29177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 2924c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstatic void maybeParseOptions(lto_code_gen_t cg) { 2930e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola if (!parsedOptions) { 294dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->parseCodeGenDebugOptions(); 295dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines lto_add_attrs(cg); 2960e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola parsedOptions = true; 2970e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola } 2984c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar} 2994c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 3004c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarbool lto_codegen_write_merged_modules(lto_code_gen_t cg, const char *path) { 3014c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar maybeParseOptions(cg); 302dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return !unwrap(cg)->writeMergedModules(path, sLastErrorString); 30377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 30477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 305168f1428346f3d51304db0be64e1d5e4a09ca4c2Bill Wendlingconst void *lto_codegen_compile(lto_code_gen_t cg, size_t *length) { 3064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar maybeParseOptions(cg); 3074c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar return unwrap(cg)->compile(length, DisableInline, 30837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines DisableGVNLoadPRE, DisableLTOVectorization, 30937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines sLastErrorString); 31077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 31177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 312ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool lto_codegen_optimize(lto_code_gen_t cg) { 3134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar maybeParseOptions(cg); 3144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar return !unwrap(cg)->optimize(DisableInline, 315ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines DisableGVNLoadPRE, DisableLTOVectorization, 316ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines sLastErrorString); 317ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 318ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 319ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesconst void *lto_codegen_compile_optimized(lto_code_gen_t cg, size_t *length) { 3204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar maybeParseOptions(cg); 321ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return unwrap(cg)->compileOptimized(length, sLastErrorString); 322ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 323ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 32407d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_codegen_compile_to_file(lto_code_gen_t cg, const char **name) { 3254c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar maybeParseOptions(cg); 32637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return !unwrap(cg)->compile_to_file( 3274c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar name, DisableInline, DisableGVNLoadPRE, 32837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines DisableLTOVectorization, sLastErrorString); 3296421a8815e14189121a5e20731fd005ea08793e1Rafael Espindola} 3306421a8815e14189121a5e20731fd005ea08793e1Rafael Espindola 331168f1428346f3d51304db0be64e1d5e4a09ca4c2Bill Wendlingvoid lto_codegen_debug_options(lto_code_gen_t cg, const char *opt) { 332dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->setCodeGenDebugOptions(opt); 333d44d4bf04b69fa7b003a0792a78ab132e40fe76fDuncan Sands} 334ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 335ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesunsigned int lto_api_version() { return LTO_API_VERSION; } 336