Author: Nick Desaulniers Date: 2023-06-02T15:19:41-07:00 New Revision: f5371eb3d3aed06ba84a69533586a60243ad2f24
URL: https://github.com/llvm/llvm-project/commit/f5371eb3d3aed06ba84a69533586a60243ad2f24 DIFF: https://github.com/llvm/llvm-project/commit/f5371eb3d3aed06ba84a69533586a60243ad2f24.diff LOG: [Damangle] convert dlangDemangle 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 D language demangler, so convert it. I have a more aggressive refactoring of the entire D language demangler to use std::string_view more extensively, but the interface with llvm::nonMicrosoftDemangle is the more interesting one. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D151003 Added: Modified: lldb/source/Core/Mangled.cpp llvm/include/llvm/Demangle/Demangle.h llvm/lib/Demangle/DLangDemangle.cpp llvm/lib/Demangle/Demangle.cpp llvm/tools/llvm-dlang-demangle-fuzzer/llvm-dlang-demangle-fuzzer.cpp llvm/unittests/Demangle/DLangDemangleTest.cpp Removed: ################################################################################ diff --git a/lldb/source/Core/Mangled.cpp b/lldb/source/Core/Mangled.cpp index bf9014daf8a26..3294b246ae743 100644 --- a/lldb/source/Core/Mangled.cpp +++ b/lldb/source/Core/Mangled.cpp @@ -164,7 +164,7 @@ static char *GetRustV0DemangledStr(std::string_view M) { return demangled_cstr; } -static char *GetDLangDemangledStr(const char *M) { +static char *GetDLangDemangledStr(std::string_view M) { char *demangled_cstr = llvm::dlangDemangle(M); if (Log *log = GetLog(LLDBLog::Demangle)) { @@ -263,7 +263,7 @@ ConstString Mangled::GetDemangledName() const { demangled_name = GetRustV0DemangledStr(m_mangled); break; case eManglingSchemeD: - demangled_name = GetDLangDemangledStr(mangled_name); + demangled_name = GetDLangDemangledStr(m_mangled); break; case eManglingSchemeNone: llvm_unreachable("eManglingSchemeNone was handled already"); diff --git a/llvm/include/llvm/Demangle/Demangle.h b/llvm/include/llvm/Demangle/Demangle.h index 9ba96c093eaca..d9b830c660047 100644 --- a/llvm/include/llvm/Demangle/Demangle.h +++ b/llvm/include/llvm/Demangle/Demangle.h @@ -58,7 +58,7 @@ char *microsoftDemangle(const char *mangled_name, size_t *n_read, int *status, char *rustDemangle(std::string_view MangledName); // Demangles a D mangled symbol. -char *dlangDemangle(const char *MangledName); +char *dlangDemangle(std::string_view MangledName); /// Attempt to demangle a string using diff erent demangling schemes. /// The function uses heuristics to determine which demangling scheme to use. diff --git a/llvm/lib/Demangle/DLangDemangle.cpp b/llvm/lib/Demangle/DLangDemangle.cpp index ad583b86946fd..8b94d40354b43 100644 --- a/llvm/lib/Demangle/DLangDemangle.cpp +++ b/llvm/lib/Demangle/DLangDemangle.cpp @@ -14,6 +14,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Demangle/Demangle.h" +#include "llvm/Demangle/StringViewExtras.h" #include "llvm/Demangle/Utility.h" #include <cctype> @@ -22,6 +23,7 @@ using namespace llvm; using llvm::itanium_demangle::OutputBuffer; +using llvm::itanium_demangle::starts_with; namespace { @@ -541,20 +543,20 @@ const char *Demangler::parseMangle(OutputBuffer *Demangled) { return parseMangle(Demangled, this->Str); } -char *llvm::dlangDemangle(const char *MangledName) { - if (MangledName == nullptr || strncmp(MangledName, "_D", 2) != 0) +char *llvm::dlangDemangle(std::string_view MangledName) { + if (MangledName.empty() || !starts_with(MangledName, "_D")) return nullptr; OutputBuffer Demangled; - if (strcmp(MangledName, "_Dmain") == 0) { + if (MangledName == "_Dmain") { Demangled << "D main"; } else { - Demangler D = Demangler(MangledName); - MangledName = D.parseMangle(&Demangled); + Demangler D(MangledName.data()); + const char *M = D.parseMangle(&Demangled); // Check that the entire symbol was successfully demangled. - if (MangledName == nullptr || *MangledName != '\0') { + if (M == nullptr || *M != '\0') { std::free(Demangled.getBuffer()); return nullptr; } diff --git a/llvm/lib/Demangle/Demangle.cpp b/llvm/lib/Demangle/Demangle.cpp index 4627ca822f676..3dd4f31268f4a 100644 --- a/llvm/lib/Demangle/Demangle.cpp +++ b/llvm/lib/Demangle/Demangle.cpp @@ -53,7 +53,7 @@ bool llvm::nonMicrosoftDemangle(std::string_view MangledName, else if (isRustEncoding(MangledName.data())) Demangled = rustDemangle(MangledName); else if (isDLangEncoding(MangledName.data())) - Demangled = dlangDemangle(MangledName.data()); + Demangled = dlangDemangle(MangledName); if (!Demangled) return false; diff --git a/llvm/tools/llvm-dlang-demangle-fuzzer/llvm-dlang-demangle-fuzzer.cpp b/llvm/tools/llvm-dlang-demangle-fuzzer/llvm-dlang-demangle-fuzzer.cpp index 16175af9f233d..ac4bd752fe0bb 100644 --- a/llvm/tools/llvm-dlang-demangle-fuzzer/llvm-dlang-demangle-fuzzer.cpp +++ b/llvm/tools/llvm-dlang-demangle-fuzzer/llvm-dlang-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::dlangDemangle(NullTerminatedString.c_str()); + char *Demangled = llvm::dlangDemangle(NullTerminatedString); std::free(Demangled); return 0; } diff --git a/llvm/unittests/Demangle/DLangDemangleTest.cpp b/llvm/unittests/Demangle/DLangDemangleTest.cpp index dd0c699d5c186..1322f530e5963 100644 --- a/llvm/unittests/Demangle/DLangDemangleTest.cpp +++ b/llvm/unittests/Demangle/DLangDemangleTest.cpp @@ -11,10 +11,11 @@ #include "gtest/gtest.h" #include <cstdlib> +#include <string_view> #include <utility> struct DLangDemangleTestFixture - : public testing::TestWithParam<std::pair<const char *, const char *>> { + : public testing::TestWithParam<std::pair<std::string_view, const char *>> { char *Demangled; void SetUp() override { Demangled = llvm::dlangDemangle(GetParam().first); } @@ -29,9 +30,8 @@ TEST_P(DLangDemangleTestFixture, DLangDemangleTest) { INSTANTIATE_TEST_SUITE_P( DLangDemangleTest, DLangDemangleTestFixture, testing::Values( - std::make_pair("_Dmain", "D main"), std::make_pair(nullptr, nullptr), - std::make_pair("_Z", nullptr), std::make_pair("_DDD", nullptr), - std::make_pair("_D88", nullptr), + std::make_pair("_Dmain", "D main"), std::make_pair("_Z", nullptr), + std::make_pair("_DDD", nullptr), std::make_pair("_D88", nullptr), std::make_pair("_D8demangleZ", "demangle"), std::make_pair("_D8demangle4testZ", "demangle.test"), std::make_pair("_D8demangle4test5test2Z", "demangle.test.test2"), _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits