Skip to content

Commit 14a5860

Browse files
committed
[lldb] Provide TrackingOutputBufferDeleter for custom unique_ptr deleter
1 parent 8e77263 commit 14a5860

File tree

2 files changed

+46
-36
lines changed

2 files changed

+46
-36
lines changed

lldb/include/lldb/Core/DemangledNameInfo.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "llvm/Demangle/Utility.h"
1414

1515
#include <cstddef>
16+
#include <cstdlib>
1617
#include <utility>
1718

1819
namespace lldb_private {
@@ -159,4 +160,13 @@ struct TrackingOutputBuffer : public llvm::itanium_demangle::OutputBuffer {
159160
};
160161
} // namespace lldb_private
161162

163+
struct TrackingOutputBufferDeleter {
164+
void operator()(TrackingOutputBuffer *TOB) {
165+
if (!TOB)
166+
return;
167+
std::free(TOB->getBuffer());
168+
delete TOB;
169+
}
170+
};
171+
162172
#endif // LLDB_CORE_DEMANGLEDNAMEINFO_H

lldb/unittests/Core/MangledTest.cpp

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626

2727
#include "gtest/gtest.h"
2828

29+
#include <memory>
30+
2931
using namespace lldb;
3032
using namespace lldb_private;
3133

@@ -589,25 +591,25 @@ TEST_P(DemanglingPartsTestFixture, DemanglingParts) {
589591

590592
ASSERT_NE(nullptr, Root);
591593

592-
TrackingOutputBuffer OB;
593-
Root->print(OB);
594-
auto demangled = std::string_view(OB);
594+
auto OB = std::unique_ptr<TrackingOutputBuffer, TrackingOutputBufferDeleter>(
595+
new TrackingOutputBuffer());
596+
Root->print(*OB);
597+
auto demangled = std::string_view(*OB);
595598

596-
ASSERT_EQ(OB.NameInfo.hasBasename(), valid_basename);
599+
ASSERT_EQ(OB->NameInfo.hasBasename(), valid_basename);
597600

598-
EXPECT_EQ(OB.NameInfo.BasenameRange, info.BasenameRange);
599-
EXPECT_EQ(OB.NameInfo.ScopeRange, info.ScopeRange);
600-
EXPECT_EQ(OB.NameInfo.ArgumentsRange, info.ArgumentsRange);
601-
EXPECT_EQ(OB.NameInfo.QualifiersRange, info.QualifiersRange);
601+
EXPECT_EQ(OB->NameInfo.BasenameRange, info.BasenameRange);
602+
EXPECT_EQ(OB->NameInfo.ScopeRange, info.ScopeRange);
603+
EXPECT_EQ(OB->NameInfo.ArgumentsRange, info.ArgumentsRange);
604+
EXPECT_EQ(OB->NameInfo.QualifiersRange, info.QualifiersRange);
602605

603606
auto get_part = [&](const std::pair<size_t, size_t> &loc) {
604607
return demangled.substr(loc.first, loc.second - loc.first);
605608
};
606609

607-
EXPECT_EQ(get_part(OB.NameInfo.BasenameRange), basename);
608-
EXPECT_EQ(get_part(OB.NameInfo.ScopeRange), scope);
609-
EXPECT_EQ(get_part(OB.NameInfo.QualifiersRange), qualifiers);
610-
std::free(OB.getBuffer());
610+
EXPECT_EQ(get_part(OB->NameInfo.BasenameRange), basename);
611+
EXPECT_EQ(get_part(OB->NameInfo.ScopeRange), scope);
612+
EXPECT_EQ(get_part(OB->NameInfo.QualifiersRange), qualifiers);
611613
}
612614

613615
INSTANTIATE_TEST_SUITE_P(DemanglingPartsTests, DemanglingPartsTestFixture,
@@ -635,44 +637,42 @@ TEST_P(DemanglingInfoCorrectnessTestFixutre, Correctness) {
635637

636638
ASSERT_NE(nullptr, Root);
637639

638-
TrackingOutputBuffer OB;
639-
Root->print(OB);
640+
auto OB = std::unique_ptr<TrackingOutputBuffer, TrackingOutputBufferDeleter>(
641+
new TrackingOutputBuffer());
642+
Root->print(*OB);
640643

641644
// Filter out cases which would never show up in frames. We only care about
642645
// function names.
643646
if (Root->getKind() !=
644647
llvm::itanium_demangle::Node::Kind::KFunctionEncoding &&
645-
Root->getKind() != llvm::itanium_demangle::Node::Kind::KDotSuffix) {
646-
std::free(OB.getBuffer());
648+
Root->getKind() != llvm::itanium_demangle::Node::Kind::KDotSuffix)
647649
return;
648-
}
649650

650-
ASSERT_TRUE(OB.NameInfo.hasBasename());
651-
652-
auto tracked_name = llvm::StringRef(OB);
653-
654-
auto return_left = tracked_name.slice(0, OB.NameInfo.ScopeRange.first);
655-
auto scope = tracked_name.slice(OB.NameInfo.ScopeRange.first,
656-
OB.NameInfo.ScopeRange.second);
657-
auto basename = tracked_name.slice(OB.NameInfo.BasenameRange.first,
658-
OB.NameInfo.BasenameRange.second);
659-
auto template_args = tracked_name.slice(OB.NameInfo.BasenameRange.second,
660-
OB.NameInfo.ArgumentsRange.first);
661-
auto args = tracked_name.slice(OB.NameInfo.ArgumentsRange.first,
662-
OB.NameInfo.ArgumentsRange.second);
663-
auto return_right = tracked_name.slice(OB.NameInfo.ArgumentsRange.second,
664-
OB.NameInfo.QualifiersRange.first);
665-
auto qualifiers = tracked_name.slice(OB.NameInfo.QualifiersRange.first,
666-
OB.NameInfo.QualifiersRange.second);
667-
auto suffix = tracked_name.slice(OB.NameInfo.QualifiersRange.second,
651+
ASSERT_TRUE(OB->NameInfo.hasBasename());
652+
653+
auto tracked_name = llvm::StringRef(*OB);
654+
655+
auto return_left = tracked_name.slice(0, OB->NameInfo.ScopeRange.first);
656+
auto scope = tracked_name.slice(OB->NameInfo.ScopeRange.first,
657+
OB->NameInfo.ScopeRange.second);
658+
auto basename = tracked_name.slice(OB->NameInfo.BasenameRange.first,
659+
OB->NameInfo.BasenameRange.second);
660+
auto template_args = tracked_name.slice(OB->NameInfo.BasenameRange.second,
661+
OB->NameInfo.ArgumentsRange.first);
662+
auto args = tracked_name.slice(OB->NameInfo.ArgumentsRange.first,
663+
OB->NameInfo.ArgumentsRange.second);
664+
auto return_right = tracked_name.slice(OB->NameInfo.ArgumentsRange.second,
665+
OB->NameInfo.QualifiersRange.first);
666+
auto qualifiers = tracked_name.slice(OB->NameInfo.QualifiersRange.first,
667+
OB->NameInfo.QualifiersRange.second);
668+
auto suffix = tracked_name.slice(OB->NameInfo.QualifiersRange.second,
668669
llvm::StringRef::npos);
669670

670671
auto reconstructed_name =
671672
llvm::join_items("", return_left, scope, basename, template_args, args,
672673
return_right, qualifiers, suffix);
673674

674675
EXPECT_EQ(reconstructed_name, demangled);
675-
std::free(OB.getBuffer());
676676
}
677677

678678
INSTANTIATE_TEST_SUITE_P(

0 commit comments

Comments
 (0)