lto.cpp revision 07d5aef3057b2e403b20d683e7477c93fde67d99
1//===-lto.cpp - LLVM Link Time Optimizer ----------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the Link Time Optimization library. This library is
11// intended to be used by linker to optimize code at link time.
12//
13//===----------------------------------------------------------------------===//
14
15#include "llvm-c/lto.h"
16#include "llvm/CodeGen/CommandFlags.h"
17#include "llvm/LTO/LTOCodeGenerator.h"
18#include "llvm/LTO/LTOModule.h"
19#include "llvm-c/Core.h"
20#include "llvm-c/Target.h"
21
22// extra command-line flags needed for LTOCodeGenerator
23static cl::opt<bool>
24DisableOpt("disable-opt", cl::init(false),
25  cl::desc("Do not run any optimization passes"));
26
27static cl::opt<bool>
28DisableInline("disable-inlining", cl::init(false),
29  cl::desc("Do not run the inliner pass"));
30
31static cl::opt<bool>
32DisableGVNLoadPRE("disable-gvn-loadpre", cl::init(false),
33  cl::desc("Do not run the GVN load PRE pass"));
34
35// Holds most recent error string.
36// *** Not thread safe ***
37static std::string sLastErrorString;
38
39// Holds the initialization state of the LTO module.
40// *** Not thread safe ***
41static bool initialized = false;
42
43// Holds the command-line option parsing state of the LTO module.
44static bool parsedOptions = false;
45
46// Initialize the configured targets if they have not been initialized.
47static void lto_initialize() {
48  if (!initialized) {
49    LLVMInitializeAllTargetInfos();
50    LLVMInitializeAllTargets();
51    LLVMInitializeAllTargetMCs();
52    LLVMInitializeAllAsmParsers();
53    LLVMInitializeAllAsmPrinters();
54    LLVMInitializeAllDisassemblers();
55    initialized = true;
56  }
57}
58
59static void lto_set_target_options(llvm::TargetOptions &Options) {
60  Options.LessPreciseFPMADOption = EnableFPMAD;
61  Options.NoFramePointerElim = DisableFPElim;
62  Options.AllowFPOpFusion = FuseFPOps;
63  Options.UnsafeFPMath = EnableUnsafeFPMath;
64  Options.NoInfsFPMath = EnableNoInfsFPMath;
65  Options.NoNaNsFPMath = EnableNoNaNsFPMath;
66  Options.HonorSignDependentRoundingFPMathOption =
67    EnableHonorSignDependentRoundingFPMath;
68  Options.UseSoftFloat = GenerateSoftFloatCalls;
69  if (FloatABIForCalls != llvm::FloatABI::Default)
70    Options.FloatABIType = FloatABIForCalls;
71  Options.NoZerosInBSS = DontPlaceZerosInBSS;
72  Options.GuaranteedTailCallOpt = EnableGuaranteedTailCallOpt;
73  Options.DisableTailCalls = DisableTailCalls;
74  Options.StackAlignmentOverride = OverrideStackAlignment;
75  Options.TrapFuncName = TrapFuncName;
76  Options.PositionIndependentExecutable = EnablePIE;
77  Options.EnableSegmentedStacks = SegmentedStacks;
78  Options.UseInitArray = UseInitArray;
79}
80
81/// lto_get_version - Returns a printable string.
82extern const char* lto_get_version() {
83  return LTOCodeGenerator::getVersionString();
84}
85
86/// lto_get_error_message - Returns the last error string or NULL if last
87/// operation was successful.
88const char* lto_get_error_message() {
89  return sLastErrorString.c_str();
90}
91
92/// lto_module_is_object_file - Validates if a file is a loadable object file.
93bool lto_module_is_object_file(const char* path) {
94  return LTOModule::isBitcodeFile(path);
95}
96
97/// lto_module_is_object_file_for_target - Validates if a file is a loadable
98/// object file compilable for requested target.
99bool lto_module_is_object_file_for_target(const char* path,
100                                          const char* target_triplet_prefix) {
101  return LTOModule::isBitcodeFileForTarget(path, target_triplet_prefix);
102}
103
104/// lto_module_is_object_file_in_memory - Validates if a buffer is a loadable
105/// object file.
106bool lto_module_is_object_file_in_memory(const void* mem, size_t length) {
107  return LTOModule::isBitcodeFile(mem, length);
108}
109
110/// lto_module_is_object_file_in_memory_for_target - Validates if a buffer is a
111/// loadable object file compilable for the target.
112bool
113lto_module_is_object_file_in_memory_for_target(const void* mem,
114                                            size_t length,
115                                            const char* target_triplet_prefix) {
116  return LTOModule::isBitcodeFileForTarget(mem, length, target_triplet_prefix);
117}
118
119/// lto_module_create - Loads an object file from disk. Returns NULL on error
120/// (check lto_get_error_message() for details).
121lto_module_t lto_module_create(const char* path) {
122  lto_initialize();
123  llvm::TargetOptions Options;
124  lto_set_target_options(Options);
125  return LTOModule::makeLTOModule(path, Options, sLastErrorString);
126}
127
128/// lto_module_create_from_fd - Loads an object file from disk. Returns NULL on
129/// error (check lto_get_error_message() for details).
130lto_module_t lto_module_create_from_fd(int fd, const char *path, size_t size) {
131  lto_initialize();
132  llvm::TargetOptions Options;
133  lto_set_target_options(Options);
134  return LTOModule::makeLTOModule(fd, path, size, Options, sLastErrorString);
135}
136
137/// lto_module_create_from_fd_at_offset - Loads an object file from disk.
138/// Returns NULL on error (check lto_get_error_message() for details).
139lto_module_t lto_module_create_from_fd_at_offset(int fd, const char *path,
140                                                 size_t file_size,
141                                                 size_t map_size,
142                                                 off_t offset) {
143  lto_initialize();
144  llvm::TargetOptions Options;
145  lto_set_target_options(Options);
146  return LTOModule::makeLTOModule(fd, path, map_size, offset, Options,
147                                  sLastErrorString);
148}
149
150/// lto_module_create_from_memory - Loads an object file from memory. Returns
151/// NULL on error (check lto_get_error_message() for details).
152lto_module_t lto_module_create_from_memory(const void* mem, size_t length) {
153  lto_initialize();
154  llvm::TargetOptions Options;
155  lto_set_target_options(Options);
156  return LTOModule::makeLTOModule(mem, length, Options, sLastErrorString);
157}
158
159/// lto_module_dispose - Frees all memory for a module. Upon return the
160/// lto_module_t is no longer valid.
161void lto_module_dispose(lto_module_t mod) {
162  delete mod;
163}
164
165/// lto_module_get_target_triple - Returns triplet string which the object
166/// module was compiled under.
167const char* lto_module_get_target_triple(lto_module_t mod) {
168  return mod->getTargetTriple();
169}
170
171/// lto_module_set_target_triple - Sets triple string with which the object will
172/// be codegened.
173void lto_module_set_target_triple(lto_module_t mod, const char *triple) {
174  return mod->setTargetTriple(triple);
175}
176
177/// lto_module_get_num_symbols - Returns the number of symbols in the object
178/// module.
179unsigned int lto_module_get_num_symbols(lto_module_t mod) {
180  return mod->getSymbolCount();
181}
182
183/// lto_module_get_symbol_name - Returns the name of the ith symbol in the
184/// object module.
185const char* lto_module_get_symbol_name(lto_module_t mod, unsigned int index) {
186  return mod->getSymbolName(index);
187}
188
189/// lto_module_get_symbol_attribute - Returns the attributes of the ith symbol
190/// in the object module.
191lto_symbol_attributes lto_module_get_symbol_attribute(lto_module_t mod,
192                                                      unsigned int index) {
193  return mod->getSymbolAttributes(index);
194}
195
196/// lto_codegen_create - Instantiates a code generator. Returns NULL if there
197/// is an error.
198lto_code_gen_t lto_codegen_create(void) {
199  lto_initialize();
200
201  TargetOptions Options;
202  lto_set_target_options(Options);
203
204  LTOCodeGenerator *CodeGen = new LTOCodeGenerator();
205  if (CodeGen)
206    CodeGen->setTargetOptions(Options);
207  return CodeGen;
208}
209
210/// lto_codegen_dispose - Frees all memory for a code generator. Upon return the
211/// lto_code_gen_t is no longer valid.
212void lto_codegen_dispose(lto_code_gen_t cg) {
213  delete cg;
214}
215
216/// lto_codegen_add_module - Add an object module to the set of modules for
217/// which code will be generated. Returns true on error (check
218/// lto_get_error_message() for details).
219bool lto_codegen_add_module(lto_code_gen_t cg, lto_module_t mod) {
220  return !cg->addModule(mod, sLastErrorString);
221}
222
223/// lto_codegen_set_debug_model - Sets what if any format of debug info should
224/// be generated. Returns true on error (check lto_get_error_message() for
225/// details).
226bool lto_codegen_set_debug_model(lto_code_gen_t cg, lto_debug_model debug) {
227  cg->setDebugInfo(debug);
228  return false;
229}
230
231/// lto_codegen_set_pic_model - Sets what code model to generated. Returns true
232/// on error (check lto_get_error_message() for details).
233bool lto_codegen_set_pic_model(lto_code_gen_t cg, lto_codegen_model model) {
234  cg->setCodePICModel(model);
235  return false;
236}
237
238/// lto_codegen_set_cpu - Sets the cpu to generate code for.
239void lto_codegen_set_cpu(lto_code_gen_t cg, const char *cpu) {
240  return cg->setCpu(cpu);
241}
242
243/// lto_codegen_set_assembler_path - Sets the path to the assembler tool.
244void lto_codegen_set_assembler_path(lto_code_gen_t cg, const char *path) {
245  // In here only for backwards compatibility. We use MC now.
246}
247
248/// lto_codegen_set_assembler_args - Sets extra arguments that libLTO should
249/// pass to the assembler.
250void lto_codegen_set_assembler_args(lto_code_gen_t cg, const char **args,
251                                    int nargs) {
252  // In here only for backwards compatibility. We use MC now.
253}
254
255/// lto_codegen_add_must_preserve_symbol - Adds to a list of all global symbols
256/// that must exist in the final generated code. If a function is not listed
257/// there, it might be inlined into every usage and optimized away.
258void lto_codegen_add_must_preserve_symbol(lto_code_gen_t cg,
259                                          const char *symbol) {
260  cg->addMustPreserveSymbol(symbol);
261}
262
263void lto_codegen_add_dso_symbol(lto_code_gen_t cg, const char *symbol) {
264  cg->addDSOSymbol(symbol);
265}
266
267/// lto_codegen_write_merged_modules - Writes a new file at the specified path
268/// that contains the merged contents of all modules added so far. Returns true
269/// on error (check lto_get_error_message() for details).
270bool lto_codegen_write_merged_modules(lto_code_gen_t cg, const char *path) {
271  if (!parsedOptions) {
272    cg->parseCodeGenDebugOptions();
273    parsedOptions = true;
274  }
275  return !cg->writeMergedModules(path, sLastErrorString);
276}
277
278/// lto_codegen_compile - Generates code for all added modules into one native
279/// object file. On success returns a pointer to a generated mach-o/ELF buffer
280/// and length set to the buffer size. The buffer is owned by the lto_code_gen_t
281/// object and will be freed when lto_codegen_dispose() is called, or
282/// lto_codegen_compile() is called again. On failure, returns NULL (check
283/// lto_get_error_message() for details).
284const void *lto_codegen_compile(lto_code_gen_t cg, size_t *length) {
285  if (!parsedOptions) {
286    cg->parseCodeGenDebugOptions();
287    parsedOptions = true;
288  }
289  return cg->compile(length, DisableOpt, DisableInline, DisableGVNLoadPRE,
290                     sLastErrorString);
291}
292
293/// lto_codegen_compile_to_file - Generates code for all added modules into one
294/// native object file. The name of the file is written to name. Returns true on
295/// error.
296bool lto_codegen_compile_to_file(lto_code_gen_t cg, const char **name) {
297  if (!parsedOptions) {
298    cg->parseCodeGenDebugOptions();
299    parsedOptions = true;
300  }
301  return !cg->compile_to_file(name, DisableOpt, DisableInline, DisableGVNLoadPRE,
302                              sLastErrorString);
303}
304
305/// lto_codegen_debug_options - Used to pass extra options to the code
306/// generator.
307void lto_codegen_debug_options(lto_code_gen_t cg, const char *opt) {
308  cg->setCodeGenDebugOptions(opt);
309}
310