Author: Nick Desaulniers Date: 2023-06-02T15:08:14-07:00 New Revision: 12d967c95f1633bebd1b225ddd53573951a7ca43
URL: https://github.com/llvm/llvm-project/commit/12d967c95f1633bebd1b225ddd53573951a7ca43 DIFF: https://github.com/llvm/llvm-project/commit/12d967c95f1633bebd1b225ddd53573951a7ca43.diff LOG: [Damangle] convert rustDemangle to use std::string_view I was doing this API conversion to use std::string_view top-down in D149104, but this exposed issues in individual demanglers that needed to get fixed first. There's no issue with the conversion for the Rust demangler, so convert it first. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D149784 Added: Modified: lldb/include/lldb/Utility/ConstString.h lldb/source/Core/Mangled.cpp llvm/include/llvm/Demangle/Demangle.h llvm/lib/Demangle/Demangle.cpp llvm/lib/Demangle/RustDemangle.cpp llvm/tools/llvm-rust-demangle-fuzzer/llvm-rust-demangle-fuzzer.cpp Removed: ################################################################################ diff --git a/lldb/include/lldb/Utility/ConstString.h b/lldb/include/lldb/Utility/ConstString.h index a4b959b14f15a..332cca5fdbf12 100644 --- a/lldb/include/lldb/Utility/ConstString.h +++ b/lldb/include/lldb/Utility/ConstString.h @@ -14,6 +14,7 @@ #include "llvm/Support/FormatVariadic.h" #include <cstddef> +#include <string_view> namespace lldb_private { class Stream; @@ -182,6 +183,8 @@ class ConstString { // Implicitly convert \class ConstString instances to \class StringRef. operator llvm::StringRef() const { return GetStringRef(); } + // Implicitly convert \class ConstString instances to \calss std::string_view. + operator std::string_view() const { return std::string_view(m_string, GetLength()); } /// Get the string value as a C string. /// diff --git a/lldb/source/Core/Mangled.cpp b/lldb/source/Core/Mangled.cpp index 30c8e1a3330d2..bf9014daf8a26 100644 --- a/lldb/source/Core/Mangled.cpp +++ b/lldb/source/Core/Mangled.cpp @@ -25,6 +25,7 @@ #include <mutex> #include <string> +#include <string_view> #include <utility> #include <cstdlib> @@ -150,7 +151,7 @@ static char *GetItaniumDemangledStr(const char *M) { return demangled_cstr; } -static char *GetRustV0DemangledStr(const char *M) { +static char *GetRustV0DemangledStr(std::string_view M) { char *demangled_cstr = llvm::rustDemangle(M); if (Log *log = GetLog(LLDBLog::Demangle)) { @@ -259,7 +260,7 @@ ConstString Mangled::GetDemangledName() const { break; } case eManglingSchemeRustV0: - demangled_name = GetRustV0DemangledStr(mangled_name); + demangled_name = GetRustV0DemangledStr(m_mangled); break; case eManglingSchemeD: demangled_name = GetDLangDemangledStr(mangled_name); diff --git a/llvm/include/llvm/Demangle/Demangle.h b/llvm/include/llvm/Demangle/Demangle.h index 1fd286bfad4c0..9ba96c093eaca 100644 --- a/llvm/include/llvm/Demangle/Demangle.h +++ b/llvm/include/llvm/Demangle/Demangle.h @@ -11,6 +11,7 @@ #include <cstddef> #include <string> +#include <string_view> namespace llvm { /// This is a llvm local version of __cxa_demangle. Other than the name and @@ -54,7 +55,7 @@ char *microsoftDemangle(const char *mangled_name, size_t *n_read, int *status, MSDemangleFlags Flags = MSDF_None); // Demangles a Rust v0 mangled symbol. -char *rustDemangle(const char *MangledName); +char *rustDemangle(std::string_view MangledName); // Demangles a D mangled symbol. char *dlangDemangle(const char *MangledName); diff --git a/llvm/lib/Demangle/Demangle.cpp b/llvm/lib/Demangle/Demangle.cpp index f83117f3b7e05..4627ca822f676 100644 --- a/llvm/lib/Demangle/Demangle.cpp +++ b/llvm/lib/Demangle/Demangle.cpp @@ -51,7 +51,7 @@ bool llvm::nonMicrosoftDemangle(std::string_view MangledName, if (isItaniumEncoding(MangledName.data())) Demangled = itaniumDemangle(MangledName); else if (isRustEncoding(MangledName.data())) - Demangled = rustDemangle(MangledName.data()); + Demangled = rustDemangle(MangledName); else if (isDLangEncoding(MangledName.data())) Demangled = dlangDemangle(MangledName.data()); diff --git a/llvm/lib/Demangle/RustDemangle.cpp b/llvm/lib/Demangle/RustDemangle.cpp index 697673f0564b7..f0d70de3abb53 100644 --- a/llvm/lib/Demangle/RustDemangle.cpp +++ b/llvm/lib/Demangle/RustDemangle.cpp @@ -20,11 +20,13 @@ #include <cstdint> #include <cstring> #include <limits> +#include <string_view> using namespace llvm; using llvm::itanium_demangle::OutputBuffer; using llvm::itanium_demangle::ScopedOverride; +using llvm::itanium_demangle::starts_with; namespace { @@ -146,17 +148,13 @@ class Demangler { } // namespace -char *llvm::rustDemangle(const char *MangledName) { - if (MangledName == nullptr) - return nullptr; - +char *llvm::rustDemangle(std::string_view MangledName) { // Return early if mangled name doesn't look like a Rust symbol. - std::string_view Mangled(MangledName); - if (!llvm::itanium_demangle::starts_with(Mangled, "_R")) + if (MangledName.empty() || !starts_with(MangledName, "_R")) return nullptr; Demangler D; - if (!D.demangle(Mangled)) { + if (!D.demangle(MangledName)) { std::free(D.Output.getBuffer()); return nullptr; } @@ -196,7 +194,7 @@ bool Demangler::demangle(std::string_view Mangled) { RecursionLevel = 0; BoundLifetimes = 0; - if (!llvm::itanium_demangle::starts_with(Mangled, "_R")) { + if (!starts_with(Mangled, "_R")) { Error = true; return false; } diff --git a/llvm/tools/llvm-rust-demangle-fuzzer/llvm-rust-demangle-fuzzer.cpp b/llvm/tools/llvm-rust-demangle-fuzzer/llvm-rust-demangle-fuzzer.cpp index 3a4b7ca7af8ff..ed7161a482125 100644 --- a/llvm/tools/llvm-rust-demangle-fuzzer/llvm-rust-demangle-fuzzer.cpp +++ b/llvm/tools/llvm-rust-demangle-fuzzer/llvm-rust-demangle-fuzzer.cpp @@ -13,7 +13,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { std::string NullTerminatedString((const char *)Data, Size); - char *Demangled = llvm::rustDemangle(NullTerminatedString.c_str()); + char *Demangled = llvm::rustDemangle(NullTerminatedString); std::free(Demangled); return 0; } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits