diff --git a/lld/test/COFF/export-alias.test b/lld/test/COFF/export-alias.test new file mode 100644 index 000000000000..a13fdf1504fb --- /dev/null +++ b/lld/test/COFF/export-alias.test @@ -0,0 +1,16 @@ +; REQUIRES: x86 + +; RUN: echo > %t.s +; RUN: llvm-mc -filetype=obj -triple=i686-windows %t.s -o %t.obj +; RUN: lld-link -machine:x86 -dll -noentry -safeseh:no -out:%t.dll -def:%s %t.obj +; RUN: llvm-readobj --coff-exports %t.dll | FileCheck %s + +; CHECK: Export { +; CHECK-NEXT: Ordinal: 1 +; CHECK-NEXT: Name: func +; CHECK-NEXT: ForwardedTo: other.dll.func +; CHECK-NEXT: } + +LIBRARY test.dll +EXPORTS + func = other.dll.func diff --git a/llvm/lib/Object/COFFModuleDefinition.cpp b/llvm/lib/Object/COFFModuleDefinition.cpp index 82c18539658e..67b0dc4fa297 100644 --- a/llvm/lib/Object/COFFModuleDefinition.cpp +++ b/llvm/lib/Object/COFFModuleDefinition.cpp @@ -238,7 +238,10 @@ private: } if (AddUnderscores) { - if (!isDecorated(E.Name, MingwDef)) + // Don't add underscore if the name is already mangled or if it's a + // forward target. + if (!isDecorated(E.Name, MingwDef) && + (E.ExtName.empty() || !StringRef(E.Name).contains("."))) E.Name = (std::string("_").append(E.Name)); if (!E.ExtName.empty() && !isDecorated(E.ExtName, MingwDef)) E.ExtName = (std::string("_").append(E.ExtName)); diff --git a/llvm/test/tools/llvm-lib/underscore.test b/llvm/test/tools/llvm-lib/underscore.test new file mode 100644 index 000000000000..61eee00bcf9b --- /dev/null +++ b/llvm/test/tools/llvm-lib/underscore.test @@ -0,0 +1,23 @@ +; RUN: llvm-lib -machine:x86 -out:%t.lib -def:%s +; RUN: llvm-readobj %t.lib | FileCheck %s + +; CHECK: File: test.dll +; CHECK-NEXT: Format: COFF-import-file-i386 +; CHECK-NEXT: Type: code +; CHECK-NEXT: Name type: noprefix +; CHECK-NEXT: Export name: func +; CHECK-NEXT: Symbol: __imp__func +; CHECK-NEXT: Symbol: _func +; CHECK-EMPTY: +; CHECK-NEXT: File: test.dll +; CHECK-NEXT: Format: COFF-import-file-i386 +; CHECK-NEXT: Type: code +; CHECK-NEXT: Name type: noprefix +; CHECK-NEXT: Export name: test.func +; CHECK-NEXT: Symbol: __imp__test.func +; CHECK-NEXT: Symbol: _test.func + +LIBRARY test.dll +EXPORTS + func + test.func