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