[patchv2 8/11] TUI: source "file" -> "fullname"

Jan Kratochvil jan.kratochvil@redhat.com
Sun Jan 27 22:36:00 GMT 2013


Hi,

this is a new part in this v2 series.

It was tested current "gdb -tui" is really incorrect and it gets fixed by this
patch:
	cd gdb.linespec/
	cd base/one/
	g++ -o ../../1.o -c thefile.cc -Wall -g
	cd ../two
	g++ -o ../../2.o -c thefile.cc -Wall -g
	cd  ../..
	g++ -o 0 lspec.cc -Wall -g 1.o 2.o
	../../gdb-tuiN -tui ./0
	../../gdb-tuiY -tui ./0
	b m
	b n
	r
	c
With this patch GDB displays the first thefile.cc for m() and the second
thefile.cc for n(); without this patch it forgot to display n().

It expects that if !ui_out_is_mi_like_p and !ui_source_list it is really TUI
and no other uiout interface; I hope it is safe assumption and there will be
no new interfaces besides current CLI + TUI + MI.

TUI uses a special exception to suppress + catch the output of "list" command.


Thanks,
Jan


gdb/
2013-01-25  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* source.c (print_source_lines_base): Print for TUI also "fullname".
	* tui/tui-data.c (init_content_element): Change tui_locator_element
	field to full_name.
	* tui/tui-data.h (struct tui_locator_element): Likewise.
	* tui/tui-disasm.c (tui_show_disassem_and_update_source): Rename
	tui_update_locator_filename calls to tui_update_locator_fullname.
	Replace symtab->filename refererence by symtab_to_fullname call.
	* tui/tui-out.c (tui_field_string): Check for "fullname" now.
	* tui/tui-source.c (tui_set_source_content): Change tui_locator_element
	field to full_name.  Replace symtab->filename refererence by
	symtab_to_fullname call.
	(tui_show_symtab_source): Rename parameter to fullname.  Change
	tui_locator_element field to full_name.
	* tui/tui-stack.c: Include source.h.
	(tui_set_locator_filename): Rename the declaration to ...
	(tui_set_locator_fullname): ... here.  Rename its parameter to
	fullname, updates its comment.
	(tui_set_locator_info): Rename its parameter to fullname.
	(tui_set_locator_filename): Rename the definition to ...
	(tui_set_locator_fullname): ... here.  Rename its parameter to
	fullname, updates its comment.  Change tui_locator_element field to
	full_name.
	(tui_set_locator_info): Rename its parameter to fullname.
	(tui_set_locator_info): Rename callee to tui_set_locator_fullname.
	(tui_update_locator_filename): Rename to ...
	(tui_update_locator_fullname): ... here. Rename callee to
	tui_set_locator_fullname.
	(tui_show_frame_info): Replace symtab->filename refererence by
	symtab_to_fullname call.
	* tui/tui-stack.h (tui_update_locator_filename): Rename to ...
	(tui_update_locator_fullname): ... here.
	* tui/tui-winsource.c (tui_display_main): Rename the callee to
	tui_update_locator_fullname.  Replace symtab->filename refererence by
	symtab_to_fullname call.
	* tui/tui.c (tui_show_source): Rename its parameter to fullname.
	Rename the callee to tui_update_locator_fullname.
	* tui/tui.h (tui_show_source): Rename its parameter to fullname.

