@@ -324,6 +324,23 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
324
324
return *maybe_member_expr;
325
325
}
326
326
327
+ exprt gdb_value_extractort::get_pointer_to_function_value (
328
+ const exprt &expr,
329
+ const pointer_valuet &pointer_value,
330
+ const source_locationt &location)
331
+ {
332
+ PRECONDITION (expr.type ().id () == ID_pointer);
333
+ PRECONDITION (expr.type ().subtype ().id () == ID_code);
334
+ PRECONDITION (!pointer_value.address .is_null ());
335
+
336
+ const auto &function_name = pointer_value.pointee ;
337
+ CHECK_RETURN (!function_name.empty ());
338
+ const auto function_symbol = symbol_table.lookup (function_name);
339
+ CHECK_RETURN (function_symbol != nullptr );
340
+ CHECK_RETURN (function_symbol->type .id () == ID_code);
341
+ return function_symbol->symbol_expr ();
342
+ }
343
+
327
344
exprt gdb_value_extractort::get_non_char_pointer_value (
328
345
const exprt &expr,
329
346
const pointer_valuet &value,
@@ -489,6 +506,17 @@ exprt gdb_value_extractort::get_pointer_value(
489
506
return result_expr;
490
507
}
491
508
509
+ // pointer to function
510
+ if (expr.type ().subtype ().id () == ID_code)
511
+ {
512
+ const auto target_expr =
513
+ get_pointer_to_function_value (expr, value, location);
514
+ CHECK_RETURN (target_expr.id () != ID_nil);
515
+ const auto result_expr = address_of_exprt (target_expr);
516
+ CHECK_RETURN (result_expr.type () == zero_expr.type ());
517
+ return result_expr;
518
+ }
519
+
492
520
// non-member: split for char/non-char
493
521
const auto target_expr =
494
522
is_c_char_type (expr.type ().subtype ())
0 commit comments