https://github.com/rupprecht updated https://github.com/llvm/llvm-project/pull/142815
>From 14a5860c98b5c0c067c8b12ccbaf32bfa45b1a66 Mon Sep 17 00:00:00 2001 From: Jordan Rupprecht <ruppre...@google.com> Date: Wed, 4 Jun 2025 09:53:12 -0700 Subject: [PATCH 1/4] [lldb] Provide TrackingOutputBufferDeleter for custom unique_ptr deleter --- lldb/include/lldb/Core/DemangledNameInfo.h | 10 +++ lldb/unittests/Core/MangledTest.cpp | 72 +++++++++++----------- 2 files changed, 46 insertions(+), 36 deletions(-) diff --git a/lldb/include/lldb/Core/DemangledNameInfo.h b/lldb/include/lldb/Core/DemangledNameInfo.h index 4b5ba5e42b3b1..8d730efbc44d8 100644 --- a/lldb/include/lldb/Core/DemangledNameInfo.h +++ b/lldb/include/lldb/Core/DemangledNameInfo.h @@ -13,6 +13,7 @@ #include "llvm/Demangle/Utility.h" #include <cstddef> +#include <cstdlib> #include <utility> namespace lldb_private { @@ -159,4 +160,13 @@ struct TrackingOutputBuffer : public llvm::itanium_demangle::OutputBuffer { }; } // namespace lldb_private +struct TrackingOutputBufferDeleter { + void operator()(TrackingOutputBuffer *TOB) { + if (!TOB) + return; + std::free(TOB->getBuffer()); + delete TOB; + } +}; + #endif // LLDB_CORE_DEMANGLEDNAMEINFO_H diff --git a/lldb/unittests/Core/MangledTest.cpp b/lldb/unittests/Core/MangledTest.cpp index e9dfd05459642..42e732b79dedf 100644 --- a/lldb/unittests/Core/MangledTest.cpp +++ b/lldb/unittests/Core/MangledTest.cpp @@ -26,6 +26,8 @@ #include "gtest/gtest.h" +#include <memory> + using namespace lldb; using namespace lldb_private; @@ -589,25 +591,25 @@ TEST_P(DemanglingPartsTestFixture, DemanglingParts) { ASSERT_NE(nullptr, Root); - TrackingOutputBuffer OB; - Root->print(OB); - auto demangled = std::string_view(OB); + auto OB = std::unique_ptr<TrackingOutputBuffer, TrackingOutputBufferDeleter>( + new TrackingOutputBuffer()); + Root->print(*OB); + auto demangled = std::string_view(*OB); - ASSERT_EQ(OB.NameInfo.hasBasename(), valid_basename); + ASSERT_EQ(OB->NameInfo.hasBasename(), valid_basename); - EXPECT_EQ(OB.NameInfo.BasenameRange, info.BasenameRange); - EXPECT_EQ(OB.NameInfo.ScopeRange, info.ScopeRange); - EXPECT_EQ(OB.NameInfo.ArgumentsRange, info.ArgumentsRange); - EXPECT_EQ(OB.NameInfo.QualifiersRange, info.QualifiersRange); + EXPECT_EQ(OB->NameInfo.BasenameRange, info.BasenameRange); + EXPECT_EQ(OB->NameInfo.ScopeRange, info.ScopeRange); + EXPECT_EQ(OB->NameInfo.ArgumentsRange, info.ArgumentsRange); + EXPECT_EQ(OB->NameInfo.QualifiersRange, info.QualifiersRange); auto get_part = [&](const std::pair<size_t, size_t> &loc) { return demangled.substr(loc.first, loc.second - loc.first); }; - EXPECT_EQ(get_part(OB.NameInfo.BasenameRange), basename); - EXPECT_EQ(get_part(OB.NameInfo.ScopeRange), scope); - EXPECT_EQ(get_part(OB.NameInfo.QualifiersRange), qualifiers); - std::free(OB.getBuffer()); + EXPECT_EQ(get_part(OB->NameInfo.BasenameRange), basename); + EXPECT_EQ(get_part(OB->NameInfo.ScopeRange), scope); + EXPECT_EQ(get_part(OB->NameInfo.QualifiersRange), qualifiers); } INSTANTIATE_TEST_SUITE_P(DemanglingPartsTests, DemanglingPartsTestFixture, @@ -635,36 +637,35 @@ TEST_P(DemanglingInfoCorrectnessTestFixutre, Correctness) { ASSERT_NE(nullptr, Root); - TrackingOutputBuffer OB; - Root->print(OB); + auto OB = std::unique_ptr<TrackingOutputBuffer, TrackingOutputBufferDeleter>( + new TrackingOutputBuffer()); + Root->print(*OB); // Filter out cases which would never show up in frames. We only care about // function names. if (Root->getKind() != llvm::itanium_demangle::Node::Kind::KFunctionEncoding && - Root->getKind() != llvm::itanium_demangle::Node::Kind::KDotSuffix) { - std::free(OB.getBuffer()); + Root->getKind() != llvm::itanium_demangle::Node::Kind::KDotSuffix) return; - } - ASSERT_TRUE(OB.NameInfo.hasBasename()); - - auto tracked_name = llvm::StringRef(OB); - - auto return_left = tracked_name.slice(0, OB.NameInfo.ScopeRange.first); - auto scope = tracked_name.slice(OB.NameInfo.ScopeRange.first, - OB.NameInfo.ScopeRange.second); - auto basename = tracked_name.slice(OB.NameInfo.BasenameRange.first, - OB.NameInfo.BasenameRange.second); - auto template_args = tracked_name.slice(OB.NameInfo.BasenameRange.second, - OB.NameInfo.ArgumentsRange.first); - auto args = tracked_name.slice(OB.NameInfo.ArgumentsRange.first, - OB.NameInfo.ArgumentsRange.second); - auto return_right = tracked_name.slice(OB.NameInfo.ArgumentsRange.second, - OB.NameInfo.QualifiersRange.first); - auto qualifiers = tracked_name.slice(OB.NameInfo.QualifiersRange.first, - OB.NameInfo.QualifiersRange.second); - auto suffix = tracked_name.slice(OB.NameInfo.QualifiersRange.second, + ASSERT_TRUE(OB->NameInfo.hasBasename()); + + auto tracked_name = llvm::StringRef(*OB); + + auto return_left = tracked_name.slice(0, OB->NameInfo.ScopeRange.first); + auto scope = tracked_name.slice(OB->NameInfo.ScopeRange.first, + OB->NameInfo.ScopeRange.second); + auto basename = tracked_name.slice(OB->NameInfo.BasenameRange.first, + OB->NameInfo.BasenameRange.second); + auto template_args = tracked_name.slice(OB->NameInfo.BasenameRange.second, + OB->NameInfo.ArgumentsRange.first); + auto args = tracked_name.slice(OB->NameInfo.ArgumentsRange.first, + OB->NameInfo.ArgumentsRange.second); + auto return_right = tracked_name.slice(OB->NameInfo.ArgumentsRange.second, + OB->NameInfo.QualifiersRange.first); + auto qualifiers = tracked_name.slice(OB->NameInfo.QualifiersRange.first, + OB->NameInfo.QualifiersRange.second); + auto suffix = tracked_name.slice(OB->NameInfo.QualifiersRange.second, llvm::StringRef::npos); auto reconstructed_name = @@ -672,7 +673,6 @@ TEST_P(DemanglingInfoCorrectnessTestFixutre, Correctness) { return_right, qualifiers, suffix); EXPECT_EQ(reconstructed_name, demangled); - std::free(OB.getBuffer()); } INSTANTIATE_TEST_SUITE_P( >From 498de8f6e9679092993cd8e2eae7bbe1834c842e Mon Sep 17 00:00:00 2001 From: Jordan Rupprecht <ruppre...@google.com> Date: Wed, 4 Jun 2025 09:55:40 -0700 Subject: [PATCH 2/4] Add docs --- lldb/include/lldb/Core/DemangledNameInfo.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lldb/include/lldb/Core/DemangledNameInfo.h b/lldb/include/lldb/Core/DemangledNameInfo.h index 8d730efbc44d8..a3edb3e034eb1 100644 --- a/lldb/include/lldb/Core/DemangledNameInfo.h +++ b/lldb/include/lldb/Core/DemangledNameInfo.h @@ -160,6 +160,16 @@ struct TrackingOutputBuffer : public llvm::itanium_demangle::OutputBuffer { }; } // namespace lldb_private +/// Custom deleter to use with unique_ptr. +/// +/// Usage: +/// \code{.cpp} +/// +/// auto OB = +/// std::unique_ptr<TrackingOutputBuffer, TrackingOutputBufferDeleter>( +/// new TrackingOutputBuffer()); +/// +/// \endcode struct TrackingOutputBufferDeleter { void operator()(TrackingOutputBuffer *TOB) { if (!TOB) >From 118b4f2df19418d8154566f68ef159d1a958be1a Mon Sep 17 00:00:00 2001 From: Jordan Rupprecht <ruppre...@google.com> Date: Wed, 4 Jun 2025 13:45:41 -0700 Subject: [PATCH 3/4] Move class to test --- lldb/include/lldb/Core/DemangledNameInfo.h | 19 ------------------- lldb/unittests/Core/MangledTest.cpp | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lldb/include/lldb/Core/DemangledNameInfo.h b/lldb/include/lldb/Core/DemangledNameInfo.h index a3edb3e034eb1..8fef93e2980c6 100644 --- a/lldb/include/lldb/Core/DemangledNameInfo.h +++ b/lldb/include/lldb/Core/DemangledNameInfo.h @@ -160,23 +160,4 @@ struct TrackingOutputBuffer : public llvm::itanium_demangle::OutputBuffer { }; } // namespace lldb_private -/// Custom deleter to use with unique_ptr. -/// -/// Usage: -/// \code{.cpp} -/// -/// auto OB = -/// std::unique_ptr<TrackingOutputBuffer, TrackingOutputBufferDeleter>( -/// new TrackingOutputBuffer()); -/// -/// \endcode -struct TrackingOutputBufferDeleter { - void operator()(TrackingOutputBuffer *TOB) { - if (!TOB) - return; - std::free(TOB->getBuffer()); - delete TOB; - } -}; - #endif // LLDB_CORE_DEMANGLEDNAMEINFO_H diff --git a/lldb/unittests/Core/MangledTest.cpp b/lldb/unittests/Core/MangledTest.cpp index 42e732b79dedf..24073fbcf2f5a 100644 --- a/lldb/unittests/Core/MangledTest.cpp +++ b/lldb/unittests/Core/MangledTest.cpp @@ -31,6 +31,25 @@ using namespace lldb; using namespace lldb_private; +/// Custom deleter to use with unique_ptr. +/// +/// Usage: +/// \code{.cpp} +/// +/// auto OB = +/// std::unique_ptr<TrackingOutputBuffer, TrackingOutputBufferDeleter>( +/// new TrackingOutputBuffer()); +/// +/// \endcode +struct TrackingOutputBufferDeleter { + void operator()(TrackingOutputBuffer *TOB) { + if (!TOB) + return; + std::free(TOB->getBuffer()); + delete TOB; + } +}; + TEST(MangledTest, ResultForValidName) { ConstString MangledName("_ZN1a1b1cIiiiEEvm"); Mangled TheMangled(MangledName); >From ca2d2d5c8b02688d8fb913e30bbd8191ab45f1e0 Mon Sep 17 00:00:00 2001 From: Jordan Rupprecht <ruppre...@google.com> Date: Wed, 4 Jun 2025 13:47:42 -0700 Subject: [PATCH 4/4] Move the corresponding include too --- lldb/include/lldb/Core/DemangledNameInfo.h | 1 - lldb/unittests/Core/MangledTest.cpp | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/lldb/include/lldb/Core/DemangledNameInfo.h b/lldb/include/lldb/Core/DemangledNameInfo.h index 8fef93e2980c6..4b5ba5e42b3b1 100644 --- a/lldb/include/lldb/Core/DemangledNameInfo.h +++ b/lldb/include/lldb/Core/DemangledNameInfo.h @@ -13,7 +13,6 @@ #include "llvm/Demangle/Utility.h" #include <cstddef> -#include <cstdlib> #include <utility> namespace lldb_private { diff --git a/lldb/unittests/Core/MangledTest.cpp b/lldb/unittests/Core/MangledTest.cpp index 24073fbcf2f5a..46adb62722091 100644 --- a/lldb/unittests/Core/MangledTest.cpp +++ b/lldb/unittests/Core/MangledTest.cpp @@ -26,6 +26,7 @@ #include "gtest/gtest.h" +#include <cstdlib> #include <memory> using namespace lldb; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits