gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Tue, 25 Dec 2012 08:03:33 +0000 (08:03 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Tue, 25 Dec 2012 08:03:33 +0000 (08:03 +0000)
* ada-lang.c (is_known_support_routine): New variable fullname.  Use
access call to verify the symtab_to_fullname result.
* breakpoint.c (print_breakpoint_location, update_static_tracepoint):
Remove NULL check of symtab_to_fullname result.
* cli/cli-cmds.c (edit_command): Likewise.
* mi/mi-cmd-file.c (mi_cmd_file_list_exec_source_file)
(mi_cmd_file_list_exec_source_files): Likewise.
* python/py-symtab.c (stpy_fullname): Likewise.
* source.c (symtab_to_fullname): Update function comment.  Rename
variable r to fd, move it to inner block.  Always provide non-NULL
result.
(print_source_lines_base): Remove NULL check of symtab_to_fullname
result.
* stack.c (print_frame): Likewise.
* symtab.c (iterate_over_some_symtabs, find_line_symtab, sources_info):
Likewise.
* tracepoint.c (print_one_static_tracepoint_marker): Likewise.

gdb/doc/
* gdb.texinfo (GDB/MI Data Manipulation) (fullname): Make it always
present.
(GDB/MI File Commands) (-file-list-exec-source-files): Make the
fullname output always present.

gdb/testsuite/
* gdb.mi/mi-fullname-deleted.exp: New file.

14 files changed:
gdb/ChangeLog
gdb/ada-lang.c
gdb/breakpoint.c
gdb/cli/cli-cmds.c
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/mi/mi-cmd-file.c
gdb/python/py-symtab.c
gdb/source.c
gdb/stack.c
gdb/symtab.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.mi/mi-fullname-deleted.exp [new file with mode: 0644]
gdb/tracepoint.c

index eb9cfdc..6f22130 100644 (file)
@@ -1,3 +1,23 @@
+2012-12-25  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * ada-lang.c (is_known_support_routine): New variable fullname.  Use
+       access call to verify the symtab_to_fullname result.
+       * breakpoint.c (print_breakpoint_location, update_static_tracepoint):
+       Remove NULL check of symtab_to_fullname result.
+       * cli/cli-cmds.c (edit_command): Likewise.
+       * mi/mi-cmd-file.c (mi_cmd_file_list_exec_source_file)
+       (mi_cmd_file_list_exec_source_files): Likewise.
+       * python/py-symtab.c (stpy_fullname): Likewise.
+       * source.c (symtab_to_fullname): Update function comment.  Rename
+       variable r to fd, move it to inner block.  Always provide non-NULL
+       result.
+       (print_source_lines_base): Remove NULL check of symtab_to_fullname
+       result.
+       * stack.c (print_frame): Likewise.
+       * symtab.c (iterate_over_some_symtabs, find_line_symtab, sources_info):
+       Likewise.
+       * tracepoint.c (print_one_static_tracepoint_marker): Likewise.
+
 2012-12-24  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Code cleanup.
index f07e4bc..cb7313b 100644 (file)
@@ -11084,6 +11084,7 @@ is_known_support_routine (struct frame_info *frame)
   const char *func_name;
   enum language func_lang;
   int i;
+  const char *fullname;
 
   /* If this code does not have any debugging information (no symtab),
      This cannot be any user code.  */
@@ -11098,7 +11099,8 @@ is_known_support_routine (struct frame_info *frame)
      for the user.  This should also take care of case such as VxWorks
      where the kernel has some debugging info provided for a few units.  */
 
-  if (symtab_to_fullname (sal.symtab) == NULL)
+  fullname = symtab_to_fullname (sal.symtab);
+  if (access (fullname, R_OK) != 0)
     return 1;
 
   /* Check the unit filename againt the Ada runtime file naming.
index bb4be0b..66bbf76 100644 (file)
@@ -5694,8 +5694,7 @@ print_breakpoint_location (struct breakpoint *b,
          struct symtab_and_line sal = find_pc_line (loc->address, 0);
          const char *fullname = symtab_to_fullname (sal.symtab);
          
-         if (fullname)
-           ui_out_field_string (uiout, "fullname", fullname);
+         ui_out_field_string (uiout, "fullname", fullname);
        }
       
       ui_out_field_int (uiout, "line", loc->line_number);
@@ -13870,8 +13869,7 @@ update_static_tracepoint (struct breakpoint *b, struct symtab_and_line sal)
            {
              const char *fullname = symtab_to_fullname (sal2.symtab);
 
-             if (fullname)
-               ui_out_field_string (uiout, "fullname", fullname);
+             ui_out_field_string (uiout, "fullname", fullname);
            }
 
          ui_out_field_int (uiout, "line", sal2.line);
index 8477339..e9c5df8 100644 (file)
@@ -840,16 +840,7 @@ edit_command (char *arg, int from_tty)
   if ((editor = (char *) getenv ("EDITOR")) == NULL)
       editor = "/bin/ex";
 
-  /* If we don't already know the full absolute file name of the
-     source file, find it now.  */
-  if (!sal.symtab->fullname)
-    {
-      fn = symtab_to_fullname (sal.symtab);
-      if (!fn)
-       fn = "unknown";
-    }
-  else
-    fn = sal.symtab->fullname;
+  fn = symtab_to_fullname (sal.symtab);
 
   /* Quote the file name, in case it has whitespace or other special
      characters.  */
index 44077d0..4c96eae 100644 (file)
@@ -1,3 +1,10 @@
+2012-12-25  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * gdb.texinfo (GDB/MI Data Manipulation) (fullname): Make it always
+       present.
+       (GDB/MI File Commands) (-file-list-exec-source-files): Make the
+       fullname output always present.
+
 2012-12-23  Pierre Muller  <muller@sourceware.org>
 
         * gdbint.texinfo (Function prototypes): Require use of "extern"
index 5abcd93..c1ba745 100644 (file)
@@ -31086,9 +31086,13 @@ file name or a relative file name depending on the compile command
 used.
 
 @item fullname
-This field is optional.  If it is present it will contain an absolute
-file name of @samp{file}.  If this field is not present then
-@value{GDBN} was unable to determine the absolute file name.
+Absolute file name of @samp{file}.  It is converted to a canonical form
+using the source file search path
+(@pxref{Source Path, ,Specifying Source Directories})
+and after resolving all the symbolic links.
+
+If the source file is not found this field will contain the path as
+present in the debug information.
 
 @item line_asm_insn
 This is a list of tuples containing the disassembly for @samp{line} in
@@ -32269,8 +32273,8 @@ The @value{GDBN} equivalent is @samp{info source}
 
 List the source files for the current executable.
 
-It will always output the filename, but only when @value{GDBN} can find
-the absolute file name of a source file, will it output the fullname.
+It will always output both the filename and fullname (absolute file
+name) of a source file.
 
 @subsubheading @value{GDBN} Command
 
index 0b2b725..018f505 100644 (file)
@@ -48,16 +48,11 @@ mi_cmd_file_list_exec_source_file (char *command, char **argv, int argc)
   if (!st.symtab)
     error (_("-file-list-exec-source-file: No symtab"));
 
-  /* Extract the fullname if it is not known yet.  */
-  symtab_to_fullname (st.symtab);
-
   /* Print to the user the line, filename and fullname.  */
   ui_out_field_int (uiout, "line", st.line);
   ui_out_field_string (uiout, "file", st.symtab->filename);
 
-  /* We may not be able to open the file (not available). */
-  if (st.symtab->fullname)
-  ui_out_field_string (uiout, "fullname", st.symtab->fullname);
+  ui_out_field_string (uiout, "fullname", symtab_to_fullname (st.symtab));
 
   ui_out_field_int (uiout, "macro-info", st.symtab->macro_table ? 1 : 0);
 }
