Index: COFF/Symbols.cpp =================================================================== --- COFF/Symbols.cpp +++ COFF/Symbols.cpp @@ -26,26 +26,22 @@ "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("_"); + if (Optional s = demangle(demangleInput)) + return prefix + *s; } 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 { Index: Common/Strings.cpp =================================================================== --- Common/Strings.cpp +++ Common/Strings.cpp @@ -19,38 +19,29 @@ using namespace lld; // Returns the demangled C++ symbol name for Name. -Optional lld::demangleItanium(StringRef name) { - // itaniumDemangle can be used to demangle strings other than symbol - // names which do not necessarily start with "_Z". Name can be - // either a C or C++ symbol. Don't call itaniumDemangle if the name - // does not look like a C++ symbol name to avoid getting unexpected - // result for a C symbol that happens to match a mangled type name. - if (!name.startswith("_Z")) - return None; - - char *buf = itaniumDemangle(name.str().c_str(), nullptr, nullptr, nullptr); - if (!buf) - return None; - std::string s(buf); - free(buf); - 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; +Optional lld::demangle(StringRef name) { + if (name.startswith("_Z")) { + // itaniumDemangle can be used to demangle strings other than symbol + // names which do not necessarily start with "_Z". Name can be + // either a C or C++ symbol. Don't call itaniumDemangle if the name + // does not look like a C++ symbol name to avoid getting unexpected + // result for a C symbol that happens to match a mangled type name. + char *buf = itaniumDemangle(name.str().c_str(), nullptr, nullptr, nullptr); + if (!buf) + return None; + std::string s(buf); + free(buf); + return s; + } + if (name.startswith("?")) { + char *buf = microsoftDemangle(name.str().c_str(), nullptr, nullptr, nullptr); + if (!buf) + return None; + std::string s(buf); + free(buf); + return s; + } + return None; } StringMatcher::StringMatcher(ArrayRef pat) { Index: ELF/SymbolTable.cpp =================================================================== --- ELF/SymbolTable.cpp +++ ELF/SymbolTable.cpp @@ -123,7 +123,7 @@ for (Symbol *sym : symVector) { if (!sym->isDefined() && !sym->isCommon()) continue; - if (Optional s = demangleItanium(sym->getName())) + if (Optional s = demangle(sym->getName())) (*demangledSyms)[*s].push_back(sym); else (*demangledSyms)[sym->getName()].push_back(sym); Index: ELF/Symbols.cpp =================================================================== --- ELF/Symbols.cpp +++ ELF/Symbols.cpp @@ -43,16 +43,16 @@ Defined *ElfSym::tlsModuleBase; // Returns a symbol for an error message. -static std::string demangle(StringRef symName) { +static std::string maybeDemangleSymbol(StringRef symName) { if (config->demangle) - if (Optional s = demangleItanium(symName)) + if (Optional s = demangle(symName)) return *s; return symName; } namespace lld { -std::string toString(const Symbol &b) { return demangle(b.getName()); } +std::string toString(const Symbol &b) { return maybeDemangleSymbol(b.getName()); } std::string toELFString(const Archive::Symbol &b) { - return demangle(b.getName()); + return maybeDemangleSymbol(b.getName()); } } // namespace lld Index: include/lld/Common/Strings.h =================================================================== --- include/lld/Common/Strings.h +++ include/lld/Common/Strings.h @@ -19,8 +19,7 @@ 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); +llvm::Optional demangle(llvm::StringRef name); std::vector parseHex(llvm::StringRef s); bool isValidCIdentifier(llvm::StringRef s); Index: wasm/Symbols.cpp =================================================================== --- wasm/Symbols.cpp +++ wasm/Symbols.cpp @@ -303,7 +303,7 @@ std::string lld::maybeDemangleSymbol(StringRef name) { if (config->demangle) - if (Optional s = demangleItanium(name)) + if (Optional s = demangle(name)) return *s; return name; }