diff options
-rw-r--r-- | lld/Common/Strings.cpp | 10 | ||||
-rw-r--r-- | lld/test/ELF/undef.s | 5 |
2 files changed, 9 insertions, 6 deletions
diff --git a/lld/Common/Strings.cpp b/lld/Common/Strings.cpp index 5cb44e9a8fe..4b40abeda5e 100644 --- a/lld/Common/Strings.cpp +++ b/lld/Common/Strings.cpp @@ -22,18 +22,16 @@ using namespace lld; Optional<std::string> 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<StringRef> pat) { diff --git a/lld/test/ELF/undef.s b/lld/test/ELF/undef.s index e6277e36667..3d432b097c9 100644 --- a/lld/test/ELF/undef.s +++ b/lld/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 @@ _start: call zed1 call _Z3fooi call _ZTV3Foo + call __Z3fooi |