@@ -99,12 +94,7 @@ mi_cmd_file_list_exec_source_files (char *command, char **argv, int argc)
     ui_out_begin (uiout, ui_out_type_tuple, NULL);
 
     ui_out_field_string (uiout, "file", s->filename);
-
-    /* Extract the fullname if it is not known yet.  */
-    symtab_to_fullname (s);
-
-    if (s->fullname)
-      ui_out_field_string (uiout, "fullname", s->fullname);
+    ui_out_field_string (uiout, "fullname", symtab_to_fullname (s));
 
     ui_out_end (uiout, ui_out_type_tuple);
   }
index d3e95db..deb7330 100644 (file)
@@ -132,11 +132,8 @@ stpy_fullname (PyObject *self, PyObject *args)
   STPY_REQUIRE_VALID (self, symtab);
 
   fullname = symtab_to_fullname (symtab);
-  if (fullname)
-    return PyString_Decode (fullname, strlen (fullname),
-                           host_charset (), NULL);
 
-  Py_RETURN_NONE;
+  return PyString_Decode (fullname, strlen (fullname), host_charset (), NULL);
 }
 
 /* Implementation of gdb.Symtab.is_valid (self) -> Boolean.
index c9e6ba1..ea39528 100644 (file)
@@ -1075,35 +1075,32 @@ open_source_file (struct symtab *s)
 
 /* Finds the fullname that a symtab represents.
 
-   If this functions finds the fullname, it will save it in s->fullname
-   and it will also return the value.
+   This functions finds the fullname and saves it in s->fullname.
+   It will also return the value.
 
    If this function fails to find the file that this symtab represents,
-   NULL will be returned and s->fullname will be set to NULL.  */
+   the expected fullname is used.  Therefore the files does not have to
+   exist.  */
 
 const char *
 symtab_to_fullname (struct symtab *s)
 {
-  int r;
-
-  if (!s)
-    return NULL;
-
   /* Use cached copy if we have it.
      We rely on forget_cached_source_info being called appropriately
      to handle cases like the file being moved.  */
-  if (s->fullname)
-    return s->fullname;
-
-  r = find_and_open_source (s->filename, s->dirname, &s->fullname);
-
-  if (r >= 0)
+  if (s->fullname == NULL)
     {
-      close (r);
-      return s->fullname;
-    }
+      int fd = find_and_open_source (s->filename, s->dirname, &s->fullname);
 
-  return NULL;
+      if (fd >= 0)
+       close (fd);
+      else if (s->dirname == NULL)
+       s->fullname = xstrdup (s->filename);
+      else
+       s->fullname = concat (s->dirname, SLASH_STRING, s->filename, NULL);
+    } 
+
+  return s->fullname;
 }
 \f
 /* Create and initialize the table S->line_charpos that records
@@ -1306,8 +1303,7 @@ print_source_lines_base (struct symtab *s, int line, int stopline,
            {
              const char *fullname = symtab_to_fullname (s);
 
-             if (fullname != NULL)
-               ui_out_field_string (uiout, "fullname", fullname);
+             ui_out_field_string (uiout, "fullname", fullname);
            }
          ui_out_text (uiout, "\n");
        }
index e246a68..6cf6052 100644 (file)
@@ -1189,8 +1189,7 @@ print_frame (struct frame_info *frame, int print_level,
        {
          const char *fullname = symtab_to_fullname (sal.symtab);
 
-         if (fullname != NULL)
-           ui_out_field_string (uiout, "fullname", fullname);
+         ui_out_field_string (uiout, "fullname", fullname);
        }
       annotate_frame_source_file_end ();
       ui_out_text (uiout, ":");
index 7c06b41..a39e5bf 100644 (file)
@@ -224,13 +224,13 @@ iterate_over_some_symtabs (const char *name,
       {
         const char *fp = symtab_to_fullname (s);
 
-        if (fp != NULL && FILENAME_CMP (full_path, fp) == 0)
+        if (FILENAME_CMP (full_path, fp) == 0)
           {
            if (callback (s, data))
              return 1;
           }
 
-       if (fp != NULL && !is_abs && compare_filenames_for_search (fp, name))
+       if (!is_abs && compare_filenames_for_search (fp, name))
          {
            if (callback (s, data))
              return 1;
@@ -240,24 +240,20 @@ iterate_over_some_symtabs (const char *name,
     if (real_path != NULL)
       {
         const char *fullname = symtab_to_fullname (s);
+       char *rp = gdb_realpath (fullname);
 
-        if (fullname != NULL)
-          {
-            char *rp = gdb_realpath (fullname);
-
-            make_cleanup (xfree, rp);
-            if (FILENAME_CMP (real_path, rp) == 0)
-             {
-               if (callback (s, data))
-                 return 1;
-             }
+       make_cleanup (xfree, rp);
+       if (FILENAME_CMP (real_path, rp) == 0)
+         {
+           if (callback (s, data))
+             return 1;
+         }
 
-           if (!is_abs && compare_filenames_for_search (rp, name))
-             {
-               if (callback (s, data))
-                 return 1;
-             }
-          }
+       if (!is_abs && compare_filenames_for_search (rp, name))
+         {
+           if (callback (s, data))
+             return 1;
+         }
       }
     }
 
@@ -2551,9 +2547,6 @@ find_line_symtab (struct symtab *symtab, int line,
                                                         symtab->filename);
       }
 
-      /* Get symbol full file name if possible.  */
-      symtab_to_fullname (symtab);
-
       ALL_SYMTABS (objfile, s)
       {
        struct linetable *l;
@@ -2561,9 +2554,7 @@ find_line_symtab (struct symtab *symtab, int line,
 
        if (FILENAME_CMP (symtab->filename, s->filename) != 0)
          continue;
-       if (symtab->fullname != NULL
-           && symtab_to_fullname (s) != NULL
-           && FILENAME_CMP (symtab->fullname, s->fullname) != 0)
+       if (FILENAME_CMP (symtab->fullname, symtab_to_fullname (s)) != 0)
          continue;     
        l = LINETABLE (s);
        ind = find_line_common (l, line, &exact, 0);
@@ -3294,7 +3285,7 @@ sources_info (char *ignore, int from_tty)
   {
     const char *fullname = symtab_to_fullname (s);
 
-    output_source_filename (fullname ? fullname : s->filename, &data);
+    output_source_filename (fullname, &data);
   }
   printf_filtered ("\n\n");
 
index b83d445..4620c2e 100644 (file)
@@ -1,3 +1,7 @@
+2012-12-25  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * gdb.mi/mi-fullname-deleted.exp: New file.
+
 2012-12-24  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * gdb.base/skip-solib.exp (info skip with pending file): Update the
diff --git a/gdb/testsuite/gdb.mi/mi-fullname-deleted.exp b/gdb/testsuite/gdb.mi/mi-fullname-deleted.exp
new file mode 100644 (file)
index 0000000..d76225e
--- /dev/null
@@ -0,0 +1,41 @@
+# Copyright 2012 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+load_lib mi-support.exp
+set MIFLAGS "-i=mi"
+
+gdb_exit
+if [mi_gdb_start] {
+    continue
+}
+
+standard_testfile
+set srcfileabs [standard_output_file $srcfile]
+
+set f [open $srcfileabs "w"]
+puts $f "int main (void) { return 0; }"
+close $f
+
+if { [gdb_compile "$srcfileabs" "${binfile}" executable {debug}] != "" } {
+    untested $testname
+    return -1
+}
+
+file delete -- $srcfileabs
+
+mi_gdb_reinitialize_dir $srcdir/$subdir
+mi_gdb_load ${binfile}
+
+mi_gdb_test "-file-list-exec-source-file" ".*\",fullname=\"[string_to_regexp $srcfileabs]\".*" "fullname present"
index 848179a..2ab8323 100644 (file)
@@ -4872,8 +4872,7 @@ print_one_static_tracepoint_marker (int count,
        {
          const char *fullname = symtab_to_fullname (sal.symtab);
 
-         if (fullname)
-           ui_out_field_string (uiout, "fullname", fullname);
+         ui_out_field_string (uiout, "fullname", fullname);
        }
       else
        ui_out_field_skip (uiout, "fullname");