aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2010-06-17 17:36:54 +0000
committerTom Tromey <tromey@redhat.com>2010-06-17 17:36:54 +0000
commit60606b2c71756935d1f399d04f26d30352e44fc1 (patch)
treef50dea0c14b630489e84812a42e1b08a4aa1f643
parent83bcb37903a025de78f588e13081a2af9406c835 (diff)
downloadgdb-60606b2c71756935d1f399d04f26d30352e44fc1.zip
gdb-60606b2c71756935d1f399d04f26d30352e44fc1.tar.gz
gdb-60606b2c71756935d1f399d04f26d30352e44fc1.tar.bz2
* dwarf2read.c (psymtabs_addrmap_cleanup): New function.
(dwarf2_build_psymtabs_hard): Use it. Create addrmap on a temporary obstack.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/dwarf2read.c21
2 files changed, 24 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 5079f8a..db4a2c5 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2010-06-17 Tom Tromey <tromey@redhat.com>
+
+ * dwarf2read.c (psymtabs_addrmap_cleanup): New function.
+ (dwarf2_build_psymtabs_hard): Use it. Create addrmap on a
+ temporary obstack.
+
2010-06-16 Sergio Durigan Junior <sergiodj@redhat.com>
Jan Kratochvil <jan.kratochvil@redhat.com>
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 297138c..9723ea2 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -1995,6 +1995,15 @@ build_type_psymtabs (struct objfile *objfile)
process_type_comp_unit, objfile);
}
+/* A cleanup function that clears objfile's psymtabs_addrmap field. */
+
+static void
+psymtabs_addrmap_cleanup (void *o)
+{
+ struct objfile *objfile = o;
+ objfile->psymtabs_addrmap = NULL;
+}
+
/* Build the partial symbol table by doing a quick pass through the
.debug_info and .debug_abbrev sections. */
@@ -2002,7 +2011,8 @@ static void
dwarf2_build_psymtabs_hard (struct objfile *objfile)
{
gdb_byte *info_ptr;
- struct cleanup *back_to;
+ struct cleanup *back_to, *addrmap_cleanup;
+ struct obstack temp_obstack;
dwarf2_read_section (objfile, &dwarf2_per_objfile->info);
info_ptr = dwarf2_per_objfile->info.buffer;
@@ -2015,8 +2025,12 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile)
create_all_comp_units (objfile);
- objfile->psymtabs_addrmap =
- addrmap_create_mutable (&objfile->objfile_obstack);
+ /* Create a temporary address map on a temporary obstack. We later
+ copy this to the final obstack. */
+ obstack_init (&temp_obstack);
+ make_cleanup_obstack_free (&temp_obstack);
+ objfile->psymtabs_addrmap = addrmap_create_mutable (&temp_obstack);
+ addrmap_cleanup = make_cleanup (psymtabs_addrmap_cleanup, objfile);
/* Since the objects we're extracting from .debug_info vary in
length, only the individual functions to extract them (like
@@ -2048,6 +2062,7 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile)
objfile->psymtabs_addrmap = addrmap_create_fixed (objfile->psymtabs_addrmap,
&objfile->objfile_obstack);
+ discard_cleanups (addrmap_cleanup);
do_cleanups (back_to);
}