Skip to content

Commit 07c4afe

Browse files
committed
Implement LLDBParser::enumerateClassTemplateParams
1 parent 4b3e81a commit 07c4afe

File tree

3 files changed

+53
-27
lines changed

3 files changed

+53
-27
lines changed

oi/type_graph/LLDBParser.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,13 +157,35 @@ Class& LLDBParser::enumerateClass(lldb::SBType& type) {
157157

158158
auto &c = makeType<Class>(type, kind, displayName, name, size, virtuality);
159159

160+
enumerateClassTemplateParams(type, c.templateParams);
160161
enumerateClassParents(type, c.parents);
161162
enumerateClassMembers(type, c.members);
162163
enumerateClassFunctions(type, c.functions);
163164

164165
return c;
165166
}
166167

168+
void LLDBParser::enumerateClassTemplateParams(lldb::SBType &type, std::vector<TemplateParam>& params) {
169+
assert(params.empty());
170+
params.reserve(type.GetNumberOfTemplateArguments());
171+
172+
for (uint32_t i = 0; i < type.GetNumberOfTemplateArguments(); i++) {
173+
auto param = type.GetTemplateArgumentType(i);
174+
enumerateTemplateParam(type, param, i, params);
175+
}
176+
}
177+
178+
void LLDBParser::enumerateTemplateParam(lldb::SBType& /*type*/,
179+
lldb::SBType& param,
180+
uint32_t /*i*/,
181+
std::vector<TemplateParam>& params) {
182+
QualifierSet qualifiers;
183+
qualifiers[Qualifier::Const] = param.GetName() != param.GetUnqualifiedType().GetName(); // TODO: Wonky as hell :/
184+
auto& paramType = enumerateType(param);
185+
186+
params.emplace_back(paramType, qualifiers);
187+
}
188+
167189
void LLDBParser::enumerateClassParents(lldb::SBType& type, std::vector<Parent>& parents) {
168190
assert(parents.empty());
169191
parents.reserve(type.GetNumberOfDirectBaseClasses());

oi/type_graph/LLDBParser.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ class LLDBParser {
6161
Primitive::Kind primitiveIntKind(lldb::SBType& type, bool is_signed);
6262
Primitive::Kind primitiveFloatKind(lldb::SBType& type);
6363

64+
void enumerateClassTemplateParams(lldb::SBType &type, std::vector<TemplateParam>& params);
65+
void enumerateTemplateParam(lldb::SBType& type, lldb::SBType& param, uint32_t i, std::vector<TemplateParam>& params);
6466
void enumerateClassParents(lldb::SBType& type, std::vector<Parent>& parents);
6567
void enumerateClassMembers(lldb::SBType& type, std::vector<Member>& members);
6668
void enumerateClassFunctions(lldb::SBType &type, std::vector<Function>& functions);

test/test_lldb_parser.cpp

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -214,16 +214,16 @@ TEST_F(LLDBParserTest, Container) {
214214
testMultiCompilerGlob("oid_test_case_std_vector_int_empty",
215215
R"(
216216
[13] Pointer
217-
[0] Class: vector<int, std::allocator<int> > (size: 24)
217+
[0] Class: std::vector<int, std::allocator<int> > (size: 24)
218218
Param
219219
Primitive: int32_t
220220
Param
221-
[1] Class: allocator<int> (size: 1)
221+
[1] Class: std::allocator<int> (size: 1)
222222
Param
223223
Primitive: int32_t
224224
Parent (offset: 0)
225-
[3] Typedef: __allocator_base<int>
226-
[2] Class: new_allocator<int> (size: 1)
225+
[3] Typedef: std::__allocator_base<int>
226+
[2] Class: __gnu_cxx::new_allocator<int> (size: 1)
227227
Param
228228
Primitive: int32_t
229229
Function: new_allocator
@@ -242,13 +242,13 @@ TEST_F(LLDBParserTest, Container) {
242242
)",
243243
R"(
244244
[9] Pointer
245-
[0] Class: vector<int, std::allocator<int> > (size: 24)
245+
[0] Class: std::vector<int, std::allocator<int> > (size: 24)
246246
Param
247247
Primitive: int32_t
248248
Param
249-
[1] Class: allocator<int> (size: 1)
249+
[1] Class: std::allocator<int> (size: 1)
250250
Parent (offset: 0)
251-
[2] Class: new_allocator<int> (size: 1)
251+
[2] Class: __gnu_cxx::new_allocator<int> (size: 1)
252252
Param
253253
Primitive: int32_t
254254
Function: new_allocator
@@ -380,15 +380,16 @@ TEST_F(LLDBParserTest, PointerNoFollow) {
380380

381381
TEST_F(LLDBParserTest, PointerIncomplete) {
382382
test("oid_test_case_pointers_incomplete_raw", R"(
383-
[0] Pointer
384-
Incomplete: [IncompleteType]
383+
[1] Pointer
384+
Incomplete
385+
[0] Struct: ns_pointers_incomplete::IncompleteType (size: 0)
385386
)");
386387
}
387388

388389
TEST_F(LLDBParserTest, Cycle) {
389390
test("oid_test_case_cycles_raw_ptr", R"(
390391
[2] Pointer
391-
[0] Struct: RawNode (size: 16)
392+
[0] Struct: ns_cycles::RawNode (size: 16)
392393
Member: value (offset: 0)
393394
Primitive: int32_t
394395
Member: next (offset: 8)
@@ -400,7 +401,7 @@ TEST_F(LLDBParserTest, Cycle) {
400401
TEST_F(LLDBParserTest, ClassTemplateInt) {
401402
test("oid_test_case_templates_int", R"(
402403
[1] Pointer
403-
[0] Class: TemplatedClass1<int> (size: 4)
404+
[0] Class: ns_templates::TemplatedClass1<int> (size: 4)
404405
Param
405406
Primitive: int32_t
406407
Member: val (offset: 0)
@@ -411,17 +412,17 @@ TEST_F(LLDBParserTest, ClassTemplateInt) {
411412
TEST_F(LLDBParserTest, ClassTemplateTwo) {
412413
test("oid_test_case_templates_two", R"(
413414
[3] Pointer
414-
[0] Class: TemplatedClass2<ns_templates::Foo, int> (size: 12)
415+
[0] Class: ns_templates::TemplatedClass2<ns_templates::Foo, int> (size: 12)
415416
Param
416-
[1] Struct: Foo (size: 8)
417+
[1] Struct: ns_templates::Foo (size: 8)
417418
Member: a (offset: 0)
418419
Primitive: int32_t
419420
Member: b (offset: 4)
420421
Primitive: int32_t
421422
Param
422423
Primitive: int32_t
423424
Member: tc1 (offset: 0)
424-
[2] Class: TemplatedClass1<ns_templates::Foo> (size: 8)
425+
[2] Class: ns_templates::TemplatedClass1<ns_templates::Foo> (size: 8)
425426
Param
426427
[1]
427428
Member: val (offset: 0)
@@ -434,7 +435,7 @@ TEST_F(LLDBParserTest, ClassTemplateTwo) {
434435
TEST_F(LLDBParserTest, ClassTemplateValue) {
435436
test("oid_test_case_templates_value", R"(
436437
[2] Pointer
437-
[0] Struct: TemplatedClassVal<3> (size: 12)
438+
[0] Struct: ns_templates::TemplatedClassVal<3> (size: 12)
438439
Param
439440
Value: 3
440441
Primitive: int32_t
@@ -448,18 +449,18 @@ TEST_F(LLDBParserTest, TemplateEnumValue) {
448449
testMultiCompilerGlob("oid_test_case_enums_params_scoped_enum_val",
449450
R"(
450451
[1] Pointer
451-
[0] Class: MyClass<ns_enums_params::MyNS::ScopedEnum::One> (size: 4)
452+
[0] Class: ns_enums_params::MyClass<ns_enums_params::MyNS::ScopedEnum::One> (size: 4)
452453
Param
453454
Value: ns_enums_params::MyNS::ScopedEnum::One
454-
Enum: ScopedEnum (size: 4)
455+
Enum: ns_enums_params::MyNS::ScopedEnum (size: 4)
455456
*
456457
)",
457458
R"(
458459
[1] Pointer
459-
[0] Class: MyClass<(ns_enums_params::MyNS::ScopedEnum)1> (size: 4)
460+
[0] Class: ns_enums_params::MyClass<(ns_enums_params::MyNS::ScopedEnum)1> (size: 4)
460461
Param
461462
Value: ns_enums_params::MyNS::ScopedEnum::One
462-
Enum: ScopedEnum (size: 4)
463+
Enum: ns_enums_params::MyNS::ScopedEnum (size: 4)
463464
*
464465
)");
465466
}
@@ -468,18 +469,18 @@ TEST_F(LLDBParserTest, TemplateEnumValueGaps) {
468469
testMultiCompilerGlob("oid_test_case_enums_params_scoped_enum_val_gaps",
469470
R"(
470471
[1] Pointer
471-
[0] Class: ClassGaps<ns_enums_params::MyNS::EnumWithGaps::Twenty> (size: 4)
472+
[0] Class: ns_enums_params::ClassGaps<ns_enums_params::MyNS::EnumWithGaps::Twenty> (size: 4)
472473
Param
473474
Value: ns_enums_params::MyNS::EnumWithGaps::Twenty
474-
Enum: EnumWithGaps (size: 4)
475+
Enum: ns_enums_params::MyNS::EnumWithGaps (size: 4)
475476
*
476477
)",
477478
R"(
478479
[1] Pointer
479480
[0] Class: ClassGaps<(ns_enums_params::MyNS::EnumWithGaps)20> (size: 4)
480481
Param
481482
Value: ns_enums_params::MyNS::EnumWithGaps::Twenty
482-
Enum: EnumWithGaps (size: 4)
483+
Enum: ns_enums_params::MyNS::EnumWithGaps (size: 4)
483484
*
484485
)");
485486
}
@@ -488,18 +489,18 @@ TEST_F(LLDBParserTest, TemplateEnumValueNegative) {
488489
testMultiCompilerGlob("oid_test_case_enums_params_scoped_enum_val_negative",
489490
R"(
490491
[1] Pointer
491-
[0] Class: ClassGaps<ns_enums_params::MyNS::EnumWithGaps::MinusTwo> (size: 4)
492+
[0] Class: ns_enums_params::ClassGaps<ns_enums_params::MyNS::EnumWithGaps::MinusTwo> (size: 4)
492493
Param
493494
Value: ns_enums_params::MyNS::EnumWithGaps::MinusTwo
494-
Enum: EnumWithGaps (size: 4)
495+
Enum: ns_enums_params::MyNS::EnumWithGaps (size: 4)
495496
*
496497
)",
497498
R"(
498499
[1] Pointer
499-
[0] Class: ClassGaps<(ns_enums_params::MyNS::EnumWithGaps)-2> (size: 4)
500+
[0] Class: ns_enums_params::ClassGaps<(ns_enums_params::MyNS::EnumWithGaps)-2> (size: 4)
500501
Param
501502
Value: ns_enums_params::MyNS::EnumWithGaps::MinusTwo
502-
Enum: EnumWithGaps (size: 4)
503+
Enum: ns_enums_params::MyNS::EnumWithGaps (size: 4)
503504
*
504505
)");
505506
}
@@ -620,10 +621,11 @@ TEST_F(LLDBParserTest, BitfieldsMixed) {
620621
}
621622

622623
TEST_F(LLDBParserTest, BitfieldsMoreBitsThanType) {
624+
// TODO: Validate with integration tests that 29 bitsize doesn't break CodeGen
623625
test("oid_test_case_bitfields_more_bits_than_type", R"(
624626
[1] Pointer
625627
[0] Struct: ns_bitfields::MoreBitsThanType (size: 4)
626-
Member: a (offset: 0, bitsize: 8)
628+
Member: a (offset: 0, bitsize: 29)
627629
Primitive: int8_t
628630
)");
629631
}

0 commit comments

Comments
 (0)