[PATCH] D151815: [lld][COFF] Retry failed paths to take advantage of winsysroot search paths
Arthur Eubanks via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed May 31 08:58:53 PDT 2023
aeubanks created this revision.
aeubanks added reviewers: hans, thakis.
Herald added a project: All.
aeubanks requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
With /winsysroot and without /machine, we don't know which paths to add to the search paths.
We do autodetect machine type and add winsysroot search paths in SymbolTable::addFile(), but that happens after all input files are opened. So in the loop where we read files, if we fail to open a file we can retry with the winsysroot search path potentially added by reading a previous file. This will fail if we try to open something in the winsysroot before reading a file that can give us the architecture, but shrug.
Fixes #54409
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D151815
Files:
lld/COFF/Driver.cpp
lld/test/COFF/winsysroot.test
Index: lld/test/COFF/winsysroot.test
===================================================================
--- lld/test/COFF/winsysroot.test
+++ lld/test/COFF/winsysroot.test
@@ -12,6 +12,31 @@
# RUN: lld-link %p/Inputs/hello64.obj /winsysroot:%t.dir/sysroot \
# RUN: /defaultlib:std64 /entry:main
+Check directly passed lib with /machine:
+# RUN: lld-link %p/Inputs/hello64.obj /winsysroot:%t.dir/sysroot /machine:x64 \
+# RUN: std64.lib /entry:main
+
+# RUN: lld-link %t.obj /winsysroot:%t.dir/sysroot /machine:x86 \
+# RUN: std32.lib /entry:main
+
+Check directly passed lib without /machine: (should infer from obj arch)
+# RUN: lld-link %p/Inputs/hello64.obj /winsysroot:%t.dir/sysroot \
+# RUN: std64.lib /entry:main
+
+# RUN: lld-link %t.obj /winsysroot:%t.dir/sysroot \
+# RUN: std32.lib /entry:main
+
+FIXME: 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
+
+Check we don't choose the wrong arch
+# RUN: not lld-link %t.obj /winsysroot:%t.dir/sysroot \
+# RUN: std64.lib /entry:main
+
+# RUN: not lld-link %p/Inputs/hello64.obj /winsysroot:%t.dir/sysroot \
+# RUN: std32.lib /entry:main
+
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
LIBIGNORED: could not open 'std32.lib'
Index: lld/COFF/Driver.cpp
===================================================================
--- lld/COFF/Driver.cpp
+++ lld/COFF/Driver.cpp
@@ -247,10 +247,20 @@
createFutureForFile(std::string(path)));
std::string pathStr = std::string(path);
enqueueTask([=]() {
- auto mbOrErr = future->get();
- if (mbOrErr.second) {
- std::string msg =
- "could not open '" + pathStr + "': " + mbOrErr.second.message();
+ auto [mb, ec] = future->get();
+ if (ec) {
+ // Retry reading the file (synchronously) now that we may have added
+ // winsysroot search paths from SymbolTable::addFile().
+ if (std::optional<StringRef> retryPath = findFile(pathStr)) {
+ auto retryMb = MemoryBuffer::getFile(*retryPath, /*IsText=*/false,
+ /*RequiresNullTerminator=*/false);
+ ec = retryMb.getError();
+ if (!ec)
+ mb = std::move(*retryMb);
+ }
+ }
+ if (ec) {
+ std::string msg = "could not open '" + pathStr + "': " + ec.message();
// Check if the filename is a typo for an option flag. OptTable thinks
// that all args that are not known options and that start with / are
// filenames, but e.g. `/nodefaultlibs` is more likely a typo for
@@ -262,7 +272,7 @@
else
error(msg + "; did you mean '" + nearest + "'");
} else
- ctx.driver.addBuffer(std::move(mbOrErr.first), wholeArchive, lazy);
+ ctx.driver.addBuffer(std::move(mb), wholeArchive, lazy);
});
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D151815.527069.patch
Type: text/x-patch
Size: 3113 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230531/000afb02/attachment.bin>
More information about the llvm-commits
mailing list