summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/COFF/Driver.cpp27
-rw-r--r--lld/test/COFF/msvclto-archive.ll21
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
+}
OpenPOWER on IntegriCloud