summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Storsjo <martin@martin.st>2019-09-02 13:28:16 +0000
committerMartin Storsjo <martin@martin.st>2019-09-02 13:28:16 +0000
commit1cec6b2970e5120607d5adaa3bc5449e656a87b3 (patch)
treee49e2a5e39b0547d4d5120b14d2083098b235a6a
parent40782261aea89dc55cd5688626a24bba116b9f17 (diff)
downloadbcm5719-llvm-1cec6b2970e5120607d5adaa3bc5449e656a87b3.tar.gz
bcm5719-llvm-1cec6b2970e5120607d5adaa3bc5449e656a87b3.zip
[llvm-dlltool] Handle external and internal names with differing decoration
Also add a missed part of the test from SVN r369747. Differential Revision: https://reviews.llvm.org/D66996 llvm-svn: 370656
-rw-r--r--llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp13
-rw-r--r--llvm/test/tools/llvm-dlltool/coff-decorated.def9
2 files changed, 21 insertions, 1 deletions
diff --git a/llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp b/llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp
index bd026a09e0c..19f253be795 100644
--- a/llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp
+++ b/llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp
@@ -148,6 +148,18 @@ int llvm::dlltoolDriverMain(llvm::ArrayRef<const char *> ArgsArr) {
std::string Path = Args.getLastArgValue(OPT_l);
+ // If ExtName is set (if the "ExtName = Name" syntax was used), overwrite
+ // Name with ExtName and clear ExtName. When only creating an import
+ // library and not linking, the internal name is irrelevant. This avoids
+ // cases where writeImportLibrary tries to transplant decoration from
+ // symbol decoration onto ExtName.
+ for (COFFShortExport& E : Def->Exports) {
+ if (!E.ExtName.empty()) {
+ E.Name = E.ExtName;
+ E.ExtName.clear();
+ }
+ }
+
if (Machine == IMAGE_FILE_MACHINE_I386 && Args.getLastArg(OPT_k)) {
for (COFFShortExport& E : Def->Exports) {
if (!E.AliasTarget.empty() || (!E.Name.empty() && E.Name[0] == '?'))
@@ -162,7 +174,6 @@ int llvm::dlltoolDriverMain(llvm::ArrayRef<const char *> ArgsArr) {
// By making sure E.SymbolName != E.Name for decorated symbols,
// writeImportLibrary writes these symbols with the type
// IMPORT_NAME_UNDECORATE.
- E.ExtName = E.ExtName.substr(0, E.ExtName.find('@', 1));
}
}
diff --git a/llvm/test/tools/llvm-dlltool/coff-decorated.def b/llvm/test/tools/llvm-dlltool/coff-decorated.def
index e1ca3cbe2d0..42adea9e33f 100644
--- a/llvm/test/tools/llvm-dlltool/coff-decorated.def
+++ b/llvm/test/tools/llvm-dlltool/coff-decorated.def
@@ -10,6 +10,8 @@ StdcallFunction@4
StdcallAlias@4==StdcallFunction@4
??_7exception@@6B@
StdcallExportName@4=StdcallInternalFunction@4
+OtherStdcallExportName@4=CdeclInternalFunction
+CdeclExportName=StdcallInternalFunction@4
; CHECK: Name type: noprefix
; CHECK: Symbol: __imp__CdeclFunction
@@ -25,5 +27,12 @@ StdcallExportName@4=StdcallInternalFunction@4
; CHECK: Symbol: ??_7exception@@6B@
; CHECK-NM: W _StdcallAlias@4
; CHECK-NM: U _StdcallFunction@4
+; CHECK: Name type: undecorate
; CHECK: Symbol: __imp__StdcallExportName@4{{$}}
; CHECK: Symbol: _StdcallExportName@4{{$}}
+; CHECK: Name type: undecorate
+; CHECK: Symbol: __imp__OtherStdcallExportName@4{{$}}
+; CHECK: Symbol: _OtherStdcallExportName@4{{$}}
+; CHECK: Name type: noprefix
+; CHECK: Symbol: __imp__CdeclExportName
+; CHECK: Symbol: _CdeclExportName
OpenPOWER on IntegriCloud