template <class ELFT> 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<ELFT>::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.
// 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
; 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:
; 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"