Index: COFF/Config.h =================================================================== --- COFF/Config.h +++ 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: COFF/Driver.cpp =================================================================== --- COFF/Driver.cpp +++ 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: COFF/SymbolTable.cpp =================================================================== --- COFF/SymbolTable.cpp +++ 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: test/COFF/lto-opt-level.ll =================================================================== --- /dev/null +++ test/COFF/lto-opt-level.ll @@ -0,0 +1,18 @@ +; 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 + +; CHECK-O0: foo +; CHECK-O2-NOT: foo +define internal void @foo() { + ret void +} + +define void @main() { + call void @foo() + ret void +}