* source.c (line_info): If --fullname, display the source.
authorJim Kingdon <jkingdon@engr.sgi.com>
Wed, 26 May 1993 03:27:32 +0000 (03:27 +0000)
committerJim Kingdon <jkingdon@engr.sgi.com>
Wed, 26 May 1993 03:27:32 +0000 (03:27 +0000)
(identify_source_line), callers: Take pc as argument, rather than
assuming innermost frame (emacs doesn't use this, so no one ever
noticed).
* symtab.h: Declare frame_file_full_name.
* main.c: Don't.

gdb/ChangeLog
gdb/source.c
gdb/symtab.h

index 4886362e4b30e90868e7ae68d42a3d57c026ba98..49cb5c013476846122928232833c20cc76d1790f 100644 (file)
@@ -1,3 +1,12 @@
+Tue May 25 20:44:24 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
+
+       * source.c (line_info): If --fullname, display the source.
+       (identify_source_line), callers: Take pc as argument, rather than
+       assuming innermost frame (emacs doesn't use this, so no one ever
+       noticed).
+       * symtab.h: Declare frame_file_full_name.
+       * main.c: Don't.
+
 Tue May 25 15:30:43 1993  Brendan Kehoe  (brendan@lisa.cygnus.com)
 
        * breakpoint.c (catch_command_1): Fix typo in error msg.
index 2c2c518b15218fd6b54a0ea660bd2c3e29b628a1..682f1e86189e7e809829c84e5b09d49c268c586f 100644 (file)
@@ -106,13 +106,13 @@ static int last_line_listed;
 static int first_line_listed;
 
 \f
-/* Set the source file default for the "list" command, specifying a
-   symtab.  Sigh.  Behavior specification: If it is called with a
-   non-zero argument, that is the symtab to select.  If it is not,
-   first lookup "main"; if it exists, use the symtab and line it
-   defines.  If not, take the last symtab in the symtab lists (if it
-   exists) or the last symtab in the psymtab lists (if *it* exists).  If
-   none of this works, report an error.   */
+/* Set the source file default for the "list" command to be S.
+
+   If S is NULL, and we don't have a default, find one.  This
+   should only be called when the user actually tries to use the
+   default, since we produce an error if we can't find a reasonable
+   default.  Also, since this can cause symbols to be read, doing it
+   before we need to would make things slower than necessary.  */
 
 void
 select_source_symtab (s)
@@ -131,6 +131,9 @@ select_source_symtab (s)
       return;
     }
 
+  if (current_source_symtab)
+    return;
+
   /* Make the default place to list be the function `main'
      if one exists.  */
   if (lookup_symbol ("main", 0, VAR_NAMESPACE, 0, NULL))
@@ -189,9 +192,6 @@ select_source_symtab (s)
        }
     }
 
-  if (current_source_symtab)
-    return;
-
   error ("Can't find a default source file");
 }
 \f
@@ -437,8 +437,13 @@ source_info (ignore, from_tty)
 \f
 /* Open a file named STRING, searching path PATH (dir names sep by colons)
    using mode MODE and protection bits PROT in the calls to open.
+
    If TRY_CWD_FIRST, try to open ./STRING before searching PATH.
-   (ie pretend the first element of PATH is ".")
+   (ie pretend the first element of PATH is ".").  This also indicates
+   that a slash in STRING disables searching of the path (this is
+   so that "exec-file ./foo" or "symbol-file ./foo" insures that you
+   get that particular version of foo or an error message).
+
    If FILENAMED_OPENED is non-null, set it to a newly allocated string naming
    the actual file opened (this string will always start with a "/".  We
    have to take special pains to avoid doubling the "/" between the directory
@@ -468,18 +473,18 @@ openp (path, try_cwd_first, string, mode, prot, filename_opened)
   if (!path)
     path = ".";
 
-  /* ./foo => foo */
-  while (string[0] == '.' && string[1] == '/')
-    string += 2;
-
   if (try_cwd_first || string[0] == '/')
     {
       filename = string;
       fd = open (filename, mode, prot);
-      if (fd >= 0 || string[0] == '/')
+      if (fd >= 0 || string[0] == '/' || strchr (string, '/'))
        goto done;
     }
 
