[2/3] RFC: add `special_display' to linespec_result

Tom Tromey tromey@redhat.com
Fri Mar 18 18:28:00 GMT 2011


This patch adds a new field to linespec_result and updates the
breakpoint code to use it.  This new field gives the linespec code a way
to tell the breakpoint code that a given linespec should be displayed
verbatim in "info break".

Without this, `function:label' linespecs would display something like
`<main+3>', instead of the more friendly `function:label'.

This patch does not change anything to set this field, so it does not
affect behavior.

This, combined with patch #1, was built and regtested on x86-64 (compile
farm).

Tom

2011-03-18  Tom Tromey  <tromey@redhat.com>

	* linespec.h (struct linespec_result) <special_display>: New
	field.
	* breakpoint.h (struct breakpoint) <display_canonical>: New
	field.
	* breakpoint.c (print_breakpoint_location): Respect
	display_canonical.
	(create_breakpoint_sal): Add 'display_canonical' parameter.
	(create_breakpoints_sal): Update.
	(create_breakpoint): Update.

diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index c1c7b5a..8f9e5f4 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -4621,7 +4621,9 @@ print_breakpoint_location (struct breakpoint *b,
   if (loc != NULL)
     set_current_program_space (loc->pspace);
 
-  if (b->source_file && loc)
+  if (b->display_canonical)
+    ui_out_field_string (uiout, "what", b->addr_string);
+  else if (b->source_file && loc)
     {
       struct symbol *sym 
 	= find_pc_sect_function (loc->address, loc->section);
@@ -7204,7 +7206,7 @@ create_breakpoint_sal (struct gdbarch *gdbarch,
 		       enum bptype type, enum bpdisp disposition,
 		       int thread, int task, int ignore_count,
 		       struct breakpoint_ops *ops, int from_tty,
-		       int enabled, int internal)
+		       int enabled, int internal, int display_canonical)
 {
   struct breakpoint *b = NULL;
   int i;
@@ -7313,6 +7315,7 @@ create_breakpoint_sal (struct gdbarch *gdbarch,
 	}
     }   
 
+  b->display_canonical = display_canonical;
   if (addr_string)
     b->addr_string = addr_string;
   else
@@ -7497,7 +7500,8 @@ create_breakpoints_sal (struct gdbarch *gdbarch,
       create_breakpoint_sal (gdbarch, expanded, canonical->canonical[i],
 			     cond_string, type, disposition,
 			     thread, task, ignore_count, ops,
-			     from_tty, enabled, internal);
+			     from_tty, enabled, internal,
+			     canonical->special_display);
     }
 }
 
@@ -7953,7 +7957,8 @@ create_breakpoint (struct gdbarch *gdbarch,
 				     cond_string, type_wanted,
 				     tempflag ? disp_del : disp_donttouch,
 				     thread, task, ignore_count, ops,
-				     from_tty, enabled, internal);
+				     from_tty, enabled, internal,
+				     canonical.special_display);
 
 	      do_cleanups (old_chain);
 
diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h
index bd09713..d5af928 100644
--- a/gdb/breakpoint.h
+++ b/gdb/breakpoint.h
@@ -472,6 +472,8 @@ struct breakpoint
     /* Non-zero means a silent breakpoint (don't print frame info
        if we stop here).  */
     unsigned char silent;
+    /* Non-zero means display ADDR_STRING to the user verbatim.  */
+    unsigned char display_canonical;
     /* Number of stops at this breakpoint that should
        be continued automatically before really stopping.  */
     int ignore_count;
diff --git a/gdb/linespec.h b/gdb/linespec.h
index 3366fc6..d8d2ec9 100644
--- a/gdb/linespec.h
+++ b/gdb/linespec.h
@@ -25,6 +25,11 @@ struct symtab;
 
 struct linespec_result
 {
+  /* If non-zero, the linespec should be displayed to the user.  This
+     is used by "unusual" linespecs where the ordinary `info break'
+     display mechanism would do the wrong thing.  */
+  int special_display;
+
   /* If non-NULL, an array of canonical names for returned
      symtab_and_line objects.  The array has as many elements as the
      `nelts' field in the symtabs_and_line returned by decode_line_1.



More information about the Gdb-patches mailing list