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