From 270960f5cd02511f02f6bf742418d3e5c6979819 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Thu, 9 Jul 2015 23:03:51 +0000 Subject: [PATCH] COFF: Find C++ mangled name for symbols starting with underscore. Symbol foo is mangled as _foo in C and ?foo@@... in C++ on x86. findMangle has to remove prefix underscore before mangle a given name as a C++ symbol. llvm-svn: 241874 --- lld/COFF/SymbolTable.cpp | 9 ++++++++- lld/test/COFF/export32.test | 4 +++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp index faa9aa7a7417..4c7513276745 100644 --- a/lld/COFF/SymbolTable.cpp +++ b/lld/COFF/SymbolTable.cpp @@ -281,7 +281,14 @@ void SymbolTable::mangleMaybe(Undefined *U) { return; // In Microsoft ABI, a non-member function name is mangled this way. - std::string Prefix = ("?" + U->getName() + "@@Y").str(); + std::string Prefix; + if (Config->is64()) { + Prefix = ("?" + U->getName() + "@@Y").str(); + } else { + if (!U->getName().startswith("_")) + return; + Prefix = ("?" + U->getName().substr(1) + "@@Y").str(); + } for (auto Pair : Symtab) { StringRef Name = Pair.first; if (!Name.startswith(Prefix)) diff --git a/lld/test/COFF/export32.test b/lld/test/COFF/export32.test index b46314c7b711..a9e49e0a27ca 100644 --- a/lld/test/COFF/export32.test +++ b/lld/test/COFF/export32.test @@ -10,7 +10,8 @@ CHECK1-NEXT: 0 0 CHECK1-NEXT: 1 0x1008 exportfn1 CHECK1-NEXT: 2 0x1010 exportfn2 -# RUN: lld -flavor link2 /out:%t.dll /dll %t.obj /export:exportfn1,@5 /export:exportfn2 +# RUN: lld -flavor link2 /out:%t.dll /dll %t.obj /export:exportfn1,@5 \ +# RUN: /export:exportfn2 /export:mangled # RUN: llvm-objdump -p %t.dll | FileCheck -check-prefix=CHECK2 %s CHECK2: Export Table: @@ -24,6 +25,7 @@ CHECK2-NEXT: 4 0 CHECK2-NEXT: 5 0x1008 exportfn1 CHECK2-NEXT: 6 0x1010 exportfn2 CHECK2-NEXT: 7 0x1010 exportfn3 +CHECK2-NEXT: 8 0x1010 mangled # RUN: lld -flavor link2 /out:%t.dll /dll %t.obj /export:exportfn1,@5,noname /export:exportfn2 # RUN: llvm-objdump -p %t.dll | FileCheck -check-prefix=CHECK3 %s