[Lldb-commits] [lldb] [lldb] Provide TrackingOutputBufferDeleter for custom unique_ptr deleter (PR #142815)
Jordan Rupprecht via lldb-commits
lldb-commits at lists.llvm.org
Wed Jun 4 09:57:04 PDT 2025
https://github.com/rupprecht created https://github.com/llvm/llvm-project/pull/142815
Suggested in #142676 as a way to automatically free the buffer in tests
>From 14a5860c98b5c0c067c8b12ccbaf32bfa45b1a66 Mon Sep 17 00:00:00 2001
From: Jordan Rupprecht <rupprecht at google.com>
Date: Wed, 4 Jun 2025 09:53:12 -0700
Subject: [PATCH 1/2] [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 <rupprecht at google.com>
Date: Wed, 4 Jun 2025 09:55:40 -0700
Subject: [PATCH 2/2] 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)
More information about the lldb-commits
mailing list