diff --git a/lld/COFF/CMakeLists.txt b/lld/COFF/CMakeLists.txt index 4a133835932e..da2916f0cfc0 100644 --- a/lld/COFF/CMakeLists.txt +++ b/lld/COFF/CMakeLists.txt @@ -30,6 +30,7 @@ add_lld_library(lldCOFF DebugInfoCodeView DebugInfoMSF DebugInfoPDB + Demangle LibDriver LTO MC diff --git a/lld/COFF/Symbols.cpp b/lld/COFF/Symbols.cpp index 0b89fc65f789..817ae8b7488c 100644 --- a/lld/COFF/Symbols.cpp +++ b/lld/COFF/Symbols.cpp @@ -12,6 +12,7 @@ #include "lld/Common/Memory.h" #include "lld/Common/Strings.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/Demangle/Demangle.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" @@ -26,26 +27,25 @@ static_assert(sizeof(SymbolUnion) <= 48, "symbols should be optimized for memory usage"); // Returns a symbol name for an error message. -static std::string demangle(StringRef symName) { +static std::string maybeDemangleSymbol(StringRef symName) { if (config->demangle) { - if (Optional 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 s = demangleItanium(demangleInput)) - return prefix + *s; - } + std::string prefix; + StringRef demangleInput = symName; + if (demangleInput.consume_front("__imp_")) + prefix = "__declspec(dllimport) "; + if (config->machine == I386) + demangleInput.consume_front("_"); + std::string demangled = demangle(demangleInput); + if (demangled != demangleInput) + return prefix + demangled; } return symName; } -std::string toString(coff::Symbol &b) { return demangle(b.getName()); } +std::string toString(coff::Symbol &b) { + return maybeDemangleSymbol(b.getName()); +} std::string toCOFFString(const Archive::Symbol &b) { - return demangle(b.getName()); + return maybeDemangleSymbol(b.getName()); } namespace coff { diff --git a/lld/Common/Strings.cpp b/lld/Common/Strings.cpp index 2240f9644e12..5cb44e9a8fea 100644 --- a/lld/Common/Strings.cpp +++ b/lld/Common/Strings.cpp @@ -36,23 +36,6 @@ Optional lld::demangleItanium(StringRef name) { return s; } -Optional lld::demangleMSVC(StringRef name) { - std::string prefix; - if (name.consume_front("__imp_")) - prefix = "__declspec(dllimport) "; - - // Demangle only C++ names. - if (!name.startswith("?")) - return None; - - char *buf = microsoftDemangle(name.str().c_str(), nullptr, nullptr, nullptr); - if (!buf) - return None; - std::string s(buf); - free(buf); - return prefix + s; -} - StringMatcher::StringMatcher(ArrayRef pat) { for (StringRef s : pat) { Expected pat = GlobPattern::create(s); diff --git a/lld/include/lld/Common/Strings.h b/lld/include/lld/Common/Strings.h index ded22dd769be..eb9bd43a4783 100644 --- a/lld/include/lld/Common/Strings.h +++ b/lld/include/lld/Common/Strings.h @@ -20,7 +20,6 @@ namespace lld { // Returns a demangled C++ symbol name. If Name is not a mangled // name, it returns Optional::None. llvm::Optional demangleItanium(llvm::StringRef name); -llvm::Optional demangleMSVC(llvm::StringRef s); std::vector parseHex(llvm::StringRef s); bool isValidCIdentifier(llvm::StringRef s); diff --git a/lld/test/COFF/undefined-symbol-itanium-i386.s b/lld/test/COFF/undefined-symbol-itanium-i386.s index 228f2d81c1ae..478e943bd88f 100644 --- a/lld/test/COFF/undefined-symbol-itanium-i386.s +++ b/lld/test/COFF/undefined-symbol-itanium-i386.s @@ -7,6 +7,7 @@ # NODEMANGLE: error: undefined symbol: __Z3fooi # NODEMANGLE: error: undefined symbol: __Z3barPKc # NODEMANGLE: error: undefined symbol: __imp___Z3bazv +# NODEMANGLE: error: undefined symbol: _Z3fooi # CHECK: error: undefined symbol: foo(int) # CHECK-NEXT: >>> referenced by {{.*}}.o:(_main) @@ -17,6 +18,9 @@ # CHECK-NEXT: >>> referenced by {{.*}}.o:(_f1) # CHECK-EMPTY: # CHECK-NEXT: error: undefined symbol: __declspec(dllimport) baz() +# CHECK-NEXT: >>> referenced by {{.*}}.o:(_f2) +# CHECK-EMPTY: +# CHECK-NEXT: error: undefined symbol: _Z3fooi # CHECK-NEXT: >>> referenced by {{.*}}.o:(_f2) .section .text,"xr",one_only,_main @@ -34,3 +38,4 @@ _f1: .globl _f2 _f2: call *__imp___Z3bazv + call _Z3fooi diff --git a/lld/test/COFF/undefined-symbol.s b/lld/test/COFF/undefined-symbol.s index 5fb2511ae25d..e3f07ab07390 100644 --- a/lld/test/COFF/undefined-symbol.s +++ b/lld/test/COFF/undefined-symbol.s @@ -7,6 +7,7 @@ # NODEMANGLE: error: undefined symbol: ?foo@@YAHXZ # NODEMANGLE: error: undefined symbol: ?bar@@YAHXZ # NODEMANGLE: error: undefined symbol: __imp_?baz@@YAHXZ +# NODEMANGLE: error: undefined symbol: __imp_undecorated # CHECK: error: undefined symbol: int __cdecl foo(void) # CHECK-NEXT: >>> referenced by {{.*}}.obj:(main) @@ -17,6 +18,9 @@ # CHECK-NEXT: >>> referenced by {{.*}}.obj:(f1) # CHECK-EMPTY: # 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: >>> referenced by {{.*}}.obj:(f2) .section .text,"xr",one_only,main @@ -34,3 +38,4 @@ f1: .globl f2 f2: callq *"__imp_?baz@@YAHXZ"(%rip) + callq *__imp_undecorated(%rip)