From b6ffcf7fbde32a91409b594515fe1d5de32f273a Mon Sep 17 00:00:00 2001 From: Teresa Johnson Date: Fri, 16 Sep 2016 13:54:19 +0000 Subject: [PATCH] [LTO] Fix handling of mixed (regular and thin) mode LTO Summary: In runThinLTO we start the task numbering for ThinLTO backend tasks depending on whether there was also a regular LTO object (CombinedModule). However, the CombinedModule is moved at the end of runRegularLTO, so we need to save this information and pass it into runThinLTO. Otherwise the AddOutput callback to the client will use the same task number for both the regular LTO object and the first ThinLTO object, which in gold-plugin caused only one to be end up in the output filename array and therefore passed back to gold for the final native link. Reviewers: pcc, mehdi_amini Subscribers: mehdi_amini, kromanova Differential Revision: https://reviews.llvm.org/D24643 llvm-svn: 281725 --- include/llvm/LTO/LTO.h | 2 +- lib/LTO/LTO.cpp | 15 +++++++++------ test/LTO/Resolution/X86/Inputs/mixed_lto.ll | 6 ++++++ test/LTO/Resolution/X86/mixed_lto.ll | 19 +++++++++++++++++++ test/tools/gold/X86/Inputs/mixed_lto.ll | 6 ++++++ test/tools/gold/X86/mixed_lto.ll | 18 ++++++++++++++++++ 6 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 test/LTO/Resolution/X86/Inputs/mixed_lto.ll create mode 100644 test/LTO/Resolution/X86/mixed_lto.ll create mode 100644 test/tools/gold/X86/Inputs/mixed_lto.ll create mode 100644 test/tools/gold/X86/mixed_lto.ll diff --git a/include/llvm/LTO/LTO.h b/include/llvm/LTO/LTO.h index 86b76135740..5c622de85c7 100644 --- a/include/llvm/LTO/LTO.h +++ b/include/llvm/LTO/LTO.h @@ -387,7 +387,7 @@ private: ArrayRef Res); Error runRegularLTO(AddOutputFn AddOutput); - Error runThinLTO(AddOutputFn AddOutput); + Error runThinLTO(AddOutputFn AddOutput, bool HasRegularLTO); mutable bool CalledGetMaxTasks = false; }; diff --git a/lib/LTO/LTO.cpp b/lib/LTO/LTO.cpp index a1c287a10ad..0d47cd49a17 100644 --- a/lib/LTO/LTO.cpp +++ b/lib/LTO/LTO.cpp @@ -410,11 +410,15 @@ unsigned LTO::getMaxTasks() const { } Error LTO::run(AddOutputFn AddOutput) { + // Save the status of having a regularLTO combined module, as + // this is needed for generating the ThinLTO Task ID, and + // the CombinedModule will be moved at the end of runRegularLTO. + bool HasRegularLTO = RegularLTO.CombinedModule != nullptr; // Invoke regular LTO if there was a regular LTO module to start with. - if (RegularLTO.CombinedModule) + if (HasRegularLTO) if (auto E = runRegularLTO(AddOutput)) return E; - return runThinLTO(AddOutput); + return runThinLTO(AddOutput, HasRegularLTO); } Error LTO::runRegularLTO(AddOutputFn AddOutput) { @@ -696,7 +700,7 @@ ThinBackend lto::createWriteIndexesThinBackend(std::string OldPrefix, }; } -Error LTO::runThinLTO(AddOutputFn AddOutput) { +Error LTO::runThinLTO(AddOutputFn AddOutput, bool HasRegularLTO) { if (ThinLTO.ModuleMap.empty()) return Error(); @@ -753,9 +757,8 @@ Error LTO::runThinLTO(AddOutputFn AddOutput) { // ParallelCodeGenParallelismLevel if an LTO module is present, as tasks 0 // through ParallelCodeGenParallelismLevel-1 are reserved for parallel code // generation partitions. - unsigned Task = RegularLTO.CombinedModule - ? RegularLTO.ParallelCodeGenParallelismLevel - : 0; + unsigned Task = + HasRegularLTO ? RegularLTO.ParallelCodeGenParallelismLevel : 0; unsigned Partition = 1; for (auto &Mod : ThinLTO.ModuleMap) { diff --git a/test/LTO/Resolution/X86/Inputs/mixed_lto.ll b/test/LTO/Resolution/X86/Inputs/mixed_lto.ll new file mode 100644 index 00000000000..44e82c9fac7 --- /dev/null +++ b/test/LTO/Resolution/X86/Inputs/mixed_lto.ll @@ -0,0 +1,6 @@ +target triple = "x86_64-unknown-linux-gnu" +declare i32 @g() +define i32 @main() { + call i32 @g() + ret i32 0 +} diff --git a/test/LTO/Resolution/X86/mixed_lto.ll b/test/LTO/Resolution/X86/mixed_lto.ll new file mode 100644 index 00000000000..ea56a2a2c62 --- /dev/null +++ b/test/LTO/Resolution/X86/mixed_lto.ll @@ -0,0 +1,19 @@ +; Test mixed-mode LTO (mix of regular and thin LTO objects) +; RUN: opt %s -o %t1.o +; RUN: opt -module-summary %p/Inputs/mixed_lto.ll -o %t2.o + +; RUN: llvm-lto2 -o %t3.o %t2.o %t1.o -r %t2.o,main,px -r %t2.o,g, -r %t1.o,g,px + +; Task 0 is the regular LTO file (this file) +; RUN: nm %t3.o.0 | FileCheck %s --check-prefix=NM0 +; NM0: T g + +; Task 1 is the (first) ThinLTO file (Inputs/mixed_lto.ll) +; RUN: nm %t3.o.1 | FileCheck %s --check-prefix=NM1 +; NM1-DAG: T main +; NM1-DAG: U g + +target triple = "x86_64-unknown-linux-gnu" +define i32 @g() { + ret i32 0 +} diff --git a/test/tools/gold/X86/Inputs/mixed_lto.ll b/test/tools/gold/X86/Inputs/mixed_lto.ll new file mode 100644 index 00000000000..44e82c9fac7 --- /dev/null +++ b/test/tools/gold/X86/Inputs/mixed_lto.ll @@ -0,0 +1,6 @@ +target triple = "x86_64-unknown-linux-gnu" +declare i32 @g() +define i32 @main() { + call i32 @g() + ret i32 0 +} diff --git a/test/tools/gold/X86/mixed_lto.ll b/test/tools/gold/X86/mixed_lto.ll new file mode 100644 index 00000000000..6a326e57f14 --- /dev/null +++ b/test/tools/gold/X86/mixed_lto.ll @@ -0,0 +1,18 @@ +; Test mixed-mode LTO (mix of regular and thin LTO objects) +; RUN: opt %s -o %t.o +; RUN: opt -module-summary %p/Inputs/mixed_lto.ll -o %t2.o + +; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold.so \ +; RUN: -shared \ +; RUN: --plugin-opt=thinlto \ +; RUN: --plugin-opt=-import-instr-limit=0 \ +; RUN: -o %t3.o %t2.o %t.o +; RUN: nm %t3.o | FileCheck %s + +; CHECK-DAG: T main +; CHECK-DAG: T g + +target triple = "x86_64-unknown-linux-gnu" +define i32 @g() { + ret i32 0 +}