--- a/gdb/source.c
+++ b/gdb/source.c
@@ -1345,7 +1345,11 @@ print_source_lines_base (struct symtab *s, int line, int stopline,
 	  ui_out_field_int (uiout, "line", line);
 	  ui_out_text (uiout, "\tin ");
 	  ui_out_field_string (uiout, "file", symtab_to_filename (s));
-	  if (ui_out_is_mi_like_p (uiout))
+
+	  /* TUI expects the "fullname" field.  While it is
+	     !ui_out_is_mi_like_p compared to CLI it is !ui_source_list.  */
+	  if (ui_out_is_mi_like_p (uiout)
+	      || !ui_out_test_flags (uiout, ui_source_list))
 	    {
 	      const char *fullname = symtab_to_fullname (s);
 
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -510,7 +510,7 @@ init_content_element (struct tui_win_element *element,
       element->which_element.data.content = (char*) NULL;
       break;
     case LOCATOR_WIN:
-      element->which_element.locator.file_name[0] =
+      element->which_element.locator.full_name[0] =
 	element->which_element.locator.proc_name[0] = (char) 0;
       element->which_element.locator.line_no = 0;
       element->which_element.locator.addr = 0;
--- a/gdb/tui/tui-data.h
+++ b/gdb/tui/tui-data.h
@@ -203,7 +203,8 @@ struct tui_command_element
 /* Elements in the locator window content.  */
 struct tui_locator_element
 {
-  char file_name[MAX_LOCATOR_ELEMENT_LEN];
+  /* Resolved absolute filename as returned by symtab_to_fullname.  */
+  char full_name[MAX_LOCATOR_ELEMENT_LEN];
   char proc_name[MAX_LOCATOR_ELEMENT_LEN];
   int line_no;
   CORE_ADDR addr;
--- a/gdb/tui/tui-disasm.c
+++ b/gdb/tui/tui-disasm.c
@@ -318,10 +318,10 @@ tui_show_disassem_and_update_source (struct gdbarch *gdbarch,
       if (sal.symtab)
 	{
 	  set_current_source_symtab_and_line (&sal);
-	  tui_update_locator_filename (sal.symtab->filename);
+	  tui_update_locator_fullname (symtab_to_fullname (sal.symtab));
 	}
       else
-	tui_update_locator_filename ("?");
+	tui_update_locator_fullname ("?");
     }
 
   return;
--- a/gdb/tui/tui-out.c
+++ b/gdb/tui/tui-out.c
@@ -84,7 +84,7 @@ tui_field_string (struct ui_out *uiout,
   if (data->base.suppress_output)
     return;
 
-  if (fldname && data->line > 0 && strcmp (fldname, "file") == 0)
+  if (fldname && data->line > 0 && strcmp (fldname, "fullname") == 0)
     {
       data->start_of_line ++;
       if (data->line > 0)
--- a/gdb/tui/tui-source.c
+++ b/gdb/tui/tui-source.c
@@ -151,8 +151,8 @@ tui_set_source_content (struct symtab *s,
 			cur_line_no;
 		      element->which_element.source.is_exec_point =
 			(filename_cmp (((struct tui_win_element *)
-				       locator->content[0])->which_element.locator.file_name,
-				       s->filename) == 0
+				       locator->content[0])->which_element.locator.full_name,
+				       symtab_to_fullname (s)) == 0
 			 && cur_line_no == ((struct tui_win_element *)
 					    locator->content[0])->which_element.locator.line_no);
 		      if (c != EOF)
@@ -333,14 +333,14 @@ tui_show_symtab_source (struct gdbarch *gdbarch, struct symtab *s,
 /* Answer whether the source is currently displayed in the source
    window.  */
 int
-tui_source_is_displayed (const char *fname)
+tui_source_is_displayed (const char *fullname)
 {
   return (TUI_SRC_WIN != NULL
 	  && TUI_SRC_WIN->generic.content_in_use 
 	  && (filename_cmp (((struct tui_win_element *)
 			     (tui_locator_win_info_ptr ())->
-			     content[0])->which_element.locator.file_name,
-			    fname) == 0));
+			     content[0])->which_element.locator.full_name,
+			    fullname) == 0));
 }
 
 
--- a/gdb/tui/tui-stack.c
+++ b/gdb/tui/tui-stack.c
@@ -29,6 +29,7 @@
 #include "top.h"
 #include "gdb-demangle.h"
 #include "gdb_string.h"
+#include "source.h"
 #include "tui/tui.h"
 #include "tui/tui-data.h"
 #include "tui/tui-stack.h"
@@ -44,12 +45,12 @@
    Returns a pointer to a static area holding the result.  */
 static char *tui_get_function_from_frame (struct frame_info *fi);
 
-/* Set the filename portion of the locator.  */
-static void tui_set_locator_filename (const char *filename);
+/* Set the full_name portion of the locator.  */
+static void tui_set_locator_fullname (const char *fullname);
 
 /* Update the locator, with the provided arguments.  */
 static void tui_set_locator_info (struct gdbarch *gdbarch,
-				  const char *filename,
+				  const char *fullname,
 				  const char *procname,
                                   int lineno, CORE_ADDR addr);
 
@@ -276,27 +277,27 @@ tui_show_locator_content (void)
 
 /* Set the filename portion of the locator.  */
 static void
-tui_set_locator_filename (const char *filename)
+tui_set_locator_fullname (const char *fullname)
 {
   struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
   struct tui_locator_element *element;
 
   if (locator->content[0] == NULL)
     {
-      tui_set_locator_info (NULL, filename, NULL, 0, 0);
+      tui_set_locator_info (NULL, fullname, NULL, 0, 0);
       return;
     }
 
   element = &((struct tui_win_element *)
 	      locator->content[0])->which_element.locator;
-  element->file_name[0] = 0;
-  strcat_to_buf (element->file_name, MAX_LOCATOR_ELEMENT_LEN, filename);
+  element->full_name[0] = 0;
+  strcat_to_buf (element->full_name, MAX_LOCATOR_ELEMENT_LEN, fullname);
 }
 
 /* Update the locator, with the provided arguments.  */
 static void
 tui_set_locator_info (struct gdbarch *gdbarch,
-		      const char *filename,
+		      const char *fullname,
 		      const char *procname, 
 		      int lineno,
                       CORE_ADDR addr)
@@ -318,14 +319,14 @@ tui_set_locator_info (struct gdbarch *gdbarch,
   element->line_no = lineno;
   element->addr = addr;
   element->gdbarch = gdbarch;
-  tui_set_locator_filename (filename);
+  tui_set_locator_fullname (fullname);
 }
 
-/* Update only the filename portion of the locator.  */
+/* Update only the full_name portion of the locator.  */
 void
-tui_update_locator_filename (const char *filename)
+tui_update_locator_fullname (const char *fullname)
 {
-  tui_set_locator_filename (filename);
+  tui_set_locator_fullname (fullname);
   tui_show_locator_content ();
 }
 
@@ -348,11 +349,12 @@ tui_show_frame_info (struct frame_info *fi)
       find_frame_sal (fi, &sal);
 
       source_already_displayed = sal.symtab != 0
-        && tui_source_is_displayed (sal.symtab->filename);
+        && tui_source_is_displayed (symtab_to_fullname (sal.symtab));
 
       if (get_frame_pc_if_available (fi, &pc))
 	tui_set_locator_info (get_frame_arch (fi),
-			      sal.symtab == 0 ? "??" : sal.symtab->filename,
+			      (sal.symtab == 0
+			       ? "??" : symtab_to_fullname (sal.symtab)),
 			      tui_get_function_from_frame (fi),
 			      sal.line,
 			      pc);
--- a/gdb/tui/tui-stack.h
+++ b/gdb/tui/tui-stack.h
@@ -24,7 +24,7 @@
 
 struct frame_info;
 
-extern void tui_update_locator_filename (const char *);
+extern void tui_update_locator_fullname (const char *);
 extern void tui_show_locator_content (void);
 extern void tui_show_frame_info (struct frame_info *);
 
--- a/gdb/tui/tui-winsource.c
+++ b/gdb/tui/tui-winsource.c
@@ -59,9 +59,9 @@ tui_display_main (void)
 	  tui_update_source_windows_with_addr (gdbarch, addr);
 	  sal = find_pc_line (addr, 0);
           if (sal.symtab)
-             tui_update_locator_filename (sal.symtab->filename);
+             tui_update_locator_fullname (symtab_to_fullname (sal.symtab));
           else
-             tui_update_locator_filename ("??");
+             tui_update_locator_fullname ("??");
 	}
     }
 }
--- a/gdb/tui/tui.c
+++ b/gdb/tui/tui.c
@@ -532,7 +532,7 @@ tui_reset (void)
 #endif
 
 void
-tui_show_source (const char *file, int line)
+tui_show_source (const char *fullname, int line)
 {
   struct symtab_and_line cursal = get_current_source_symtab_and_line ();
 
@@ -540,7 +540,7 @@ tui_show_source (const char *file, int line)
   tui_add_win_to_layout (SRC_WIN);
 
   tui_update_source_windows_with_line (cursal.symtab, line);
-  tui_update_locator_filename (file);
+  tui_update_locator_fullname (fullname);
 }
 
 void
--- a/gdb/tui/tui.h
+++ b/gdb/tui/tui.h
@@ -95,7 +95,7 @@ extern void tui_set_key_mode (enum tui_key_mode mode);
 
 extern int tui_active;
 
-extern void tui_show_source (const char *file, int line);
+extern void tui_show_source (const char *fullname, int line);
 
 extern struct ui_out *tui_out_new (struct ui_file *stream);
 



More information about the Gdb-patches mailing list