Index: lld/trunk/COFF/LTO.cpp =================================================================== --- lld/trunk/COFF/LTO.cpp +++ lld/trunk/COFF/LTO.cpp @@ -10,6 +10,7 @@ #include "Config.h" #include "InputFiles.h" #include "Symbols.h" +#include "lld/Common/Args.h" #include "lld/Common/ErrorHandler.h" #include "lld/Common/Strings.h" #include "lld/Common/TargetOptionsCommandFlags.h" @@ -61,6 +62,7 @@ C.OptLevel = Config->LTOO; C.CPU = GetCPUStr(); C.MAttrs = GetMAttrs(); + C.CGOptLevel = args::getCGOptLevel(Config->LTOO); if (Config->SaveTemps) checkError(C.addSaveTemps(std::string(Config->OutputFile) + ".", Index: lld/trunk/Common/Args.cpp =================================================================== --- lld/trunk/Common/Args.cpp +++ lld/trunk/Common/Args.cpp @@ -17,6 +17,15 @@ using namespace llvm; using namespace lld; +// TODO(sbc): Remove this once CGOptLevel can be set completely based on bitcode +// function metadata. +CodeGenOpt::Level lld::args::getCGOptLevel(int OptLevelLTO) { + if (OptLevelLTO == 3) + return CodeGenOpt::Aggressive; + assert(OptLevelLTO < 3); + return CodeGenOpt::Default; +} + int lld::args::getInteger(opt::InputArgList &Args, unsigned Key, int Default) { auto *A = Args.getLastArg(Key); if (!A) Index: lld/trunk/ELF/LTO.cpp =================================================================== --- lld/trunk/ELF/LTO.cpp +++ lld/trunk/ELF/LTO.cpp @@ -12,6 +12,7 @@ #include "LinkerScript.h" #include "SymbolTable.h" #include "Symbols.h" +#include "lld/Common/Args.h" #include "lld/Common/ErrorHandler.h" #include "lld/Common/TargetOptionsCommandFlags.h" #include "llvm/ADT/STLExtras.h" @@ -88,6 +89,7 @@ C.OptLevel = Config->LTOO; C.CPU = GetCPUStr(); C.MAttrs = GetMAttrs(); + C.CGOptLevel = args::getCGOptLevel(Config->LTOO); // Set up a custom pipeline if we've been asked to. C.OptPipeline = Config->LTONewPmPasses; Index: lld/trunk/include/lld/Common/Args.h =================================================================== --- lld/trunk/include/lld/Common/Args.h +++ lld/trunk/include/lld/Common/Args.h @@ -10,6 +10,7 @@ #define LLD_ARGS_H #include "lld/Common/LLVM.h" +#include "llvm/Support/CodeGen.h" #include "llvm/Support/MemoryBuffer.h" #include @@ -21,7 +22,11 @@ namespace lld { namespace args { + +llvm::CodeGenOpt::Level getCGOptLevel(int OptLevelLTO); + int getInteger(llvm::opt::InputArgList &Args, unsigned Key, int Default); + std::vector getStrings(llvm::opt::InputArgList &Args, int Id); uint64_t getZOptionValue(llvm::opt::InputArgList &Args, int Id, StringRef Key, Index: lld/trunk/wasm/LTO.cpp =================================================================== --- lld/trunk/wasm/LTO.cpp +++ lld/trunk/wasm/LTO.cpp @@ -10,6 +10,7 @@ #include "Config.h" #include "InputFiles.h" #include "Symbols.h" +#include "lld/Common/Args.h" #include "lld/Common/ErrorHandler.h" #include "lld/Common/Strings.h" #include "lld/Common/TargetOptionsCommandFlags.h" @@ -53,6 +54,7 @@ C.DiagHandler = diagnosticHandler; C.OptLevel = Config->LTOO; C.MAttrs = GetMAttrs(); + C.CGOptLevel = args::getCGOptLevel(Config->LTOO); if (Config->Relocatable) C.RelocModel = None;