lto.cpp revision c6a4f5e819217e1e12c458aed8e7b122e23a3a58
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" 16c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola#include "llvm/CodeGen/CommandFlags.h" 17cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne#include "llvm/LTO/LTOCodeGenerator.h" 18cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne#include "llvm/LTO/LTOModule.h" 19c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "llvm/Support/MemoryBuffer.h" 20c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "llvm/Support/TargetSelect.h" 2177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 22c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola// extra command-line flags needed for LTOCodeGenerator 23c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindolastatic cl::opt<bool> 24c13c9e5a9d288eac494a38f0710d34446167f940Rafael EspindolaDisableOpt("disable-opt", cl::init(false), 25c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola cl::desc("Do not run any optimization passes")); 26c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola 27c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindolastatic cl::opt<bool> 28c13c9e5a9d288eac494a38f0710d34446167f940Rafael EspindolaDisableInline("disable-inlining", cl::init(false), 29c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola cl::desc("Do not run the inliner pass")); 30c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola 31c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindolastatic cl::opt<bool> 32c13c9e5a9d288eac494a38f0710d34446167f940Rafael EspindolaDisableGVNLoadPRE("disable-gvn-loadpre", cl::init(false), 33c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola cl::desc("Do not run the GVN load PRE pass")); 3477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 358fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling// Holds most recent error string. 368fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling// *** Not thread safe *** 3777595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzikstatic std::string sLastErrorString; 3877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 39cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne// Holds the initialization state of the LTO module. 40cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne// *** Not thread safe *** 41cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbournestatic bool initialized = false; 42cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne 430e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola// Holds the command-line option parsing state of the LTO module. 440e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindolastatic bool parsedOptions = false; 450e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola 46cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne// Initialize the configured targets if they have not been initialized. 47cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbournestatic void lto_initialize() { 48cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne if (!initialized) { 49c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines InitializeAllTargetInfos(); 50c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines InitializeAllTargets(); 51c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines InitializeAllTargetMCs(); 52c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines InitializeAllAsmParsers(); 53c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines InitializeAllAsmPrinters(); 54c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines InitializeAllDisassemblers(); 55cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne initialized = true; 56cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne } 57cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne} 58cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne 59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesDEFINE_SIMPLE_CONVERSION_FUNCTIONS(LTOCodeGenerator, lto_code_gen_t) 60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesDEFINE_SIMPLE_CONVERSION_FUNCTIONS(LTOModule, lto_module_t) 61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// Convert the subtarget features into a string to pass to LTOCodeGenerator. 63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic void lto_add_attrs(lto_code_gen_t cg) { 64dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines LTOCodeGenerator *CG = unwrap(cg); 65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (MAttrs.size()) { 66dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::string attrs; 67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines for (unsigned i = 0; i < MAttrs.size(); ++i) { 68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (i > 0) 69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines attrs.append(","); 70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines attrs.append(MAttrs[i]); 71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 72dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines CG->setAttr(attrs.c_str()); 74dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 778fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingextern const char* lto_get_version() { 788fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling return LTOCodeGenerator::getVersionString(); 7977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 8077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 818fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingconst char* lto_get_error_message() { 828fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling return sLastErrorString.c_str(); 8377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 8477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 8507d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_module_is_object_file(const char* path) { 868fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling return LTOModule::isBitcodeFile(path); 8777595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 8877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 8907d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_module_is_object_file_for_target(const char* path, 908fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling const char* target_triplet_prefix) { 91c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines ErrorOr<std::unique_ptr<MemoryBuffer>> Buffer = MemoryBuffer::getFile(path); 92c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (!Buffer) 93c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return false; 94c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return LTOModule::isBitcodeForTarget(Buffer->get(), target_triplet_prefix); 9577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 9677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 9707d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_module_is_object_file_in_memory(const void* mem, size_t length) { 988fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling return LTOModule::isBitcodeFile(mem, length); 9977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 10077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 10107d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool 1028fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlinglto_module_is_object_file_in_memory_for_target(const void* mem, 1038fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling size_t length, 1048fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling const char* target_triplet_prefix) { 105c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines std::unique_ptr<MemoryBuffer> buffer(LTOModule::makeBuffer(mem, length)); 106c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (!buffer) 107c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return false; 108c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return LTOModule::isBitcodeForTarget(buffer.get(), target_triplet_prefix); 10977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 11077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 1118fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlinglto_module_t lto_module_create(const char* path) { 112cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne lto_initialize(); 11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 114c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return wrap(LTOModule::createFromFile(path, Options, sLastErrorString)); 11577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 11677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 1178fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlinglto_module_t lto_module_create_from_fd(int fd, const char *path, size_t size) { 118cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne lto_initialize(); 11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return wrap( 121c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines LTOModule::createFromOpenFile(fd, path, size, Options, sLastErrorString)); 122b4cc031a3e1306fea74c9211d50c5cde6d9a8cd5Rafael Espindola} 12377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 124f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindolalto_module_t lto_module_create_from_fd_at_offset(int fd, const char *path, 125f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola size_t file_size, 126f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola size_t map_size, 1278fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling off_t offset) { 128cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne lto_initialize(); 12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 130c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return wrap(LTOModule::createFromOpenFileSlice(fd, path, map_size, offset, 131c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines Options, sLastErrorString)); 132f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola} 133f21b1058a194f411000bdd8000a8b675a7874056Rafael Espindola 1348fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlinglto_module_t lto_module_create_from_memory(const void* mem, size_t length) { 135cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne lto_initialize(); 13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 137c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return wrap(LTOModule::createFromBuffer(mem, length, Options, sLastErrorString)); 13877595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 13977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hineslto_module_t lto_module_create_from_memory_with_path(const void* mem, 14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines size_t length, 14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const char *path) { 14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines lto_initialize(); 14436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 145dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return wrap( 146c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines LTOModule::createFromBuffer(mem, length, Options, sLastErrorString, path)); 14736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 14836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 149dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid lto_module_dispose(lto_module_t mod) { delete unwrap(mod); } 15077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 1518fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingconst char* lto_module_get_target_triple(lto_module_t mod) { 152c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return unwrap(mod)->getTargetTriple().c_str(); 15377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 15477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 1558fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingvoid lto_module_set_target_triple(lto_module_t mod, const char *triple) { 156dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->setTargetTriple(triple); 157cbb170d057aa6692b19f577b1e09a6c1c7a26969Rafael Espindola} 158cbb170d057aa6692b19f577b1e09a6c1c7a26969Rafael Espindola 1598fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingunsigned int lto_module_get_num_symbols(lto_module_t mod) { 160dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getSymbolCount(); 16177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 16277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 1638fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingconst char* lto_module_get_symbol_name(lto_module_t mod, unsigned int index) { 164dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getSymbolName(index); 16577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 16677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 1678fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlinglto_symbol_attributes lto_module_get_symbol_attribute(lto_module_t mod, 1688fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling unsigned int index) { 169dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getSymbolAttributes(index); 17077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 17177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesunsigned int lto_module_get_num_deplibs(lto_module_t mod) { 173dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getDependentLibraryCount(); 17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 17536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 17636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst char* lto_module_get_deplib(lto_module_t mod, unsigned int index) { 177dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getDependentLibrary(index); 17836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 17936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 18036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesunsigned int lto_module_get_num_linkeropts(lto_module_t mod) { 181dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getLinkerOptCount(); 18236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 18336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 18436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst char* lto_module_get_linkeropt(lto_module_t mod, unsigned int index) { 185dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(mod)->getLinkerOpt(index); 18636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 18736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 18836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid lto_codegen_set_diagnostic_handler(lto_code_gen_t cg, 18936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines lto_diagnostic_handler_t diag_handler, 19036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void *ctxt) { 191dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->setDiagnosticHandler(diag_handler, ctxt); 19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 19336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1948fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlinglto_code_gen_t lto_codegen_create(void) { 195cc48854d5d51a2d7557f1040a61f160ad86c9729Peter Collingbourne lto_initialize(); 196c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola 19736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); 198c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola 199c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola LTOCodeGenerator *CodeGen = new LTOCodeGenerator(); 200c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola if (CodeGen) 201c13c9e5a9d288eac494a38f0710d34446167f940Rafael Espindola CodeGen->setTargetOptions(Options); 202dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return wrap(CodeGen); 20377595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 20477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 205dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid lto_codegen_dispose(lto_code_gen_t cg) { delete unwrap(cg); } 20677595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 20707d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_codegen_add_module(lto_code_gen_t cg, lto_module_t mod) { 208dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return !unwrap(cg)->addModule(unwrap(mod), sLastErrorString); 20977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 21077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 21107d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_codegen_set_debug_model(lto_code_gen_t cg, lto_debug_model debug) { 212dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->setDebugInfo(debug); 213235089bdaefabcef9e9cde28eb3b0d8937b12a0dShuxin Yang return false; 21477595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 21577595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 21607d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_codegen_set_pic_model(lto_code_gen_t cg, lto_codegen_model model) { 217dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->setCodePICModel(model); 218235089bdaefabcef9e9cde28eb3b0d8937b12a0dShuxin Yang return false; 21977595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 22077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 221168f1428346f3d51304db0be64e1d5e4a09ca4c2Bill Wendlingvoid lto_codegen_set_cpu(lto_code_gen_t cg, const char *cpu) { 222dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(cg)->setCpu(cpu); 223dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 224dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 225dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid lto_codegen_set_attr(lto_code_gen_t cg, const char *attr) { 226dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(cg)->setAttr(attr); 2272d643ef32891859ec73b6eea2959748f5ebc3af7Rafael Espindola} 2282d643ef32891859ec73b6eea2959748f5ebc3af7Rafael Espindola 2298fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingvoid lto_codegen_set_assembler_path(lto_code_gen_t cg, const char *path) { 230e9efea1194691580c74520aad48887d95fd0ce1bRafael Espindola // In here only for backwards compatibility. We use MC now. 231cbad58624090933cb8fb85587e03be613a481309Nick Kledzik} 232cbad58624090933cb8fb85587e03be613a481309Nick Kledzik 233168f1428346f3d51304db0be64e1d5e4a09ca4c2Bill Wendlingvoid lto_codegen_set_assembler_args(lto_code_gen_t cg, const char **args, 2348fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendling int nargs) { 235e9efea1194691580c74520aad48887d95fd0ce1bRafael Espindola // In here only for backwards compatibility. We use MC now. 23698197e55c10176c3ef9100f7d852abbd2347225fRafael Espindola} 23798197e55c10176c3ef9100f7d852abbd2347225fRafael Espindola 2388fd3fcdba8be962aad1ed48bedbfddffc238c657Bill Wendlingvoid lto_codegen_add_must_preserve_symbol(lto_code_gen_t cg, 239168f1428346f3d51304db0be64e1d5e4a09ca4c2Bill Wendling const char *symbol) { 240dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->addMustPreserveSymbol(symbol); 24177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 24277595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 24307d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_codegen_write_merged_modules(lto_code_gen_t cg, const char *path) { 2440e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola if (!parsedOptions) { 245dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->parseCodeGenDebugOptions(); 246dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines lto_add_attrs(cg); 2470e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola parsedOptions = true; 2480e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola } 249dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return !unwrap(cg)->writeMergedModules(path, sLastErrorString); 25077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 25177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 252168f1428346f3d51304db0be64e1d5e4a09ca4c2Bill Wendlingconst void *lto_codegen_compile(lto_code_gen_t cg, size_t *length) { 2530e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola if (!parsedOptions) { 254dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->parseCodeGenDebugOptions(); 255dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines lto_add_attrs(cg); 2560e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola parsedOptions = true; 2570e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola } 258dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return unwrap(cg)->compile(length, DisableOpt, DisableInline, 259dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DisableGVNLoadPRE, sLastErrorString); 26077595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik} 26177595fc35642f990bfc5ad05b8e68d4056695ecaNick Kledzik 26207d5aef3057b2e403b20d683e7477c93fde67d99Reid Klecknerbool lto_codegen_compile_to_file(lto_code_gen_t cg, const char **name) { 2630e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola if (!parsedOptions) { 264dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->parseCodeGenDebugOptions(); 265dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines lto_add_attrs(cg); 2660e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola parsedOptions = true; 2670e95b3aba9b2039ae3af617e681aacca2ff81f79Rafael Espindola } 268dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return !unwrap(cg)->compile_to_file(name, DisableOpt, DisableInline, 269dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DisableGVNLoadPRE, sLastErrorString); 2706421a8815e14189121a5e20731fd005ea08793e1Rafael Espindola} 2716421a8815e14189121a5e20731fd005ea08793e1Rafael Espindola 272168f1428346f3d51304db0be64e1d5e4a09ca4c2Bill Wendlingvoid lto_codegen_debug_options(lto_code_gen_t cg, const char *opt) { 273dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unwrap(cg)->setCodeGenDebugOptions(opt); 274d44d4bf04b69fa7b003a0792a78ab132e40fe76fDuncan Sands} 275