From ed22f9b6f10d39643754f037bff1210be0acdee5 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Thu, 31 Mar 2016 21:00:27 +0000 Subject: [PATCH] ELF: Add flag for controlling LTO optimization level. Differential Revision: http://reviews.llvm.org/D18667 llvm-svn: 265053 --- lld/ELF/Config.h | 1 + lld/ELF/Driver.cpp | 6 ++++++ lld/ELF/LTO.cpp | 2 +- lld/ELF/Options.td | 3 +++ lld/test/ELF/lto/opt-level.ll | 21 +++++++++++++++++++++ 5 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 lld/test/ELF/lto/opt-level.ll diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index 591b625..254720f 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -90,6 +90,7 @@ struct Configuration { ELFKind EKind = ELFNoneKind; uint16_t EMachine = llvm::ELF::EM_NONE; uint64_t EntryAddr = -1; + unsigned LtoO = 2; unsigned Optimize = 0; }; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index eaa27ee..cfcdc7c 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -282,6 +282,12 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { error("invalid optimization level"); } + if (auto *Arg = Args.getLastArg(OPT_lto_O)) { + StringRef Val = Arg->getValue(); + if (Val.getAsInteger(10, Config->LtoO)) + error("invalid optimization level"); + } + if (auto *Arg = Args.getLastArg(OPT_hash_style)) { StringRef S = Arg->getValue(); if (S == "gnu") { diff --git a/lld/ELF/LTO.cpp b/lld/ELF/LTO.cpp index b1d5d60..abcafb1 100644 --- a/lld/ELF/LTO.cpp +++ b/lld/ELF/LTO.cpp @@ -62,7 +62,7 @@ static void runLTOPasses(Module &M, TargetMachine &TM) { PMB.VerifyOutput = true; PMB.LoopVectorize = true; PMB.SLPVectorize = true; - PMB.OptLevel = 2; // FIXME: This should be an option. + PMB.OptLevel = Config->LtoO; PMB.populateLTOPassManager(LtoPasses); LtoPasses.run(M); diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td index 6b4ead2..cc093da 100644 --- a/lld/ELF/Options.td +++ b/lld/ELF/Options.td @@ -75,6 +75,9 @@ def init : Separate<["-"], "init">, MetaVarName<"">, def l : JoinedOrSeparate<["-"], "l">, MetaVarName<"">, HelpText<"Root name of library to use">; +def lto_O : Joined<["--"], "lto-O">, MetaVarName<"">, + HelpText<"Optimization level for LTO">; + def m : JoinedOrSeparate<["-"], "m">, HelpText<"Set target emulation">; diff --git a/lld/test/ELF/lto/opt-level.ll b/lld/test/ELF/lto/opt-level.ll new file mode 100644 index 0000000..c52588e --- /dev/null +++ b/lld/test/ELF/lto/opt-level.ll @@ -0,0 +1,21 @@ +; RUN: llvm-as -o %t.o %s +; RUN: ld.lld -o %t0 -m elf_x86_64 -e main --lto-O0 %t.o +; RUN: llvm-nm %t0 | FileCheck --check-prefix=CHECK-O0 %s +; RUN: ld.lld -o %t2 -m elf_x86_64 -e main --lto-O2 %t.o +; RUN: llvm-nm %t2 | FileCheck --check-prefix=CHECK-O2 %s +; RUN: ld.lld -o %t2a -m elf_x86_64 -e main %t.o +; RUN: llvm-nm %t2a | FileCheck --check-prefix=CHECK-O2 %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; CHECK-O0: foo +; CHECK-O2-NOT: foo +define internal void @foo() { + ret void +} + +define void @main() { + call void @foo() + ret void +} -- 2.7.4