https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/152483
>From cdcb92a3012107dce4418de1c74c6142dc356a14 Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Thu, 7 Aug 2025 13:11:59 +0100 Subject: [PATCH 1/2] [lldb][Mangled] Move SuffixRange computation into TrackingOutputBuffer This way all the tracking is self-contained in `TrackingOutputBuffer` and we can test the `SuffixRange` properly. --- lldb/source/Core/DemangledNameInfo.cpp | 11 ++++++++ lldb/source/Core/Mangled.cpp | 3 --- .../Language/CPlusPlus/CPlusPlusLanguage.cpp | 25 +++++++++---------- .../Language/CPlusPlus/CPlusPlusLanguage.h | 4 +++ lldb/unittests/Core/MangledTest.cpp | 8 +++--- 5 files changed, 31 insertions(+), 20 deletions(-) diff --git a/lldb/source/Core/DemangledNameInfo.cpp b/lldb/source/Core/DemangledNameInfo.cpp index 00227f02bbff8..4001e699f75c2 100644 --- a/lldb/source/Core/DemangledNameInfo.cpp +++ b/lldb/source/Core/DemangledNameInfo.cpp @@ -111,6 +111,11 @@ void TrackingOutputBuffer::finalizeEnd() { if (NameInfo.ScopeRange.first > NameInfo.ScopeRange.second) NameInfo.ScopeRange.second = NameInfo.ScopeRange.first; NameInfo.BasenameRange.first = NameInfo.ScopeRange.second; + + // We call anything past the FunctionEncoding is the suffix. + // In practice this would be nodes like `DotSuffix` that wrap + // a FunctionEncoding. + NameInfo.SuffixRange.first = getCurrentPosition(); } ScopedOverride<unsigned> TrackingOutputBuffer::enterFunctionTypePrinting() { @@ -138,6 +143,9 @@ void TrackingOutputBuffer::printLeft(const Node &N) { default: OutputBuffer::printLeft(N); } + + // Keeps updating suffix until we reach the end. + NameInfo.SuffixRange.second = getCurrentPosition(); } void TrackingOutputBuffer::printRight(const Node &N) { @@ -151,6 +159,9 @@ void TrackingOutputBuffer::printRight(const Node &N) { default: OutputBuffer::printRight(N); } + + // Keeps updating suffix until we reach the end. + NameInfo.SuffixRange.second = getCurrentPosition(); } void TrackingOutputBuffer::printLeftImpl(const FunctionType &N) { diff --git a/lldb/source/Core/Mangled.cpp b/lldb/source/Core/Mangled.cpp index 3663f430111c2..ce4db4e0daa8b 100644 --- a/lldb/source/Core/Mangled.cpp +++ b/lldb/source/Core/Mangled.cpp @@ -172,9 +172,6 @@ GetItaniumDemangledStr(const char *M) { TrackingOutputBuffer OB(demangled_cstr, demangled_size); demangled_cstr = ipd.finishDemangle(&OB); - // TODO: we should set the SuffixRange inside the TrackingOutputBuffer. - OB.NameInfo.SuffixRange.first = OB.NameInfo.QualifiersRange.second; - OB.NameInfo.SuffixRange.second = std::string_view(OB).size(); info = std::move(OB.NameInfo); assert(demangled_cstr && diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 3bc870810dc81..3118ff151d1cf 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -392,13 +392,16 @@ GetDemangledScope(const SymbolContext &sc) { return CPlusPlusLanguage::GetDemangledScope(demangled_name, info); } -/// Handles anything printed after the FunctionEncoding ItaniumDemangle -/// node. Most notably the DotSuffix node. -/// -/// FIXME: the suffix should also have an associated -/// CPlusPlusLanguage::GetDemangledFunctionSuffix -/// once we start setting the `DemangledNameInfo::SuffixRange` -/// from inside the `TrackingOutputBuffer`. +llvm::Expected<llvm::StringRef> +CPlusPlusLanguage::GetDemangledFunctionSuffix(llvm::StringRef demangled, + const DemangledNameInfo &info) { + if (!info.hasSuffix()) + return llvm::createStringError("Suffix range for '%s' is invalid.", + demangled.data()); + + return demangled.slice(info.SuffixRange.first, info.SuffixRange.second); +} + static llvm::Expected<llvm::StringRef> GetDemangledFunctionSuffix(const SymbolContext &sc) { auto info_or_err = GetAndValidateInfo(sc); @@ -407,11 +410,7 @@ GetDemangledFunctionSuffix(const SymbolContext &sc) { auto [demangled_name, info] = *info_or_err; - if (!info.hasSuffix()) - return llvm::createStringError("Suffix range for '%s' is invalid.", - demangled_name.data()); - - return demangled_name.slice(info.SuffixRange.first, info.SuffixRange.second); + return CPlusPlusLanguage::GetDemangledFunctionSuffix(demangled_name, info); } llvm::Expected<llvm::StringRef> @@ -2424,7 +2423,7 @@ bool CPlusPlusLanguage::HandleFrameFormatVariable( return true; } case FormatEntity::Entry::Type::FunctionSuffix: { - auto suffix_or_err = GetDemangledFunctionSuffix(sc); + auto suffix_or_err = ::GetDemangledFunctionSuffix(sc); if (!suffix_or_err) { LLDB_LOG_ERROR( GetLog(LLDBLog::Language), suffix_or_err.takeError(), diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h index 4f449f11257a6..4a30299dd2658 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h @@ -138,6 +138,10 @@ class CPlusPlusLanguage : public Language { GetDemangledFunctionArguments(llvm::StringRef demangled, const DemangledNameInfo &info); + static llvm::Expected<llvm::StringRef> + GetDemangledFunctionSuffix(llvm::StringRef demangled, + const DemangledNameInfo &info); + // Extract C++ context and identifier from a string using heuristic matching // (as opposed to // CPlusPlusLanguage::CxxMethodName which has to have a fully qualified C++ diff --git a/lldb/unittests/Core/MangledTest.cpp b/lldb/unittests/Core/MangledTest.cpp index a6e6e75fde145..cbc0c5d951b99 100644 --- a/lldb/unittests/Core/MangledTest.cpp +++ b/lldb/unittests/Core/MangledTest.cpp @@ -889,10 +889,10 @@ TEST_P(DemanglingInfoCorrectnessTestFixutre, Correctness) { EXPECT_THAT_EXPECTED(qualifiers, llvm::Succeeded()); reconstructed_name += *qualifiers; - // TODO: should retrieve suffix using the plugin too. - auto suffix = tracked_name.slice(OB->NameInfo.QualifiersRange.second, - llvm::StringRef::npos); - reconstructed_name += suffix; + auto suffix = + CPlusPlusLanguage::GetDemangledFunctionSuffix(tracked_name, OB->NameInfo); + EXPECT_THAT_EXPECTED(suffix, llvm::Succeeded()); + reconstructed_name += *suffix; EXPECT_EQ(reconstructed_name, demangled); } >From 6b5bf4f7bfbeca496ee9a15008cc63da68a373a1 Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Thu, 7 Aug 2025 14:30:25 +0100 Subject: [PATCH 2/2] fixup! typos --- lldb/source/Core/DemangledNameInfo.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lldb/source/Core/DemangledNameInfo.cpp b/lldb/source/Core/DemangledNameInfo.cpp index 4001e699f75c2..76f8987c5149c 100644 --- a/lldb/source/Core/DemangledNameInfo.cpp +++ b/lldb/source/Core/DemangledNameInfo.cpp @@ -112,7 +112,7 @@ void TrackingOutputBuffer::finalizeEnd() { NameInfo.ScopeRange.second = NameInfo.ScopeRange.first; NameInfo.BasenameRange.first = NameInfo.ScopeRange.second; - // We call anything past the FunctionEncoding is the suffix. + // We call anything past the FunctionEncoding the "suffix". // In practice this would be nodes like `DotSuffix` that wrap // a FunctionEncoding. NameInfo.SuffixRange.first = getCurrentPosition(); @@ -144,7 +144,7 @@ void TrackingOutputBuffer::printLeft(const Node &N) { OutputBuffer::printLeft(N); } - // Keeps updating suffix until we reach the end. + // Keep updating suffix until we reach the end. NameInfo.SuffixRange.second = getCurrentPosition(); } @@ -160,7 +160,7 @@ void TrackingOutputBuffer::printRight(const Node &N) { OutputBuffer::printRight(N); } - // Keeps updating suffix until we reach the end. + // Keep updating suffix until we reach the end. NameInfo.SuffixRange.second = getCurrentPosition(); } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits