[PATCH] D53017: [LLD] [COFF] Look for libfoo.a if foo.lib is specified, for MinGW

Martin Storsjö via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 10 02:03:48 PDT 2018


This revision was automatically updated to reflect the committed changes.
Closed by commit rL344124: [COFF] Look for libfoo.a if foo.lib is specified, for MinGW (authored by mstorsjo, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D53017?vs=168872&id=168951#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D53017

Files:
  lld/trunk/COFF/Driver.cpp
  lld/trunk/COFF/Driver.h
  lld/trunk/test/COFF/libname-mingw.test


Index: lld/trunk/test/COFF/libname-mingw.test
===================================================================
--- lld/trunk/test/COFF/libname-mingw.test
+++ lld/trunk/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
Index: lld/trunk/COFF/Driver.h
===================================================================
--- lld/trunk/COFF/Driver.h
+++ lld/trunk/COFF/Driver.h
@@ -89,6 +89,7 @@
   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();
Index: lld/trunk/COFF/Driver.cpp
===================================================================
--- lld/trunk/COFF/Driver.cpp
+++ lld/trunk/COFF/Driver.cpp
@@ -371,13 +371,30 @@
   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


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D53017.168951.patch
Type: text/x-patch
Size: 2207 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181010/d185b9b3/attachment.bin>


More information about the llvm-commits mailing list