Index: lld/trunk/Common/Strings.cpp =================================================================== --- lld/trunk/Common/Strings.cpp +++ lld/trunk/Common/Strings.cpp @@ -22,18 +22,16 @@ 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 + // either a C or C++ symbol. Don't call demangle 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) + std::string demangled = demangle(name); + if (demangled == name) return None; - std::string s(buf); - free(buf); - return s; + return demangled; } StringMatcher::StringMatcher(ArrayRef pat) { Index: lld/trunk/test/ELF/undef.s =================================================================== --- lld/trunk/test/ELF/undef.s +++ lld/trunk/test/ELF/undef.s @@ -23,6 +23,10 @@ # CHECK: error: undefined symbol: vtable for Foo # CHECK: the vtable symbol may be undefined because the class is missing its key function (see https://lld.llvm.org/missingkeyfunction) +# CHECK: error: undefined symbol: __Z3fooi +# CHECK: >>> referenced by undef.s +# CHECK: >>> {{.*}}:(.text+0x1A) + # CHECK: error: undefined symbol: zed2 # CHECK: >>> referenced by {{.*}}.o:(.text+0x0) in archive {{.*}}2.a @@ -64,3 +68,4 @@ call zed1 call _Z3fooi call _ZTV3Foo + call __Z3fooi