* breakpoint.c (breakpoint_1): Walk the breakpoint chain to decide if
authorPeter Schauer <Peter.Schauer@mytum.de>
Tue, 27 Jul 1993 19:40:57 +0000 (19:40 +0000)
committerPeter Schauer <Peter.Schauer@mytum.de>
Tue, 27 Jul 1993 19:40:57 +0000 (19:40 +0000)
we have breakpoints or watchpoints as we might have to ignore internal
breakpoints.

Fix gdb core dumps after `file newfile' commands.
* symtab.h, symfile.c (clear_symtab_users):  New routine which
unconditionally clears symtab users. clear_symtab_users_once
commented out as it was a noop anyway.
* objfiles.c (free_objfile):  Don't call clear_symtab_users_once.
* objfiles.c (free_all_objfiles), symfile.c (new_symfile_objfile),
xcoffexec.c (exec_close):  Call clear_symtab_users if necessary.
* symfile.c (syms_from_objfile):  Install cleanups for errors during
symbol reading.
* coffread.c, dbxread.c, mipsread.c, xcoffread.c (*_symfile_read):
Lint cleanup code, call do_cleanups explicitly.
* symfile.c (symbol_file_add):  Call new_symfile_objfile and
reinit_frame_cache _after_ the new symbols are read in.

gdb/ChangeLog
gdb/dbxread.c
gdb/objfiles.c
gdb/xcoffexec.c
gdb/xcoffread.c

index e7bbf57fdf81734c81b2440c23aba5c3581f4a9b..7ad66db1ab4ed13ff7ed2592aae0fd16aad0b545 100644 (file)
@@ -1,3 +1,23 @@
+Tue Jul 27 12:36:49 1993  Peter Schauer  (pes@regent.e-technik.tu-muenchen.de)
+
+       * breakpoint.c (breakpoint_1):  Walk the breakpoint chain to decide if
+       we have breakpoints or watchpoints as we might have to ignore internal
+       breakpoints.
+
+       Fix gdb core dumps after `file newfile' commands.
+       * symtab.h, symfile.c (clear_symtab_users):  New routine which
+       unconditionally clears symtab users. clear_symtab_users_once
+       commented out as it was a noop anyway.
+       * objfiles.c (free_objfile):  Don't call clear_symtab_users_once.
+       * objfiles.c (free_all_objfiles), symfile.c (new_symfile_objfile),
+       xcoffexec.c (exec_close):  Call clear_symtab_users if necessary.
+       * symfile.c (syms_from_objfile):  Install cleanups for errors during
+       symbol reading.
+       * coffread.c, dbxread.c, mipsread.c, xcoffread.c (*_symfile_read):
+       Lint cleanup code, call do_cleanups explicitly.
+       * symfile.c (symbol_file_add):  Call new_symfile_objfile and
+       reinit_frame_cache _after_ the new symbols are read in.
+
 Tue Jul 27 01:57:01 1993  Peter Schauer  (pes@regent.e-technik.tu-muenchen.de)
 
        * mipsread.c (parse_type):  Do not set tag name for compiler
index cc66a152e7bda3abdeea276a0a1d6c969ba4f4a9..012fac20119951405e4b30ebd6a5ab11c2fc7214 100644 (file)
@@ -497,6 +497,7 @@ dbx_symfile_read (objfile, section_offsets, mainline)
 {
   bfd *sym_bfd;
   int val;
+  struct cleanup *back_to;
 
   sym_bfd = objfile->obfd;
   val = bfd_seek (objfile->obfd, DBX_SYMTAB_OFFSET (objfile), SEEK_SET);
@@ -511,7 +512,7 @@ dbx_symfile_read (objfile, section_offsets, mainline)
   symbol_table_offset = DBX_SYMTAB_OFFSET (objfile);
 
   pending_blocks = 0;
-  make_cleanup (really_free_pendings, 0);
+  back_to = make_cleanup (really_free_pendings, 0);
 
   init_minimal_symbol_collection ();
   make_cleanup (discard_minimal_symbols, 0);
@@ -533,6 +534,8 @@ dbx_symfile_read (objfile, section_offsets, mainline)
     printf_filtered ("(no debugging symbols found)...");
     wrap_here ("");
   }
+
+  do_cleanups (back_to);
 }
 
 /* Initialize anything that needs initializing when a completely new
@@ -856,7 +859,7 @@ read_dbx_symtab (section_offsets, objfile, text_addr, text_size)
   int nsl;
   int past_first_source_file = 0;
   CORE_ADDR last_o_file_start = 0;
-  struct cleanup *old_chain;
+  struct cleanup *back_to;
   bfd *abfd;
 
   /* End of the text segment of the executable file.  */
@@ -894,11 +897,9 @@ read_dbx_symtab (section_offsets, objfile, text_addr, text_size)
     (struct partial_symtab **) alloca (dependencies_allocated *
                                       sizeof (struct partial_symtab *));
 
