diff options
Diffstat (limited to 'llvm/lib/Demangle/Demangle.cpp')
-rw-r--r-- | llvm/lib/Demangle/Demangle.cpp | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/llvm/lib/Demangle/Demangle.cpp b/llvm/lib/Demangle/Demangle.cpp index 9d128424cabf..f2aa571d685f 100644 --- a/llvm/lib/Demangle/Demangle.cpp +++ b/llvm/lib/Demangle/Demangle.cpp @@ -11,45 +11,45 @@ //===----------------------------------------------------------------------===// #include "llvm/Demangle/Demangle.h" +#include "llvm/Demangle/StringViewExtras.h" #include <cstdlib> -#include <cstring> +#include <string_view> -static bool isItaniumEncoding(const char *S) { - // Itanium encoding requires 1 or 3 leading underscores, followed by 'Z'. - return std::strncmp(S, "_Z", 2) == 0 || std::strncmp(S, "___Z", 4) == 0; -} - -static bool isRustEncoding(const char *S) { return S[0] == '_' && S[1] == 'R'; } - -static bool isDLangEncoding(const std::string &MangledName) { - return MangledName.size() >= 2 && MangledName[0] == '_' && - MangledName[1] == 'D'; -} +using llvm::itanium_demangle::starts_with; -std::string llvm::demangle(const std::string &MangledName) { +std::string llvm::demangle(std::string_view MangledName) { std::string Result; - const char *S = MangledName.c_str(); - if (nonMicrosoftDemangle(S, Result)) + if (nonMicrosoftDemangle(MangledName, Result)) return Result; - if (S[0] == '_' && nonMicrosoftDemangle(S + 1, Result)) + if (starts_with(MangledName, '_') && + nonMicrosoftDemangle(MangledName.substr(1), Result)) return Result; - if (char *Demangled = - microsoftDemangle(S, nullptr, nullptr, nullptr, nullptr)) { + if (char *Demangled = microsoftDemangle(MangledName, nullptr, nullptr)) { Result = Demangled; std::free(Demangled); - return Result; + } else { + Result = MangledName; } + return Result; +} - return MangledName; +static bool isItaniumEncoding(std::string_view S) { + // Itanium encoding requires 1 or 3 leading underscores, followed by 'Z'. + return starts_with(S, "_Z") || starts_with(S, "___Z"); } -bool llvm::nonMicrosoftDemangle(const char *MangledName, std::string &Result) { +static bool isRustEncoding(std::string_view S) { return starts_with(S, "_R"); } + +static bool isDLangEncoding(std::string_view S) { return starts_with(S, "_D"); } + +bool llvm::nonMicrosoftDemangle(std::string_view MangledName, + std::string &Result) { char *Demangled = nullptr; if (isItaniumEncoding(MangledName)) - Demangled = itaniumDemangle(MangledName, nullptr, nullptr, nullptr); + Demangled = itaniumDemangle(MangledName); else if (isRustEncoding(MangledName)) Demangled = rustDemangle(MangledName); else if (isDLangEncoding(MangledName)) |