* core.c (core_file_command): Print frame at coredump with
authorJohn Gilmore <gnu@cygnus>
Wed, 11 Sep 1991 01:49:50 +0000 (01:49 +0000)
committerJohn Gilmore <gnu@cygnus>
Wed, 11 Sep 1991 01:49:50 +0000 (01:49 +0000)
its level number, by calling print_stack_frame.
* frame.h:  Add selected_frame_level, print_stack_frame.
* frame.h, stack.c:  Remove print_sel_frame, print_selected_frame.
* convex-tdep.c, convex-xdep.c, infcmd.c, inflow.c, infrun.c:
Change print_sel_frame and print_selected_frame callers to
print_stack_frame.

* dbxread.c (read_ofile_symtab):  Avoid empty else clause.
* symfile.c (free_named_symtabs):  Ditto.
* main.c (main):  wrap_here needs an arg.
* solib.c (find_solib):  Avoid memory access if _DYNAMIC is zero.
(solib_add):  Avoid noise.
(solib_create_inferior_hook):  Lint.
(sharedlibrary_command):  Move dont_repeat to here.
* utils.c (error):  Call wrap_here to force buffered output.

Small patches from Peter Schauer:

* coffread.c (start_symtab):  Free any existing line_vector before
malloc-ing new one.
(read_coff_symtab):  Ditto for type_vector.

* source.c (lines_to_list):  New variable, replacing function.
(all uses):  Use as variable.
(_initialize_source):  Add 'set listsize' and 'show listsize'.
* utils.c (lines_to_list):  Remove function.
* stack.c (print_frame_info):  Use as variable.
* defs.h (lines_to_list):  Remove declaration.

gdb/ChangeLog
gdb/coffread.c
gdb/convex-tdep.c
gdb/convex-xdep.c
gdb/core.c
gdb/inflow.c
gdb/stack.c

index 701b8e39185111a24315459891edb37e6795f51e..397f235f9903526a10f1a1d9dc8dc061be91761f 100644 (file)
@@ -1,3 +1,35 @@
+Tue Sep 10 09:19:29 1991  John Gilmore  (gnu at cygint.cygnus.com)
+
+       * core.c (core_file_command):  Print frame at coredump with
+       its level number, by calling print_stack_frame.
+       * frame.h:  Add selected_frame_level, print_stack_frame.
+       * frame.h, stack.c:  Remove print_sel_frame, print_selected_frame.
+       * convex-tdep.c, convex-xdep.c, infcmd.c, inflow.c, infrun.c:
+       Change print_sel_frame and print_selected_frame callers to
+       print_stack_frame.
+
+       * dbxread.c (read_ofile_symtab):  Avoid empty else clause.
+       * symfile.c (free_named_symtabs):  Ditto.
+       * main.c (main):  wrap_here needs an arg.
+       * solib.c (find_solib):  Avoid memory access if _DYNAMIC is zero.
+       (solib_add):  Avoid noise.  
+       (solib_create_inferior_hook):  Lint.
+       (sharedlibrary_command):  Move dont_repeat to here.
+       * utils.c (error):  Call wrap_here to force buffered output.
+
+       Small patches from Peter Schauer:
+
+       * coffread.c (start_symtab):  Free any existing line_vector before
+       malloc-ing new one.
+       (read_coff_symtab):  Ditto for type_vector.
+
+       * source.c (lines_to_list):  New variable, replacing function.
+       (all uses):  Use as variable.
+       (_initialize_source):  Add 'set listsize' and 'show listsize'.
+       * utils.c (lines_to_list):  Remove function.
+       * stack.c (print_frame_info):  Use as variable.
+       * defs.h (lines_to_list):  Remove declaration.
+
 Mon Sep  9 13:45:57 1991  John Gilmore  (gnu at cygint.cygnus.com)
 
        * breakpoint.c (insert_breakpoints):  Restore warning about
index c69505651e8fb8ecdfd2aa2fe921449127f5eaef..33e014da2f92dec865faf8912655c04261c2385b 100644 (file)
@@ -439,8 +439,10 @@ start_symtab ()
 #endif
 #endif
 
-  /* Initialize the source file information for this file.  */
+  /* Initialize the source file line number information for this file.  */
 
+  if (line_vector)             /* Unlikely, but maybe possible? */
+    free (line_vector);
   line_vector_index = 0;
   line_vector_length = 1000;
   prev_line_number = -2;       /* Force first line number to be explicit */
@@ -831,6 +833,8 @@ read_coff_symtab (desc, nsyms)
   last_source_file = 0;
   bzero (opaque_type_chain, sizeof opaque_type_chain);
 
