diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -262,6 +262,9 @@ ec = retryMb.getError(); if (!ec) mb = std::move(*retryMb); + } else { + // We've already handled this file. + return; } } if (ec) { diff --git a/lld/test/COFF/winsysroot.test b/lld/test/COFF/winsysroot.test --- a/lld/test/COFF/winsysroot.test +++ b/lld/test/COFF/winsysroot.test @@ -26,16 +26,27 @@ # RUN: lld-link %t.obj /winsysroot:%t.dir/sysroot \ # RUN: std32.lib /entry:main +Check that passing a lib from /winsysroot twice is ok +# RUN: lld-link %p/Inputs/hello64.obj /winsysroot:%t.dir/sysroot \ +# RUN: std64.lib std64.lib /entry:main + +Check unknown library +# RUN: not lld-link %p/Inputs/hello64.obj /winsysroot:%t.dir/sysroot \ +# RUN: notfound.lib /entry:main 2>&1 | FileCheck --check-prefix=UNKNOWNLIB %s +UNKNOWNLIB: could not open 'notfound.lib' + If winsysroot lib appears before we can detect arch we don't find it # RUN: not lld-link std64.lib %p/Inputs/hello64.obj /winsysroot:%t.dir/sysroot \ -# RUN: /entry:main +# RUN: /entry:main 2>&1 | FileCheck --check-prefix=NO64 %s Check we don't choose the wrong arch # RUN: not lld-link %t.obj /winsysroot:%t.dir/sysroot \ -# RUN: std64.lib /entry:main +# RUN: std64.lib /entry:main 2>&1 | FileCheck --check-prefix=NO64 %s +NO64: could not open 'std64.lib' # RUN: not lld-link %p/Inputs/hello64.obj /winsysroot:%t.dir/sysroot \ -# RUN: std32.lib /entry:main +# RUN: std32.lib /entry:main 2>&1 | FileCheck --check-prefix=NO32 %s +NO32: could not open 'std32.lib' Check that when /winsysroot is specified, %LIB% is ignored. # RUN: env LIB=foo.dir/sysroot/VC/Tools/MSVC/1.1.1.1/lib/x86 not lld-link %t.obj /winsysroot:%t.dir/doesnotexist /defaultlib:std32 2>&1 | FileCheck -check-prefix=LIBIGNORED %s