summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Storsjo <martin@martin.st>2018-01-20 11:44:42 +0000
committerMartin Storsjo <martin@martin.st>2018-01-20 11:44:42 +0000
commit3b611fa93f8bd0882676516b0f12db374fa937a0 (patch)
treedb73dff6b4ad58e117777171caacb30d5036d627
parentf641d0d4f23f76bc6a6e96ab73f1579d8eb0bf4c (diff)
downloadbcm5719-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.cpp2
-rw-r--r--lld/COFF/DriverUtils.cpp6
-rw-r--r--lld/test/COFF/def-export-stdcall.s6
-rw-r--r--lld/test/COFF/dllexport.s10
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;
OpenPOWER on IntegriCloud