Index: lld/trunk/ELF/InputFiles.cpp =================================================================== --- lld/trunk/ELF/InputFiles.cpp +++ lld/trunk/ELF/InputFiles.cpp @@ -425,18 +425,16 @@ 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. Index: lld/trunk/test/ELF/empty-archive.s =================================================================== --- lld/trunk/test/ELF/empty-archive.s +++ lld/trunk/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 Index: lld/trunk/test/ELF/lto/archive.ll =================================================================== --- lld/trunk/test/ELF/lto/archive.ll +++ lld/trunk/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"