[lld] r323036 - [COFF] Keep the underscore on exported decorated stdcall functions in MSVC mode

Martin Storsjo via llvm-commits llvm-commits at lists.llvm.org
Sat Jan 20 03:44:42 PST 2018


Author: mstorsjo
Date: Sat Jan 20 03:44:42 2018
New Revision: 323036

URL: http://llvm.org/viewvc/llvm-project?rev=323036&view=rev
Log:
[COFF] Keep the underscore on exported decorated stdcall functions in MSVC mode

This fixes PR35733.

Differential Revision: https://reviews.llvm.org/D41632

Modified:
    lld/trunk/COFF/Driver.cpp
    lld/trunk/COFF/DriverUtils.cpp
    lld/trunk/test/COFF/def-export-stdcall.s
    lld/trunk/test/COFF/dllexport.s

Modified: lld/trunk/COFF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=323036&r1=323035&r2=323036&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.cpp (original)
+++ lld/trunk/COFF/Driver.cpp Sat Jan 20 03:44:42 2018
@@ -540,7 +540,7 @@ static void createImportLibrary(bool AsL
   }
 
   auto E = writeImportLibrary(getImportName(AsLib), getImplibPath(), Exports,
-                              Config->Machine, false);
+                              Config->Machine, false, Config->MinGW);
   handleAllErrors(std::move(E),
                   [&](ErrorInfoBase &EIB) { error(EIB.message()); });
 }

Modified: lld/trunk/COFF/DriverUtils.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/DriverUtils.cpp?rev=323036&r1=323035&r2=323036&view=diff
==============================================================================
--- lld/trunk/COFF/DriverUtils.cpp (original)
+++ lld/trunk/COFF/DriverUtils.cpp Sat Jan 20 03:44:42 2018
@@ -558,6 +558,12 @@ err:
 static StringRef undecorate(StringRef Sym) {
   if (Config->Machine != I386)
     return Sym;
+  // In MSVC mode, a fully decorated stdcall function is exported
+  // as-is with the leading underscore (with type IMPORT_NAME).
+  // In MinGW mode, a decorated stdcall function gets the underscore
+  // removed, just like normal cdecl functions.
+  if (Sym.startswith("_") && Sym.contains('@') && !Config->MinGW)
+    return Sym;
   return Sym.startswith("_") ? Sym.substr(1) : Sym;
 }
 

Modified: lld/trunk/test/COFF/def-export-stdcall.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/def-export-stdcall.s?rev=323036&r1=323035&r2=323036&view=diff
==============================================================================
--- lld/trunk/test/COFF/def-export-stdcall.s (original)
+++ lld/trunk/test/COFF/def-export-stdcall.s Sat Jan 20 03:44:42 2018
@@ -32,8 +32,7 @@
 # DECORATED-IMPLIB: Name type: name
 # DECORATED-IMPLIB-NEXT: __imp_ at fastcall@8
 # DECORATED-IMPLIB-NEXT: @fastcall at 8
-# TODO: To match link.exe, this one should also be Name type: name.
-# DECORATED-IMPLIB: Name type: noprefix
+# DECORATED-IMPLIB: Name type: name
 # DECORATED-IMPLIB-NEXT: __imp__stdcall at 8
 # DECORATED-IMPLIB-NEXT: _stdcall at 8
 # DECORATED-IMPLIB: Name type: name
@@ -41,8 +40,7 @@
 # DECORATED-IMPLIB-NEXT: vectorcall@@8
 
 # DECORATED-EXPORTS: Name: @fastcall at 8
-# TODO: To match link.exe, this one should actually be _stdcall at 8
-# DECORATED-EXPORTS: Name: stdcall at 8
+# DECORATED-EXPORTS: Name: _stdcall at 8
 # DECORATED-EXPORTS: Name: vectorcall@@8
 
 

Modified: lld/trunk/test/COFF/dllexport.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/dllexport.s?rev=323036&r1=323035&r2=323036&view=diff
==============================================================================
--- lld/trunk/test/COFF/dllexport.s (original)
+++ lld/trunk/test/COFF/dllexport.s Sat Jan 20 03:44:42 2018
@@ -8,21 +8,19 @@
 # DECORATED-IMPLIB: Name type: name
 # DECORATED-IMPLIB-NEXT: __imp_ at fastcall@8
 # DECORATED-IMPLIB-NEXT: @fastcall at 8
+# DECORATED-IMPLIB: Name type: name
+# DECORATED-IMPLIB-NEXT: __imp__stdcall at 8
+# DECORATED-IMPLIB-NEXT: _stdcall at 8
 # DECORATED-IMPLIB: Name type: noprefix
 # DECORATED-IMPLIB-NEXT: __imp___underscored
 # DECORATED-IMPLIB-NEXT: __underscored
-# TODO: To match link.exe, this one should also be Name type: name.
-# DECORATED-IMPLIB: Name type: noprefix
-# DECORATED-IMPLIB-NEXT: __imp__stdcall at 8
-# DECORATED-IMPLIB-NEXT: _stdcall at 8
 # DECORATED-IMPLIB: Name type: name
 # DECORATED-IMPLIB-NEXT: __imp_vectorcall@@8
 # DECORATED-IMPLIB-NEXT: vectorcall@@8
 
 # DECORATED-EXPORTS: Name: @fastcall at 8
+# DECORATED-EXPORTS: Name: _stdcall at 8
 # DECORATED-EXPORTS: Name: _underscored
-# TODO: To match link.exe, this one should actually be _stdcall at 8
-# DECORATED-EXPORTS: Name: stdcall at 8
 # DECORATED-EXPORTS: Name: vectorcall@@8
 
         .def     _stdcall at 8;




More information about the llvm-commits mailing list