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