diff options
-rw-r--r-- | lld/COFF/Driver.cpp | 12 | ||||
-rw-r--r-- | lld/test/COFF/msvclto-archive.ll | 15 |
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" |