From d418b1da384bf40a764295a2da499ba3982fd8ee Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Thu, 31 Mar 2016 23:12:18 +0000 Subject: [PATCH] ELF: Correctly handle --whole-archive for thin archives. Differential Revision: http://reviews.llvm.org/D18669 llvm-svn: 265073 --- lld/ELF/Driver.cpp | 8 +++++++- lld/ELF/Driver.h | 1 + lld/test/ELF/archive.s | 4 ++++ lld/test/ELF/whole-archive.s | 6 ++++++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 95d099f..320f9cb 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -71,7 +71,8 @@ static std::pair parseEmulation(StringRef S) { // Returns slices of MB by parsing MB as an archive file. // Each slice consists of a member file in the archive. -static std::vector getArchiveMembers(MemoryBufferRef MB) { +std::vector +LinkerDriver::getArchiveMembers(MemoryBufferRef MB) { std::unique_ptr File = check(Archive::create(MB), "failed to parse archive"); @@ -85,6 +86,11 @@ static std::vector getArchiveMembers(MemoryBufferRef MB) { File->getFileName()); V.push_back(Mb); } + + // Take ownership of memory buffers created for members of thin archives. + for (std::unique_ptr &MB : File->takeThinBuffers()) + OwningMBs.push_back(std::move(MB)); + return V; } diff --git a/lld/ELF/Driver.h b/lld/ELF/Driver.h index 0437ebf..0e9aaa9 100644 --- a/lld/ELF/Driver.h +++ b/lld/ELF/Driver.h @@ -28,6 +28,7 @@ public: void addLibrary(StringRef Name); private: + std::vector getArchiveMembers(MemoryBufferRef MB); void readConfigs(llvm::opt::InputArgList &Args); void createFiles(llvm::opt::InputArgList &Args); template void link(llvm::opt::InputArgList &Args); diff --git a/lld/test/ELF/archive.s b/lld/test/ELF/archive.s index 41d7445..59c96a5 100644 --- a/lld/test/ELF/archive.s +++ b/lld/test/ELF/archive.s @@ -6,6 +6,10 @@ # RUN: llvm-ar rcs %tar %t2 %t3 %t4 # RUN: ld.lld %t %tar %t5 -o %tout # RUN: llvm-nm %tout | FileCheck %s +# RUN: rm -f %tarthin +# RUN: llvm-ar --format=gnu rcsT %tarthin %t2 %t3 %t4 +# RUN: ld.lld %t %tarthin %t5 -o %tout +# RUN: llvm-nm %tout | FileCheck %s # REQUIRES: x86 # Nothing here. Just needed for the linker to create a undefined _start symbol. diff --git a/lld/test/ELF/whole-archive.s b/lld/test/ELF/whole-archive.s index 0a6b30f..a0ef6b9 100644 --- a/lld/test/ELF/whole-archive.s +++ b/lld/test/ELF/whole-archive.s @@ -30,5 +30,11 @@ // RUN: ld.lld -o %t3 %t.o --whole-archive %t.a --no-whole-archive // RUN: llvm-readobj --symbols %t3 | FileCheck --check-prefix=ADDED %s +// --whole-archive should also work with thin archives +// RUN: rm -f %tthin.a +// RUN: llvm-ar --format=gnu rcsT %tthin.a %ta.o +// RUN: ld.lld -o %t3 %t.o --whole-archive %tthin.a +// RUN: llvm-readobj --symbols %t3 | FileCheck --check-prefix=ADDED %s + .globl _start; _start: -- 2.7.4