diff --git a/llvm/include/llvm/Demangle/Demangle.h b/llvm/include/llvm/Demangle/Demangle.h --- a/llvm/include/llvm/Demangle/Demangle.h +++ b/llvm/include/llvm/Demangle/Demangle.h @@ -28,7 +28,10 @@ demangle_success = 0, }; -char *itaniumDemangle(const char *mangled_name, int *status); +/// Returns a non-NULL pointer to a NUL-terminated C style string +/// that should be explicitly freed, if successful. Otherwise, may return +/// nullptr if mangled_name is not a valid mangling or is nullptr. +char *itaniumDemangle(const char *mangled_name); enum MSDemangleFlags { MSDF_None = 0, diff --git a/llvm/lib/Demangle/Demangle.cpp b/llvm/lib/Demangle/Demangle.cpp --- a/llvm/lib/Demangle/Demangle.cpp +++ b/llvm/lib/Demangle/Demangle.cpp @@ -48,7 +48,7 @@ bool llvm::nonMicrosoftDemangle(const char *MangledName, std::string &Result) { char *Demangled = nullptr; if (isItaniumEncoding(MangledName)) - Demangled = itaniumDemangle(MangledName, nullptr); + Demangled = itaniumDemangle(MangledName); else if (isRustEncoding(MangledName)) Demangled = rustDemangle(MangledName); else if (isDLangEncoding(MangledName)) diff --git a/llvm/lib/Demangle/ItaniumDemangle.cpp b/llvm/lib/Demangle/ItaniumDemangle.cpp --- a/llvm/lib/Demangle/ItaniumDemangle.cpp +++ b/llvm/lib/Demangle/ItaniumDemangle.cpp @@ -365,31 +365,20 @@ using Demangler = itanium_demangle::ManglingParser; -char *llvm::itaniumDemangle(const char *MangledName, int *Status) { - if (MangledName == nullptr) { - if (Status) - *Status = demangle_invalid_args; +char *llvm::itaniumDemangle(const char *MangledName) { + if (!MangledName) return nullptr; - } - int InternalStatus = demangle_success; Demangler Parser(MangledName, MangledName + std::strlen(MangledName)); Node *AST = Parser.parse(); + if (!AST) + return nullptr; - char *Buf; - if (AST == nullptr) - InternalStatus = demangle_invalid_mangled_name; - else { - OutputBuffer OB; - assert(Parser.ForwardTemplateRefs.empty()); - AST->print(OB); - OB += '\0'; - Buf = OB.getBuffer(); - } - - if (Status) - *Status = InternalStatus; - return InternalStatus == demangle_success ? Buf : nullptr; + OutputBuffer OB; + assert(Parser.ForwardTemplateRefs.empty()); + AST->print(OB); + OB += '\0'; + return OB.getBuffer(); } ItaniumPartialDemangler::ItaniumPartialDemangler() diff --git a/llvm/lib/ProfileData/GCOV.cpp b/llvm/lib/ProfileData/GCOV.cpp --- a/llvm/lib/ProfileData/GCOV.cpp +++ b/llvm/lib/ProfileData/GCOV.cpp @@ -337,10 +337,8 @@ if (demangled.empty()) { do { if (Name.startswith("_Z")) { - int status = 0; // Name is guaranteed to be NUL-terminated. - char *res = itaniumDemangle(Name.data(), &status); - if (status == 0) { + if (char *res = itaniumDemangle(Name.data())) { demangled = res; free(res); break; diff --git a/llvm/lib/Support/Unix/Signals.inc b/llvm/lib/Support/Unix/Signals.inc --- a/llvm/lib/Support/Unix/Signals.inc +++ b/llvm/lib/Support/Unix/Signals.inc @@ -652,13 +652,12 @@ if (dlinfo.dli_sname != nullptr) { OS << ' '; - int res; - char *d = itaniumDemangle(dlinfo.dli_sname, &res); - if (!d) - OS << dlinfo.dli_sname; - else + if (char *d = itaniumDemangle(dlinfo.dli_sname)) { OS << d; - free(d); + free(d); + } else { + OS << dlinfo.dli_sname; + } OS << format(" + %tu", (static_cast(StackTrace[i]) - static_cast(dlinfo.dli_saddr))); diff --git a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp --- a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp +++ b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp @@ -84,11 +84,11 @@ char *Undecorated = nullptr; if (Types) - Undecorated = itaniumDemangle(DecoratedStr, nullptr); + Undecorated = itaniumDemangle(DecoratedStr); if (!Undecorated && strncmp(DecoratedStr, "__imp_", 6) == 0) { Prefix = "import thunk for "; - Undecorated = itaniumDemangle(DecoratedStr + 6, nullptr); + Undecorated = itaniumDemangle(DecoratedStr + 6); } Result = Undecorated ? Prefix + Undecorated : Mangled; diff --git a/llvm/tools/llvm-itanium-demangle-fuzzer/llvm-itanium-demangle-fuzzer.cpp b/llvm/tools/llvm-itanium-demangle-fuzzer/llvm-itanium-demangle-fuzzer.cpp --- a/llvm/tools/llvm-itanium-demangle-fuzzer/llvm-itanium-demangle-fuzzer.cpp +++ b/llvm/tools/llvm-itanium-demangle-fuzzer/llvm-itanium-demangle-fuzzer.cpp @@ -14,9 +14,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { std::string NullTerminatedString((const char *)Data, Size); - int status = 0; - if (char *demangle = - llvm::itaniumDemangle(NullTerminatedString.c_str(), &status)) + if (char *demangle = llvm::itaniumDemangle(NullTerminatedString.c_str())) free(demangle); return 0; diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -7280,8 +7280,7 @@ } else if (SymbolName != nullptr && strncmp(SymbolName, "__Z", 3) == 0) { if (info->demangled_name != nullptr) free(info->demangled_name); - int status; - info->demangled_name = itaniumDemangle(SymbolName + 1, &status); + info->demangled_name = itaniumDemangle(SymbolName + 1); if (info->demangled_name != nullptr) { *ReferenceName = info->demangled_name; *ReferenceType = LLVMDisassembler_ReferenceType_DeMangled_Name; @@ -7379,8 +7378,7 @@ } else if (SymbolName != nullptr && strncmp(SymbolName, "__Z", 3) == 0) { if (info->demangled_name != nullptr) free(info->demangled_name); - int status; - info->demangled_name = itaniumDemangle(SymbolName + 1, &status); + info->demangled_name = itaniumDemangle(SymbolName + 1); if (info->demangled_name != nullptr) { *ReferenceName = info->demangled_name; *ReferenceType = LLVMDisassembler_ReferenceType_DeMangled_Name; diff --git a/llvm/tools/llvm-opt-report/OptReport.cpp b/llvm/tools/llvm-opt-report/OptReport.cpp --- a/llvm/tools/llvm-opt-report/OptReport.cpp +++ b/llvm/tools/llvm-opt-report/OptReport.cpp @@ -338,15 +338,11 @@ bool Printed = false; if (!NoDemangle) { - int Status = 0; - char *Demangled = itaniumDemangle(FuncName.c_str(), &Status); - if (Demangled && Status == 0) { + if (char *Demangled = itaniumDemangle(FuncName.c_str())) { OS << Demangled; Printed = true; - } - - if (Demangled) std::free(Demangled); + } } if (!Printed)