<div dir="ltr">Can you send a change to add new behavior to me so that I can review before you commit? This change seems fine, but in general, I want to keep an eye on it.</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 15, 2017 at 1:39 PM, Saleem Abdulrasool via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: compnerd<br>
Date: Thu Jun 15 15:39:58 2017<br>
New Revision: 305502<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=305502&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=305502&view=rev</a><br>
Log:<br>
COFF: add support for lib mode usage<br>
<br>
When link is invoked with `/def:` and no input files, it behaves as if<br>
`lib.exe` was invoked.  Emulate this behaviour, generating the import<br>
library from the def file that was passed.  Because there is no input to<br>
actually generate the dll, we simply process the def file early and exit<br>
once we have created the import library.<br>
<br>
Added:<br>
    lld/trunk/test/COFF/Inputs/<wbr>library.def<br>
    lld/trunk/test/COFF/lib.test<br>
Modified:<br>
    lld/trunk/COFF/Driver.cpp<br>
    lld/trunk/COFF/DriverUtils.cpp<br>
<br>
Modified: lld/trunk/COFF/Driver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=305502&r1=305501&r2=305502&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/COFF/Driver.<wbr>cpp?rev=305502&r1=305501&r2=<wbr>305502&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/COFF/Driver.cpp (original)<br>
+++ lld/trunk/COFF/Driver.cpp Thu Jun 15 15:39:58 2017<br>
@@ -703,8 +703,12 @@ void LinkerDriver::link(ArrayRef<<wbr>const c<br>
     }<br>
   }<br>
<br>
-  if (!Args.hasArgNoClaim(OPT_<wbr>INPUT))<br>
-    fatal("no input files");<br>
+  if (!Args.hasArgNoClaim(OPT_<wbr>INPUT)) {<br>
+    if (Args.hasArgNoClaim(OPT_<wbr>deffile))<br>
+      Config->NoEntry = true;<br>
+    else<br>
+      fatal("no input files");<br>
+  }<br>
<br>
   // Construct search path list.<br>
   SearchPaths.push_back("");<br>
@@ -986,6 +990,13 @@ void LinkerDriver::link(ArrayRef<<wbr>const c<br>
     parseModuleDefs(Arg->getValue(<wbr>));<br>
   }<br>
<br>
+  // Handle generation of import library from a def file.<br>
+  if (!Args.hasArgNoClaim(OPT_<wbr>INPUT)) {<br>
+    fixupExports();<br>
+    createImportLibrary();<br>
+    exit(0);<br>
+  }<br>
+<br>
   // Handle /delayload<br>
   for (auto *Arg : Args.filtered(OPT_delayload)) {<br>
     Config->DelayLoads.insert(<wbr>StringRef(Arg->getValue()).<wbr>lower());<br>
<br>
Modified: lld/trunk/COFF/DriverUtils.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/DriverUtils.cpp?rev=305502&r1=305501&r2=305502&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/COFF/<wbr>DriverUtils.cpp?rev=305502&r1=<wbr>305501&r2=305502&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/COFF/DriverUtils.cpp (original)<br>
+++ lld/trunk/COFF/DriverUtils.cpp Thu Jun 15 15:39:58 2017<br>
@@ -522,7 +522,7 @@ void fixupExports() {<br>
<br>
   for (Export &E : Config->Exports) {<br>
     SymbolBody *Sym = E.Sym;<br>
-    if (!E.ForwardTo.empty()) {<br>
+    if (!E.ForwardTo.empty() || !Sym) {<br>
       E.SymbolName = E.Name;<br>
     } else {<br>
       if (auto *U = dyn_cast<Undefined>(Sym))<br>
<br>
Added: lld/trunk/test/COFF/Inputs/<wbr>library.def<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/library.def?rev=305502&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/COFF/<wbr>Inputs/library.def?rev=305502&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/COFF/Inputs/<wbr>library.def (added)<br>
+++ lld/trunk/test/COFF/Inputs/<wbr>library.def Thu Jun 15 15:39:58 2017<br>
@@ -0,0 +1,5 @@<br>
+LIBRARY library<br>
+EXPORTS<br>
+  function<br>
+  data DATA<br>
+  constant CONSTANT<br>
<br>
Added: lld/trunk/test/COFF/lib.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/lib.test?rev=305502&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/test/COFF/<wbr>lib.test?rev=305502&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/test/COFF/lib.test (added)<br>
+++ lld/trunk/test/COFF/lib.test Thu Jun 15 15:39:58 2017<br>
@@ -0,0 +1,11 @@<br>
+# RUN: lld-link /machine:x64 /def:%S/Inputs/library.def /out:%t.lib<br>
+# RUN: llvm-nm %t.lib | FileCheck %s<br>
+<br>
+CHECK: 00000000 R __imp_constant<br>
+CHECK: 00000000 R constant<br>
+<br>
+CHECK: 00000000 D __imp_data<br>
+<br>
+CHECK: 00000000 T __imp_function<br>
+CHECK: 00000000 T function<br>
+<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>