diff options
author | Martin Storsjo <martin@martin.st> | 2018-01-20 11:44:42 +0000 |
---|---|---|
committer | Martin Storsjo <martin@martin.st> | 2018-01-20 11:44:42 +0000 |
commit | 3b611fa93f8bd0882676516b0f12db374fa937a0 (patch) | |
tree | db73dff6b4ad58e117777171caacb30d5036d627 | |
parent | f641d0d4f23f76bc6a6e96ab73f1579d8eb0bf4c (diff) | |
download | bcm5719-llvm-3b611fa93f8bd0882676516b0f12db374fa937a0.tar.gz bcm5719-llvm-3b611fa93f8bd0882676516b0f12db374fa937a0.zip |
[COFF] Keep the underscore on exported decorated stdcall functions in MSVC mode
This fixes PR35733.
Differential Revision: https://reviews.llvm.org/D41632
llvm-svn: 323036
-rw-r--r-- | lld/COFF/Driver.cpp | 2 | ||||
-rw-r--r-- | lld/COFF/DriverUtils.cpp | 6 | ||||
-rw-r--r-- | lld/test/COFF/def-export-stdcall.s | 6 | ||||
-rw-r--r-- | lld/test/COFF/dllexport.s | 10 |
4 files changed, 13 insertions, 11 deletions
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 8f79a7b18ae..58058106797 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -540,7 +540,7 @@ static void createImportLibrary(bool AsLib) { } auto E = writeImportLibrary(getImportName(AsLib), getImplibPath(), Exports, - Config->Machine, false); + Config->Machine, false, Config->MinGW); handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) { error(EIB.message()); }); } diff --git a/lld/COFF/DriverUtils.cpp b/lld/COFF/DriverUtils.cpp index 16768a441e2..f2a9da510a8 100644 --- a/lld/COFF/DriverUtils.cpp +++ b/lld/COFF/DriverUtils.cpp @@ -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; } diff --git a/lld/test/COFF/def-export-stdcall.s b/lld/test/COFF/def-export-stdcall.s index 851ac6d975b..db251406584 100644 --- a/lld/test/COFF/def-export-stdcall.s +++ b/lld/test/COFF/def-export-stdcall.s @@ -32,8 +32,7 @@ # DECORATED-IMPLIB: Name type: name # DECORATED-IMPLIB-NEXT: __imp_@fastcall@8 # DECORATED-IMPLIB-NEXT: @fastcall@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@8 # DECORATED-IMPLIB-NEXT: _stdcall@8 # DECORATED-IMPLIB: Name type: name @@ -41,8 +40,7 @@ # DECORATED-IMPLIB-NEXT: vectorcall@@8 # DECORATED-EXPORTS: Name: @fastcall@8 -# TODO: To match link.exe, this one should actually be _stdcall@8 -# DECORATED-EXPORTS: Name: stdcall@8 +# DECORATED-EXPORTS: Name: _stdcall@8 # DECORATED-EXPORTS: Name: vectorcall@@8 diff --git a/lld/test/COFF/dllexport.s b/lld/test/COFF/dllexport.s index 27cbd235a53..78d97c97874 100644 --- a/lld/test/COFF/dllexport.s +++ b/lld/test/COFF/dllexport.s @@ -8,21 +8,19 @@ # DECORATED-IMPLIB: Name type: name # DECORATED-IMPLIB-NEXT: __imp_@fastcall@8 # DECORATED-IMPLIB-NEXT: @fastcall@8 +# DECORATED-IMPLIB: Name type: name +# DECORATED-IMPLIB-NEXT: __imp__stdcall@8 +# DECORATED-IMPLIB-NEXT: _stdcall@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@8 -# DECORATED-IMPLIB-NEXT: _stdcall@8 # DECORATED-IMPLIB: Name type: name # DECORATED-IMPLIB-NEXT: __imp_vectorcall@@8 # DECORATED-IMPLIB-NEXT: vectorcall@@8 # DECORATED-EXPORTS: Name: @fastcall@8 +# DECORATED-EXPORTS: Name: _stdcall@8 # DECORATED-EXPORTS: Name: _underscored -# TODO: To match link.exe, this one should actually be _stdcall@8 -# DECORATED-EXPORTS: Name: stdcall@8 # DECORATED-EXPORTS: Name: vectorcall@@8 .def _stdcall@8; |