1*9880d681SAndroid Build Coastguard Worker //===-lto.cpp - LLVM Link Time Optimizer ----------------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file implements the Link Time Optimization library. This library is
11*9880d681SAndroid Build Coastguard Worker // intended to be used by linker to optimize code at link time.
12*9880d681SAndroid Build Coastguard Worker //
13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker #include "llvm-c/lto.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/Bitcode/ReaderWriter.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/CommandFlags.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DiagnosticInfo.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DiagnosticPrinter.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/LTO/legacy/LTOCodeGenerator.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/LTO/legacy/LTOModule.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/LTO/legacy/ThinLTOCodeGenerator.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MemoryBuffer.h"
26*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Signals.h"
27*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetSelect.h"
28*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker // extra command-line flags needed for LTOCodeGenerator
31*9880d681SAndroid Build Coastguard Worker static cl::opt<char>
32*9880d681SAndroid Build Coastguard Worker OptLevel("O",
33*9880d681SAndroid Build Coastguard Worker cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] "
34*9880d681SAndroid Build Coastguard Worker "(default = '-O2')"),
35*9880d681SAndroid Build Coastguard Worker cl::Prefix,
36*9880d681SAndroid Build Coastguard Worker cl::ZeroOrMore,
37*9880d681SAndroid Build Coastguard Worker cl::init('2'));
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
40*9880d681SAndroid Build Coastguard Worker DisableInline("disable-inlining", cl::init(false),
41*9880d681SAndroid Build Coastguard Worker cl::desc("Do not run the inliner pass"));
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
44*9880d681SAndroid Build Coastguard Worker DisableGVNLoadPRE("disable-gvn-loadpre", cl::init(false),
45*9880d681SAndroid Build Coastguard Worker cl::desc("Do not run the GVN load PRE pass"));
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
48*9880d681SAndroid Build Coastguard Worker DisableLTOVectorization("disable-lto-vectorization", cl::init(false),
49*9880d681SAndroid Build Coastguard Worker cl::desc("Do not run loop or slp vectorization during LTO"));
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker #ifdef NDEBUG
52*9880d681SAndroid Build Coastguard Worker static bool VerifyByDefault = false;
53*9880d681SAndroid Build Coastguard Worker #else
54*9880d681SAndroid Build Coastguard Worker static bool VerifyByDefault = true;
55*9880d681SAndroid Build Coastguard Worker #endif
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker static cl::opt<bool> DisableVerify(
58*9880d681SAndroid Build Coastguard Worker "disable-llvm-verifier", cl::init(!VerifyByDefault),
59*9880d681SAndroid Build Coastguard Worker cl::desc("Don't run the LLVM verifier during the optimization pipeline"));
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker // Holds most recent error string.
62*9880d681SAndroid Build Coastguard Worker // *** Not thread safe ***
63*9880d681SAndroid Build Coastguard Worker static std::string sLastErrorString;
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker // Holds the initialization state of the LTO module.
66*9880d681SAndroid Build Coastguard Worker // *** Not thread safe ***
67*9880d681SAndroid Build Coastguard Worker static bool initialized = false;
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker // Holds the command-line option parsing state of the LTO module.
70*9880d681SAndroid Build Coastguard Worker static bool parsedOptions = false;
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker static LLVMContext *LTOContext = nullptr;
73*9880d681SAndroid Build Coastguard Worker
diagnosticHandler(const DiagnosticInfo & DI,void * Context)74*9880d681SAndroid Build Coastguard Worker static void diagnosticHandler(const DiagnosticInfo &DI, void *Context) {
75*9880d681SAndroid Build Coastguard Worker if (DI.getSeverity() != DS_Error) {
76*9880d681SAndroid Build Coastguard Worker DiagnosticPrinterRawOStream DP(errs());
77*9880d681SAndroid Build Coastguard Worker DI.print(DP);
78*9880d681SAndroid Build Coastguard Worker errs() << '\n';
79*9880d681SAndroid Build Coastguard Worker return;
80*9880d681SAndroid Build Coastguard Worker }
81*9880d681SAndroid Build Coastguard Worker sLastErrorString = "";
82*9880d681SAndroid Build Coastguard Worker {
83*9880d681SAndroid Build Coastguard Worker raw_string_ostream Stream(sLastErrorString);
84*9880d681SAndroid Build Coastguard Worker DiagnosticPrinterRawOStream DP(Stream);
85*9880d681SAndroid Build Coastguard Worker DI.print(DP);
86*9880d681SAndroid Build Coastguard Worker }
87*9880d681SAndroid Build Coastguard Worker }
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker // Initialize the configured targets if they have not been initialized.
lto_initialize()90*9880d681SAndroid Build Coastguard Worker static void lto_initialize() {
91*9880d681SAndroid Build Coastguard Worker if (!initialized) {
92*9880d681SAndroid Build Coastguard Worker #ifdef LLVM_ON_WIN32
93*9880d681SAndroid Build Coastguard Worker // Dialog box on crash disabling doesn't work across DLL boundaries, so do
94*9880d681SAndroid Build Coastguard Worker // it here.
95*9880d681SAndroid Build Coastguard Worker llvm::sys::DisableSystemDialogsOnCrash();
96*9880d681SAndroid Build Coastguard Worker #endif
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker InitializeAllTargetInfos();
99*9880d681SAndroid Build Coastguard Worker InitializeAllTargets();
100*9880d681SAndroid Build Coastguard Worker InitializeAllTargetMCs();
101*9880d681SAndroid Build Coastguard Worker InitializeAllAsmParsers();
102*9880d681SAndroid Build Coastguard Worker InitializeAllAsmPrinters();
103*9880d681SAndroid Build Coastguard Worker InitializeAllDisassemblers();
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker static LLVMContext Context;
106*9880d681SAndroid Build Coastguard Worker LTOContext = &Context;
107*9880d681SAndroid Build Coastguard Worker LTOContext->setDiagnosticHandler(diagnosticHandler, nullptr, true);
108*9880d681SAndroid Build Coastguard Worker initialized = true;
109*9880d681SAndroid Build Coastguard Worker }
110*9880d681SAndroid Build Coastguard Worker }
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker namespace {
113*9880d681SAndroid Build Coastguard Worker
handleLibLTODiagnostic(lto_codegen_diagnostic_severity_t Severity,const char * Msg,void *)114*9880d681SAndroid Build Coastguard Worker static void handleLibLTODiagnostic(lto_codegen_diagnostic_severity_t Severity,
115*9880d681SAndroid Build Coastguard Worker const char *Msg, void *) {
116*9880d681SAndroid Build Coastguard Worker sLastErrorString = Msg;
117*9880d681SAndroid Build Coastguard Worker }
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker // This derived class owns the native object file. This helps implement the
120*9880d681SAndroid Build Coastguard Worker // libLTO API semantics, which require that the code generator owns the object
121*9880d681SAndroid Build Coastguard Worker // file.
122*9880d681SAndroid Build Coastguard Worker struct LibLTOCodeGenerator : LTOCodeGenerator {
LibLTOCodeGenerator__anon89b56d0f0111::LibLTOCodeGenerator123*9880d681SAndroid Build Coastguard Worker LibLTOCodeGenerator() : LTOCodeGenerator(*LTOContext) { init(); }
LibLTOCodeGenerator__anon89b56d0f0111::LibLTOCodeGenerator124*9880d681SAndroid Build Coastguard Worker LibLTOCodeGenerator(std::unique_ptr<LLVMContext> Context)
125*9880d681SAndroid Build Coastguard Worker : LTOCodeGenerator(*Context), OwnedContext(std::move(Context)) {
126*9880d681SAndroid Build Coastguard Worker init();
127*9880d681SAndroid Build Coastguard Worker }
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker // Reset the module first in case MergedModule is created in OwnedContext.
130*9880d681SAndroid Build Coastguard Worker // Module must be destructed before its context gets destructed.
~LibLTOCodeGenerator__anon89b56d0f0111::LibLTOCodeGenerator131*9880d681SAndroid Build Coastguard Worker ~LibLTOCodeGenerator() { resetMergedModule(); }
132*9880d681SAndroid Build Coastguard Worker
init__anon89b56d0f0111::LibLTOCodeGenerator133*9880d681SAndroid Build Coastguard Worker void init() { setDiagnosticHandler(handleLibLTODiagnostic, nullptr); }
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MemoryBuffer> NativeObjectFile;
136*9880d681SAndroid Build Coastguard Worker std::unique_ptr<LLVMContext> OwnedContext;
137*9880d681SAndroid Build Coastguard Worker };
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Worker }
140*9880d681SAndroid Build Coastguard Worker
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LibLTOCodeGenerator,lto_code_gen_t)141*9880d681SAndroid Build Coastguard Worker DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LibLTOCodeGenerator, lto_code_gen_t)
142*9880d681SAndroid Build Coastguard Worker DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThinLTOCodeGenerator, thinlto_code_gen_t)
143*9880d681SAndroid Build Coastguard Worker DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LTOModule, lto_module_t)
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker // Convert the subtarget features into a string to pass to LTOCodeGenerator.
146*9880d681SAndroid Build Coastguard Worker static void lto_add_attrs(lto_code_gen_t cg) {
147*9880d681SAndroid Build Coastguard Worker LTOCodeGenerator *CG = unwrap(cg);
148*9880d681SAndroid Build Coastguard Worker if (MAttrs.size()) {
149*9880d681SAndroid Build Coastguard Worker std::string attrs;
150*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < MAttrs.size(); ++i) {
151*9880d681SAndroid Build Coastguard Worker if (i > 0)
152*9880d681SAndroid Build Coastguard Worker attrs.append(",");
153*9880d681SAndroid Build Coastguard Worker attrs.append(MAttrs[i]);
154*9880d681SAndroid Build Coastguard Worker }
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker CG->setAttr(attrs.c_str());
157*9880d681SAndroid Build Coastguard Worker }
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Worker if (OptLevel < '0' || OptLevel > '3')
160*9880d681SAndroid Build Coastguard Worker report_fatal_error("Optimization level must be between 0 and 3");
161*9880d681SAndroid Build Coastguard Worker CG->setOptLevel(OptLevel - '0');
162*9880d681SAndroid Build Coastguard Worker }
163*9880d681SAndroid Build Coastguard Worker
lto_get_version()164*9880d681SAndroid Build Coastguard Worker extern const char* lto_get_version() {
165*9880d681SAndroid Build Coastguard Worker return LTOCodeGenerator::getVersionString();
166*9880d681SAndroid Build Coastguard Worker }
167*9880d681SAndroid Build Coastguard Worker
lto_get_error_message()168*9880d681SAndroid Build Coastguard Worker const char* lto_get_error_message() {
169*9880d681SAndroid Build Coastguard Worker return sLastErrorString.c_str();
170*9880d681SAndroid Build Coastguard Worker }
171*9880d681SAndroid Build Coastguard Worker
lto_module_is_object_file(const char * path)172*9880d681SAndroid Build Coastguard Worker bool lto_module_is_object_file(const char* path) {
173*9880d681SAndroid Build Coastguard Worker return LTOModule::isBitcodeFile(path);
174*9880d681SAndroid Build Coastguard Worker }
175*9880d681SAndroid Build Coastguard Worker
lto_module_is_object_file_for_target(const char * path,const char * target_triplet_prefix)176*9880d681SAndroid Build Coastguard Worker bool lto_module_is_object_file_for_target(const char* path,
177*9880d681SAndroid Build Coastguard Worker const char* target_triplet_prefix) {
178*9880d681SAndroid Build Coastguard Worker ErrorOr<std::unique_ptr<MemoryBuffer>> Buffer = MemoryBuffer::getFile(path);
179*9880d681SAndroid Build Coastguard Worker if (!Buffer)
180*9880d681SAndroid Build Coastguard Worker return false;
181*9880d681SAndroid Build Coastguard Worker return LTOModule::isBitcodeForTarget(Buffer->get(), target_triplet_prefix);
182*9880d681SAndroid Build Coastguard Worker }
183*9880d681SAndroid Build Coastguard Worker
lto_module_has_objc_category(const void * mem,size_t length)184*9880d681SAndroid Build Coastguard Worker bool lto_module_has_objc_category(const void *mem, size_t length) {
185*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MemoryBuffer> Buffer(LTOModule::makeBuffer(mem, length));
186*9880d681SAndroid Build Coastguard Worker if (!Buffer)
187*9880d681SAndroid Build Coastguard Worker return false;
188*9880d681SAndroid Build Coastguard Worker LLVMContext Ctx;
189*9880d681SAndroid Build Coastguard Worker return llvm::isBitcodeContainingObjCCategory(*Buffer, Ctx);
190*9880d681SAndroid Build Coastguard Worker }
191*9880d681SAndroid Build Coastguard Worker
lto_module_is_object_file_in_memory(const void * mem,size_t length)192*9880d681SAndroid Build Coastguard Worker bool lto_module_is_object_file_in_memory(const void* mem, size_t length) {
193*9880d681SAndroid Build Coastguard Worker return LTOModule::isBitcodeFile(mem, length);
194*9880d681SAndroid Build Coastguard Worker }
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Worker bool
lto_module_is_object_file_in_memory_for_target(const void * mem,size_t length,const char * target_triplet_prefix)197*9880d681SAndroid Build Coastguard Worker lto_module_is_object_file_in_memory_for_target(const void* mem,
198*9880d681SAndroid Build Coastguard Worker size_t length,
199*9880d681SAndroid Build Coastguard Worker const char* target_triplet_prefix) {
200*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MemoryBuffer> buffer(LTOModule::makeBuffer(mem, length));
201*9880d681SAndroid Build Coastguard Worker if (!buffer)
202*9880d681SAndroid Build Coastguard Worker return false;
203*9880d681SAndroid Build Coastguard Worker return LTOModule::isBitcodeForTarget(buffer.get(), target_triplet_prefix);
204*9880d681SAndroid Build Coastguard Worker }
205*9880d681SAndroid Build Coastguard Worker
lto_module_create(const char * path)206*9880d681SAndroid Build Coastguard Worker lto_module_t lto_module_create(const char* path) {
207*9880d681SAndroid Build Coastguard Worker lto_initialize();
208*9880d681SAndroid Build Coastguard Worker llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
209*9880d681SAndroid Build Coastguard Worker ErrorOr<std::unique_ptr<LTOModule>> M =
210*9880d681SAndroid Build Coastguard Worker LTOModule::createFromFile(*LTOContext, path, Options);
211*9880d681SAndroid Build Coastguard Worker if (!M)
212*9880d681SAndroid Build Coastguard Worker return nullptr;
213*9880d681SAndroid Build Coastguard Worker return wrap(M->release());
214*9880d681SAndroid Build Coastguard Worker }
215*9880d681SAndroid Build Coastguard Worker
lto_module_create_from_fd(int fd,const char * path,size_t size)216*9880d681SAndroid Build Coastguard Worker lto_module_t lto_module_create_from_fd(int fd, const char *path, size_t size) {
217*9880d681SAndroid Build Coastguard Worker lto_initialize();
218*9880d681SAndroid Build Coastguard Worker llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
219*9880d681SAndroid Build Coastguard Worker ErrorOr<std::unique_ptr<LTOModule>> M =
220*9880d681SAndroid Build Coastguard Worker LTOModule::createFromOpenFile(*LTOContext, fd, path, size, Options);
221*9880d681SAndroid Build Coastguard Worker if (!M)
222*9880d681SAndroid Build Coastguard Worker return nullptr;
223*9880d681SAndroid Build Coastguard Worker return wrap(M->release());
224*9880d681SAndroid Build Coastguard Worker }
225*9880d681SAndroid Build Coastguard Worker
lto_module_create_from_fd_at_offset(int fd,const char * path,size_t file_size,size_t map_size,off_t offset)226*9880d681SAndroid Build Coastguard Worker lto_module_t lto_module_create_from_fd_at_offset(int fd, const char *path,
227*9880d681SAndroid Build Coastguard Worker size_t file_size,
228*9880d681SAndroid Build Coastguard Worker size_t map_size,
229*9880d681SAndroid Build Coastguard Worker off_t offset) {
230*9880d681SAndroid Build Coastguard Worker lto_initialize();
231*9880d681SAndroid Build Coastguard Worker llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
232*9880d681SAndroid Build Coastguard Worker ErrorOr<std::unique_ptr<LTOModule>> M = LTOModule::createFromOpenFileSlice(
233*9880d681SAndroid Build Coastguard Worker *LTOContext, fd, path, map_size, offset, Options);
234*9880d681SAndroid Build Coastguard Worker if (!M)
235*9880d681SAndroid Build Coastguard Worker return nullptr;
236*9880d681SAndroid Build Coastguard Worker return wrap(M->release());
237*9880d681SAndroid Build Coastguard Worker }
238*9880d681SAndroid Build Coastguard Worker
lto_module_create_from_memory(const void * mem,size_t length)239*9880d681SAndroid Build Coastguard Worker lto_module_t lto_module_create_from_memory(const void* mem, size_t length) {
240*9880d681SAndroid Build Coastguard Worker lto_initialize();
241*9880d681SAndroid Build Coastguard Worker llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
242*9880d681SAndroid Build Coastguard Worker ErrorOr<std::unique_ptr<LTOModule>> M =
243*9880d681SAndroid Build Coastguard Worker LTOModule::createFromBuffer(*LTOContext, mem, length, Options);
244*9880d681SAndroid Build Coastguard Worker if (!M)
245*9880d681SAndroid Build Coastguard Worker return nullptr;
246*9880d681SAndroid Build Coastguard Worker return wrap(M->release());
247*9880d681SAndroid Build Coastguard Worker }
248*9880d681SAndroid Build Coastguard Worker
lto_module_create_from_memory_with_path(const void * mem,size_t length,const char * path)249*9880d681SAndroid Build Coastguard Worker lto_module_t lto_module_create_from_memory_with_path(const void* mem,
250*9880d681SAndroid Build Coastguard Worker size_t length,
251*9880d681SAndroid Build Coastguard Worker const char *path) {
252*9880d681SAndroid Build Coastguard Worker lto_initialize();
253*9880d681SAndroid Build Coastguard Worker llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
254*9880d681SAndroid Build Coastguard Worker ErrorOr<std::unique_ptr<LTOModule>> M =
255*9880d681SAndroid Build Coastguard Worker LTOModule::createFromBuffer(*LTOContext, mem, length, Options, path);
256*9880d681SAndroid Build Coastguard Worker if (!M)
257*9880d681SAndroid Build Coastguard Worker return nullptr;
258*9880d681SAndroid Build Coastguard Worker return wrap(M->release());
259*9880d681SAndroid Build Coastguard Worker }
260*9880d681SAndroid Build Coastguard Worker
lto_module_create_in_local_context(const void * mem,size_t length,const char * path)261*9880d681SAndroid Build Coastguard Worker lto_module_t lto_module_create_in_local_context(const void *mem, size_t length,
262*9880d681SAndroid Build Coastguard Worker const char *path) {
263*9880d681SAndroid Build Coastguard Worker lto_initialize();
264*9880d681SAndroid Build Coastguard Worker llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Worker // Create a local context. Ownership will be transfered to LTOModule.
267*9880d681SAndroid Build Coastguard Worker std::unique_ptr<LLVMContext> Context = llvm::make_unique<LLVMContext>();
268*9880d681SAndroid Build Coastguard Worker Context->setDiagnosticHandler(diagnosticHandler, nullptr, true);
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Worker ErrorOr<std::unique_ptr<LTOModule>> M =
271*9880d681SAndroid Build Coastguard Worker LTOModule::createInLocalContext(std::move(Context), mem, length, Options,
272*9880d681SAndroid Build Coastguard Worker path);
273*9880d681SAndroid Build Coastguard Worker if (!M)
274*9880d681SAndroid Build Coastguard Worker return nullptr;
275*9880d681SAndroid Build Coastguard Worker return wrap(M->release());
276*9880d681SAndroid Build Coastguard Worker }
277*9880d681SAndroid Build Coastguard Worker
lto_module_create_in_codegen_context(const void * mem,size_t length,const char * path,lto_code_gen_t cg)278*9880d681SAndroid Build Coastguard Worker lto_module_t lto_module_create_in_codegen_context(const void *mem,
279*9880d681SAndroid Build Coastguard Worker size_t length,
280*9880d681SAndroid Build Coastguard Worker const char *path,
281*9880d681SAndroid Build Coastguard Worker lto_code_gen_t cg) {
282*9880d681SAndroid Build Coastguard Worker lto_initialize();
283*9880d681SAndroid Build Coastguard Worker llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
284*9880d681SAndroid Build Coastguard Worker ErrorOr<std::unique_ptr<LTOModule>> M = LTOModule::createFromBuffer(
285*9880d681SAndroid Build Coastguard Worker unwrap(cg)->getContext(), mem, length, Options, path);
286*9880d681SAndroid Build Coastguard Worker return wrap(M->release());
287*9880d681SAndroid Build Coastguard Worker }
288*9880d681SAndroid Build Coastguard Worker
lto_module_dispose(lto_module_t mod)289*9880d681SAndroid Build Coastguard Worker void lto_module_dispose(lto_module_t mod) { delete unwrap(mod); }
290*9880d681SAndroid Build Coastguard Worker
lto_module_get_target_triple(lto_module_t mod)291*9880d681SAndroid Build Coastguard Worker const char* lto_module_get_target_triple(lto_module_t mod) {
292*9880d681SAndroid Build Coastguard Worker return unwrap(mod)->getTargetTriple().c_str();
293*9880d681SAndroid Build Coastguard Worker }
294*9880d681SAndroid Build Coastguard Worker
lto_module_set_target_triple(lto_module_t mod,const char * triple)295*9880d681SAndroid Build Coastguard Worker void lto_module_set_target_triple(lto_module_t mod, const char *triple) {
296*9880d681SAndroid Build Coastguard Worker return unwrap(mod)->setTargetTriple(triple);
297*9880d681SAndroid Build Coastguard Worker }
298*9880d681SAndroid Build Coastguard Worker
lto_module_get_num_symbols(lto_module_t mod)299*9880d681SAndroid Build Coastguard Worker unsigned int lto_module_get_num_symbols(lto_module_t mod) {
300*9880d681SAndroid Build Coastguard Worker return unwrap(mod)->getSymbolCount();
301*9880d681SAndroid Build Coastguard Worker }
302*9880d681SAndroid Build Coastguard Worker
lto_module_get_symbol_name(lto_module_t mod,unsigned int index)303*9880d681SAndroid Build Coastguard Worker const char* lto_module_get_symbol_name(lto_module_t mod, unsigned int index) {
304*9880d681SAndroid Build Coastguard Worker return unwrap(mod)->getSymbolName(index);
305*9880d681SAndroid Build Coastguard Worker }
306*9880d681SAndroid Build Coastguard Worker
lto_module_get_symbol_attribute(lto_module_t mod,unsigned int index)307*9880d681SAndroid Build Coastguard Worker lto_symbol_attributes lto_module_get_symbol_attribute(lto_module_t mod,
308*9880d681SAndroid Build Coastguard Worker unsigned int index) {
309*9880d681SAndroid Build Coastguard Worker return unwrap(mod)->getSymbolAttributes(index);
310*9880d681SAndroid Build Coastguard Worker }
311*9880d681SAndroid Build Coastguard Worker
lto_module_get_linkeropts(lto_module_t mod)312*9880d681SAndroid Build Coastguard Worker const char* lto_module_get_linkeropts(lto_module_t mod) {
313*9880d681SAndroid Build Coastguard Worker return unwrap(mod)->getLinkerOpts();
314*9880d681SAndroid Build Coastguard Worker }
315*9880d681SAndroid Build Coastguard Worker
lto_codegen_set_diagnostic_handler(lto_code_gen_t cg,lto_diagnostic_handler_t diag_handler,void * ctxt)316*9880d681SAndroid Build Coastguard Worker void lto_codegen_set_diagnostic_handler(lto_code_gen_t cg,
317*9880d681SAndroid Build Coastguard Worker lto_diagnostic_handler_t diag_handler,
318*9880d681SAndroid Build Coastguard Worker void *ctxt) {
319*9880d681SAndroid Build Coastguard Worker unwrap(cg)->setDiagnosticHandler(diag_handler, ctxt);
320*9880d681SAndroid Build Coastguard Worker }
321*9880d681SAndroid Build Coastguard Worker
createCodeGen(bool InLocalContext)322*9880d681SAndroid Build Coastguard Worker static lto_code_gen_t createCodeGen(bool InLocalContext) {
323*9880d681SAndroid Build Coastguard Worker lto_initialize();
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard Worker TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Worker LibLTOCodeGenerator *CodeGen =
328*9880d681SAndroid Build Coastguard Worker InLocalContext ? new LibLTOCodeGenerator(make_unique<LLVMContext>())
329*9880d681SAndroid Build Coastguard Worker : new LibLTOCodeGenerator();
330*9880d681SAndroid Build Coastguard Worker CodeGen->setTargetOptions(Options);
331*9880d681SAndroid Build Coastguard Worker return wrap(CodeGen);
332*9880d681SAndroid Build Coastguard Worker }
333*9880d681SAndroid Build Coastguard Worker
lto_codegen_create(void)334*9880d681SAndroid Build Coastguard Worker lto_code_gen_t lto_codegen_create(void) {
335*9880d681SAndroid Build Coastguard Worker return createCodeGen(/* InLocalContext */ false);
336*9880d681SAndroid Build Coastguard Worker }
337*9880d681SAndroid Build Coastguard Worker
lto_codegen_create_in_local_context(void)338*9880d681SAndroid Build Coastguard Worker lto_code_gen_t lto_codegen_create_in_local_context(void) {
339*9880d681SAndroid Build Coastguard Worker return createCodeGen(/* InLocalContext */ true);
340*9880d681SAndroid Build Coastguard Worker }
341*9880d681SAndroid Build Coastguard Worker
lto_codegen_dispose(lto_code_gen_t cg)342*9880d681SAndroid Build Coastguard Worker void lto_codegen_dispose(lto_code_gen_t cg) { delete unwrap(cg); }
343*9880d681SAndroid Build Coastguard Worker
lto_codegen_add_module(lto_code_gen_t cg,lto_module_t mod)344*9880d681SAndroid Build Coastguard Worker bool lto_codegen_add_module(lto_code_gen_t cg, lto_module_t mod) {
345*9880d681SAndroid Build Coastguard Worker return !unwrap(cg)->addModule(unwrap(mod));
346*9880d681SAndroid Build Coastguard Worker }
347*9880d681SAndroid Build Coastguard Worker
lto_codegen_set_module(lto_code_gen_t cg,lto_module_t mod)348*9880d681SAndroid Build Coastguard Worker void lto_codegen_set_module(lto_code_gen_t cg, lto_module_t mod) {
349*9880d681SAndroid Build Coastguard Worker unwrap(cg)->setModule(std::unique_ptr<LTOModule>(unwrap(mod)));
350*9880d681SAndroid Build Coastguard Worker }
351*9880d681SAndroid Build Coastguard Worker
lto_codegen_set_debug_model(lto_code_gen_t cg,lto_debug_model debug)352*9880d681SAndroid Build Coastguard Worker bool lto_codegen_set_debug_model(lto_code_gen_t cg, lto_debug_model debug) {
353*9880d681SAndroid Build Coastguard Worker unwrap(cg)->setDebugInfo(debug);
354*9880d681SAndroid Build Coastguard Worker return false;
355*9880d681SAndroid Build Coastguard Worker }
356*9880d681SAndroid Build Coastguard Worker
lto_codegen_set_pic_model(lto_code_gen_t cg,lto_codegen_model model)357*9880d681SAndroid Build Coastguard Worker bool lto_codegen_set_pic_model(lto_code_gen_t cg, lto_codegen_model model) {
358*9880d681SAndroid Build Coastguard Worker switch (model) {
359*9880d681SAndroid Build Coastguard Worker case LTO_CODEGEN_PIC_MODEL_STATIC:
360*9880d681SAndroid Build Coastguard Worker unwrap(cg)->setCodePICModel(Reloc::Static);
361*9880d681SAndroid Build Coastguard Worker return false;
362*9880d681SAndroid Build Coastguard Worker case LTO_CODEGEN_PIC_MODEL_DYNAMIC:
363*9880d681SAndroid Build Coastguard Worker unwrap(cg)->setCodePICModel(Reloc::PIC_);
364*9880d681SAndroid Build Coastguard Worker return false;
365*9880d681SAndroid Build Coastguard Worker case LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC:
366*9880d681SAndroid Build Coastguard Worker unwrap(cg)->setCodePICModel(Reloc::DynamicNoPIC);
367*9880d681SAndroid Build Coastguard Worker return false;
368*9880d681SAndroid Build Coastguard Worker case LTO_CODEGEN_PIC_MODEL_DEFAULT:
369*9880d681SAndroid Build Coastguard Worker unwrap(cg)->setCodePICModel(None);
370*9880d681SAndroid Build Coastguard Worker return false;
371*9880d681SAndroid Build Coastguard Worker }
372*9880d681SAndroid Build Coastguard Worker sLastErrorString = "Unknown PIC model";
373*9880d681SAndroid Build Coastguard Worker return true;
374*9880d681SAndroid Build Coastguard Worker }
375*9880d681SAndroid Build Coastguard Worker
lto_codegen_set_cpu(lto_code_gen_t cg,const char * cpu)376*9880d681SAndroid Build Coastguard Worker void lto_codegen_set_cpu(lto_code_gen_t cg, const char *cpu) {
377*9880d681SAndroid Build Coastguard Worker return unwrap(cg)->setCpu(cpu);
378*9880d681SAndroid Build Coastguard Worker }
379*9880d681SAndroid Build Coastguard Worker
lto_codegen_set_assembler_path(lto_code_gen_t cg,const char * path)380*9880d681SAndroid Build Coastguard Worker void lto_codegen_set_assembler_path(lto_code_gen_t cg, const char *path) {
381*9880d681SAndroid Build Coastguard Worker // In here only for backwards compatibility. We use MC now.
382*9880d681SAndroid Build Coastguard Worker }
383*9880d681SAndroid Build Coastguard Worker
lto_codegen_set_assembler_args(lto_code_gen_t cg,const char ** args,int nargs)384*9880d681SAndroid Build Coastguard Worker void lto_codegen_set_assembler_args(lto_code_gen_t cg, const char **args,
385*9880d681SAndroid Build Coastguard Worker int nargs) {
386*9880d681SAndroid Build Coastguard Worker // In here only for backwards compatibility. We use MC now.
387*9880d681SAndroid Build Coastguard Worker }
388*9880d681SAndroid Build Coastguard Worker
lto_codegen_add_must_preserve_symbol(lto_code_gen_t cg,const char * symbol)389*9880d681SAndroid Build Coastguard Worker void lto_codegen_add_must_preserve_symbol(lto_code_gen_t cg,
390*9880d681SAndroid Build Coastguard Worker const char *symbol) {
391*9880d681SAndroid Build Coastguard Worker unwrap(cg)->addMustPreserveSymbol(symbol);
392*9880d681SAndroid Build Coastguard Worker }
393*9880d681SAndroid Build Coastguard Worker
maybeParseOptions(lto_code_gen_t cg)394*9880d681SAndroid Build Coastguard Worker static void maybeParseOptions(lto_code_gen_t cg) {
395*9880d681SAndroid Build Coastguard Worker if (!parsedOptions) {
396*9880d681SAndroid Build Coastguard Worker unwrap(cg)->parseCodeGenDebugOptions();
397*9880d681SAndroid Build Coastguard Worker lto_add_attrs(cg);
398*9880d681SAndroid Build Coastguard Worker parsedOptions = true;
399*9880d681SAndroid Build Coastguard Worker }
400*9880d681SAndroid Build Coastguard Worker }
401*9880d681SAndroid Build Coastguard Worker
lto_codegen_write_merged_modules(lto_code_gen_t cg,const char * path)402*9880d681SAndroid Build Coastguard Worker bool lto_codegen_write_merged_modules(lto_code_gen_t cg, const char *path) {
403*9880d681SAndroid Build Coastguard Worker maybeParseOptions(cg);
404*9880d681SAndroid Build Coastguard Worker return !unwrap(cg)->writeMergedModules(path);
405*9880d681SAndroid Build Coastguard Worker }
406*9880d681SAndroid Build Coastguard Worker
lto_codegen_compile(lto_code_gen_t cg,size_t * length)407*9880d681SAndroid Build Coastguard Worker const void *lto_codegen_compile(lto_code_gen_t cg, size_t *length) {
408*9880d681SAndroid Build Coastguard Worker maybeParseOptions(cg);
409*9880d681SAndroid Build Coastguard Worker LibLTOCodeGenerator *CG = unwrap(cg);
410*9880d681SAndroid Build Coastguard Worker CG->NativeObjectFile =
411*9880d681SAndroid Build Coastguard Worker CG->compile(DisableVerify, DisableInline, DisableGVNLoadPRE,
412*9880d681SAndroid Build Coastguard Worker DisableLTOVectorization);
413*9880d681SAndroid Build Coastguard Worker if (!CG->NativeObjectFile)
414*9880d681SAndroid Build Coastguard Worker return nullptr;
415*9880d681SAndroid Build Coastguard Worker *length = CG->NativeObjectFile->getBufferSize();
416*9880d681SAndroid Build Coastguard Worker return CG->NativeObjectFile->getBufferStart();
417*9880d681SAndroid Build Coastguard Worker }
418*9880d681SAndroid Build Coastguard Worker
lto_codegen_optimize(lto_code_gen_t cg)419*9880d681SAndroid Build Coastguard Worker bool lto_codegen_optimize(lto_code_gen_t cg) {
420*9880d681SAndroid Build Coastguard Worker maybeParseOptions(cg);
421*9880d681SAndroid Build Coastguard Worker return !unwrap(cg)->optimize(DisableVerify, DisableInline, DisableGVNLoadPRE,
422*9880d681SAndroid Build Coastguard Worker DisableLTOVectorization);
423*9880d681SAndroid Build Coastguard Worker }
424*9880d681SAndroid Build Coastguard Worker
lto_codegen_compile_optimized(lto_code_gen_t cg,size_t * length)425*9880d681SAndroid Build Coastguard Worker const void *lto_codegen_compile_optimized(lto_code_gen_t cg, size_t *length) {
426*9880d681SAndroid Build Coastguard Worker maybeParseOptions(cg);
427*9880d681SAndroid Build Coastguard Worker LibLTOCodeGenerator *CG = unwrap(cg);
428*9880d681SAndroid Build Coastguard Worker CG->NativeObjectFile = CG->compileOptimized();
429*9880d681SAndroid Build Coastguard Worker if (!CG->NativeObjectFile)
430*9880d681SAndroid Build Coastguard Worker return nullptr;
431*9880d681SAndroid Build Coastguard Worker *length = CG->NativeObjectFile->getBufferSize();
432*9880d681SAndroid Build Coastguard Worker return CG->NativeObjectFile->getBufferStart();
433*9880d681SAndroid Build Coastguard Worker }
434*9880d681SAndroid Build Coastguard Worker
lto_codegen_compile_to_file(lto_code_gen_t cg,const char ** name)435*9880d681SAndroid Build Coastguard Worker bool lto_codegen_compile_to_file(lto_code_gen_t cg, const char **name) {
436*9880d681SAndroid Build Coastguard Worker maybeParseOptions(cg);
437*9880d681SAndroid Build Coastguard Worker return !unwrap(cg)->compile_to_file(
438*9880d681SAndroid Build Coastguard Worker name, DisableVerify, DisableInline, DisableGVNLoadPRE,
439*9880d681SAndroid Build Coastguard Worker DisableLTOVectorization);
440*9880d681SAndroid Build Coastguard Worker }
441*9880d681SAndroid Build Coastguard Worker
lto_codegen_debug_options(lto_code_gen_t cg,const char * opt)442*9880d681SAndroid Build Coastguard Worker void lto_codegen_debug_options(lto_code_gen_t cg, const char *opt) {
443*9880d681SAndroid Build Coastguard Worker unwrap(cg)->setCodeGenDebugOptions(opt);
444*9880d681SAndroid Build Coastguard Worker }
445*9880d681SAndroid Build Coastguard Worker
lto_api_version()446*9880d681SAndroid Build Coastguard Worker unsigned int lto_api_version() { return LTO_API_VERSION; }
447*9880d681SAndroid Build Coastguard Worker
lto_codegen_set_should_internalize(lto_code_gen_t cg,bool ShouldInternalize)448*9880d681SAndroid Build Coastguard Worker void lto_codegen_set_should_internalize(lto_code_gen_t cg,
449*9880d681SAndroid Build Coastguard Worker bool ShouldInternalize) {
450*9880d681SAndroid Build Coastguard Worker unwrap(cg)->setShouldInternalize(ShouldInternalize);
451*9880d681SAndroid Build Coastguard Worker }
452*9880d681SAndroid Build Coastguard Worker
lto_codegen_set_should_embed_uselists(lto_code_gen_t cg,lto_bool_t ShouldEmbedUselists)453*9880d681SAndroid Build Coastguard Worker void lto_codegen_set_should_embed_uselists(lto_code_gen_t cg,
454*9880d681SAndroid Build Coastguard Worker lto_bool_t ShouldEmbedUselists) {
455*9880d681SAndroid Build Coastguard Worker unwrap(cg)->setShouldEmbedUselists(ShouldEmbedUselists);
456*9880d681SAndroid Build Coastguard Worker }
457*9880d681SAndroid Build Coastguard Worker
458*9880d681SAndroid Build Coastguard Worker // ThinLTO API below
459*9880d681SAndroid Build Coastguard Worker
thinlto_create_codegen(void)460*9880d681SAndroid Build Coastguard Worker thinlto_code_gen_t thinlto_create_codegen(void) {
461*9880d681SAndroid Build Coastguard Worker lto_initialize();
462*9880d681SAndroid Build Coastguard Worker ThinLTOCodeGenerator *CodeGen = new ThinLTOCodeGenerator();
463*9880d681SAndroid Build Coastguard Worker CodeGen->setTargetOptions(InitTargetOptionsFromCodeGenFlags());
464*9880d681SAndroid Build Coastguard Worker
465*9880d681SAndroid Build Coastguard Worker return wrap(CodeGen);
466*9880d681SAndroid Build Coastguard Worker }
467*9880d681SAndroid Build Coastguard Worker
thinlto_codegen_dispose(thinlto_code_gen_t cg)468*9880d681SAndroid Build Coastguard Worker void thinlto_codegen_dispose(thinlto_code_gen_t cg) { delete unwrap(cg); }
469*9880d681SAndroid Build Coastguard Worker
thinlto_codegen_add_module(thinlto_code_gen_t cg,const char * Identifier,const char * Data,int Length)470*9880d681SAndroid Build Coastguard Worker void thinlto_codegen_add_module(thinlto_code_gen_t cg, const char *Identifier,
471*9880d681SAndroid Build Coastguard Worker const char *Data, int Length) {
472*9880d681SAndroid Build Coastguard Worker unwrap(cg)->addModule(Identifier, StringRef(Data, Length));
473*9880d681SAndroid Build Coastguard Worker }
474*9880d681SAndroid Build Coastguard Worker
thinlto_codegen_process(thinlto_code_gen_t cg)475*9880d681SAndroid Build Coastguard Worker void thinlto_codegen_process(thinlto_code_gen_t cg) { unwrap(cg)->run(); }
476*9880d681SAndroid Build Coastguard Worker
thinlto_module_get_num_objects(thinlto_code_gen_t cg)477*9880d681SAndroid Build Coastguard Worker unsigned int thinlto_module_get_num_objects(thinlto_code_gen_t cg) {
478*9880d681SAndroid Build Coastguard Worker return unwrap(cg)->getProducedBinaries().size();
479*9880d681SAndroid Build Coastguard Worker }
thinlto_module_get_object(thinlto_code_gen_t cg,unsigned int index)480*9880d681SAndroid Build Coastguard Worker LTOObjectBuffer thinlto_module_get_object(thinlto_code_gen_t cg,
481*9880d681SAndroid Build Coastguard Worker unsigned int index) {
482*9880d681SAndroid Build Coastguard Worker assert(index < unwrap(cg)->getProducedBinaries().size() && "Index overflow");
483*9880d681SAndroid Build Coastguard Worker auto &MemBuffer = unwrap(cg)->getProducedBinaries()[index];
484*9880d681SAndroid Build Coastguard Worker return LTOObjectBuffer{MemBuffer->getBufferStart(),
485*9880d681SAndroid Build Coastguard Worker MemBuffer->getBufferSize()};
486*9880d681SAndroid Build Coastguard Worker }
487*9880d681SAndroid Build Coastguard Worker
thinlto_codegen_disable_codegen(thinlto_code_gen_t cg,lto_bool_t disable)488*9880d681SAndroid Build Coastguard Worker void thinlto_codegen_disable_codegen(thinlto_code_gen_t cg,
489*9880d681SAndroid Build Coastguard Worker lto_bool_t disable) {
490*9880d681SAndroid Build Coastguard Worker unwrap(cg)->disableCodeGen(disable);
491*9880d681SAndroid Build Coastguard Worker }
492*9880d681SAndroid Build Coastguard Worker
thinlto_codegen_set_codegen_only(thinlto_code_gen_t cg,lto_bool_t CodeGenOnly)493*9880d681SAndroid Build Coastguard Worker void thinlto_codegen_set_codegen_only(thinlto_code_gen_t cg,
494*9880d681SAndroid Build Coastguard Worker lto_bool_t CodeGenOnly) {
495*9880d681SAndroid Build Coastguard Worker unwrap(cg)->setCodeGenOnly(CodeGenOnly);
496*9880d681SAndroid Build Coastguard Worker }
497*9880d681SAndroid Build Coastguard Worker
thinlto_debug_options(const char * const * options,int number)498*9880d681SAndroid Build Coastguard Worker void thinlto_debug_options(const char *const *options, int number) {
499*9880d681SAndroid Build Coastguard Worker // if options were requested, set them
500*9880d681SAndroid Build Coastguard Worker if (number && options) {
501*9880d681SAndroid Build Coastguard Worker std::vector<const char *> CodegenArgv(1, "libLTO");
502*9880d681SAndroid Build Coastguard Worker for (auto Arg : ArrayRef<const char *>(options, number))
503*9880d681SAndroid Build Coastguard Worker CodegenArgv.push_back(Arg);
504*9880d681SAndroid Build Coastguard Worker cl::ParseCommandLineOptions(CodegenArgv.size(), CodegenArgv.data());
505*9880d681SAndroid Build Coastguard Worker }
506*9880d681SAndroid Build Coastguard Worker }
507*9880d681SAndroid Build Coastguard Worker
lto_module_is_thinlto(lto_module_t mod)508*9880d681SAndroid Build Coastguard Worker lto_bool_t lto_module_is_thinlto(lto_module_t mod) {
509*9880d681SAndroid Build Coastguard Worker return unwrap(mod)->isThinLTO();
510*9880d681SAndroid Build Coastguard Worker }
511*9880d681SAndroid Build Coastguard Worker
thinlto_codegen_add_must_preserve_symbol(thinlto_code_gen_t cg,const char * Name,int Length)512*9880d681SAndroid Build Coastguard Worker void thinlto_codegen_add_must_preserve_symbol(thinlto_code_gen_t cg,
513*9880d681SAndroid Build Coastguard Worker const char *Name, int Length) {
514*9880d681SAndroid Build Coastguard Worker unwrap(cg)->preserveSymbol(StringRef(Name, Length));
515*9880d681SAndroid Build Coastguard Worker }
516*9880d681SAndroid Build Coastguard Worker
thinlto_codegen_add_cross_referenced_symbol(thinlto_code_gen_t cg,const char * Name,int Length)517*9880d681SAndroid Build Coastguard Worker void thinlto_codegen_add_cross_referenced_symbol(thinlto_code_gen_t cg,
518*9880d681SAndroid Build Coastguard Worker const char *Name, int Length) {
519*9880d681SAndroid Build Coastguard Worker unwrap(cg)->crossReferenceSymbol(StringRef(Name, Length));
520*9880d681SAndroid Build Coastguard Worker }
521*9880d681SAndroid Build Coastguard Worker
thinlto_codegen_set_cpu(thinlto_code_gen_t cg,const char * cpu)522*9880d681SAndroid Build Coastguard Worker void thinlto_codegen_set_cpu(thinlto_code_gen_t cg, const char *cpu) {
523*9880d681SAndroid Build Coastguard Worker return unwrap(cg)->setCpu(cpu);
524*9880d681SAndroid Build Coastguard Worker }
525*9880d681SAndroid Build Coastguard Worker
thinlto_codegen_set_cache_dir(thinlto_code_gen_t cg,const char * cache_dir)526*9880d681SAndroid Build Coastguard Worker void thinlto_codegen_set_cache_dir(thinlto_code_gen_t cg,
527*9880d681SAndroid Build Coastguard Worker const char *cache_dir) {
528*9880d681SAndroid Build Coastguard Worker return unwrap(cg)->setCacheDir(cache_dir);
529*9880d681SAndroid Build Coastguard Worker }
530*9880d681SAndroid Build Coastguard Worker
thinlto_codegen_set_cache_pruning_interval(thinlto_code_gen_t cg,int interval)531*9880d681SAndroid Build Coastguard Worker void thinlto_codegen_set_cache_pruning_interval(thinlto_code_gen_t cg,
532*9880d681SAndroid Build Coastguard Worker int interval) {
533*9880d681SAndroid Build Coastguard Worker return unwrap(cg)->setCachePruningInterval(interval);
534*9880d681SAndroid Build Coastguard Worker }
535*9880d681SAndroid Build Coastguard Worker
thinlto_codegen_set_cache_entry_expiration(thinlto_code_gen_t cg,unsigned expiration)536*9880d681SAndroid Build Coastguard Worker void thinlto_codegen_set_cache_entry_expiration(thinlto_code_gen_t cg,
537*9880d681SAndroid Build Coastguard Worker unsigned expiration) {
538*9880d681SAndroid Build Coastguard Worker return unwrap(cg)->setCacheEntryExpiration(expiration);
539*9880d681SAndroid Build Coastguard Worker }
540*9880d681SAndroid Build Coastguard Worker
thinlto_codegen_set_final_cache_size_relative_to_available_space(thinlto_code_gen_t cg,unsigned Percentage)541*9880d681SAndroid Build Coastguard Worker void thinlto_codegen_set_final_cache_size_relative_to_available_space(
542*9880d681SAndroid Build Coastguard Worker thinlto_code_gen_t cg, unsigned Percentage) {
543*9880d681SAndroid Build Coastguard Worker return unwrap(cg)->setMaxCacheSizeRelativeToAvailableSpace(Percentage);
544*9880d681SAndroid Build Coastguard Worker }
545*9880d681SAndroid Build Coastguard Worker
thinlto_codegen_set_savetemps_dir(thinlto_code_gen_t cg,const char * save_temps_dir)546*9880d681SAndroid Build Coastguard Worker void thinlto_codegen_set_savetemps_dir(thinlto_code_gen_t cg,
547*9880d681SAndroid Build Coastguard Worker const char *save_temps_dir) {
548*9880d681SAndroid Build Coastguard Worker return unwrap(cg)->setSaveTempsDir(save_temps_dir);
549*9880d681SAndroid Build Coastguard Worker }
550*9880d681SAndroid Build Coastguard Worker
thinlto_codegen_set_pic_model(thinlto_code_gen_t cg,lto_codegen_model model)551*9880d681SAndroid Build Coastguard Worker lto_bool_t thinlto_codegen_set_pic_model(thinlto_code_gen_t cg,
552*9880d681SAndroid Build Coastguard Worker lto_codegen_model model) {
553*9880d681SAndroid Build Coastguard Worker switch (model) {
554*9880d681SAndroid Build Coastguard Worker case LTO_CODEGEN_PIC_MODEL_STATIC:
555*9880d681SAndroid Build Coastguard Worker unwrap(cg)->setCodePICModel(Reloc::Static);
556*9880d681SAndroid Build Coastguard Worker return false;
557*9880d681SAndroid Build Coastguard Worker case LTO_CODEGEN_PIC_MODEL_DYNAMIC:
558*9880d681SAndroid Build Coastguard Worker unwrap(cg)->setCodePICModel(Reloc::PIC_);
559*9880d681SAndroid Build Coastguard Worker return false;
560*9880d681SAndroid Build Coastguard Worker case LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC:
561*9880d681SAndroid Build Coastguard Worker unwrap(cg)->setCodePICModel(Reloc::DynamicNoPIC);
562*9880d681SAndroid Build Coastguard Worker return false;
563*9880d681SAndroid Build Coastguard Worker case LTO_CODEGEN_PIC_MODEL_DEFAULT:
564*9880d681SAndroid Build Coastguard Worker unwrap(cg)->setCodePICModel(None);
565*9880d681SAndroid Build Coastguard Worker return false;
566*9880d681SAndroid Build Coastguard Worker }
567*9880d681SAndroid Build Coastguard Worker sLastErrorString = "Unknown PIC model";
568*9880d681SAndroid Build Coastguard Worker return true;
569*9880d681SAndroid Build Coastguard Worker }
570