This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] gdb: Split func_command into two parts.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=39f0c2040f13ae0eb3405b8cf2ff6491c6f354a5

commit 39f0c2040f13ae0eb3405b8cf2ff6491c6f354a5
Author: Andrew Burgess <andrew.burgess@embecosm.com>
Date:   Sat May 5 15:55:58 2018 +0100

    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.

Diff:
---
 gdb/ChangeLog |  9 ++++++++
 gdb/stack.c   | 67 +++++++++++++++++++++++++++++++++--------------------------
 2 files changed, 46 insertions(+), 30 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6a1aae8..16a4d10 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,12 @@
+2018-05-24  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* 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  <philippe.waroquiers@skynet.be>
 
 	* stack.c (iterate_over_block_arg_vars): Fix comment.
diff --git a/gdb/stack.c b/gdb/stack.c
index 016ee1d..bfd9653 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.  */
-
-struct function_bounds
-{
-  CORE_ADDR low, high;
-};
+/* Find the most inner frame in the current stack for a function called
+   FUNCTION_NAME.  If no matching frame is found return NULL.  */
 
-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<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++)
+  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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]