+  /* ./foo => foo */
+  while (string[0] == '.' && string[1] == '/')
+    string += 2;
+
   alloclen = strlen (path) + strlen (string) + 2;
   filename = (char *) alloca (alloclen);
   fd = -1;
@@ -773,10 +778,11 @@ get_filename_and_charpos (s, fullname)
    Return 1 if successful, 0 if could not find the file.  */
 
 int
-identify_source_line (s, line, mid_statement)
+identify_source_line (s, line, mid_statement, pc)
      struct symtab *s;
      int line;
      int mid_statement;
+     CORE_ADDR pc;
 {
   if (s->line_charpos == 0)
     get_filename_and_charpos (s, (char **)NULL);
@@ -787,7 +793,7 @@ identify_source_line (s, line, mid_statement)
   printf ("\032\032%s:%d:%d:%s:0x%x\n", s->fullname,
          line, s->line_charpos[line - 1],
          mid_statement ? "middle" : "beg",
-         get_frame_pc (get_current_frame()));
+         pc);
   current_source_line = line;
   first_line_listed = line;
   last_line_listed = line;
@@ -841,7 +847,7 @@ print_source_lines (s, line, stopline, noerror)
       perror_with_name (s->filename);
     }
 
-  stream = fdopen (desc, "r");
+  stream = fdopen (desc, FOPEN_RT);
   clearerr (stream);
 
   while (nlines-- > 0)
@@ -1110,6 +1116,11 @@ line_info (arg, from_tty)
          set_next_address (start_pc);
          /* Repeating "info line" should do the following line.  */
          last_line_listed = sal.line + 1;
+
+         /* If this is the only line, show the source code.  If it could
+            not find the file, don't do anything special.  */
+         if (frame_file_full_name && sals.nelts == 1)
+           identify_source_line (sal.symtab, sal.line, 0, start_pc);
        }
       else
        printf_filtered ("Line number %d is out of range for \"%s\".\n",
@@ -1159,7 +1170,7 @@ forward_search_command (regex, from_tty)
       perror_with_name (current_source_symtab->filename);
     }
 
-  stream = fdopen (desc, "r");
+  stream = fdopen (desc, FOPEN_RT);
   clearerr (stream);
   while (1) {
 /* FIXME!!!  We walk right off the end of buf if we get a long line!!! */
@@ -1231,7 +1242,7 @@ reverse_search_command (regex, from_tty)
       perror_with_name (current_source_symtab->filename);
     }
 
-  stream = fdopen (desc, "r");
+  stream = fdopen (desc, FOPEN_RT);
   clearerr (stream);
   while (line > 1)
     {
index 03d5e7f8a2b81fcb6e2b94abc03b073de9b79afa..c8c311dbfb7aa0f38a5f2a845aa1d6030a6eff26 100644 (file)
@@ -469,7 +469,8 @@ enum address_class
   /* Value is in specified register.  Just like LOC_REGPARM except the
      register holds the address of the argument instead of the argument
      itself. This is currently used for the passing of structs and unions
-     on sparc and hppa.  */
+     on sparc and hppa.  It is also used for call by reference where the
+     address is in a register, at least by mipsread.c.  */
 
   LOC_REGPARM_ADDR,
 
@@ -618,6 +619,23 @@ struct linetable_entry
   CORE_ADDR pc;
 };
 
+/* The order of entries in the linetable is significant.
+
+   It should generally be in ascending line number order.  Line table
+   entries for a function at lines 10-40 should come before entries
+   for a function at lines 50-70.
+
+   A for statement looks like this
+
+       10      0x100   - for the init/test part of a for stmt.
+       20      0x200
+       30      0x300
+       10      0x400   - for the increment part of a for stmt.
+
+   FIXME: this description is incomplete.  coffread.c is said to get
+   the linetable order wrong (would arrange_linenos from xcoffread.c
+   work for normal COFF too?).  */
+
 struct linetable
 {
   int nitems;
@@ -1041,8 +1059,10 @@ symbol_file_add PARAMS ((char *, int, CORE_ADDR, int, int, int));
 
 /* source.c */
 
+extern int frame_file_full_name; /* in stack.c */
+
 extern int
-identify_source_line PARAMS ((struct symtab *, int, int));
+identify_source_line PARAMS ((struct symtab *, int, int, CORE_ADDR));
 
 extern void
 print_source_lines PARAMS ((struct symtab *, int, int, int));