}
}
-DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LTOCodeGenerator, lto_code_gen_t)
+namespace {
+
+// This derived class owns the native object file. This helps implement the
+// libLTO API semantics, which require that the code generator owns the object
+// file.
+struct LibLTOCodeGenerator : LTOCodeGenerator {
+ LibLTOCodeGenerator() {}
+ LibLTOCodeGenerator(std::unique_ptr<LLVMContext> Context)
+ : LTOCodeGenerator(std::move(Context)) {}
+
+ std::unique_ptr<MemoryBuffer> NativeObjectFile;
+};
+
+}
+
+DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LibLTOCodeGenerator, lto_code_gen_t)
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LTOModule, lto_module_t)
// Convert the subtarget features into a string to pass to LTOCodeGenerator.
}
unsigned int lto_module_get_num_deplibs(lto_module_t mod) {
- return unwrap(mod)->getDependentLibraryCount();
+ return 0;
}
const char* lto_module_get_deplib(lto_module_t mod, unsigned int index) {
- return unwrap(mod)->getDependentLibrary(index);
+ return nullptr;
}
unsigned int lto_module_get_num_linkeropts(lto_module_t mod) {
- return unwrap(mod)->getLinkerOptCount();
+ return 1;
}
const char* lto_module_get_linkeropt(lto_module_t mod, unsigned int index) {
- return unwrap(mod)->getLinkerOpt(index);
+ if (index != 0)
+ return nullptr;
+ return unwrap(mod)->getLinkerOpts();
}
void lto_codegen_set_diagnostic_handler(lto_code_gen_t cg,
TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
- LTOCodeGenerator *CodeGen =
- InLocalContext ? new LTOCodeGenerator(make_unique<LLVMContext>())
- : new LTOCodeGenerator();
- if (CodeGen)
- CodeGen->setTargetOptions(Options);
+ LibLTOCodeGenerator *CodeGen =
+ InLocalContext ? new LibLTOCodeGenerator(make_unique<LLVMContext>())
+ : new LibLTOCodeGenerator();
+ CodeGen->setTargetOptions(Options);
return wrap(CodeGen);
}
unwrap(cg)->addMustPreserveSymbol(symbol);
}
-static void maybeParseOptions() {
+static void maybeParseOptions(lto_code_gen_t cg) {
if (!parsedOptions) {
unwrap(cg)->parseCodeGenDebugOptions();
lto_add_attrs(cg);
}
bool lto_codegen_write_merged_modules(lto_code_gen_t cg, const char *path) {
- maybeParseOptions();
+ maybeParseOptions(cg);
return !unwrap(cg)->writeMergedModules(path, sLastErrorString);
}
const void *lto_codegen_compile(lto_code_gen_t cg, size_t *length) {
- maybeParseOptions();
- return unwrap(cg)->compile(length, DisableInline,
- DisableGVNLoadPRE, DisableLTOVectorization,
- sLastErrorString);
+ maybeParseOptions(cg);
+ LibLTOCodeGenerator *CG = unwrap(cg);
+ CG->NativeObjectFile = CG->compile(DisableInline, DisableGVNLoadPRE,
+ DisableLTOVectorization, sLastErrorString);
+ if (!CG->NativeObjectFile)
+ return nullptr;
+ *length = CG->NativeObjectFile->getBufferSize();
+ return CG->NativeObjectFile->getBufferStart();
}
bool lto_codegen_optimize(lto_code_gen_t cg) {
- maybeParseOptions();
+ maybeParseOptions(cg);
return !unwrap(cg)->optimize(DisableInline,
DisableGVNLoadPRE, DisableLTOVectorization,
sLastErrorString);
}
const void *lto_codegen_compile_optimized(lto_code_gen_t cg, size_t *length) {
- maybeParseOptions();
- return unwrap(cg)->compileOptimized(length, sLastErrorString);
+ maybeParseOptions(cg);
+ LibLTOCodeGenerator *CG = unwrap(cg);
+ CG->NativeObjectFile = CG->compileOptimized(sLastErrorString);
+ if (!CG->NativeObjectFile)
+ return nullptr;
+ *length = CG->NativeObjectFile->getBufferSize();
+ return CG->NativeObjectFile->getBufferStart();
}
bool lto_codegen_compile_to_file(lto_code_gen_t cg, const char **name) {
- maybeParseOptions();
+ maybeParseOptions(cg);
return !unwrap(cg)->compile_to_file(
name, DisableInline, DisableGVNLoadPRE,
DisableLTOVectorization, sLastErrorString);
}
unsigned int lto_api_version() { return LTO_API_VERSION; }
+
+void lto_codegen_set_should_internalize(lto_code_gen_t cg,
+ bool ShouldInternalize) {
+ unwrap(cg)->setShouldInternalize(ShouldInternalize);
+}
+
+void lto_codegen_set_should_embed_uselists(lto_code_gen_t cg,
+ lto_bool_t ShouldEmbedUselists) {
+ unwrap(cg)->setShouldEmbedUselists(ShouldEmbedUselists);
+}