-  old_chain = make_cleanup (free_objfile, objfile);
-
   /* Init bincl list */
   init_bincl_list (20, objfile);
-  make_cleanup (free_bincl_list, objfile);
+  back_to = make_cleanup (free_bincl_list, objfile);
 
   last_source_file = NULL;
 
@@ -984,8 +985,7 @@ read_dbx_symtab (section_offsets, objfile, text_addr, text_size)
                   dependency_list, dependencies_used);
     }
 
-  free_bincl_list (objfile);
-  discard_cleanups (old_chain);
+  do_cleanups (back_to);
 }
 
 /* Allocate and partially fill a partial symtab.  It will be
index ac238abd849f2a790f4909822afad72e2f58083f..060409d703335beecbfebebca9447946ae43d588 100644 (file)
@@ -336,7 +336,6 @@ free_objfile (objfile)
      is unknown, but we play it safe for now and keep each action until
      it is shown to be no longer needed. */
      
-  clear_symtab_users_once ();
 #if defined (CLEAR_SOLIB)
   CLEAR_SOLIB ();
 #endif
@@ -384,7 +383,7 @@ free_objfile (objfile)
 }
 
 
-/* Free all the object files at once.  */
+/* Free all the object files at once and clean up their users.  */
 
 void
 free_all_objfiles ()
@@ -395,6 +394,7 @@ free_all_objfiles ()
     {
       free_objfile (objfile);
     }
+  clear_symtab_users ();
 }
 \f
 /* Relocate OBJFILE to NEW_OFFSETS.  There should be OBJFILE->NUM_SECTIONS
index 0e997b1d8f7615c2dc7832e063129d4e0ccb05bd..65a57b59f9f3aa2343b0dd2b8ada03d4dfa5cde2 100644 (file)
@@ -81,6 +81,7 @@ exec_close(quitting)
 {
   register struct vmap *vp, *nxt;
   struct objfile *obj;
+  int need_symtab_cleanup = 0;
   
   for (nxt = vmap; vp = nxt; )
     {
@@ -90,7 +91,10 @@ exec_close(quitting)
         free_objfile() will do proper cleanup of objfile *and* bfd. */
                   
       if (vp->objfile)
-       free_objfile (vp->objfile);
+       {
+         free_objfile (vp->objfile);
+         need_symtab_cleanup = 1;
+       }
       else
        bfd_close(vp->bfd);
 
@@ -111,6 +115,9 @@ exec_close(quitting)
     exec_ops.to_sections = NULL;
     exec_ops.to_sections_end = NULL;
   }
+
+  if (need_symtab_cleanup)
+    clear_symtab_users ();
 }
 
 /*
index a9b89c2d0f6a0a4262d0ad0205d1438b0976b8ed..efa8e7dbd5ebe42c2dac66ff735117473614c0c7 100644 (file)
@@ -184,6 +184,9 @@ xcoff_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
 static int
 init_lineno PARAMS ((bfd *, file_ptr, int));
 
+static void
+free_linetab PARAMS ((void));
+
 static void
 find_linenos PARAMS ((bfd *, sec_ptr, PTR));
 
@@ -1817,6 +1820,8 @@ init_lineno (abfd, offset, size)
 {
   int val;
 
+  free_linetab ();
+
   if (bfd_seek(abfd, offset, L_SET) < 0)
     return -1;
 
@@ -1828,9 +1833,16 @@ init_lineno (abfd, offset, size)
 
   linetab_offset = offset;
   linetab_size = size;
-  make_cleanup (free, linetab);        /* Be sure it gets de-allocated. */
   return 0;
 }
+
+static void
+free_linetab ()
+{
+  if (linetab)
+    free (linetab);
+  linetab = NULL;
+}
 \f
 /* dbx allows the text of a symbol name to be continued into the
    next symbol name!  When such a continuation is encountered
@@ -1996,6 +2008,7 @@ xcoff_symfile_read (objfile, section_offset, mainline)
   bfd *abfd;
   struct coff_symfile_info *info;
   char *name;
+  struct cleanup *back_to = make_cleanup (null_cleanup, 0);
 
   info = (struct coff_symfile_info *) objfile -> sym_private;
   symfile_bfd = abfd = objfile->obfd;
@@ -2015,6 +2028,7 @@ xcoff_symfile_read (objfile, section_offset, mainline)
       && info->max_lineno_offset > info->min_lineno_offset) {
 
     /* only read in the line # table if one exists */
+    make_cleanup (free_linetab, 0);
     val = init_lineno(abfd, info->min_lineno_offset,
        (int) (info->max_lineno_offset - info->min_lineno_offset));
 
@@ -2066,6 +2080,8 @@ xcoff_symfile_read (objfile, section_offset, mainline)
      minimal symbols for this objfile. */
 
   install_minimal_symbols (objfile);
+
+  do_cleanups (back_to);
 }
 
 /* XCOFF-specific parsing routine for section offsets.  */