From 3d0f77b28193224fc33059a2b034000418fc4d1c Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Fri, 30 Sep 2016 17:56:20 +0000 Subject: [PATCH] Improve error check for an empty archive. Previously, it warned on any archive file that has no symbol. It turned out that that is too noisy. With this patch, it warns on such archive file that contains no file. Differential Revision: https://reviews.llvm.org/D25111 llvm-svn: 282885 --- lld/ELF/InputFiles.cpp | 18 ++++++++---------- lld/test/ELF/empty-archive.s | 4 +--- lld/test/ELF/lto/archive.ll | 5 +++++ 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index 7605ab007b53..c1b59c12d0f6 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -425,18 +425,16 @@ SymbolBody *elf::ObjectFile::createSymbolBody(const Elf_Sym *Sym) { template void ArchiveFile::parse() { File = check(Archive::create(MB), "failed to parse archive"); + // Checks for a common usage error of an ar command. + if (File->getNumberOfSymbols() == 0 && !File->isEmpty()) + warn(getName() + " has no symbol." + " Chances are you are doing an LTO build and forgot to use an ar" + " command that can create a symbol table for LLVM bitcode files." + " If so, use llvm-ar or GNU ar + plugin."); + // Read the symbol table to construct Lazy objects. - bool IsEmpty = true; - for (const Archive::Symbol &Sym : File->symbols()) { + for (const Archive::Symbol &Sym : File->symbols()) Symtab::X->addLazyArchive(this, Sym); - IsEmpty = false; - } - - if (IsEmpty) - warn(getName() + " has no symbol. Chances are you are doing " - "an LTO build and forgot to use an ar command that can create " - "a symbol table for LLVM bitcode files. If so, use llvm-ar or " - "GNU ar + plugin."); } // Returns a buffer pointing to a member file containing a given symbol. diff --git a/lld/test/ELF/empty-archive.s b/lld/test/ELF/empty-archive.s index a5ac59aea1db..ffb0a7814419 100644 --- a/lld/test/ELF/empty-archive.s +++ b/lld/test/ELF/empty-archive.s @@ -1,5 +1,3 @@ // RUN: llvm-ar rc %t.a // RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o -// RUN: ld.lld -shared %t.o %t.a -o t 2>&1 | FileCheck %s - -// CHECK: has no symbol. +// RUN: ld.lld -shared %t.o %t.a -o t diff --git a/lld/test/ELF/lto/archive.ll b/lld/test/ELF/lto/archive.ll index b3f69fb9920f..da5e055b0b8e 100644 --- a/lld/test/ELF/lto/archive.ll +++ b/lld/test/ELF/lto/archive.ll @@ -8,6 +8,9 @@ ; RUN: ld.lld -m elf_x86_64 %t2.o --whole-archive %t.a -o %t3 -shared ; RUN: llvm-readobj -t %t3 | FileCheck %s +; RUN: llvm-ar rcS %t4.a %t1.o +; RUN: ld.lld -m elf_x86_64 %t2.o %t4.a -o %t3 -shared 2>&1 \ +; RUN: | FileCheck -check-prefix=WARN %s ; CHECK: Name: g ( ; CHECK-NEXT: Value: @@ -25,6 +28,8 @@ ; CHECK-NEXT: Other: 0 ; CHECK-NEXT: Section: .text +; WARN: has no symbol. + target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" -- 2.34.1