RFA: info macro [-at LOCATION,]

Message ID 31913.1415655693@usendtaylorx2l
State New, archived
Headers

Commit Message

David Taylor Nov. 10, 2014, 9:41 p.m. UTC
  A few releases ago it was possible to set a location that would be used
by 'info location' by typing something like:

    list file.c:42

and then do:

    info macro MACRONAME

.  Sometime between release 7.1 and 7.8 that stopped working.

The following patch adds the option [-at LOCATION,] to 'info macro' to
enable the use of a user selected location as a documented feature.

Three files, three change log entries:

gdb/ChangeLog:


2014-11-10  David Taylor  <dtaylor@emc.com>

	* macrocmd.c (info_macro_command): Add support for new option '-at
	LOCATION'.  (_initialize_macrocmd): Update doc string for 'info
	macro' command.

gdb/doc/ChangeLog:

2014-11-10  David Taylor  <dtaylor@emc.com>

	* gdb.texinfo: Document new -at LOCATION option of the 'info
	macro' command.

gdb/testsuite/ChangeLog:

2014-11-10  David Taylor  <dtaylor@emc.com>

	* gdb.base/info-macros.exp: Add testcases for new -at LOCATION
	option of the 'info macro' command.

On an x86-64 Linux platform, there were no testsuite regressions and the
new tests passed.

The actual patch:
  

Comments

Eli Zaretskii Nov. 11, 2014, 3:44 a.m. UTC | #1
> From: David Taylor <dtaylor@emc.com>
> Date: Mon, 10 Nov 2014 16:41:33 -0500
> 
> A few releases ago it was possible to set a location that would be used
> by 'info location' by typing something like:
> 
>     list file.c:42
> 
> and then do:
> 
>     info macro MACRONAME
> 
> .  Sometime between release 7.1 and 7.8 that stopped working.
> 
> The following patch adds the option [-at LOCATION,] to 'info macro' to
> enable the use of a user selected location as a documented feature.
> 
> Three files, three change log entries:

Thanks.  I think this warrants a NEWS entry as well.

> gdb/doc/ChangeLog:
> 
> 2014-11-10  David Taylor  <dtaylor@emc.com>
> 
> 	* gdb.texinfo: Document new -at LOCATION option of the 'info
> 	macro' command.

Please state the node in which the change was made (as if it were a
function, i.e. in parentheses).

> -@item info macro [-a|-all] [--] @var{macro}
> +@item info macro [-a|-all] [-at LOCATION,] [--] @var{macro}
>  Show the current definition or all definitions of the named @var{macro},
>  and describe the source location or compiler command-line where that
>  definition was established.  The optional double dash is to signify the end of
>  argument processing and the beginning of @var{macro} for non C-like macros where
> -the macro may begin with a hyphen.
> +the macro may begin with a hyphen.  If the optional LOCATION is specified,
> +it is used instead of the current location.

First, "LOCATION" should be "@var{location}", as it is a parameter,
not a literal string.

And second, "it is used instead of the current location" leaves too
much unsaid.  The reader will wonder why does location matter for this
purpose.  I suggest to make that explicit in the text.
  

Patch

Index: gdb/macrocmd.c
===================================================================
RCS file: /home/cvsroot/GDB/gdb/macrocmd.c,v
retrieving revision 1.1.1.3
diff -u -r1.1.1.3 macrocmd.c
--- gdb/macrocmd.c	21 Aug 2014 13:17:23 -0000	1.1.1.3
+++ gdb/macrocmd.c	10 Nov 2014 21:23:37 -0000
@@ -206,21 +206,43 @@ 
 info_macro_command (char *args, int from_tty)
 {
   struct macro_scope *ms = NULL;
-  struct cleanup *cleanup_chain;
+  struct cleanup *cleanup_chain = NULL;
   char *name;
   int show_all_macros_named = 0;
   char *arg_start = args;
   int processing_args = 1;
 
-  while (processing_args
-	 && arg_start && *arg_start == '-' && *arg_start != '\0')
-    {
-      char *p = skip_to_space (arg_start);
+  int location_specified = 0;
 
-      if (strncmp (arg_start, "-a", p - arg_start) == 0
-	  || strncmp (arg_start, "-all", p - arg_start) == 0)
+  while (processing_args && args && *args == '-')
+    {
+      if (check_for_argument (&args, "-a", sizeof ("-a") - 1)
+	  || check_for_argument (&args, "-all", sizeof ("-all") - 1))
 	show_all_macros_named = 1;
-      else if (strncmp (arg_start, "--", p - arg_start) == 0)
+      else if (check_for_argument (&args, "-at", sizeof ("-at") - 1))
+	{
+	  struct linespec_result canonical;
+
+	  location_specified = 1;
+
+	  args = skip_spaces (args);
+	  init_linespec_result (&canonical);
+	  decode_line_full (&args, DECODE_LINE_FUNFIRSTLINE,
+			    (struct symtab *) NULL, 0, &canonical,
+			    NULL, NULL);
+
+	  cleanup_chain = make_cleanup_destroy_linespec_result (&canonical);
+	  args = skip_spaces (args);
+	  if (args[0] == ',')
+	    {
+	      args++;
+	      args = skip_spaces (args);
+	    }
+	  ms = sal_macro_scope (canonical.sals->vec->sals.sals[0]);
+	  do_cleanups (cleanup_chain);
+	  cleanup_chain = make_cleanup (free_current_contents, &ms);
+	}
+      else if (check_for_argument (&args, "--", sizeof ("--") - 1))
           /* Our macro support seems rather C specific but this would
              seem necessary for languages allowing - in macro names.
 	     e.g. Scheme's (defmacro ->foo () "bar\n")  */
@@ -228,24 +250,26 @@ 
       else
 	{
 	  /* Relies on modified 'args' not making it in to history */
-	  *p = '\0';
 	  error (_("Unrecognized option '%s' to info macro command.  "
-		   "Try \"help info macro\"."), arg_start);
+		   "Try \"help info macro\"."), args);
 	}
 
-        arg_start = skip_spaces (p);
+        args = skip_spaces (args);
     }
 
