<div dir="ltr">Looks like a new test is failing. This is a log on my machine.<div><br></div><div><div>Command Output (stderr):</div><div>--</div><div>/ssd/b/bin/lld-link: error: could not open /ssd/b/tools/lld/test/COFF/Output/def-export-stdcall.s.tmp.deco-mingw.def: No such file or directory</div></div></div><br><br><div class="gmail_quote"><div dir="ltr">On Wed, Mar 14, 2018 at 1:19 PM Martin Storsjo via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: mstorsjo<br>
Date: Wed Mar 14 13:17:16 2018<br>
New Revision: 327561<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=327561&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=327561&view=rev</a><br>
Log:<br>
[COFF] Add support for the GNU ld flag --kill-at<br>
<br>
GNU ld has got a number of different flags for adjusting how to<br>
behave around stdcall functions. The --kill-at flag strips the<br>
trailing sdcall suffix from exported functions (which otherwise<br>
is included by default in MinGW setups).<br>
<br>
This also strips it from the corresponding import library though.<br>
That makes it hard to link to such an import library from code<br>
that calls the functions - but this matches what GNU ld does with<br>
this flag. Therefore, this flag is probably not sensibly used<br>
together with import libraries, but probably mostly when creating<br>
some sort of plugin, or if creating the import library separately<br>
with dlltool.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D44292" rel="noreferrer" target="_blank">https://reviews.llvm.org/D44292</a><br>
<br>
Modified:<br>
    lld/trunk/COFF/Config.h<br>
    lld/trunk/COFF/Driver.cpp<br>
    lld/trunk/COFF/DriverUtils.cpp<br>
    lld/trunk/COFF/Options.td<br>
    lld/trunk/test/COFF/def-export-stdcall.s<br>
<br>
Modified: lld/trunk/COFF/Config.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Config.h?rev=327561&r1=327560&r2=327561&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Config.h?rev=327561&r1=327560&r2=327561&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/COFF/Config.h (original)<br>
+++ lld/trunk/COFF/Config.h Wed Mar 14 13:17:16 2018<br>
@@ -190,6 +190,7 @@ struct Configuration {<br>
   bool WarnMissingOrderSymbol = true;<br>
   bool WarnLocallyDefinedImported = true;<br>
   bool Incremental = true;<br>
+  bool KillAt = false;<br>
 };<br>
<br>
 extern Configuration *Config;<br>
