aboutsummaryrefslogtreecommitdiff
path: root/gdb/xcoffread.c
diff options
context:
space:
mode:
authorPeter Schauer <Peter.Schauer@mytum.de>1993-07-27 19:40:57 +0000
committerPeter Schauer <Peter.Schauer@mytum.de>1993-07-27 19:40:57 +0000
commit0eb22669dc339b3d59eba3324a8c77592e0395c3 (patch)
treef145b3f7025ae5c96e46bf41fd5e859750fe5eb9 /gdb/xcoffread.c
parent62cd4a20676cc2df7aafe16aeca3d66c8d57c0f7 (diff)
downloadgdb-0eb22669dc339b3d59eba3324a8c77592e0395c3.zip
gdb-0eb22669dc339b3d59eba3324a8c77592e0395c3.tar.gz
gdb-0eb22669dc339b3d59eba3324a8c77592e0395c3.tar.bz2
* 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.
Diffstat (limited to 'gdb/xcoffread.c')
-rw-r--r--gdb/xcoffread.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index a9b89c2..efa8e7d 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -185,6 +185,9 @@ static int
init_lineno PARAMS ((bfd *, file_ptr, int));
static void
+free_linetab PARAMS ((void));
+
+static void
find_linenos PARAMS ((bfd *, sec_ptr, PTR));
static void
@@ -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;
+}
/* 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. */