[LLD] [COFF] Demangle itanium symbols in mingw mode

Differential Revision: https://reviews.llvm.org/D67051

llvm-svn: 370654
This commit is contained in:
Martin Storsjo 2019-09-02 13:25:46 +00:00
parent 3f3673ead9
commit a66fc1c99f
3 changed files with 84 additions and 1 deletions

View File

@ -27,9 +27,20 @@ static_assert(sizeof(SymbolUnion) <= 48,
// Returns a symbol name for an error message.
static std::string demangle(StringRef symName) {
if (config->demangle)
if (config->demangle) {
if (Optional<std::string> s = demangleMSVC(symName))
return *s;
if (config->mingw) {
StringRef demangleInput = symName;
std::string prefix;
if (demangleInput.consume_front("__imp_"))
prefix = "__declspec(dllimport) ";
if (config->machine == I386)
demangleInput.consume_front("_");
if (Optional<std::string> s = demangleItanium(demangleInput))
return prefix + *s;
}
}
return symName;
}
std::string toString(coff::Symbol &b) { return demangle(b.getName()); }

View File

@ -0,0 +1,36 @@
# REQUIRES: x86
# RUN: llvm-mc -triple=i386-windows-gnu -filetype=obj -o %t.o %s
# RUN: not lld-link /lldmingw /out:%t.exe %t.o 2>&1 | FileCheck %s
# RUN: not lld-link /lldmingw /out:%t.exe /demangle %t.o 2>&1 | FileCheck %s
# RUN: not lld-link /lldmingw /out:%t.exe /demangle:no %t.o 2>&1 | FileCheck --check-prefix=NODEMANGLE %s
# NODEMANGLE: error: undefined symbol: __Z3fooi
# NODEMANGLE: error: undefined symbol: __Z3barPKc
# NODEMANGLE: error: undefined symbol: __imp___Z3bazv
# CHECK: error: undefined symbol: foo(int)
# CHECK-NEXT: >>> referenced by {{.*}}.o:(_main)
# CHECK-NEXT: >>> referenced by {{.*}}.o:(_main)
# CHECK-EMPTY:
# CHECK-NEXT: error: undefined symbol: bar(char const*)
# CHECK-NEXT: >>> referenced by {{.*}}.o:(_main)
# CHECK-NEXT: >>> referenced by {{.*}}.o:(_f1)
# CHECK-EMPTY:
# CHECK-NEXT: error: undefined symbol: __declspec(dllimport) baz()
# CHECK-NEXT: >>> referenced by {{.*}}.o:(_f2)
.section .text,"xr",one_only,_main
.globl _main
_main:
call __Z3fooi
call __Z3fooi
call __Z3barPKc
_f1:
call __Z3barPKc
.Lfunc_end1:
.section .text,"xr",one_only,_f2
.globl _f2
_f2:
call *__imp___Z3bazv

View File

@ -0,0 +1,36 @@
# REQUIRES: x86
# RUN: llvm-mc -triple=x86_64-windows-gnu -filetype=obj -o %t.o %s
# RUN: not lld-link /lldmingw /out:%t.exe %t.o 2>&1 | FileCheck %s
# RUN: not lld-link /lldmingw /out:%t.exe /demangle %t.o 2>&1 | FileCheck %s
# RUN: not lld-link /lldmingw /out:%t.exe /demangle:no %t.o 2>&1 | FileCheck --check-prefix=NODEMANGLE %s
# NODEMANGLE: error: undefined symbol: _Z3fooi
# NODEMANGLE: error: undefined symbol: _Z3barPKc
# NODEMANGLE: error: undefined symbol: __imp__Z3bazv
# CHECK: error: undefined symbol: foo(int)
# CHECK-NEXT: >>> referenced by {{.*}}.o:(main)
# CHECK-NEXT: >>> referenced by {{.*}}.o:(main)
# CHECK-EMPTY:
# CHECK-NEXT: error: undefined symbol: bar(char const*)
# CHECK-NEXT: >>> referenced by {{.*}}.o:(main)
# CHECK-NEXT: >>> referenced by {{.*}}.o:(f1)
# CHECK-EMPTY:
# CHECK-NEXT: error: undefined symbol: __declspec(dllimport) baz()
# CHECK-NEXT: >>> referenced by {{.*}}.o:(f2)
.section .text,"xr",one_only,main
.globl main
main:
call _Z3fooi
call _Z3fooi
call _Z3barPKc
f1:
call _Z3barPKc
.Lfunc_end1:
.section .text,"xr",one_only,f2
.globl f2
f2:
callq *__imp__Z3bazv(%rip)