diff options
| author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-11-11 23:19:23 +0000 |
|---|---|---|
| committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-11-11 23:19:23 +0000 |
| commit | c5800f68bd821a0b10f9ef9b640ac23ca58a212f (patch) | |
| tree | 83438f065d70452213cf0d928554911d43285be1 /llvm/tools | |
| parent | 7fe6f03c3a536e54c3d7818cbf693834a610965a (diff) | |
| download | bcm5719-llvm-c5800f68bd821a0b10f9ef9b640ac23ca58a212f.tar.gz bcm5719-llvm-c5800f68bd821a0b10f9ef9b640ac23ca58a212f.zip | |
libLTO: Allow linker to choose context of modules and codegen
Add API for specifying which `LLVMContext` each `lto_module_t` and
`lto_code_gen_t` is in.
In particular, this enables the following flow:
for (auto &File : Files) {
lto_module_t M = lto_module_create_in_local_context(File...);
querySymbols(M);
lto_module_dispose(M);
}
lto_code_gen_t CG = lto_codegen_create_in_local_context();
for (auto &File : FilesToLink) {
lto_module_t M = lto_module_create_in_codegen_context(File..., CG);
lto_codegen_add_module(CG, M);
lto_module_dispose(M);
}
lto_codegen_compile(CG);
lto_codegen_write_merged_modules(CG, ...);
lto_codegen_dispose(CG);
This flow has a few benefits.
- Only one module (two if you count the combined module in the code
generator) is in memory at a time.
- Metadata (and constants) from files that are parsed to query symbols
but not linked into the code generator don't pollute the global
context.
- The first for loop can be parallelized, since each module is in its
own context.
- When the code generator is disposed, the memory from LTO gets freed.
rdar://problem/18767512
llvm-svn: 221733
Diffstat (limited to 'llvm/tools')
| -rw-r--r-- | llvm/tools/lto/lto.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/tools/lto/lto.cpp b/llvm/tools/lto/lto.cpp index 3cc6499bd90..ef37c90ba3b 100644 --- a/llvm/tools/lto/lto.cpp +++ b/llvm/tools/lto/lto.cpp @@ -150,6 +150,24 @@ lto_module_t lto_module_create_from_memory_with_path(const void* mem, LTOModule::createFromBuffer(mem, length, Options, sLastErrorString, path)); } +lto_module_t lto_module_create_in_local_context(const void *mem, size_t length, + const char *path) { + lto_initialize(); + llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); + return wrap(LTOModule::createInLocalContext(mem, length, Options, + sLastErrorString, path)); +} + +lto_module_t lto_module_create_in_codegen_context(const void *mem, + size_t length, + const char *path, + lto_code_gen_t cg) { + lto_initialize(); + llvm::TargetOptions Options = InitTargetOptionsFromCodeGenFlags(); + return wrap(LTOModule::createInContext(mem, length, Options, sLastErrorString, + path, &unwrap(cg)->getContext())); +} + void lto_module_dispose(lto_module_t mod) { delete unwrap(mod); } const char* lto_module_get_target_triple(lto_module_t mod) { |

