[lld] r312171 - Support nested static libraries.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 30 13:55:42 PDT 2017


Author: ruiu
Date: Wed Aug 30 13:55:41 2017
New Revision: 312171

URL: http://llvm.org/viewvc/llvm-project?rev=312171&view=rev
Log:
Support nested static libraries.

MSVC link.exe supports nested static libraries. That is, an .a file can
contain other .a file as its member. It is reported that MySQL actually
depends on this feature.

Fixes https://bugs.llvm.org/show_bug.cgi?id=32674

Added:
    lld/trunk/test/COFF/Inputs/nested-archives.s
    lld/trunk/test/COFF/nested-archives.s
Modified:
    lld/trunk/COFF/InputFiles.cpp

Modified: lld/trunk/COFF/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/InputFiles.cpp?rev=312171&r1=312170&r2=312171&view=diff
==============================================================================
--- lld/trunk/COFF/InputFiles.cpp (original)
+++ lld/trunk/COFF/InputFiles.cpp Wed Aug 30 13:55:41 2017
@@ -65,6 +65,12 @@ void ArchiveFile::parse() {
   // Parse a MemoryBufferRef as an archive file.
   File = check(Archive::create(MB), toString(this));
 
+  // MSVC link.exe supports nested static libraries unlike Unix linkers.
+  // To support that, we'll add inner libraries to the symbol table.
+  for (MemoryBufferRef MB : getArchiveMembers(File.get()))
+    if (identify_magic(MB.getBuffer()) == file_magic::archive)
+      make<ArchiveFile>(MB)->parse();
+
   // Read the symbol table to construct Lazy objects.
   for (const Archive::Symbol &Sym : File->symbols())
     Symtab->addLazy(this, Sym);

Added: lld/trunk/test/COFF/Inputs/nested-archives.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/nested-archives.s?rev=312171&view=auto
==============================================================================
--- lld/trunk/test/COFF/Inputs/nested-archives.s (added)
+++ lld/trunk/test/COFF/Inputs/nested-archives.s Wed Aug 30 13:55:41 2017
@@ -0,0 +1,4 @@
+.text
+.global sub
+sub:
+  ret

Added: lld/trunk/test/COFF/nested-archives.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/nested-archives.s?rev=312171&view=auto
==============================================================================
--- lld/trunk/test/COFF/nested-archives.s (added)
+++ lld/trunk/test/COFF/nested-archives.s Wed Aug 30 13:55:41 2017
@@ -0,0 +1,13 @@
+# RUN: llvm-mc %p/Inputs/nested-archives.s -filetype=obj -triple=x86_64-windows-msvc -o %t1.obj
+# RUN: rm -f %t1.lib %t2.lib
+# RUN: llvm-ar cru %t1.lib %t1.obj
+# RUN: llvm-ar cru %t2.lib %t1.lib
+
+# RUN: llvm-mc %s -filetype=obj -triple=x86_64-windows-msvc -o %t2.obj
+# RUN: lld-link -entry:main -nodefaultlib %t2.obj %t2.lib -verbose | FileCheck %s
+# CHECK: Loaded nested-archives.s.tmp1.lib(nested-archives.s.tmp1.obj) for sub
+
+.text
+.global main, sub
+main:
+  call sub




More information about the llvm-commits mailing list