@@ -324,6 +324,27 @@ 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
+ if (function_symbol == nullptr )
340
+ {
341
+ throw invalid_source_file_exceptiont{
342
+ " input source code does not contain function: " + function_name};
343
+ }
344
+ CHECK_RETURN (function_symbol->type .id () == ID_code);
345
+ return function_symbol->symbol_expr ();
346
+ }
347
+
327
348
exprt gdb_value_extractort::get_non_char_pointer_value (
328
349
const exprt &expr,
329
350
const pointer_valuet &value,
@@ -489,6 +510,17 @@ exprt gdb_value_extractort::get_pointer_value(
489
510
return result_expr;
490
511
}
491
512
513
+ // pointer to function
514
+ if (expr.type ().subtype ().id () == ID_code)
515
+ {
516
+ const auto target_expr =
517
+ get_pointer_to_function_value (expr, value, location);
518
+ CHECK_RETURN (target_expr.id () != ID_nil);
519
+ const auto result_expr = address_of_exprt (target_expr);
520
+ CHECK_RETURN (result_expr.type () == zero_expr.type ());
521
+ return result_expr;
522
+ }
523
+
492
524
// non-member: split for char/non-char
493
525
const auto target_expr =
494
526
is_c_char_type (expr.type ().subtype ())
0 commit comments