@@ -182,7 +182,7 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
182
182
183
183
std::string struct_name;
184
184
size_t member_offset;
185
- if (pointer_value.pointee . find ( " + " ) != std::string::npos )
185
+ if (pointer_value.has_known_offset () )
186
186
{
187
187
std::string member_offset_string;
188
188
split_string (
@@ -204,9 +204,7 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
204
204
for (const auto &value_pair : values)
205
205
{
206
206
const auto &value_symbol_expr = value_pair.second ;
207
- if (
208
- struct_name ==
209
- id2string (to_symbol_expr (value_symbol_expr).get_identifier ()))
207
+ if (to_symbol_expr (value_symbol_expr).get_identifier () == struct_name)
210
208
{
211
209
found = true ;
212
210
break ;
@@ -217,12 +215,14 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
217
215
{
218
216
const typet target_type = expr.type ().subtype ();
219
217
220
- symbol_exprt dummy (expr.type ());
218
+ symbol_exprt dummy (" tmp " , expr.type ());
221
219
code_blockt assignments;
222
220
223
- const symbol_exprt new_symbol =
224
- to_symbol_expr (allocate_objects.allocate_automatic_local_object (
221
+ auto emplace_pair = values.emplace (
222
+ memory_location,
223
+ allocate_objects.allocate_automatic_local_object (
225
224
assignments, dummy, target_type));
225
+ const symbol_exprt &new_symbol = to_symbol_expr (emplace_pair.first ->second );
226
226
227
227
dereference_exprt dereference_expr (expr);
228
228
@@ -232,23 +232,18 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
232
232
// add assignment of value to newly created symbol
233
233
add_assignment (new_symbol, *zero_expr);
234
234
235
- values[memory_location] = new_symbol;
236
-
237
235
const auto &struct_symbol = values.find (memory_location);
238
236
239
237
const auto maybe_member_expr = get_subexpression_at_offset (
240
238
struct_symbol->second , member_offset, expr.type ().subtype (), ns);
241
- if (maybe_member_expr.has_value ())
242
- return *maybe_member_expr;
243
- UNREACHABLE;
239
+ CHECK_RETURN (maybe_member_expr.has_value ());
240
+ return *maybe_member_expr;
244
241
}
245
242
246
243
const auto maybe_member_expr = get_subexpression_at_offset (
247
244
struct_symbol->symbol_expr (), member_offset, expr.type ().subtype (), ns);
248
- if (maybe_member_expr.has_value ())
249
- return *maybe_member_expr;
250
-
251
- UNREACHABLE;
245
+ CHECK_RETURN (maybe_member_expr.has_value ());
246
+ return *maybe_member_expr;
252
247
}
253
248
254
249
exprt gdb_value_extractort::get_non_char_pointer_value (
@@ -292,28 +287,30 @@ exprt gdb_value_extractort::get_non_char_pointer_value(
292
287
}
293
288
else
294
289
{
295
- const symbol_exprt typed_symbol_value = symbol_exprt{
296
- to_symbol_expr (it->second ).get_identifier (), expr.type ().subtype ()};
297
- return typed_symbol_value;
290
+ const auto &known_value = it->second ;
291
+ const auto &expected_type = expr.type ().subtype ();
292
+ if (known_value.type () != expected_type)
293
+ {
294
+ return symbol_exprt{to_symbol_expr (known_value).get_identifier (),
295
+ expected_type};
296
+ }
297
+ return known_value;
298
298
}
299
299
}
300
300
301
301
bool gdb_value_extractort::points_to_member (
302
302
const pointer_valuet &pointer_value) const
303
303
{
304
- if (pointer_value.pointee . find ( " + " ) != std::string::npos )
304
+ if (pointer_value.has_known_offset () )
305
305
return true ;
306
306
307
307
const symbolt *pointee_symbol = symbol_table.lookup (pointer_value.pointee );
308
308
if (pointee_symbol == nullptr )
309
309
return false ;
310
- const auto pointee_type = pointee_symbol->type ;
311
- if (
312
- pointee_type.id () == ID_struct_tag || pointee_type.id () == ID_union_tag ||
313
- pointee_type.id () == ID_array || pointee_type.id () == ID_struct ||
314
- pointee_type.id () == ID_union)
315
- return true ;
316
- return false ;
310
+ const auto &pointee_type = pointee_symbol->type ;
311
+ return pointee_type.id () == ID_struct_tag ||
312
+ pointee_type.id () == ID_union_tag || pointee_type.id () == ID_array ||
313
+ pointee_type.id () == ID_struct || pointee_type.id () == ID_union;
317
314
}
318
315
319
316
exprt gdb_value_extractort::get_pointer_value (
@@ -486,23 +483,12 @@ exprt gdb_value_extractort::get_union_value(
486
483
exprt new_expr (zero_expr);
487
484
488
485
const union_tag_typet &union_tag_type = to_union_tag_type (expr.type ());
489
- const union_typet union_type = ns.follow_tag (union_tag_type);
490
-
491
- for (size_t i = 0 ; i < new_expr.operands ().size (); ++i)
492
- {
493
- const union_typet::componentt &component = union_type.components ()[i];
494
-
495
- if (component.get_is_padding ())
496
- {
497
- continue ;
498
- }
499
-
500
- exprt &operand = new_expr.operands ()[i];
501
- member_exprt member_expr (expr, component);
502
-
503
- operand = get_expr_value (member_expr, operand, location);
504
- }
486
+ const union_typet &union_type = ns.follow_tag (union_tag_type);
505
487
488
+ CHECK_RETURN (new_expr.operands ().size () == 1 );
489
+ const union_typet::componentt &component = union_type.components ()[0 ];
490
+ auto &operand = new_expr.operands ()[0 ];
491
+ operand = get_expr_value (member_exprt{expr, component}, operand, location);
506
492
return new_expr;
507
493
}
508
494
0 commit comments