[Lldb-commits] [lldb] [lldb] Provide TrackingOutputBufferDeleter for custom unique_ptr deleter (PR #142815)
via lldb-commits
lldb-commits at lists.llvm.org
Wed Jun 4 09:57:40 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lldb
Author: Jordan Rupprecht (rupprecht)
<details>
<summary>Changes</summary>
Suggested in #<!-- -->142676 as a way to automatically free the buffer in tests
---
Full diff: https://github.com/llvm/llvm-project/pull/142815.diff
2 Files Affected:
- (modified) lldb/include/lldb/Core/DemangledNameInfo.h (+20)
- (modified) lldb/unittests/Core/MangledTest.cpp (+36-36)
``````````diff
diff --git a/lldb/include/lldb/Core/DemangledNameInfo.h b/lldb/include/lldb/Core/DemangledNameInfo.h
index 4b5ba5e42b3b1..a3edb3e034eb1 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,23 @@ 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 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(
``````````
</details>
https://github.com/llvm/llvm-project/pull/142815
More information about the lldb-commits
mailing list