+  if (type_vector)                     /* Get rid of previous one */
+    free (type_vector);
   type_vector_length = 160;
   type_vector = (struct typevector *)
                xmalloc (sizeof (struct typevector)
@@ -1697,7 +1701,7 @@ decode_type (cs, c_type, aux)
   /* Reference to existing type */
   if (cs->c_nsyms > 1 && aux->x_sym.x_tagndx.l != 0)
     {
-      type = coff_alloc_type (aux->x_sym.x_tagndx);
+      type = coff_alloc_type (aux->x_sym.x_tagndx.l);
       return type;
     }
 
index d77c25c4209dc74c1c744145e8490c61b9e808ec..03da95dd2142afd0872396a696bd4005b3804c41 100644 (file)
@@ -723,7 +723,7 @@ set_thread_command (arg)
     set_current_frame (create_new_frame (read_register (FP_REGNUM),
                                         read_pc ()));
     select_frame (get_current_frame (), 0);
-    print_sel_frame (1);
+    print_stack_frame (selected_frame, selected_frame_level, -1);
 }
 
 /* Here on CONT command; gdb's dispatch address is changed to come here.
index d39872b95f54ea3e1757b4c0e507193de6b5b14b..57646abb6701679db1f8cf393533cc765f13bfd4 100644 (file)
@@ -976,7 +976,7 @@ core_file_command (filename, from_tty)
       select_frame (get_current_frame (), 0);
       validate_files ();
 
-      print_sel_frame (1);
+      print_stack_frame (selected_frame, selected_frame_level, -1);
     }
   else if (from_tty)
     printf_filtered ("No core file now.\n");
index deaae4b9e0bd1b6e48eef37a566f225515a1baa7..b5895c5be8d6f1e0fd923940085b606a15eae5fc 100644 (file)
@@ -170,11 +170,12 @@ core_open (filename, from_tty)
 #ifdef SOLIB_ADD
     (void) catch_errors (solib_add_stub, (char *)from_tty, (char *)0);
 #endif
+
     /* Now, set up the frame cache, and print the top of stack */
-    set_current_frame ( create_new_frame (read_register (FP_REGNUM),
-                                         read_pc ()));
+    set_current_frame (create_new_frame (read_register (FP_REGNUM),
+                                        read_pc ()));
     select_frame (get_current_frame (), 0);
-    print_sel_frame (0);       /* Print the top frame and source line */
+    print_stack_frame (selected_frame, selected_frame_level, 1);
   } else {
     printf (
 "Warning: you won't be able to access this core file until you terminate\n\
index d267ffc39da92566b27eba8eec81424fc9d0ebf9..fd8f0b84ecb6456bdbd1828e83e0c87cebc2288a 100644 (file)
@@ -381,7 +381,7 @@ kill_command (arg, from_tty)
     if (selected_frame == NULL)
       fputs_filtered ("No selected stack frame.\n", stdout);
     else
-      print_sel_frame (0);
+      print_stack_frame (selected_frame, selected_frame_level, 1);
   }
 }
 
@@ -478,7 +478,7 @@ Report which ones can be written.");
   inferior_pid = 0;
 
   ioctl (0, TIOCGETP, &sg_ours);
-  fcntl (0, F_GETFL, tflags_ours);
+  tflags_ours = fcntl (0, F_GETFL, 0);
 
 #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
   ioctl (0, TIOCGETC, &tc_ours);
index 09a7f49e22fd949fabe8851a6bb48bfd4df75dd8..6eb0864594ec9cbeb8938154842d71710217c24e 100644 (file)
@@ -3,19 +3,19 @@
 
 This file is part of GDB.
 
-GDB is free software; you can redistribute it and/or modify
+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 1, or (at your option)
-any later version.
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
 
-GDB is distributed in the hope that it will be useful,
+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 GDB; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include <stdio.h>
 
@@ -31,6 +31,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 extern int addressprint;       /* Print addresses, or stay symbolic only? */
 extern int info_verbose;       /* Verbosity of symbol reading msgs */
+extern unsigned lines_to_list; /* # of lines "list" command shows by default */
 extern char *reg_names[];      /* Names of registers */
 
 /* Thie "selected" stack frame is used by default for local and arg access.
@@ -61,7 +62,7 @@ void print_frame_info ();
    If SOURCE is 1, print the source line as well.
    If SOURCE is -1, print ONLY the source line.  */
 
-static void
+void
 print_stack_frame (frame, level, source)
      FRAME frame;
      int level;
