<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>