[PATCHv2,1/2] gdb: Split func_command into two parts.
Commit Message
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.
(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 | 8 ++++++++
gdb/stack.c | 46 ++++++++++++++++++++++++++++------------------
2 files changed, 36 insertions(+), 18 deletions(-)
Comments
On 05/08/2018 05:58 PM, Andrew Burgess wrote:
> 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.
> (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.
This LGTM, with a couple minor nits.
> /* Return the symbol-block in which the selected frame is executing.
> Can return zero under various legitimate circumstances.
> @@ -2460,19 +2450,19 @@ 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)
There's a comment above the structure that is describing
what the func_command function did. That needs to be
updated to describe what the new function does.
> +
> +/* Implements the dbx 'func' command. */
> +
> +static void
> +func_command (const char *arg, int from_tty)
> +{
> + struct frame_info *frame;
> +
> + if (arg == NULL)
> + return;
> +
> + frame = find_frame_for_function (arg);
You can declare and initialize at the same time:
func_command (const char *arg, int from_tty)
{
if (arg == NULL)
return;
frame_info *frame = find_frame_for_function (arg);
Thanks,
Pedro Alves
@@ -2157,16 +2157,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.
@@ -2460,19 +2450,19 @@ 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)
{
struct frame_info *frame;
int found = 0;
int level = 1;
- if (arg == NULL)
- return;
+ gdb_assert (function_name != NULL);
frame = get_current_frame ();
std::vector<symtab_and_line> sals
- = decode_line_with_current_source (arg, DECODE_LINE_FUNFIRSTLINE);
+ = decode_line_with_current_source (function_name,
+ DECODE_LINE_FUNFIRSTLINE);
gdb::def_vector<function_bounds> func_bounds (sals.size ());
for (size_t i = 0; (i < sals.size () && !found); i++)
{
@@ -2501,9 +2491,29 @@ 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)
+{
+ struct frame_info *frame;
+
+ if (arg == NULL)
+ return;
+
+ 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