Index: lld/trunk/ELF/Driver.cpp =================================================================== --- lld/trunk/ELF/Driver.cpp +++ lld/trunk/ELF/Driver.cpp @@ -213,7 +213,15 @@ // understand the LLVM bitcode file. It is a pretty common error, so // we'll handle it as if it had a symbol table. if (!File->isEmpty() && !File->hasSymbolTable()) { - for (const auto &P : getArchiveMembers(MBRef)) + // Check if all members are bitcode files. If not, ignore, which is the + // default action without the LTO hack described above. + for (const std::pair &P : + getArchiveMembers(MBRef)) + if (identify_magic(P.first.getBuffer()) != file_magic::bitcode) + return; + + for (const std::pair &P : + getArchiveMembers(MBRef)) Files.push_back(make(P.first, Path, P.second)); return; } Index: lld/trunk/test/ELF/invalid/invalid-elf.test =================================================================== --- lld/trunk/test/ELF/invalid/invalid-elf.test +++ lld/trunk/test/ELF/invalid/invalid-elf.test @@ -4,7 +4,7 @@ # RUN: echo > %t/empty.o # RUN: llvm-ar --format=gnu cr %t/not-elf.a %t/empty.o -# RUN: not ld.lld %t/simple.o %t/not-elf.a -o %t2 2>&1 | \ +# RUN: not ld.lld --whole-archive %t/not-elf.a -o %t2 2>&1 | \ # RUN: FileCheck --check-prefix=NOT-ELF %s # NOT-ELF: not-elf.a(empty.o): not an ELF file Index: lld/trunk/test/ELF/lto/archive-no-index.ll =================================================================== --- lld/trunk/test/ELF/lto/archive-no-index.ll +++ lld/trunk/test/ELF/lto/archive-no-index.ll @@ -1,8 +1,6 @@ ; REQUIRES: x86 -; Tests that we suggest that LTO symbols missing from an archive index -; may be the cause of undefined references, but only if we both -; encountered an empty archive index and undefined references (to prevent -; noisy false alarms). +; Tests that we accept an archive file without symbol table +; if all the member files are bitcode files. ; RUN: llvm-as -o %t1.o %s ; RUN: llvm-as -o %t2.o %S/Inputs/archive.ll @@ -23,3 +21,14 @@ call void @f() ret i32 0 } + +; RUN: echo 'f:' | llvm-mc -triple=x86_64-pc-linux -filetype=obj - -o %t3.o +; RUN: rm -f %t3.a +; RUN: llvm-ar crS %t3.a %t3.o +; RUN: not ld.lld -o /dev/null -emain %t1.o %t3.a 2>&1 | FileCheck -check-prefix=ERR1 %s +; ERR1: error: undefined symbol: f + +; RUN: rm -f %t4.a +; RUN: llvm-ar cr %t4.a +; RUN: not ld.lld -o /dev/null -emain %t1.o %t4.a 2>&1 | FileCheck -check-prefix=ERR2 %s +; ERR2: error: undefined symbol: f