@@ -187,7 +188,7 @@ print_frame_info (fi, level, source, args)
            printf_filtered ("0x%x\t", fi->pc);
          print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
        }
-      current_source_line = max (sal.line - lines_to_list () / 2, 1);
+      current_source_line = max (sal.line - lines_to_list/2, 1);
     }
   if (source != 0)
     set_default_breakpoint (1, fi->pc, sal.symtab, sal.line);
@@ -195,24 +196,6 @@ print_frame_info (fi, level, source, args)
   fflush (stdout);
 }
 
-/* Call here to print info on selected frame, after a trap.  */
-
-void
-print_sel_frame (just_source)
-     int just_source;
-{
-  print_stack_frame (selected_frame, -1, just_source ? -1 : 1);
-}
-
-/* Print info on the selected frame, including level number
-   but not source.  */
-
-void
-print_selected_frame ()
-{
-  print_stack_frame (selected_frame, selected_frame_level, 0);
-}
-
 void flush_cached_frames ();
 
 #ifdef FRAME_SPECIFICATION_DYADIC
@@ -592,13 +575,11 @@ print_block_frame_locals (b, frame, stream)
   return values_printed;
 }
 
-/* Same, but print labels.
-   FIXME, this does not even reference FRAME... --gnu  */
+/* Same, but print labels.  */
 
 static int
-print_block_frame_labels (b, frame, have_default, stream)
+print_block_frame_labels (b, have_default, stream)
      struct block *b;
-     register FRAME frame;
      int *have_default;
      register FILE *stream;
 {
@@ -728,7 +709,7 @@ print_frame_label_vars (frame, this_level_only, stream)
        {
          if (blocks_printed[index] == 0)
            {
-             if (print_block_frame_labels (BLOCKVECTOR_BLOCK (bl, index), frame, &have_default, stream))
+             if (print_block_frame_labels (BLOCKVECTOR_BLOCK (bl, index), &have_default, stream))
                values_printed = 1;
              blocks_printed[index] = 1;
            }
@@ -762,18 +743,16 @@ locals_info (args, from_tty)
      char *args;
      int from_tty;
 {
-  if (!target_has_stack)
-    error ("No stack.");
-
+  if (!selected_frame)
+    error ("No frame selected.");
   print_frame_local_vars (selected_frame, stdout);
 }
 
 static void
 catch_info ()
 {
-  if (!target_has_stack)
-    error ("No stack.");
-
+  if (!selected_frame)
+    error ("No frame selected.");
   print_frame_label_vars (selected_frame, 0, stdout);
 }
 
@@ -834,8 +813,8 @@ print_frame_arg_vars (frame, stream)
 static void
 args_info ()
 {
-  if (!target_has_stack)
-    error ("No stack.");
+  if (!selected_frame)
+    error ("No frame selected.");
   print_frame_arg_vars (selected_frame, stdout);
 }
 \f
@@ -913,6 +892,11 @@ find_relative_frame (frame, level_offset_ptr)
      The following algorithm is linear.  */
   if (*level_offset_ptr < 0)
     {
+#if 0
+/* This is ancient and unnecessary?                    -- gnu@cygnus.com 
+   It also loops forever if frame #0 is not current_frame (e.g. when we have
+   used the "frame" command after the stack was invalid).  */
+
       /* First put frame1 at innermost frame
         and frame2 N levels up from there.  */
       frame1 = get_current_frame ();
@@ -931,6 +915,15 @@ find_relative_frame (frame, level_offset_ptr)
          frame2 = get_prev_frame (frame2);
        }
       return frame1;
+#else
+      while (*level_offset_ptr < 0) {
+       frame1 = get_next_frame (frame);
+       if (!frame1)
+         break;
+       frame = frame1;
+       (*level_offset_ptr)++;
+      }
+#endif
     }
   return frame;
 }
@@ -954,10 +947,15 @@ frame_command (level_exp, from_tty)
 
   frame = parse_frame_specification (level_exp);
 
-  for (frame1 = get_prev_frame (0);
-       frame1 && frame1 != frame;
-       frame1 = get_prev_frame (frame1))
-    level++;
+  /* Try to figure out what level this frame is.  But if there is
+     no current stack, don't error out -- let the user set one.  */
+  frame1 = 0;
+  if (get_current_frame()) {
+    for (frame1 = get_prev_frame (0);
+        frame1 && frame1 != frame;
+        frame1 = get_prev_frame (frame1))
+      level++;
+  }
 
   if (!frame1)
     level = 0;