[PATCHv2,1/2] gdb: Split func_command into two parts.

Message ID d34fc1596b3adba489de389eec14028982d85c40.1525797846.git.andrew.burgess@embecosm.com
State New, archived
Headers

Commit Message

Andrew Burgess May 8, 2018, 4:58 p.m. UTC
  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

Pedro Alves May 18, 2018, 7:38 p.m. UTC | #1
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
  

Patch

diff --git a/gdb/stack.c b/gdb/stack.c
index ecf1ee83793..5e99a42053c 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -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