diff options
| author | Mehdi Amini <mehdi.amini@apple.com> | 2016-08-23 18:39:12 +0000 |
|---|---|---|
| committer | Mehdi Amini <mehdi.amini@apple.com> | 2016-08-23 18:39:12 +0000 |
| commit | e7494530b2a07b8cc280871c51836b86118ddd94 (patch) | |
| tree | 784af52479aa4dd06bc0235d8f7af6e8cb94155e /llvm/lib/LTO | |
| parent | 359be8858a089427d2ccf7a9fa4dc1286386ebe2 (diff) | |
| download | bcm5719-llvm-e7494530b2a07b8cc280871c51836b86118ddd94.tar.gz bcm5719-llvm-e7494530b2a07b8cc280871c51836b86118ddd94.zip | |
Stop always creating and running an LTO compilation if there is not a single LTO object
Summary:
I assume there was a use case, so maybe this strawman patch will help
clarifying if it is legit.
In any case the current situation is not legit: a ThinLTO compilation
should not trigger an unexpected full LTO compilation.
Right now, adding a --save-temps option triggers this and makes the
number of output differs.
Reviewers: tejohnson
Subscribers: pcc, llvm-commits, mehdi_amini
Differential Revision: https://reviews.llvm.org/D23600
llvm-svn: 279550
Diffstat (limited to 'llvm/lib/LTO')
| -rw-r--r-- | llvm/lib/LTO/LTO.cpp | 34 |
1 files changed, 13 insertions, 21 deletions
diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp index 8d4f1a48d93..04c5ac79aeb 100644 --- a/llvm/lib/LTO/LTO.cpp +++ b/llvm/lib/LTO/LTO.cpp @@ -167,8 +167,7 @@ Expected<std::unique_ptr<InputFile>> InputFile::create(MemoryBufferRef Object) { LTO::RegularLTOState::RegularLTOState(unsigned ParallelCodeGenParallelismLevel, Config &Conf) : ParallelCodeGenParallelismLevel(ParallelCodeGenParallelismLevel), - Ctx(Conf), CombinedModule(llvm::make_unique<Module>("ld-temp.o", Ctx)), - Mover(*CombinedModule) {} + Ctx(Conf) {} LTO::ThinLTOState::ThinLTOState(ThinBackend Backend) : Backend(Backend) { if (!Backend) @@ -249,8 +248,11 @@ Error LTO::add(std::unique_ptr<InputFile> Input, // Add a regular LTO object to the link. Error LTO::addRegularLTO(std::unique_ptr<InputFile> Input, ArrayRef<SymbolResolution> Res) { - RegularLTO.HasModule = true; - + if (!RegularLTO.CombinedModule) { + RegularLTO.CombinedModule = + llvm::make_unique<Module>("ld-temp.o", RegularLTO.Ctx); + RegularLTO.Mover = llvm::make_unique<IRMover>(*RegularLTO.CombinedModule); + } ErrorOr<std::unique_ptr<object::IRObjectFile>> ObjOrErr = IRObjectFile::create(Input->Obj->getMemoryBufferRef(), RegularLTO.Ctx); if (!ObjOrErr) @@ -305,8 +307,8 @@ Error LTO::addRegularLTO(std::unique_ptr<InputFile> Input, } assert(ResI == Res.end()); - return RegularLTO.Mover.move(Obj->takeModule(), Keep, - [](GlobalValue &, IRMover::ValueAdder) {}); + return RegularLTO.Mover->move(Obj->takeModule(), Keep, + [](GlobalValue &, IRMover::ValueAdder) {}); } // Add a ThinLTO object to the link. @@ -316,14 +318,6 @@ Error LTO::addThinLTO(std::unique_ptr<InputFile> Input, SmallPtrSet<GlobalValue *, 8> Used; collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false); - // We need to initialize the target info for the combined regular LTO module - // in case we have no regular LTO objects. In that case we still need to build - // it as usual because the client may want to add symbol definitions to it. - if (RegularLTO.CombinedModule->getTargetTriple().empty()) { - RegularLTO.CombinedModule->setTargetTriple(M.getTargetTriple()); - RegularLTO.CombinedModule->setDataLayout(M.getDataLayout()); - } - MemoryBufferRef MBRef = Input->Obj->getMemoryBufferRef(); ErrorOr<std::unique_ptr<object::ModuleSummaryIndexObjectFile>> SummaryObjOrErr = @@ -357,12 +351,8 @@ unsigned LTO::getMaxTasks() const { } Error LTO::run(AddOutputFn AddOutput) { - // Invoke regular LTO if there was a regular LTO module to start with, - // or if there are any hooks that the linker may have used to add - // its own resolved symbols to the combined module. - if (RegularLTO.HasModule || Conf.PreOptModuleHook || - Conf.PostInternalizeModuleHook || Conf.PostOptModuleHook || - Conf.PreCodeGenModuleHook) + // Invoke regular LTO if there was a regular LTO module to start with. + if (RegularLTO.CombinedModule) if (auto E = runRegularLTO(AddOutput)) return E; return runThinLTO(AddOutput); @@ -660,7 +650,9 @@ Error LTO::runThinLTO(AddOutputFn AddOutput) { // ParallelCodeGenParallelismLevel, as tasks 0 through // ParallelCodeGenParallelismLevel-1 are reserved for parallel code generation // partitions. - unsigned Task = RegularLTO.ParallelCodeGenParallelismLevel; + unsigned Task = RegularLTO.CombinedModule + ? RegularLTO.ParallelCodeGenParallelismLevel + : 0; unsigned Partition = 1; for (auto &Mod : ThinLTO.ModuleMap) { |

