@@ -75,12 +75,12 @@ Primitive::Kind primitiveFloatKind(struct drgn_type* type) {
75
75
76
76
// TODO type stubs
77
77
78
- Type* DrgnParser::parse (struct drgn_type * root) {
78
+ Type& DrgnParser::parse (struct drgn_type * root) {
79
79
depth_ = 0 ;
80
80
return enumerateType (root);
81
81
}
82
82
83
- Type* DrgnParser::enumerateType (struct drgn_type * type) {
83
+ Type& DrgnParser::enumerateType (struct drgn_type * type) {
84
84
// Avoid re-enumerating an already-processsed type
85
85
if (auto it = drgn_types_.find (type); it != drgn_types_.end ())
86
86
return it->second ;
@@ -96,34 +96,40 @@ Type* DrgnParser::enumerateType(struct drgn_type* type) {
96
96
case DRGN_TYPE_CLASS:
97
97
case DRGN_TYPE_STRUCT:
98
98
case DRGN_TYPE_UNION:
99
- t = enumerateClass (type);
99
+ t = & enumerateClass (type);
100
100
break ;
101
101
case DRGN_TYPE_ENUM:
102
- t = enumerateEnum (type);
102
+ t = & enumerateEnum (type);
103
103
break ;
104
104
case DRGN_TYPE_TYPEDEF:
105
- t = enumerateTypedef (type);
105
+ t = & enumerateTypedef (type);
106
106
break ;
107
107
case DRGN_TYPE_POINTER:
108
- t = enumeratePointer (type);
108
+ t = & enumeratePointer (type);
109
109
break ;
110
110
case DRGN_TYPE_ARRAY:
111
- t = enumerateArray (type);
111
+ t = & enumerateArray (type);
112
112
break ;
113
113
case DRGN_TYPE_INT:
114
114
case DRGN_TYPE_BOOL:
115
115
case DRGN_TYPE_FLOAT:
116
116
case DRGN_TYPE_VOID:
117
- t = enumeratePrimitive (type);
117
+ t = & enumeratePrimitive (type);
118
118
break ;
119
119
default :
120
120
throw DrgnParserError{" Unknown drgn type kind: " + std::to_string (kind)};
121
121
}
122
122
depth_--;
123
123
124
- return t;
124
+ return * t;
125
125
}
126
126
127
+ /*
128
+ * enumerateContainer
129
+ *
130
+ * Attempts to parse a drgn_type as a Container. Returns nullptr if not
131
+ * sucessful.
132
+ */
127
133
Container* DrgnParser::enumerateContainer (struct drgn_type * type,
128
134
const std::string& fqName) {
129
135
auto size = get_drgn_type_size (type);
@@ -135,14 +141,14 @@ Container* DrgnParser::enumerateContainer(struct drgn_type* type,
135
141
136
142
VLOG (2 ) << " Matching container `" << containerInfo.typeName << " ` from `"
137
143
<< fqName << " `" << std::endl;
138
- auto * c = makeType<Container>(type, containerInfo, size);
139
- enumerateClassTemplateParams (type, c-> templateParams );
140
- return c;
144
+ auto & c = makeType<Container>(type, containerInfo, size);
145
+ enumerateClassTemplateParams (type, c. templateParams );
146
+ return & c;
141
147
}
142
148
return nullptr ;
143
149
}
144
150
145
- Type* DrgnParser::enumerateClass (struct drgn_type * type) {
151
+ Type& DrgnParser::enumerateClass (struct drgn_type * type) {
146
152
std::string fqName;
147
153
char * nameStr = nullptr ;
148
154
size_t length = 0 ;
@@ -153,7 +159,7 @@ Type* DrgnParser::enumerateClass(struct drgn_type* type) {
153
159
154
160
auto * container = enumerateContainer (type, fqName);
155
161
if (container)
156
- return container;
162
+ return * container;
157
163
158
164
std::string name;
159
165
const char * type_tag = drgn_type_tag (type);
@@ -183,13 +189,13 @@ Type* DrgnParser::enumerateClass(struct drgn_type* type) {
183
189
std::to_string (drgn_type_kind (type))};
184
190
}
185
191
186
- auto c = makeType<Class>(type, kind, std::move (name), std::move (fqName), size ,
187
- virtuality);
192
+ auto & c = makeType<Class>(type, kind, std::move (name), std::move (fqName),
193
+ size, virtuality);
188
194
189
- enumerateClassTemplateParams (type, c-> templateParams );
190
- enumerateClassParents (type, c-> parents );
191
- enumerateClassMembers (type, c-> members );
192
- enumerateClassFunctions (type, c-> functions );
195
+ enumerateClassTemplateParams (type, c. templateParams );
196
+ enumerateClassParents (type, c. parents );
197
+ enumerateClassMembers (type, c. members );
198
+ enumerateClassFunctions (type, c. functions );
193
199
194
200
return c;
195
201
}
@@ -211,9 +217,9 @@ void DrgnParser::enumerateClassParents(struct drgn_type* type,
211
217
" Error looking up parent type (" + std::to_string (i) + " )" , err};
212
218
}
213
219
214
- auto ptype = enumerateType (parent_qual_type.type );
220
+ auto & ptype = enumerateType (parent_qual_type.type );
215
221
uint64_t poffset = drgn_parents[i].bit_offset ;
216
- Parent p ( ptype, poffset) ;
222
+ Parent p{ ptype, poffset} ;
217
223
parents.push_back (p);
218
224
}
219
225
@@ -258,7 +264,7 @@ void DrgnParser::enumerateClassMembers(struct drgn_type* type,
258
264
if (drgn_members[i].name )
259
265
member_name = drgn_members[i].name ;
260
266
261
- auto mtype = enumerateType (member_type);
267
+ auto & mtype = enumerateType (member_type);
262
268
uint64_t moffset = drgn_members[i].bit_offset ;
263
269
264
270
Member m{mtype, member_name, moffset, bit_field_size};
@@ -297,7 +303,7 @@ void DrgnParser::enumerateTemplateParam(drgn_type_template_parameter* tparams,
297
303
qualifiers[Qualifier::Const] =
298
304
(tparamQualType.qualifiers & DRGN_QUALIFIER_CONST);
299
305
300
- auto ttype = enumerateType (tparamType);
306
+ auto & ttype = enumerateType (tparamType);
301
307
params.emplace_back (ttype, qualifiers);
302
308
} else {
303
309
// This template parameter is a value
@@ -411,7 +417,7 @@ void DrgnParser::enumerateClassFunctions(struct drgn_type* type,
411
417
}
412
418
}
413
419
414
- Enum* DrgnParser::enumerateEnum (struct drgn_type * type) {
420
+ Enum& DrgnParser::enumerateEnum (struct drgn_type * type) {
415
421
// TODO anonymous enums
416
422
// TODO incomplete enum?
417
423
std::string name = drgn_type_tag (type);
@@ -420,16 +426,16 @@ Enum* DrgnParser::enumerateEnum(struct drgn_type* type) {
420
426
return makeType<Enum>(type, name, size);
421
427
}
422
428
423
- Typedef* DrgnParser::enumerateTypedef (struct drgn_type * type) {
429
+ Typedef& DrgnParser::enumerateTypedef (struct drgn_type * type) {
424
430
std::string name = drgn_type_name (type);
425
431
// TODO anonymous typedefs?
426
432
427
433
struct drgn_type * underlyingType = drgn_type_type (type).type ;
428
- auto t = enumerateType (underlyingType);
434
+ auto & t = enumerateType (underlyingType);
429
435
return makeType<Typedef>(type, name, t);
430
436
}
431
437
432
- Type* DrgnParser::enumeratePointer (struct drgn_type * type) {
438
+ Type& DrgnParser::enumeratePointer (struct drgn_type * type) {
433
439
if (!chasePointer ()) {
434
440
// TODO dodgy nullptr - primitives should be handled as singletons
435
441
return makeType<Primitive>(nullptr , Primitive::Kind::UIntPtr);
@@ -439,18 +445,18 @@ Type* DrgnParser::enumeratePointer(struct drgn_type* type) {
439
445
440
446
// TODO why was old CodeGen following funciton pointers?
441
447
442
- Type* t = enumerateType (pointeeType);
448
+ Type& t = enumerateType (pointeeType);
443
449
return makeType<Pointer>(type, t);
444
450
}
445
451
446
- Array* DrgnParser::enumerateArray (struct drgn_type * type) {
452
+ Array& DrgnParser::enumerateArray (struct drgn_type * type) {
447
453
struct drgn_type * elementType = drgn_type_type (type).type ;
448
454
uint64_t len = drgn_type_length (type);
449
- auto t = enumerateType (elementType);
455
+ auto & t = enumerateType (elementType);
450
456
return makeType<Array>(type, t, len);
451
457
}
452
458
453
- Primitive* DrgnParser::enumeratePrimitive (struct drgn_type * type) {
459
+ Primitive& DrgnParser::enumeratePrimitive (struct drgn_type * type) {
454
460
Primitive::Kind kind;
455
461
switch (drgn_type_kind (type)) {
456
462
case DRGN_TYPE_INT:
0 commit comments