Index: lld/trunk/COFF/Config.h =================================================================== --- lld/trunk/COFF/Config.h +++ lld/trunk/COFF/Config.h @@ -87,6 +87,9 @@ // Used for /opt:icf bool ICF = false; + // Used for /opt:lldlto=N + unsigned LTOOptLevel = 2; + // Used for /merge:from=to (e.g. /merge:.rdata=.text) std::map Merge; Index: lld/trunk/COFF/Driver.cpp =================================================================== --- lld/trunk/COFF/Driver.cpp +++ lld/trunk/COFF/Driver.cpp @@ -369,6 +369,14 @@ Config->ICF = true; continue; } + if (StringRef(S).startswith("lldlto=")) { + StringRef OptLevel = StringRef(S).substr(7); + if (OptLevel.getAsInteger(10, Config->LTOOptLevel) || + Config->LTOOptLevel > 3) { + error("/opt:lldlto: invalid optimization level: " + OptLevel); + } + continue; + } if (S != "ref" && S != "icf" && S != "noicf" && S != "lbr" && S != "nolbr" && !StringRef(S).startswith("icf=")) { Index: lld/trunk/COFF/SymbolTable.cpp =================================================================== --- lld/trunk/COFF/SymbolTable.cpp +++ lld/trunk/COFF/SymbolTable.cpp @@ -343,6 +343,7 @@ // Create an object file and add it to the symbol table by replacing any // DefinedBitcode symbols with the definitions in the object file. LTOCodeGenerator CG; + CG.setOptLevel(Config->LTOOptLevel); ObjectFile *Obj = createLTOObject(&CG); for (SymbolBody *Body : Obj->getSymbols()) { Index: lld/trunk/test/COFF/lto-opt-level.ll =================================================================== --- lld/trunk/test/COFF/lto-opt-level.ll +++ lld/trunk/test/COFF/lto-opt-level.ll @@ -0,0 +1,21 @@ +; RUN: llvm-as -o %t.obj %s +; RUN: lld-link /out:%t0.exe /entry:main /subsystem:console /opt:lldlto=0 /debug %t.obj +; RUN: llvm-nm %t0.exe | FileCheck --check-prefix=CHECK-O0 %s +; RUN: lld-link /out:%t2.exe /entry:main /subsystem:console /opt:lldlto=2 /debug %t.obj +; RUN: llvm-nm %t2.exe | FileCheck --check-prefix=CHECK-O2 %s +; RUN: lld-link /out:%t2a.exe /entry:main /subsystem:console /debug %t.obj +; RUN: llvm-nm %t2a.exe | FileCheck --check-prefix=CHECK-O2 %s + +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-pc-windows-msvc" + +; CHECK-O0: foo +; CHECK-O2-NOT: foo +define internal void @foo() { + ret void +} + +define void @main() { + call void @foo() + ret void +}