Skip to content

Commit

Permalink
Add a libLTO API to stop/restart ThinLTO between optimizations and Co…
Browse files Browse the repository at this point in the history
…deGen

This allows the linker to instruct ThinLTO to perform only the
optimization part or only the codegen part of the process.

From: Mehdi Amini <[email protected]>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@265113 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
joker-eph committed Apr 1, 2016
1 parent ff2f27d commit 51f5548
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 5 deletions.
20 changes: 19 additions & 1 deletion include/llvm-c/lto.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ typedef bool lto_bool_t;
* @{
*/

#define LTO_API_VERSION 18
#define LTO_API_VERSION 19

/**
* \since prior to LTO_API_VERSION=3
*/
Expand Down Expand Up @@ -717,6 +718,23 @@ extern void thinlto_codegen_set_savetemps_dir(thinlto_code_gen_t cg,
*/
extern void thinlto_codegen_set_cpu(thinlto_code_gen_t cg, const char *cpu);

/**
* Disable CodeGen, only run the stages till codegen and stop. The output will
* be bitcode.
*
* \since LTO_API_VERSION=19
*/
extern void thinlto_codegen_disable_codegen(thinlto_code_gen_t cg,
lto_bool_t disable);

/**
* Perform CodeGen only: disable all other stages.
*
* \since LTO_API_VERSION=19
*/
extern void thinlto_codegen_set_codegen_only(thinlto_code_gen_t cg,
lto_bool_t codegen_only);

/**
* Parse -mllvm style debug options.
*
Expand Down
15 changes: 15 additions & 0 deletions include/llvm/LTO/ThinLTOCodeGenerator.h
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,13 @@ class ThinLTOCodeGenerator {
TMBuilder.CGOptLevel = CGOptLevel;
}

/// Disable CodeGen, only run the stages till codegen and stop. The output
/// will be bitcode.
void disableCodeGen(bool Disable) { DisableCodeGen = Disable; }

/// Perform CodeGen only: disable all other stages.
void setCodeGenOnly(bool CGOnly) { CodeGenOnly = CGOnly; }

/**@}*/

/**
Expand Down Expand Up @@ -228,6 +235,14 @@ class ThinLTOCodeGenerator {

/// Path to a directory to save the temporary bitcode files.
std::string SaveTempsDir;

/// Flag to enable/disable CodeGen. When set to true, the process stops after
/// optimizations and a bitcode is produced.
bool DisableCodeGen;

/// Flag to indicate that only the CodeGen will be performed, no cross-module
/// importing or optimization.
bool CodeGenOnly;
};
}
#endif
37 changes: 35 additions & 2 deletions lib/LTO/ThinLTOCodeGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,8 @@ ProcessThinLTOModule(Module &TheModule, const ModuleSummaryIndex &Index,
StringMap<MemoryBufferRef> &ModuleMap, TargetMachine &TM,
const FunctionImporter::ImportMapTy &ImportList,
ThinLTOCodeGenerator::CachingOptions CacheOptions,
StringRef SaveTempsDir, unsigned count) {
bool DisableCodeGen, StringRef SaveTempsDir,
unsigned count) {

// Save temps: after IPO.
saveTempBitcode(TheModule, SaveTempsDir, count, ".1.IPO.bc");
Expand All @@ -212,6 +213,16 @@ ProcessThinLTOModule(Module &TheModule, const ModuleSummaryIndex &Index,

saveTempBitcode(TheModule, SaveTempsDir, count, ".3.opt.bc");

if (DisableCodeGen) {
// Configured to stop before CodeGen, serialize the bitcode and return.
SmallVector<char, 128> OutputBuffer;
{
raw_svector_ostream OS(OutputBuffer);
WriteBitcodeToFile(&TheModule, OS, true, true);
}
return make_unique<ObjectMemoryBuffer>(std::move(OutputBuffer));
}

return codegenModule(TheModule, TM);
}

Expand Down Expand Up @@ -348,6 +359,28 @@ std::unique_ptr<MemoryBuffer> ThinLTOCodeGenerator::codegen(Module &TheModule) {

// Main entry point for the ThinLTO processing
void ThinLTOCodeGenerator::run() {
if (CodeGenOnly) {
// Perform only parallel codegen and return.
ThreadPool Pool;
assert(ProducedBinaries.empty() && "The generator should not be reused");
ProducedBinaries.resize(Modules.size());
int count = 0;
for (auto &ModuleBuffer : Modules) {
Pool.async([&](int count) {
LLVMContext Context;
Context.setDiscardValueNames(LTODiscardValueNames);

// Parse module now
auto TheModule = loadModuleFromBuffer(ModuleBuffer, Context, false);

// CodeGen
ProducedBinaries[count] = codegen(*TheModule);
}, count++);
}

return;
}

// Sequential linking phase
auto Index = linkCombinedIndex();

Expand Down Expand Up @@ -396,7 +429,7 @@ void ThinLTOCodeGenerator::run() {
auto &ImportList = ImportLists[TheModule->getModuleIdentifier()];
ProducedBinaries[count] = ProcessThinLTOModule(
*TheModule, *Index, ModuleMap, *TMBuilder.create(), ImportList,
CacheOptions, SaveTempsDir, count);
CacheOptions, DisableCodeGen, SaveTempsDir, count);
}, count);
count++;
}
Expand Down
12 changes: 11 additions & 1 deletion tools/lto/lto.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,16 @@ LTOObjectBuffer thinlto_module_get_object(thinlto_code_gen_t cg,
MemBuffer->getBufferSize()};
}

void thinlto_codegen_disable_codegen(thinlto_code_gen_t cg,
lto_bool_t disable) {
unwrap(cg)->disableCodeGen(disable);
}

void thinlto_codegen_set_codegen_only(thinlto_code_gen_t cg,
lto_bool_t CodeGenOnly) {
unwrap(cg)->setCodeGenOnly(CodeGenOnly);
}

void thinlto_debug_options(const char *const *options, int number) {
// if options were requested, set them
if (number && options) {
Expand All @@ -483,7 +493,7 @@ void thinlto_debug_options(const char *const *options, int number) {
}
}

bool lto_module_is_thinlto(lto_module_t mod) {
lto_bool_t lto_module_is_thinlto(lto_module_t mod) {
return unwrap(mod)->isThinLTO();
}

Expand Down
4 changes: 3 additions & 1 deletion tools/lto/lto.exports
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,6 @@ thinlto_debug_options
lto_module_is_thinlto
thinlto_codegen_add_must_preserve_symbol
thinlto_codegen_add_cross_referenced_symbol
thinlto_codegen_set_final_cache_size_relative_to_available_space
thinlto_codegen_set_final_cache_size_relative_to_available_space
thinlto_codegen_set_codegen_only
thinlto_codegen_disable_codegen

0 comments on commit 51f5548

Please sign in to comment.