lto.cpp revision 6948897e478cbd66626159776a8017b3c18579b9
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 766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarnamespace { 776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// This derived class owns the native object file. This helps implement the 796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// libLTO API semantics, which require that the code generator owns the object 806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// file. 816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstruct LibLTOCodeGenerator : LTOCodeGenerator { 826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar LibLTOCodeGenerator() {} 836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar LibLTOCodeGenerator(std::unique_ptr<LLVMContext> Context) 846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar : LTOCodeGenerator(std::move(Context)) {} 856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::unique_ptr<MemoryBuffer> NativeObjectFile; 876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarDEFINE_SIMPLE_CONVERSION_FUNCTIONS(LibLTOCodeGenerator, lto_code_gen_t) 92dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesDEFINE_SIMPLE_CONVERSION_FUNCTIONS(LTOModule, lto_module_t) 93dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 94dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// Convert the subtarget features into a string to pass to LTOCodeGenerator. 95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic void lto_add_attrs(lto_code_gen_t cg) { 96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines LTOCodeGenerator *CG = unwrap(cg); 97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (MAttrs.size()) { 98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::string attrs; 99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines for (unsigned i = 0; i < MAttrs.size(); ++i) { 100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (i > 0) 101dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines attrs.append(","); 102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines attrs.append(MAttrs[i]); 103dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 104dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 105dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines CG->setAttr(attrs.c_str()); 106dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 1074c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 1084c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar if (OptLevel < '0' || OptLevel > '3') 1094c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar report_fatal_error("Optimization level must be between 0 and 3"); 1104c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar CG->setOptLevel(OptLevel - '0'); 111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 112dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 1138fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingextern const char* lto_get_version() { 1148fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling return LTOCodeGenerator::getVersionString(); 11577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 11677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 1178fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingconst char* lto_get_error_message() { 1188fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling return sLastErrorString.c_str(); 11977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 12077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 12107d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_module_is_object_file(const char* path) { 1228fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling return LTOModule::isBitcodeFile(path); 12377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 12477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 12507d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_module_is_object_file_for_target(const char* path, 1268fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling const char* target_triplet_prefix) { 127c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines ErrorOr<std::unique_ptr<MemoryBuffer>> Buffer = MemoryBuffer::getFile(path); 128c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (!Buffer) 129c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return false; 130c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return LTOModule::isBitcodeForTarget(Buffer->get(), target_triplet_prefix); 13177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 13277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 13307d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_module_is_object_file_in_memory(const void* mem, size_t length) { 1348fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling return LTOModule::isBitcodeFile(mem, length); 13577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 13677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 13707d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool 1388fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlinglto_module_is_object_file_in_memory_for_target(const void* mem, 1398fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling size_t length, 1408fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling const char* target_triplet_prefix) { 141c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::unique_ptr<MemoryBuffer> buffer(LTOModule::makeBuffer(mem, length)); 142c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (!buffer) 143c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return false; 144c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return LTOModule::isBitcodeForTarget(buffer.get(), target_triplet_prefix); 14577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 14677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 1478fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlinglto_module_t lto_module_create(const char* path) { 148cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne lto_initialize(); 14936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 150c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return wrap(LTOModule::createFromFile(path, Options, sLastErrorString)); 15177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 15277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 1538fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlinglto_module_t lto_module_create_from_fd(int fd, const char *path, size_t size) { 154cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne lto_initialize(); 15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 156dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return wrap( 157c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines LTOModule::createFromOpenFile(fd, path, size, Options, sLastErrorString)); 158b4cc031a3e1306fea74c9211d50c5cde6d9a8cd5Rafael Espindola} 15977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 160f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindolalto_module_t lto_module_create_from_fd_at_offset(int fd, const char *path, 161f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola size_t file_size, 162f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola size_t map_size, 1638fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling off_t offset) { 164cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne lto_initialize(); 16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 166c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return wrap(LTOModule::createFromOpenFileSlice(fd, path, map_size, offset, 167c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Options, sLastErrorString)); 168f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola} 169f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola 1708fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlinglto_module_t lto_module_create_from_memory(const void* mem, size_t length) { 171cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne lto_initialize(); 17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 173c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return wrap(LTOModule::createFromBuffer(mem, length, Options, sLastErrorString)); 17477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 17577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 17636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hineslto_module_t lto_module_create_from_memory_with_path(const void* mem, 17736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines size_t length, 17836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const char *path) { 17936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines lto_initialize(); 18036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 181dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return wrap( 182c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines LTOModule::createFromBuffer(mem, length, Options, sLastErrorString, path)); 18336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 18436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 18537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hineslto_module_t lto_module_create_in_local_context(const void *mem, size_t length, 18637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const char *path) { 18737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines lto_initialize(); 18837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 18937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return wrap(LTOModule::createInLocalContext(mem, length, Options, 19037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines sLastErrorString, path)); 19137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 19237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 19337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hineslto_module_t lto_module_create_in_codegen_context(const void *mem, 19437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines size_t length, 19537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const char *path, 19637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines lto_code_gen_t cg) { 19737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines lto_initialize(); 19837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 19937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return wrap(LTOModule::createInContext(mem, length, Options, sLastErrorString, 20037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines path, &unwrap(cg)->getContext())); 20137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 20237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 203dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid lto_module_dispose(lto_module_t mod) { delete unwrap(mod); } 20477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 2058fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingconst char* lto_module_get_target_triple(lto_module_t mod) { 206c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return unwrap(mod)->getTargetTriple().c_str(); 20777595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 20877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 2098fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingvoid lto_module_set_target_triple(lto_module_t mod, const char *triple) { 210dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->setTargetTriple(triple); 211cbb170d057aa6692b19f577b1e09a6c1c7a26969Rafael Espindola} 212cbb170d057aa6692b19f577b1e09a6c1c7a26969Rafael Espindola 2138fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingunsigned int lto_module_get_num_symbols(lto_module_t mod) { 214dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getSymbolCount(); 21577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 21677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 2178fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingconst char* lto_module_get_symbol_name(lto_module_t mod, unsigned int index) { 218dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getSymbolName(index); 21977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 22077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 2218fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlinglto_symbol_attributes lto_module_get_symbol_attribute(lto_module_t mod, 2228fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling unsigned int index) { 223dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getSymbolAttributes(index); 22477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 22577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesunsigned int lto_module_get_num_deplibs(lto_module_t mod) { 227dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getDependentLibraryCount(); 22836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 22936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst char* lto_module_get_deplib(lto_module_t mod, unsigned int index) { 231dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getDependentLibrary(index); 23236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 23336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 23436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesunsigned int lto_module_get_num_linkeropts(lto_module_t mod) { 235dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getLinkerOptCount(); 23636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 23736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 23836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst char* lto_module_get_linkeropt(lto_module_t mod, unsigned int index) { 239dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getLinkerOpt(index); 24036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 24136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 24236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid lto_codegen_set_diagnostic_handler(lto_code_gen_t cg, 24336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines lto_diagnostic_handler_t diag_handler, 24436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void *ctxt) { 245dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->setDiagnosticHandler(diag_handler, ctxt); 24636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 24736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 248ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstatic lto_code_gen_t createCodeGen(bool InLocalContext) { 249cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne lto_initialize(); 250c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola 25136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 252c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola 2536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar LibLTOCodeGenerator *CodeGen = 2546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar InLocalContext ? new LibLTOCodeGenerator(make_unique<LLVMContext>()) 2556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar : new LibLTOCodeGenerator(); 2566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar CodeGen->setTargetOptions(Options); 257dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return wrap(CodeGen); 25877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 25977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 260ebe69fe11e48d322045d5949c83283927a0d790bStephen Hineslto_code_gen_t lto_codegen_create(void) { 261ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return createCodeGen(/* InLocalContext */ false); 262ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 263ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 264ebe69fe11e48d322045d5949c83283927a0d790bStephen Hineslto_code_gen_t lto_codegen_create_in_local_context(void) { 265ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return createCodeGen(/* InLocalContext */ true); 266ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 267ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 268dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid lto_codegen_dispose(lto_code_gen_t cg) { delete unwrap(cg); } 26977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 27007d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_codegen_add_module(lto_code_gen_t cg, lto_module_t mod) { 27137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return !unwrap(cg)->addModule(unwrap(mod)); 27277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 27377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 274ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesvoid lto_codegen_set_module(lto_code_gen_t cg, lto_module_t mod) { 275ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines unwrap(cg)->setModule(unwrap(mod)); 276ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 277ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 27807d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_codegen_set_debug_model(lto_code_gen_t cg, lto_debug_model debug) { 279dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->setDebugInfo(debug); 280235089bdaefabcef9e9cde28eb3b0d8937b12a0dShuxin Yang return false; 28177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 28277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 28307d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_codegen_set_pic_model(lto_code_gen_t cg, lto_codegen_model model) { 284dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->setCodePICModel(model); 285235089bdaefabcef9e9cde28eb3b0d8937b12a0dShuxin Yang return false; 28677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 28777595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 288168f1428346f3d51304db0be64e1d5e4a09ca4c2Bill Wendlingvoid lto_codegen_set_cpu(lto_code_gen_t cg, const char *cpu) { 289dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(cg)->setCpu(cpu); 290dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 291dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2928fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingvoid lto_codegen_set_assembler_path(lto_code_gen_t cg, const char *path) { 293e9efea1194691580c74520aad48887d95fd0ce1bRafael Espindola // In here only for backwards compatibility. We use MC now. 294cbad58624090933cb8fb85587e03be613a481309Nick Kledzik} 295cbad58624090933cb8fb85587e03be613a481309Nick Kledzik 296168f1428346f3d51304db0be64e1d5e4a09ca4c2Bill Wendlingvoid lto_codegen_set_assembler_args(lto_code_gen_t cg, const char **args, 2978fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling int nargs) { 298e9efea1194691580c74520aad48887d95fd0ce1bRafael Espindola // In here only for backwards compatibility. We use MC now. 29998197e55c10176c3ef9100f7d852abbd2347225fRafael Espindola} 30098197e55c10176c3ef9100f7d852abbd2347225fRafael Espindola 3018fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingvoid lto_codegen_add_must_preserve_symbol(lto_code_gen_t cg, 302168f1428346f3d51304db0be64e1d5e4a09ca4c2Bill Wendling const char *symbol) { 303dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->addMustPreserveSymbol(symbol); 30477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 30577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 3064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstatic void maybeParseOptions(lto_code_gen_t cg) { 3070e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola if (!parsedOptions) { 308dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->parseCodeGenDebugOptions(); 309dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines lto_add_attrs(cg); 3100e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola parsedOptions = true; 3110e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola } 3124c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar} 3134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 3144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarbool lto_codegen_write_merged_modules(lto_code_gen_t cg, const char *path) { 3154c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar maybeParseOptions(cg); 316dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return !unwrap(cg)->writeMergedModules(path, sLastErrorString); 31777595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 31877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 319168f1428346f3d51304db0be64e1d5e4a09ca4c2Bill Wendlingconst void *lto_codegen_compile(lto_code_gen_t cg, size_t *length) { 3204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar maybeParseOptions(cg); 3216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar LibLTOCodeGenerator *CG = unwrap(cg); 3226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar CG->NativeObjectFile = CG->compile(DisableInline, DisableGVNLoadPRE, 3236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar DisableLTOVectorization, sLastErrorString); 3246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!CG->NativeObjectFile) 3256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 3266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar *length = CG->NativeObjectFile->getBufferSize(); 3276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return CG->NativeObjectFile->getBufferStart(); 32877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 32977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 330ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool lto_codegen_optimize(lto_code_gen_t cg) { 3314c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar maybeParseOptions(cg); 3324c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar return !unwrap(cg)->optimize(DisableInline, 333ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines DisableGVNLoadPRE, DisableLTOVectorization, 334ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines sLastErrorString); 335ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 336ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 337ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesconst void *lto_codegen_compile_optimized(lto_code_gen_t cg, size_t *length) { 3384c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar maybeParseOptions(cg); 3396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar LibLTOCodeGenerator *CG = unwrap(cg); 3406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar CG->NativeObjectFile = CG->compileOptimized(sLastErrorString); 3416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!CG->NativeObjectFile) 3426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 3436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar *length = CG->NativeObjectFile->getBufferSize(); 3446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return CG->NativeObjectFile->getBufferStart(); 345ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 346ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 34707d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_codegen_compile_to_file(lto_code_gen_t cg, const char **name) { 3484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar maybeParseOptions(cg); 34937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return !unwrap(cg)->compile_to_file( 3504c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar name, DisableInline, DisableGVNLoadPRE, 35137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines DisableLTOVectorization, sLastErrorString); 3526421a8815e14189121a5e20731fd005ea08793e1Rafael Espindola} 3536421a8815e14189121a5e20731fd005ea08793e1Rafael Espindola 354168f1428346f3d51304db0be64e1d5e4a09ca4c2Bill Wendlingvoid lto_codegen_debug_options(lto_code_gen_t cg, const char *opt) { 355dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->setCodeGenDebugOptions(opt); 356d44d4bf04b69fa7b003a0792a78ab132e40fe76fDuncan Sands} 357ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 358ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesunsigned int lto_api_version() { return LTO_API_VERSION; } 3596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 3606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid lto_codegen_set_should_internalize(lto_code_gen_t cg, 3616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool ShouldInternalize) { 3626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar unwrap(cg)->setShouldInternalize(ShouldInternalize); 3636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 3646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 3656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid lto_codegen_set_should_embed_uselists(lto_code_gen_t cg, 3666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar lto_bool_t ShouldEmbedUselists) { 3676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar unwrap(cg)->setShouldEmbedUselists(ShouldEmbedUselists); 3686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar} 369