From 9809ed61353c401ec390170a278d27fff78b7d19 Mon Sep 17 00:00:00 2001 From: Martin Storsjo Date: Fri, 4 Oct 2019 19:47:59 +0000 Subject: [PATCH] [LLD] [COFF] Always demangle the __imp_ prefix to __declspec(dllimport) Differential Revision: https://reviews.llvm.org/D68017 llvm-svn: 373781 --- lld/COFF/Symbols.cpp | 8 +++++--- lld/test/COFF/delayimports-error.test | 2 +- lld/test/COFF/duplicate.test | 2 +- lld/test/COFF/undefined-symbol-itanium-i386.s | 5 +++++ lld/test/COFF/undefined-symbol.s | 2 +- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/lld/COFF/Symbols.cpp b/lld/COFF/Symbols.cpp index 817ae8b..938c9c52 100644 --- a/lld/COFF/Symbols.cpp +++ b/lld/COFF/Symbols.cpp @@ -30,14 +30,16 @@ static_assert(sizeof(SymbolUnion) <= 48, static std::string maybeDemangleSymbol(StringRef symName) { if (config->demangle) { std::string prefix; - StringRef demangleInput = symName; - if (demangleInput.consume_front("__imp_")) + StringRef prefixless = symName; + if (prefixless.consume_front("__imp_")) prefix = "__declspec(dllimport) "; + StringRef demangleInput = prefixless; if (config->machine == I386) demangleInput.consume_front("_"); std::string demangled = demangle(demangleInput); if (demangled != demangleInput) - return prefix + demangled; + return prefix + demangle(demangleInput); + return (prefix + prefixless).str(); } return symName; } diff --git a/lld/test/COFF/delayimports-error.test b/lld/test/COFF/delayimports-error.test index 3fea1bc..fd72f10 100644 --- a/lld/test/COFF/delayimports-error.test +++ b/lld/test/COFF/delayimports-error.test @@ -7,7 +7,7 @@ # RUN: /alternatename:__delayLoadHelper2=main /opt:noref >& %t.log # RUN: FileCheck %s < %t.log -# CHECK: cannot delay-load foo.dll due to import of data: __imp_datasym +# CHECK: cannot delay-load foo.dll due to import of data: __declspec(dllimport) datasym --- !COFF header: diff --git a/lld/test/COFF/duplicate.test b/lld/test/COFF/duplicate.test index e2d3181..0c0f351 100644 --- a/lld/test/COFF/duplicate.test +++ b/lld/test/COFF/duplicate.test @@ -9,5 +9,5 @@ CHECK-ALPHA: error: duplicate symbol: f in {{.*}}alpha.obj and in alpha.dll RUN: llc -mtriple x86_64-windows-msvc -filetype obj -o gamma.obj %S/Inputs/gamma.ll RUN: not lld-link /out:gamma.exe /subsystem:console /entry:mainCRTStartup gamma.obj alpha.lib 2>&1 | FileCheck %s -check-prefix CHECK-GAMMA -CHECK-GAMMA: error: duplicate symbol: __imp_f in {{.*}}gamma.obj and in alpha.dll +CHECK-GAMMA: error: duplicate symbol: __declspec(dllimport) f in {{.*}}gamma.obj and in alpha.dll diff --git a/lld/test/COFF/undefined-symbol-itanium-i386.s b/lld/test/COFF/undefined-symbol-itanium-i386.s index 478e943..0aa2bfb 100644 --- a/lld/test/COFF/undefined-symbol-itanium-i386.s +++ b/lld/test/COFF/undefined-symbol-itanium-i386.s @@ -8,6 +8,7 @@ # NODEMANGLE: error: undefined symbol: __Z3barPKc # NODEMANGLE: error: undefined symbol: __imp___Z3bazv # NODEMANGLE: error: undefined symbol: _Z3fooi +# NODEMANGLE: error: undefined symbol: __imp__cfunc # CHECK: error: undefined symbol: foo(int) # CHECK-NEXT: >>> referenced by {{.*}}.o:(_main) @@ -22,6 +23,9 @@ # CHECK-EMPTY: # CHECK-NEXT: error: undefined symbol: _Z3fooi # CHECK-NEXT: >>> referenced by {{.*}}.o:(_f2) +# CHECK-EMPTY: +# CHECK-NEXT: error: undefined symbol: __declspec(dllimport) _cfunc +# CHECK-NEXT: >>> referenced by {{.*}}.o:(_f2) .section .text,"xr",one_only,_main .globl _main @@ -39,3 +43,4 @@ _f1: _f2: call *__imp___Z3bazv call _Z3fooi + call *__imp__cfunc diff --git a/lld/test/COFF/undefined-symbol.s b/lld/test/COFF/undefined-symbol.s index e3f07ab..f9e11ce 100644 --- a/lld/test/COFF/undefined-symbol.s +++ b/lld/test/COFF/undefined-symbol.s @@ -20,7 +20,7 @@ # CHECK-NEXT: error: undefined symbol: __declspec(dllimport) int __cdecl baz(void) # CHECK-NEXT: >>> referenced by {{.*}}.obj:(f2) # CHECK-EMPTY: -# CHECK-NEXT: error: undefined symbol: __imp_undecorated +# CHECK-NEXT: error: undefined symbol: __declspec(dllimport) undecorated # CHECK-NEXT: >>> referenced by {{.*}}.obj:(f2) .section .text,"xr",one_only,main -- 2.7.4