diff options
-rw-r--r-- | lld/COFF/Driver.cpp | 27 | ||||
-rw-r--r-- | lld/test/COFF/msvclto-archive.ll | 21 |
2 files changed, 46 insertions, 2 deletions
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 369a329ccc0..0d14ca40671 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -417,11 +417,34 @@ static std::string getMapFile(const opt::InputArgList &Args) { return (OutFile.substr(0, OutFile.rfind('.')) + ".map").str(); } +// 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 bool isBitcodeFile(StringRef Path) { + using namespace sys::fs; + std::unique_ptr<MemoryBuffer> MB = check( MemoryBuffer::getFile(Path, -1, false, true), "could not open " + Path); - StringRef Buf = MB->getBuffer(); - return sys::fs::identify_magic(Buf) == sys::fs::file_magic::bitcode; + file_magic Magic = identify_magic(MB->getBuffer()); + + if (Magic == file_magic::bitcode) + return true; + + 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; + Archive::Child C = check(COrErr); + MemoryBufferRef MBRef = check(C.getMemoryBufferRef()); + return identify_magic(MBRef.getBuffer()) == file_magic::bitcode; + } + return true; + } + + return false; } // Create response file contents and invoke the MSVC linker. diff --git a/lld/test/COFF/msvclto-archive.ll b/lld/test/COFF/msvclto-archive.ll new file mode 100644 index 00000000000..b525fad3709 --- /dev/null +++ b/lld/test/COFF/msvclto-archive.ll @@ -0,0 +1,21 @@ +;; Make sure we do not pass archive files containing bitcode files. + +; RUN: llvm-as -o %t.obj %s +; RUN: llvm-ar cru %t-main.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: /entry:main /verbose > %t.log || true +; RUN: FileCheck %s < %t.log + +; CHECK-NOT: link.exe {{.*}}t-main.a + +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-pc-windows-msvc" + +declare void @foo() + +define i32 @main() { + call void @foo() + ret i32 0 +} |