Skip to content

Commit 7d3bad1

Browse files
refactor tests
1 parent 7b24e4e commit 7d3bad1

File tree

5 files changed

+204
-200
lines changed

5 files changed

+204
-200
lines changed

lldb/include/lldb/Core/DemangledNameInfo.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,12 @@ struct DemangledNameInfo {
6363
/// Indicates the [start, end) of the function's prefix. This is a
6464
/// catch-all range for anything that is not tracked by the rest of
6565
/// the pairs.
66-
std::pair<size_t, size_t> PrefixRange;
66+
std::pair<size_t, size_t> PrefixRange{};
6767

6868
/// Indicates the [start, end) of the function's suffix. This is a
6969
/// catch-all range for anything that is not tracked by the rest of
7070
/// the pairs.
71-
std::pair<size_t, size_t> SuffixRange;
71+
std::pair<size_t, size_t> SuffixRange{};
7272

7373
/// Returns \c true if this object holds a valid basename range.
7474
bool hasBasename() const {

lldb/unittests/Core/CMakeLists.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ add_lldb_unittest(LLDBCoreTests
44
DumpDataExtractorTest.cpp
55
DumpRegisterInfoTest.cpp
66
FormatEntityTest.cpp
7-
ItaniumMangledTest.cpp
7+
ItaniumDemanglingPartsTest.cpp
8+
MangledTest.cpp
89
ModuleSpecTest.cpp
910
ProgressReportTest.cpp
1011
RichManglingContextTest.cpp
1112
SourceLocationSpecTest.cpp
1213
SourceManagerTest.cpp
13-
SwiftMangledTest.cpp
14+
SwiftDemanglingPartsTest.cpp
1415
UniqueCStringMapTest.cpp
1516

1617
LINK_LIBS
Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
//===-- MangledTest.cpp ---------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "TestingSupport/TestUtilities.h"
10+
11+
#include "lldb/Core/DemangledNameInfo.h"
12+
#include "lldb/Core/Mangled.h"
13+
14+
#include "gtest/gtest.h"
15+
16+
using namespace lldb;
17+
using namespace lldb_private;
18+
19+
struct DemanglingPartsTestCase {
20+
const char *mangled;
21+
DemangledNameInfo expected_info;
22+
std::string_view basename;
23+
std::string_view scope;
24+
std::string_view qualifiers;
25+
bool valid_basename = true;
26+
};
27+
28+
DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
29+
// clang-format off
30+
{ "_ZNVKO3BarIN2ns3QuxIiEEE1CIPFi3FooIS_IiES6_EEE6methodIS6_EENS5_IT_SC_E5InnerIiEESD_SD_",
31+
{ /*.BasenameRange=*/{92, 98}, /*.ScopeRange=*/{36, 92}, /*.ArgumentsRange=*/{ 108, 158 },
32+
/*.QualifiersRange=*/{158, 176} },
33+
/*.basename=*/"method",
34+
/*.scope=*/"Bar<ns::Qux<int>>::C<int (*)(Foo<Bar<int>, Bar<int>>)>::",
35+
/*.qualifiers=*/" const volatile &&"
36+
},
37+
{ "_Z7getFuncIfEPFiiiET_",
38+
{ /*.BasenameRange=*/{6, 13}, /*.ScopeRange=*/{6, 6}, /*.ArgumentsRange=*/{ 20, 27 }, /*.QualifiersRange=*/{38, 38} },
39+
/*.basename=*/"getFunc",
40+
/*.scope=*/"",
41+
/*.qualifiers=*/""
42+
},
43+
{ "_ZN1f1b1c1gEv",
44+
{ /*.BasenameRange=*/{9, 10}, /*.ScopeRange=*/{0, 9}, /*.ArgumentsRange=*/{ 10, 12 },
45+
/*.QualifiersRange=*/{12, 12} },
46+
/*.basename=*/"g",
47+
/*.scope=*/"f::b::c::",
48+
/*.qualifiers=*/""
49+
},
50+
{ "_ZN5test73fD1IiEEDTcmtlNS_1DEL_ZNS_1bEEEcvT__EES2_",
51+
{ /*.BasenameRange=*/{45, 48}, /*.ScopeRange=*/{38, 45}, /*.ArgumentsRange=*/{ 53, 58 },
52+
/*.QualifiersRange=*/{58, 58} },
53+
/*.basename=*/"fD1",
54+
/*.scope=*/"test7::",
55+
/*.qualifiers=*/""
56+
},
57+
{ "_ZN5test73fD1IiEEDTcmtlNS_1DEL_ZNS_1bINDT1cE1dEEEEEcvT__EES2_",
58+
{ /*.BasenameRange=*/{61, 64}, /*.ScopeRange=*/{54, 61}, /*.ArgumentsRange=*/{ 69, 79 },
59+
/*.QualifiersRange=*/{79, 79} },
60+
/*.basename=*/"fD1",
61+
/*.scope=*/"test7::",
62+
/*.qualifiers=*/""
63+
},
64+
{ "_ZN5test7INDT1cE1dINDT1cE1dEEEE3fD1INDT1cE1dINDT1cE1dEEEEEDTcmtlNS_1DEL_ZNS_1bINDT1cE1dEEEEEcvT__EES2_",
65+
{ /*.BasenameRange=*/{120, 123}, /*.ScopeRange=*/{81, 120}, /*.ArgumentsRange=*/{ 155, 168 },
66+
/*.QualifiersRange=*/{168, 168} },
67+
/*.basename=*/"fD1",
68+
/*.scope=*/"test7<decltype(c)::d<decltype(c)::d>>::",
69+
/*.qualifiers=*/""
70+
},
71+
{ "_ZN8nlohmann16json_abi_v3_11_310basic_jsonINSt3__13mapENS2_6vectorENS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEbxydS8_NS0_14adl_serializerENS4_IhNS8_IhEEEEvE5parseIRA29_KcEESE_OT_NS2_8functionIFbiNS0_6detail13parse_event_tERSE_EEEbb",
72+
{ /*.BasenameRange=*/{687, 692}, /*.ScopeRange=*/{343, 687}, /*.ArgumentsRange=*/{ 713, 1174 },
73+
/*.QualifiersRange=*/{1174, 1174} },
74+
/*.basename=*/"parse",
75+
/*.scope=*/"nlohmann::json_abi_v3_11_3::basic_json<std::__1::map, std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, bool, long long, unsigned long long, double, std::__1::allocator, nlohmann::json_abi_v3_11_3::adl_serializer, std::__1::vector<unsigned char, std::__1::allocator<unsigned char>>, void>::",
76+
/*.qualifiers=*/""
77+
},
78+
{ "_ZN8nlohmann16json_abi_v3_11_310basic_jsonINSt3__13mapENS2_6vectorENS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEbxydS8_NS0_14adl_serializerENS4_IhNS8_IhEEEEvEC1EDn",
79+
{ /*.BasenameRange=*/{344, 354}, /*.ScopeRange=*/{0, 344}, /*.ArgumentsRange=*/{ 354, 370 },
80+
/*.QualifiersRange=*/{370, 370} },
81+
/*.basename=*/"basic_json",
82+
/*.scope=*/"nlohmann::json_abi_v3_11_3::basic_json<std::__1::map, std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, bool, long long, unsigned long long, double, std::__1::allocator, nlohmann::json_abi_v3_11_3::adl_serializer, std::__1::vector<unsigned char, std::__1::allocator<unsigned char>>, void>::",
83+
/*.qualifiers=*/""
84+
},
85+
{ "_Z3fppIiEPFPFvvEiEf",
86+
{ /*.BasenameRange=*/{10, 13}, /*.ScopeRange=*/{10, 10}, /*.ArgumentsRange=*/{ 18, 25 }, /*.QualifiersRange=*/{34,34} },
87+
/*.basename=*/"fpp",
88+
/*.scope=*/"",
89+
/*.qualifiers=*/""
90+
},
91+
{ "_Z3fppIiEPFPFvvEN2ns3FooIiEEEf",
92+
{ /*.BasenameRange=*/{10, 13}, /*.ScopeRange=*/{10, 10}, /*.ArgumentsRange=*/{ 18, 25 },
93+
/*.QualifiersRange=*/{43, 43} },
94+
/*.basename=*/"fpp",
95+
/*.scope=*/"",
96+
/*.qualifiers=*/""
97+
},
98+
{ "_Z3fppIiEPFPFvPFN2ns3FooIiEENS2_3BarIfE3QuxEEEPFS2_S2_EEf",
99+
{ /*.BasenameRange=*/{10, 13}, /*.ScopeRange=*/{10, 10}, /*.ArgumentsRange=*/{ 18, 25 },
100+
/*.QualifiersRange=*/{108, 108} },
101+
/*.basename=*/"fpp",
102+
/*.scope=*/"",
103+
/*.qualifiers=*/""
104+
},
105+
{ "_ZN2ns8HasFuncsINS_3FooINS1_IiE3BarIfE3QuxEEEE3fppIiEEPFPFvvEiEf",
106+
{ /*.BasenameRange=*/{64, 67}, /*.ScopeRange=*/{10, 64}, /*.ArgumentsRange=*/{ 72, 79 },
107+
/*.QualifiersRange=*/{88, 88} },
108+
/*.basename=*/"fpp",
109+
/*.scope=*/"ns::HasFuncs<ns::Foo<ns::Foo<int>::Bar<float>::Qux>>::",
110+
/*.qualifiers=*/""
111+
},
112+
{ "_ZN2ns8HasFuncsINS_3FooINS1_IiE3BarIfE3QuxEEEE3fppIiEEPFPFvvES2_Ef",
113+
{ /*.BasenameRange=*/{64, 67}, /*.ScopeRange=*/{10, 64}, /*.ArgumentsRange=*/{ 72, 79 },
114+
/*.QualifiersRange=*/{97, 97} },
115+
/*.basename=*/"fpp",
116+
/*.scope=*/"ns::HasFuncs<ns::Foo<ns::Foo<int>::Bar<float>::Qux>>::",
117+
/*.qualifiers=*/"",
118+
},
119+
{ "_ZN2ns8HasFuncsINS_3FooINS1_IiE3BarIfE3QuxEEEE3fppIiEEPFPFvPFS2_S5_EEPFS2_S2_EEf",
120+
{ /*.BasenameRange=*/{64, 67}, /*.ScopeRange=*/{10, 64}, /*.ArgumentsRange=*/{ 72, 79 },
121+
/*.QualifiersRange=*/{162, 162} },
122+
/*.basename=*/"fpp",
123+
/*.scope=*/"ns::HasFuncs<ns::Foo<ns::Foo<int>::Bar<float>::Qux>>::",
124+
/*.qualifiers=*/"",
125+
},
126+
{ "_ZNKO2ns3ns23Bar3fooIiEEPFPFNS0_3FooIiEEiENS3_IfEEEi",
127+
{ /*.BasenameRange=*/{37, 40}, /*.ScopeRange=*/{23, 37}, /*.ArgumentsRange=*/{ 45, 50 },
128+
/*.QualifiersRange=*/{78, 87} },
129+
/*.basename=*/"foo",
130+
/*.scope=*/"ns::ns2::Bar::",
131+
/*.qualifiers=*/" const &&",
132+
},
133+
{ "_ZTV11ImageLoader",
134+
{ /*.BasenameRange=*/{0, 0}, /*.ScopeRange=*/{0, 0}, /*.ArgumentsRange=*/{ 0, 0 },
135+
/*.QualifiersRange=*/{0, 0} },
136+
/*.basename=*/"",
137+
/*.scope=*/"",
138+
/*.qualifiers=*/"",
139+
/*.valid_basename=*/false
140+
}
141+
// clang-format on
142+
};
143+
144+
struct DemanglingPartsTestFixture
145+
: public ::testing::TestWithParam<DemanglingPartsTestCase> {};
146+
147+
namespace {
148+
class TestAllocator {
149+
llvm::BumpPtrAllocator Alloc;
150+
151+
public:
152+
void reset() { Alloc.Reset(); }
153+
154+
template <typename T, typename... Args> T *makeNode(Args &&...args) {
155+
return new (Alloc.Allocate(sizeof(T), alignof(T)))
156+
T(std::forward<Args>(args)...);
157+
}
158+
159+
void *allocateNodeArray(size_t sz) {
160+
return Alloc.Allocate(sizeof(llvm::itanium_demangle::Node *) * sz,
161+
alignof(llvm::itanium_demangle::Node *));
162+
}
163+
};
164+
} // namespace
165+
166+
TEST_P(DemanglingPartsTestFixture, DemanglingParts) {
167+
const auto &[mangled, info, basename, scope, qualifiers, valid_basename] =
168+
GetParam();
169+
170+
llvm::itanium_demangle::ManglingParser<TestAllocator> Parser(
171+
mangled, mangled + ::strlen(mangled));
172+
173+
const auto *Root = Parser.parse();
174+
175+
ASSERT_NE(nullptr, Root);
176+
177+
TrackingOutputBuffer OB;
178+
Root->print(OB);
179+
auto demangled = std::string_view(OB);
180+
181+
ASSERT_EQ(OB.NameInfo.hasBasename(), valid_basename);
182+
183+
EXPECT_EQ(OB.NameInfo.BasenameRange, info.BasenameRange);
184+
EXPECT_EQ(OB.NameInfo.ScopeRange, info.ScopeRange);
185+
EXPECT_EQ(OB.NameInfo.ArgumentsRange, info.ArgumentsRange);
186+
EXPECT_EQ(OB.NameInfo.QualifiersRange, info.QualifiersRange);
187+
188+
auto get_part = [&](const std::pair<size_t, size_t> &loc) {
189+
return demangled.substr(loc.first, loc.second - loc.first);
190+
};
191+
192+
EXPECT_EQ(get_part(OB.NameInfo.BasenameRange), basename);
193+
EXPECT_EQ(get_part(OB.NameInfo.ScopeRange), scope);
194+
EXPECT_EQ(get_part(OB.NameInfo.QualifiersRange), qualifiers);
195+
}
196+
197+
INSTANTIATE_TEST_SUITE_P(DemanglingPartsTests, DemanglingPartsTestFixture,
198+
::testing::ValuesIn(g_demangling_parts_test_cases));

0 commit comments

Comments
 (0)