From b6e6e4a0744320f1b996ae3c3e7fe593db8e0c97 Mon Sep 17 00:00:00 2001 From: Davide Italiano Date: Mon, 10 Oct 2016 23:12:14 +0000 Subject: [PATCH] [LTO] Split the options for ThinLTO jobs and Regular LTO partitions Differential Revision: https://reviews.llvm.org/D25452 llvm-svn: 283817 --- lld/ELF/Config.h | 3 ++- lld/ELF/Driver.cpp | 9 ++++++--- lld/ELF/LTO.cpp | 7 ++++--- lld/ELF/Options.td | 4 +++- lld/test/ELF/basic.s | 7 +++++-- lld/test/ELF/lto/parallel-internalize.ll | 3 ++- lld/test/ELF/lto/parallel.ll | 2 +- lld/test/ELF/lto/thinlto.ll | 4 ++-- 8 files changed, 25 insertions(+), 14 deletions(-) diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index cd6e5e3..a92c512 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -138,9 +138,10 @@ struct Configuration { uint64_t ImageBase; uint64_t MaxPageSize; uint64_t ZStackSize; - unsigned LtoJobs; + unsigned LtoPartitions; unsigned LtoO; unsigned Optimize; + unsigned ThinLtoJobs; }; // The only instance of Configuration struct. diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 2062872..d9208f3 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -481,9 +481,12 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { Config->LtoO = getInteger(Args, OPT_lto_O, 2); if (Config->LtoO > 3) error("invalid optimization level for LTO: " + getString(Args, OPT_lto_O)); - Config->LtoJobs = getInteger(Args, OPT_lto_jobs, 1); - if (Config->LtoJobs == 0) - error("number of threads must be > 0"); + Config->LtoPartitions = getInteger(Args, OPT_lto_partitions, 1); + if (Config->LtoPartitions == 0) + error("--lto-partitions: number of threads must be > 0"); + Config->ThinLtoJobs = getInteger(Args, OPT_thinlto_jobs, -1u); + if (Config->ThinLtoJobs == 0) + error("--thinlto-jobs: number of threads must be > 0"); Config->ZCombreloc = !hasZOption(Args, "nocombreloc"); Config->ZExecStack = hasZOption(Args, "execstack"); diff --git a/lld/ELF/LTO.cpp b/lld/ELF/LTO.cpp index ede80c2..9ddf223 100644 --- a/lld/ELF/LTO.cpp +++ b/lld/ELF/LTO.cpp @@ -68,9 +68,10 @@ static std::unique_ptr createLTO() { /*UseInputModulePath*/ true)); lto::ThinBackend Backend; - if (Config->LtoJobs) - Backend = lto::createInProcessThinBackend(Config->LtoJobs); - return llvm::make_unique(std::move(Conf), Backend, Config->LtoJobs); + if (Config->ThinLtoJobs != -1u) + Backend = lto::createInProcessThinBackend(Config->ThinLtoJobs); + return llvm::make_unique(std::move(Conf), Backend, + Config->LtoPartitions); } BitcodeCompiler::BitcodeCompiler() : LtoObj(createLTO()) {} diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td index 6acd7e3..e01ba28 100644 --- a/lld/ELF/Options.td +++ b/lld/ELF/Options.td @@ -303,11 +303,13 @@ def alias_version_script_version_script: J<"version-script=">, Alias; // LTO-related options. -def lto_jobs: J<"lto-jobs=">, HelpText<"Number of threads to run codegen">; def lto_aa_pipeline: J<"lto-aa-pipeline=">, HelpText<"AA pipeline to run during LTO. Used in conjunction with -lto-newpm-passes">; def lto_newpm_passes: J<"lto-newpm-passes=">, HelpText<"Passes to run during LTO">; +def lto_partitions: J<"lto-partitions=">, + HelpText<"Number of LTO codegen partitions">; def disable_verify: F<"disable-verify">; def mllvm: S<"mllvm">; def save_temps: F<"save-temps">; +def thinlto_jobs: J<"thinlto-jobs=">, HelpText<"Number of ThinLTO jobs">; diff --git a/lld/test/ELF/basic.s b/lld/test/ELF/basic.s index e9e1b3a..69ff254f 100644 --- a/lld/test/ELF/basic.s +++ b/lld/test/ELF/basic.s @@ -226,5 +226,8 @@ _start: # RUN: not ld.lld %t -o %t -m wrong_emul_fbsd 2>&1 | FileCheck --check-prefix=UNKNOWN_EMUL %s # UNKNOWN_EMUL: unknown emulation: wrong_emul_fbsd -# RUN: not ld.lld %t --lto-jobs=0 2>&1 | FileCheck --check-prefix=NOTHREADS %s -# NOTHREADS: number of threads must be > 0 +# RUN: not ld.lld %t --lto-partitions=0 2>&1 | FileCheck --check-prefix=NOTHREADS %s +# NOTHREADS: --lto-partitions: number of threads must be > 0 + +# RUN: not ld.lld %t --thinlto-jobs=0 2>&1 | FileCheck --check-prefix=NOTHREADSTHIN %s +# NOTHREADSTHIN: --thinlto-jobs: number of threads must be > 0 diff --git a/lld/test/ELF/lto/parallel-internalize.ll b/lld/test/ELF/lto/parallel-internalize.ll index 58ed50e..3bccb65 100644 --- a/lld/test/ELF/lto/parallel-internalize.ll +++ b/lld/test/ELF/lto/parallel-internalize.ll @@ -1,6 +1,7 @@ ; REQUIRES: x86 ; RUN: llvm-as -o %t.bc %s -; RUN: ld.lld -m elf_x86_64 --lto-jobs=2 -save-temps -o %t %t.bc -e foo --lto-O0 +; RUN: ld.lld -m elf_x86_64 --lto-partitions=2 -save-temps -o %t %t.bc \ +; RUN: -e foo --lto-O0 ; RUN: llvm-readobj -t -dyn-symbols %t | FileCheck %s ; RUN: llvm-nm %t0.lto.o | FileCheck --check-prefix=CHECK0 %s ; RUN: llvm-nm %t1.lto.o | FileCheck --check-prefix=CHECK1 %s diff --git a/lld/test/ELF/lto/parallel.ll b/lld/test/ELF/lto/parallel.ll index 8ea62ef..c5d7ca4 100644 --- a/lld/test/ELF/lto/parallel.ll +++ b/lld/test/ELF/lto/parallel.ll @@ -1,6 +1,6 @@ ; REQUIRES: x86 ; RUN: llvm-as -o %t.bc %s -; RUN: ld.lld -m elf_x86_64 --lto-jobs=2 -save-temps -o %t %t.bc -shared +; RUN: ld.lld -m elf_x86_64 --lto-partitions=2 -save-temps -o %t %t.bc -shared ; RUN: llvm-nm %t0.lto.o | FileCheck --check-prefix=CHECK0 %s ; RUN: llvm-nm %t1.lto.o | FileCheck --check-prefix=CHECK1 %s diff --git a/lld/test/ELF/lto/thinlto.ll b/lld/test/ELF/lto/thinlto.ll index 98d4aff..2ceb3bc 100644 --- a/lld/test/ELF/lto/thinlto.ll +++ b/lld/test/ELF/lto/thinlto.ll @@ -3,14 +3,14 @@ ; RUN: llvm-as %p/Inputs/thinlto.ll -o %t2.o ; First force single-threaded mode -; RUN: ld.lld -save-temps --lto-jobs=1 -shared %t.o %t2.o -o %t +; RUN: ld.lld -save-temps --thinlto-jobs=1 -shared %t.o %t2.o -o %t ; RUN: llvm-nm %t.lto.o | FileCheck %s --check-prefix=NM ; NM: T f ; NM: T g ; Next force multi-threaded mode -; RUN: ld.lld -save-temps --lto-jobs=2 -shared %t.o %t2.o -o %t2 +; RUN: ld.lld -save-temps --thinlto-jobs=2 -shared %t.o %t2.o -o %t2 ; RUN: llvm-nm %t20.lto.o | FileCheck %s --check-prefix=NM1 ; RUN: llvm-nm %t21.lto.o | FileCheck %s --check-prefix=NM2 -- 2.7.4