<br>
Modified: lld/trunk/COFF/Driver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=327561&r1=327560&r2=327561&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=327561&r1=327560&r2=327561&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/COFF/Driver.cpp (original)<br>
+++ lld/trunk/COFF/Driver.cpp Wed Mar 14 13:17:16 2018<br>
@@ -1073,6 +1073,10 @@ void LinkerDriver::link(ArrayRef<const c<br>
   if (Args.hasArg(OPT_lldsavetemps))<br>
     Config->SaveTemps = true;<br>
<br>
+  // Handle /kill-at<br>
+  if (Args.hasArg(OPT_kill_at))<br>
+    Config->KillAt = true;<br>
+<br>
   // Handle /lldltocache<br>
   if (auto *Arg = Args.getLastArg(OPT_lldltocache))<br>
     Config->LTOCache = Arg->getValue();<br>
<br>
Modified: lld/trunk/COFF/DriverUtils.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/DriverUtils.cpp?rev=327561&r1=327560&r2=327561&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/DriverUtils.cpp?rev=327561&r1=327560&r2=327561&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/COFF/DriverUtils.cpp (original)<br>
+++ lld/trunk/COFF/DriverUtils.cpp Wed Mar 14 13:17:16 2018<br>
@@ -582,6 +582,26 @@ static StringRef undecorate(StringRef Sy<br>
   return Sym.startswith("_") ? Sym.substr(1) : Sym;<br>
 }<br>
<br>
+// Convert stdcall/fastcall style symbols into unsuffixed symbols,<br>
+// with or without a leading underscore. (MinGW specific.)<br>
+static StringRef killAt(StringRef Sym, bool Prefix) {<br>
+  if (Sym.empty())<br>
+    return Sym;<br>
+  // Strip any trailing stdcall suffix<br>
+  Sym = Sym.substr(0, Sym.find('@', 1));<br>
+  if (!Sym.startswith("@")) {<br>
+    if (Prefix && !Sym.startswith("_"))<br>
+      return Saver.save("_" + Sym);<br>
+    return Sym;<br>
+  }<br>
+  // For fastcall, remove the leading @ and replace it with an<br>
+  // underscore, if prefixes are used.<br>
+  Sym = Sym.substr(1);<br>
+  if (Prefix)<br>
+    Sym = Saver.save("_" + Sym);<br>
+  return Sym;<br>
+}<br>
+<br>
 // Performs error checking on all /export arguments.<br>
 // It also sets ordinals.<br>
 void fixupExports() {<br>
@@ -614,6 +634,15 @@ void fixupExports() {<br>
     }<br>
   }<br>
<br>
+  if (Config->KillAt && Config->Machine == I386) {<br>
+    for (Export &E : Config->Exports) {<br>
+      E.Name = killAt(E.Name, true);<br>
+      E.ExportName = killAt(E.ExportName, false);<br>
+      E.ExtName = killAt(E.ExtName, true);<br>
+      E.SymbolName = killAt(E.SymbolName, true);<br>
+    }<br>
+  }<br>
+<br>
   // Uniquefy by name.<br>
   DenseMap<StringRef, Export *> Map(Config->Exports.size());<br>
   std::vector<Export> V;<br>
<br>
Modified: lld/trunk/COFF/Options.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Options.td?rev=327561&r1=327560&r2=327561&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Options.td?rev=327561&r1=327560&r2=327561&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/COFF/Options.td (original)<br>
+++ lld/trunk/COFF/Options.td Wed Mar 14 13:17:16 2018<br>
@@ -126,6 +126,7 @@ def help_q : Flag<["/?", "-?"], "">, Ali<br>
 def debug_ghash : F<"debug:ghash">;<br>
 def debug_dwarf : F<"debug:dwarf">;<br>
 def export_all_symbols : F<"export-all-symbols">;<br>
+def kill_at : F<"kill-at">;<br>
 def lldmingw : F<"lldmingw">;<br>
 def msvclto : F<"msvclto">;<br>
 def output_def : Joined<["/", "-"], "output-def:">;<br>
<br>
Modified: lld/trunk/test/COFF/def-export-stdcall.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/def-export-stdcall.s?rev=327561&r1=327560&r2=327561&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/def-export-stdcall.s?rev=327561&r1=327560&r2=327561&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/test/COFF/def-export-stdcall.s (original)<br>
+++ lld/trunk/test/COFF/def-export-stdcall.s Wed Mar 14 13:17:16 2018<br>
@@ -44,7 +44,8 @@<br>
 # DECORATED-EXPORTS: Name: vectorcall@@8<br>
<br>
<br>
-# RUN: echo -e "LIBRARY foo\nEXPORTS\n  stdcall@8\n  @fastcall@8" > %t.def<br>
+# GNU tools don't support vectorcall at the moment, but test it for completeness.<br>
+# RUN: echo -e "LIBRARY foo\nEXPORTS\n  stdcall@8\n  @fastcall@8\n  vectorcall@@8" > %t.def<br>
 # RUN: lld-link -lldmingw -entry:dllmain -dll -def:%t.def %t.obj -out:%t.dll -implib:%t.lib<br>
 # RUN: llvm-readobj %t.lib | FileCheck -check-prefix DECORATED-MINGW-IMPLIB %s<br>
 # RUN: llvm-readobj -coff-exports %t.dll | FileCheck -check-prefix DECORATED-MINGW-EXPORTS %s<br>
@@ -55,9 +56,39 @@<br>
 # DECORATED-MINGW-IMPLIB: Name type: noprefix<br>
 # DECORATED-MINGW-IMPLIB-NEXT: __imp__stdcall@8<br>
 # DECORATED-MINGW-IMPLIB-NEXT: _stdcall@8<br>
+# GNU tools don't support vectorcall, but this test is just to track that<br>
+# lld's behaviour remains consistent over time.<br>
+# DECORATED-MINGW-IMPLIB: Name type: name<br>
+# DECORATED-MINGW-IMPLIB-NEXT: __imp_vectorcall@@8<br>
+# DECORATED-MINGW-IMPLIB-NEXT: vectorcall@@8<br>
<br>
 # DECORATED-MINGW-EXPORTS: Name: @fastcall@8<br>
 # DECORATED-MINGW-EXPORTS: Name: stdcall@8<br>
+# DECORATED-MINGW-EXPORTS: Name: vectorcall@@8<br>
+<br>
+# RUN: lld-link -lldmingw -kill-at -entry:dllmain -dll -def:%t.deco-mingw.def %t.obj -out:%t.dll -implib:%t.lib<br>
+# RUN: llvm-readobj %t.lib | FileCheck -check-prefix MINGW-KILL-AT-IMPLIB %s<br>
+# RUN: llvm-readobj -coff-exports %t.dll | FileCheck -check-prefix MINGW-KILL-AT-EXPORTS %s<br>
+<br>
+# RUN: lld-link -lldmingw -kill-at -entry:dllmain -dll %t.obj -out:%t.dll -implib:%t.lib<br>
+# RUN: llvm-readobj %t.lib | FileCheck -check-prefix MINGW-KILL-AT-IMPLIB %s<br>
+# RUN: llvm-readobj -coff-exports %t.dll | FileCheck -check-prefix MINGW-KILL-AT-EXPORTS %s<br>
+<br>
+# MINGW-KILL-AT-IMPLIB: Name type: noprefix<br>
+# MINGW-KILL-AT-IMPLIB: __imp__fastcall<br>
+# MINGW-KILL-AT-IMPLIB-NEXT: _fastcall<br>
+# MINGW-KILL-AT-IMPLIB: Name type: noprefix<br>
+# MINGW-KILL-AT-IMPLIB-NEXT: __imp__stdcall<br>
+# MINGW-KILL-AT-IMPLIB-NEXT: _stdcall<br>
+# GNU tools don't support vectorcall, but this test is just to track that<br>
+# lld's behaviour remains consistent over time.<br>
+# MINGW-KILL-AT-IMPLIB: Name type: noprefix<br>
+# MINGW-KILL-AT-IMPLIB-NEXT: __imp__vectorcall<br>
+# MINGW-KILL-AT-IMPLIB-NEXT: _vectorcall<br>
+<br>
+# MINGW-KILL-AT-EXPORTS: Name: fastcall<br>
+# MINGW-KILL-AT-EXPORTS: Name: stdcall<br>
+# MINGW-KILL-AT-EXPORTS: Name: vectorcall<br>
<br>
<br>
         .def     _stdcall@8;<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">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/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>