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