From 39f0c2040f13ae0eb3405b8cf2ff6491c6f354a5 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Sat, 5 May 2018 15:55:58 +0100 Subject: [PATCH] gdb: Split func_command into two parts. The func_command function is used to emulate the dbx 'func' command. However, finding a stack frame based on function name might be a useful feature, and so the core of func_command is now split out into a separate function. gdb/ChangeLog: * stack.c (select_and_print_frame): Delete. (struct function_bounds): Move struct within function. (func_command): Most content moved into new function find_frame_for_function, use new function, print result, add function comment. (find_frame_for_function): New function, now returns a result. --- gdb/ChangeLog | 9 +++++++ gdb/stack.c | 67 ++++++++++++++++++++++++++++----------------------- 2 files changed, 46 insertions(+), 30 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6a1aae8523..16a4d10efd 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2018-05-24 Andrew Burgess + + * stack.c (select_and_print_frame): Delete. + (struct function_bounds): Move struct within function. + (func_command): Most content moved into new function + find_frame_for_function, use new function, print result, add + function comment. + (find_frame_for_function): New function, now returns a result. + 2018-05-24 Philippe Waroquiers * stack.c (iterate_over_block_arg_vars): Fix comment. diff --git a/gdb/stack.c b/gdb/stack.c index 016ee1d58b..bfd9653cca 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -2138,16 +2138,6 @@ info_args_command (const char *ignore, int from_tty) print_frame_arg_vars (get_selected_frame (_("No frame selected.")), gdb_stdout); } - -/* Select frame FRAME. Also print the stack frame and show the source - if this is the tui version. */ -static void -select_and_print_frame (struct frame_info *frame) -{ - select_frame (frame); - if (frame) - print_stack_frame (frame, 1, SRC_AND_LOC, 1); -} /* Return the symbol-block in which the selected frame is executing. Can return zero under various legitimate circumstances. @@ -2433,29 +2423,30 @@ return_command (const char *retval_exp, int from_tty) print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1); } -/* Sets the scope to input function name, provided that the function - is within the current stack frame. */ +/* Find the most inner frame in the current stack for a function called + FUNCTION_NAME. If no matching frame is found return NULL. */ -struct function_bounds -{ - CORE_ADDR low, high; -}; - -static void -func_command (const char *arg, int from_tty) +static struct frame_info * +find_frame_for_function (const char *function_name) { + /* Used to hold the lower and upper addresses for each of the + SYMTAB_AND_LINEs found for functions matching FUNCTION_NAME. */ + struct function_bounds + { + CORE_ADDR low, high; + }; struct frame_info *frame; - int found = 0; + bool found = false; int level = 1; - if (arg == NULL) - return; + gdb_assert (function_name != NULL); frame = get_current_frame (); std::vector sals - = decode_line_with_current_source (arg, DECODE_LINE_FUNFIRSTLINE); + = decode_line_with_current_source (function_name, + DECODE_LINE_FUNFIRSTLINE); gdb::def_vector func_bounds (sals.size ()); - for (size_t i = 0; (i < sals.size () && !found); i++) + for (size_t i = 0; i < sals.size (); i++) { if (sals[i].pspace != current_program_space) func_bounds[i].low = func_bounds[i].high = 0; @@ -2463,9 +2454,7 @@ func_command (const char *arg, int from_tty) || find_pc_partial_function (sals[i].pc, NULL, &func_bounds[i].low, &func_bounds[i].high) == 0) - { - func_bounds[i].low = func_bounds[i].high = 0; - } + func_bounds[i].low = func_bounds[i].high = 0; } do @@ -2482,9 +2471,27 @@ func_command (const char *arg, int from_tty) while (!found && level == 0); if (!found) - printf_filtered (_("'%s' not within current stack frame.\n"), arg); - else if (frame != get_selected_frame (NULL)) - select_and_print_frame (frame); + frame = NULL; + + return frame; +} + +/* Implements the dbx 'func' command. */ + +static void +func_command (const char *arg, int from_tty) +{ + if (arg == NULL) + return; + + struct frame_info *frame = find_frame_for_function (arg); + if (frame == NULL) + error (_("'%s' not within current stack frame.\n"), arg); + if (frame != get_selected_frame (NULL)) + { + select_frame (frame); + print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1); + } } void