aboutsummaryrefslogtreecommitdiff
path: root/gdb/psymtab.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2013-01-14 20:51:48 +0000
committerTom Tromey <tromey@redhat.com>2013-01-14 20:51:48 +0000
commitc9bf062262da5a158d7a74907f8db2cd6df6bdfd (patch)
tree006b1942db2e0074c7eb49f272b88d7cc7839af0 /gdb/psymtab.c
parent44d594fd828c1ba491e387ad0b06d68f5fd1b342 (diff)
downloadgdb-c9bf062262da5a158d7a74907f8db2cd6df6bdfd.zip
gdb-c9bf062262da5a158d7a74907f8db2cd6df6bdfd.tar.gz
gdb-c9bf062262da5a158d7a74907f8db2cd6df6bdfd.tar.bz2
PR symtab/14931:
* psymtab.c (struct psymtab_state): New. (discard_psymtabs_upto, make_cleanup_discard_psymtabs): New functions. * psympriv.h (make_cleanup_discard_psymtabs): Declare. * dwarf2read.c (dwarf2_build_psymtabs): Catch exceptions. gdb/testsuite * gdb.dwarf2/dw2-error.exp: New file. * gdb.dwarf2/dw2-error.c: New file. * gdb.dwarf2/dw2-error.S: New file.
Diffstat (limited to 'gdb/psymtab.c')
-rw-r--r--gdb/psymtab.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index 5181ec3..24aef99 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -1798,6 +1798,44 @@ discard_psymtab (struct objfile *objfile, struct partial_symtab *pst)
objfile->free_psymtabs = pst;
}
+/* An object of this type is passed to discard_psymtabs_upto. */
+
+struct psymtab_state
+{
+ /* The objfile where psymtabs are discarded. */
+
+ struct objfile *objfile;
+
+ /* The first psymtab to save. */
+
+ struct partial_symtab *save;
+};
+
+/* A cleanup function used by make_cleanup_discard_psymtabs. */
+
+static void
+discard_psymtabs_upto (void *arg)
+{
+ struct psymtab_state *state = arg;
+
+ while (state->objfile->psymtabs != state->save)
+ discard_psymtab (state->objfile, state->objfile->psymtabs);
+}
+
+/* Return a new cleanup that discards all psymtabs created in OBJFILE
+ after this function is called. */
+
+struct cleanup *
+make_cleanup_discard_psymtabs (struct objfile *objfile)
+{
+ struct psymtab_state *state = XNEW (struct psymtab_state);
+
+ state->objfile = objfile;
+ state->save = objfile->psymtabs;
+
+ return make_cleanup_dtor (discard_psymtabs_upto, state, xfree);
+}
+
static void