summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/COFF/Driver.cpp12
-rw-r--r--lld/test/COFF/msvclto-archive.ll15
2 files changed, 18 insertions, 9 deletions
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index 0d14ca40671..51f0b72339a 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -418,8 +418,8 @@ static std::string getMapFile(const opt::InputArgList &Args) {
}
// Returns true if a given file is a LLVM bitcode file. If it is a
-// static library, this function look at the first file in the archive
-// to determine if it's a bitcode file.
+// static library, this function returns true if all files in the
+// archive are bitcode files.
static bool isBitcodeFile(StringRef Path) {
using namespace sys::fs;
@@ -433,14 +433,18 @@ static bool isBitcodeFile(StringRef Path) {
if (Magic == file_magic::archive) {
std::unique_ptr<Archive> File =
check(Archive::create(MB->getMemBufferRef()));
+
Error Err = Error::success();
for (const ErrorOr<Archive::Child> &COrErr : File->children(Err)) {
if (Err)
- return true;
+ return false;
Archive::Child C = check(COrErr);
MemoryBufferRef MBRef = check(C.getMemoryBufferRef());
- return identify_magic(MBRef.getBuffer()) == file_magic::bitcode;
+ if (identify_magic(MBRef.getBuffer()) != file_magic::bitcode)
+ return false;
}
+ if (Err)
+ return false;
return true;
}
diff --git a/lld/test/COFF/msvclto-archive.ll b/lld/test/COFF/msvclto-archive.ll
index b525fad3709..937ef5325bf 100644
--- a/lld/test/COFF/msvclto-archive.ll
+++ b/lld/test/COFF/msvclto-archive.ll
@@ -1,14 +1,19 @@
-;; Make sure we do not pass archive files containing bitcode files.
+;; Make sure we do not pass archive files containing only bitcode files.
; RUN: llvm-as -o %t.obj %s
-; RUN: llvm-ar cru %t-main.a %t.obj
+; RUN: llvm-ar cru %t-main1.a %t.obj
; RUN: mkdir -p %t.dir
; RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o %t.dir/bitcode.obj %p/Inputs/msvclto.s
-; RUN: lld-link %t-main.a %t.dir/bitcode.obj /msvclto /out:%t.exe /opt:lldlto=1 /opt:icf \
+; RUN: lld-link %t-main1.a %t.dir/bitcode.obj /msvclto /out:%t.exe /opt:lldlto=1 /opt:icf \
; RUN: /entry:main /verbose > %t.log || true
-; RUN: FileCheck %s < %t.log
+; RUN: FileCheck -check-prefix=BC %s < %t.log
+; BC-NOT: link.exe {{.*}}-main1.a
-; CHECK-NOT: link.exe {{.*}}t-main.a
+; RUN: llvm-ar cru %t-main2.a %t.obj %t.dir/bitcode.obj
+; RUN: lld-link %t.dir/bitcode.obj %t-main2.a /msvclto /out:%t.exe /opt:lldlto=1 /opt:icf \
+; RUN: /entry:main /verbose > %t.log || true
+; RUN: FileCheck -check-prefix=OBJ %s < %t.log
+; OBJ: link.exe {{.*}}-main2.a
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc"
OpenPOWER on IntegriCloud