-  name = arg_start;
+  name = skip_spaces (args);
 
   if (! name || ! *name)
     error (_("You must follow the `info macro' command with the name"
 	     " of the macro\n"
 	     "whose definition you want to see."));
 
-  ms = default_macro_scope ();
-  cleanup_chain = make_cleanup (free_current_contents, &ms);
-
+  if (! location_specified)
+    {
+      ms = default_macro_scope ();
+      cleanup_chain = make_cleanup (free_current_contents, &ms);
+    }
+  
   if (! ms)
     macro_inform_no_debuginfo ();
   else if (show_all_macros_named)
@@ -525,10 +549,11 @@ 
 
   add_cmd ("macro", no_class, info_macro_command,
 	   _("Show the definition of MACRO, and it's source location.\n\
-Usage: info macro [-a|-all] [--] MACRO\n\
+Usage: info macro [-a|-all] [-at LOCATION,] [--] MACRO\n\
 Options: \n\
   -a, --all    Output all definitions of MACRO in the current compilation\
  unit.\n\
+  -at          Use LOCATION rather than the current PC for selecting macros.\n\
   --           Specify the end of arguments and the beginning of the MACRO."),
 
 	   &infolist);
Index: gdb/doc/gdb.texinfo
===================================================================
RCS file: /home/cvsroot/GDB/gdb/doc/gdb.texinfo,v
retrieving revision 1.3
diff -u -r1.3 gdb.texinfo
--- gdb/doc/gdb.texinfo	21 Aug 2014 14:07:17 -0000	1.3
+++ gdb/doc/gdb.texinfo	10 Nov 2014 21:23:37 -0000
@@ -11412,12 +11412,13 @@ 
 @cindex macro definition, showing
 @cindex definition of a macro, showing
 @cindex macros, from debug info
-@item info macro [-a|-all] [--] @var{macro}
+@item info macro [-a|-all] [-at LOCATION,] [--] @var{macro}
 Show the current definition or all definitions of the named @var{macro},
 and describe the source location or compiler command-line where that
 definition was established.  The optional double dash is to signify the end of
 argument processing and the beginning of @var{macro} for non C-like macros where
-the macro may begin with a hyphen.
+the macro may begin with a hyphen.  If the optional LOCATION is specified,
+it is used instead of the current location.
 
 @kindex info macros
 @item info macros @var{linespec}
Index: gdb/testsuite/gdb.base/info-macros.exp
===================================================================
RCS file: /home/cvsroot/GDB/gdb/testsuite/gdb.base/info-macros.exp,v
retrieving revision 1.1.1.3
diff -u -r1.1.1.3 info-macros.exp
--- gdb/testsuite/gdb.base/info-macros.exp	21 Aug 2014 13:17:27 -0000	1.1.1.3
+++ gdb/testsuite/gdb.base/info-macros.exp	10 Nov 2014 21:23:38 -0000
@@ -133,6 +133,30 @@ 
 set testname "$test"
 gdb_test "$test" "$r1$r2$r3$r4" "$testname"
 
+set test "info macro -at LOCATION, FOO"
+
+set r5 ".* has no definition .*\r\nat .*$srcfile:\[0-9\]+"
+set testname "$test 1"
+gdb_test "info macro -at info-macros.c:42, FOO" "$r1" "$testname"
+
+set testname "$test 2"
+gdb_test "info macro -at info-macros.c:46, FOO" "$r2" "$testname"
+
+set testname "$test 3"
+gdb_test "info macro -at info-macros.c:50, FOO" "$r3" "$testname"
+
+set testname "$test 4"
+gdb_test "info macro -at info-macros.c:54, FOO" "$r2" "$testname"
+
+set testname "$test 5"
+gdb_test "info macro -at info-macros.c:58, FOO" "$r1" "$testname"
+
+set testname "$test 6"
+gdb_test "info macro -at info-macros.c:62, FOO" "$r5" "$testname"
+
+set testname "$test 7"
+gdb_test "info macro -at info-macros.c:66, FOO" "$r4" "$testname"
+
 set test "info macros"
 set r1 ".*#define FOO \"hello\""
 set r2 ".*#define ONE"