[llvm] r265113 - Add a libLTO API to stop/restart ThinLTO between optimizations and CodeGen
Mehdi Amini via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 1 12:00:46 PDT 2016
> On Apr 1, 2016, at 5:04 AM, Benjamin Kramer <benny.kra at gmail.com> wrote:
>
> On Fri, Apr 1, 2016 at 8:47 AM, Mehdi Amini via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
>> Author: mehdi_amini
>> Date: Fri Apr 1 01:47:02 2016
>> New Revision: 265113
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=265113&view=rev
>> Log:
>> Add a libLTO API to stop/restart ThinLTO between optimizations and CodeGen
>>
>> This allows the linker to instruct ThinLTO to perform only the
>> optimization part or only the codegen part of the process.
>
> Is there any way to test this? Currently this just adds dead code.
Sure, I'll try to add something in llvm-lto.
--
Mehdi
>
>>
>> From: Mehdi Amini <mehdi.amini at apple.com>
>>
>> Modified:
>> llvm/trunk/include/llvm-c/lto.h
>> llvm/trunk/include/llvm/LTO/ThinLTOCodeGenerator.h
>> llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp
>> llvm/trunk/tools/lto/lto.cpp
>> llvm/trunk/tools/lto/lto.exports
>>
>> Modified: llvm/trunk/include/llvm-c/lto.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/lto.h?rev=265113&r1=265112&r2=265113&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm-c/lto.h (original)
>> +++ llvm/trunk/include/llvm-c/lto.h Fri Apr 1 01:47:02 2016
>> @@ -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
>> */
>> @@ -718,6 +719,23 @@ extern void thinlto_codegen_set_savetemp
>> 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.
>> *
>> * \since LTO_API_VERSION=18
>>
>> Modified: llvm/trunk/include/llvm/LTO/ThinLTOCodeGenerator.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LTO/ThinLTOCodeGenerator.h?rev=265113&r1=265112&r2=265113&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/LTO/ThinLTOCodeGenerator.h (original)
>> +++ llvm/trunk/include/llvm/LTO/ThinLTOCodeGenerator.h Fri Apr 1 01:47:02 2016
>> @@ -169,6 +169,13 @@ public:
>> 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; }
>> +
>> /**@}*/
>>
>> /**
>> @@ -228,6 +235,14 @@ private:
>>
>> /// 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
>>
>> Modified: llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp?rev=265113&r1=265112&r2=265113&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp (original)
>> +++ llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp Fri Apr 1 01:47:02 2016
>> @@ -188,7 +188,8 @@ ProcessThinLTOModule(Module &TheModule,
>> 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");
>> @@ -212,6 +213,16 @@ ProcessThinLTOModule(Module &TheModule,
>>
>> 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);
>> }
>>
>> @@ -348,6 +359,28 @@ std::unique_ptr<MemoryBuffer> ThinLTOCod
>>
>> // 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();
>>
>> @@ -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++;
>> }
>>
>> Modified: llvm/trunk/tools/lto/lto.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/lto.cpp?rev=265113&r1=265112&r2=265113&view=diff
>> ==============================================================================
>> --- llvm/trunk/tools/lto/lto.cpp (original)
>> +++ llvm/trunk/tools/lto/lto.cpp Fri Apr 1 01:47:02 2016
>> @@ -473,6 +473,16 @@ LTOObjectBuffer thinlto_module_get_objec
>> 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) {
>> @@ -483,7 +493,7 @@ void thinlto_debug_options(const char *c
>> }
>> }
>>
>> -bool lto_module_is_thinlto(lto_module_t mod) {
>> +lto_bool_t lto_module_is_thinlto(lto_module_t mod) {
>> return unwrap(mod)->isThinLTO();
>> }
>>
>>
>> Modified: llvm/trunk/tools/lto/lto.exports
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/lto.exports?rev=265113&r1=265112&r2=265113&view=diff
>> ==============================================================================
>> --- llvm/trunk/tools/lto/lto.exports (original)
>> +++ llvm/trunk/tools/lto/lto.exports Fri Apr 1 01:47:02 2016
>> @@ -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
>> \ No newline at end of file
>> +thinlto_codegen_set_final_cache_size_relative_to_available_space
>> +thinlto_codegen_set_codegen_only
>> +thinlto_codegen_disable_codegen
>> \ No newline at end of file
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list