summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Storsjo <martin@martin.st>2018-10-10 09:00:10 +0000
committerMartin Storsjo <martin@martin.st>2018-10-10 09:00:10 +0000
commit33d43ff8517c95918acccbc16d84eb1ca4baeef7 (patch)
tree0934c87b0717b08bc3c19df3b79bb471292b2efe
parent803b37ad5de61614a382c72bb7b3a69776a4fb82 (diff)
downloadbcm5719-llvm-33d43ff8517c95918acccbc16d84eb1ca4baeef7.tar.gz
bcm5719-llvm-33d43ff8517c95918acccbc16d84eb1ca4baeef7.zip
[COFF] Look for libfoo.a if foo.lib is specified, for MinGW
This allows using #pragma comment(lib, "foo") in MinGW built code, if built with -fms-extensions. (This works for system libraries and static libraries only, as it doesn't try to look for .dll.a. As ld.bfd doesn't support embedded defaultlib directives, this isn't in widespread use among mingw users.) Differential Revision: https://reviews.llvm.org/D53017 llvm-svn: 344124
-rw-r--r--lld/COFF/Driver.cpp19
-rw-r--r--lld/COFF/Driver.h1
-rw-r--r--lld/test/COFF/libname-mingw.test8
3 files changed, 27 insertions, 1 deletions
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index bc24b914c9d..ce6d4ac6e3b 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -371,13 +371,30 @@ Optional<StringRef> LinkerDriver::findFile(StringRef Filename) {
return Path;
}
+// MinGW specific. If an embedded directive specified to link to
+// foo.lib, but it isn't found, try libfoo.a instead.
+StringRef LinkerDriver::doFindLibMinGW(StringRef Filename) {
+ if (Filename.contains('/') || Filename.contains('\\'))
+ return Filename;
+
+ SmallString<128> S = Filename;
+ sys::path::replace_extension(S, ".a");
+ StringRef LibName = Saver.save("lib" + S.str());
+ return doFindFile(LibName);
+}
+
// Find library file from search path.
StringRef LinkerDriver::doFindLib(StringRef Filename) {
// Add ".lib" to Filename if that has no file extension.
bool HasExt = Filename.contains('.');
if (!HasExt)
Filename = Saver.save(Filename + ".lib");
- return doFindFile(Filename);
+ StringRef Ret = doFindFile(Filename);
+ // For MinGW, if the find above didn't turn up anything, try
+ // looking for a MinGW formatted library name.
+ if (Config->MinGW && Ret == Filename)
+ return doFindLibMinGW(Filename);
+ return Ret;
}
// Resolves a library path. /nodefaultlib options are taken into
diff --git a/lld/COFF/Driver.h b/lld/COFF/Driver.h
index e917955ec68..e779721ab75 100644
--- a/lld/COFF/Driver.h
+++ b/lld/COFF/Driver.h
@@ -89,6 +89,7 @@ private:
Optional<StringRef> findLib(StringRef Filename);
StringRef doFindFile(StringRef Filename);
StringRef doFindLib(StringRef Filename);
+ StringRef doFindLibMinGW(StringRef Filename);
// Parses LIB environment which contains a list of search paths.
void addLibSearchPaths();
diff --git a/lld/test/COFF/libname-mingw.test b/lld/test/COFF/libname-mingw.test
new file mode 100644
index 00000000000..171164f7346
--- /dev/null
+++ b/lld/test/COFF/libname-mingw.test
@@ -0,0 +1,8 @@
+# RUN: mkdir -p %t/a
+# RUN: cp %p/Inputs/std64.lib %t/a/libstd64.a
+
+# RUN: lld-link /lldmingw /out:%t.exe /entry:main /verbose \
+# RUN: /defaultlib:std64.lib /subsystem:console %p/Inputs/hello64.obj \
+# RUN: /libpath:%t/a 2>&1 | FileCheck %s
+
+CHECK: a{{[/\\]}}libstd64.a
OpenPOWER on IntegriCloud