[lld] r297229 - Pass archive files to link.exe if they contain at least one native object file.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 7 13:26:10 PST 2017


Author: ruiu
Date: Tue Mar  7 15:26:10 2017
New Revision: 297229

URL: http://llvm.org/viewvc/llvm-project?rev=297229&view=rev
Log:
Pass archive files to link.exe if they contain at least one native object file.

Some archive files created during chromium build contains both BC
and native files. If that's the case, we want to pass the archive
file to link.exe. Otherwise, the MSVC linker would complain that
there's an unresolved symbol in a given set of files.

I cannot explain why link.exe doesn't complain about the presence
of bitcode files in this case, but it seems link.exe doesn't touch BC.

Modified:
    lld/trunk/COFF/Driver.cpp
    lld/trunk/test/COFF/msvclto-archive.ll

Modified: lld/trunk/COFF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=297229&r1=297228&r2=297229&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.cpp (original)
+++ lld/trunk/COFF/Driver.cpp Tue Mar  7 15:26:10 2017
@@ -418,8 +418,8 @@ static std::string getMapFile(const opt:
 }
 
 // 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;
   }
 

Modified: lld/trunk/test/COFF/msvclto-archive.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/msvclto-archive.ll?rev=297229&r1=297228&r2=297229&view=diff
==============================================================================
--- lld/trunk/test/COFF/msvclto-archive.ll (original)
+++ lld/trunk/test/COFF/msvclto-archive.ll Tue Mar  7 15:26:10 2017
@@ -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"




More information about the llvm-commits mailing list