From c89bff2ce1b58de373612b22f500456db3320deb Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Tue, 23 Feb 2016 18:17:11 +0000 Subject: [PATCH] Handle bitcode files in archive files with --whole-archive. This patch moves BitcodeFile instantiation into createObjectFile. Previously, we handle bitcode files outside that function and did not handle for --whole-archive. http://reviews.llvm.org/D17527 llvm-svn: 261663 --- lld/ELF/Driver.cpp | 3 --- lld/ELF/InputFiles.cpp | 7 ++++++- lld/ELF/Symbols.cpp | 7 ------- lld/test/ELF/lto/archive.ll | 2 ++ 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 13e211d..5d08237 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -113,9 +113,6 @@ void LinkerDriver::addFile(StringRef Path) { case file_magic::elf_shared_object: Files.push_back(createSharedFile(MBRef)); return; - case sys::fs::file_magic::bitcode: - Files.push_back(make_unique(MBRef)); - return; default: Files.push_back(createObjectFile(MBRef)); } diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index 5a942ba..2ba02fc 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -491,7 +491,12 @@ static std::unique_ptr createELFFile(MemoryBufferRef MB) { std::unique_ptr elf2::createObjectFile(MemoryBufferRef MB, StringRef ArchiveName) { - std::unique_ptr F = createELFFile(MB); + using namespace sys::fs; + std::unique_ptr F; + if (identify_magic(MB.getBuffer()) == file_magic::bitcode) + F.reset(new BitcodeFile(MB)); + else + F = createELFFile(MB); F->ArchiveName = ArchiveName; return F; } diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index ff08996..39abc47 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -209,13 +209,6 @@ std::unique_ptr Lazy::getMember() { // read from the library. if (MBRef.getBuffer().empty()) return std::unique_ptr(nullptr); - - if (sys::fs::identify_magic(MBRef.getBuffer()) == - sys::fs::file_magic::bitcode) { - auto Ret = make_unique(MBRef); - Ret->ArchiveName = File->getName(); - return std::move(Ret); - } return createObjectFile(MBRef, File->getName()); } diff --git a/lld/test/ELF/lto/archive.ll b/lld/test/ELF/lto/archive.ll index 37be78b..b3f69fb 100644 --- a/lld/test/ELF/lto/archive.ll +++ b/lld/test/ELF/lto/archive.ll @@ -5,6 +5,8 @@ ; RUN: llvm-as %s -o %t2.o ; RUN: ld.lld -m elf_x86_64 %t2.o %t.a -o %t3 -shared ; RUN: llvm-readobj -t %t3 | FileCheck %s +; RUN: ld.lld -m elf_x86_64 %t2.o --whole-archive %t.a -o %t3 -shared +; RUN: llvm-readobj -t %t3 | FileCheck %s ; CHECK: Name: g ( -- 2.7.4