diff options
author | Daniel Jacobowitz <dan@debian.org> | 2004-02-21 20:50:11 +0000 |
---|---|---|
committer | Daniel Jacobowitz <dan@debian.org> | 2004-02-21 20:50:11 +0000 |
commit | e33ca13ef87ec374caf870fd439972d5f75ef9cf (patch) | |
tree | 8ede20f18a0cc12dce04309d2059f20d121e29a8 | |
parent | 40fa240b4f56e4417818ec321eacc1c4c5885839 (diff) | |
download | gdb-e33ca13ef87ec374caf870fd439972d5f75ef9cf.tar.gz |
* Makefile.in (hashtab_h): Add.
(dwarf2read.o): Update dependencies.
* dwarf2read.c: Include "hashtab.h".
(struct dwarf2_cu): Change partial_dies to an htab_t.
(hash_obstack_allocate, partial_die_hash, partial_die_eq): New
functions.
(dwarf2_build_psymtabs_hard): Call htab_create_alloc_ex.
(load_partial_dies): Call htab_find_slot_with_hash.
(find_partial_die): Call htab_find_with_hash.
-rw-r--r-- | gdb/ChangeLog.intercu | 12 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 54 |
2 files changed, 55 insertions, 11 deletions
diff --git a/gdb/ChangeLog.intercu b/gdb/ChangeLog.intercu index 400ac24cbbf..95d0618b080 100644 --- a/gdb/ChangeLog.intercu +++ b/gdb/ChangeLog.intercu @@ -1,5 +1,17 @@ 2004-02-21 Daniel Jacobowitz <drow@mvista.com> + * Makefile.in (hashtab_h): Add. + (dwarf2read.o): Update dependencies. + * dwarf2read.c: Include "hashtab.h". + (struct dwarf2_cu): Change partial_dies to an htab_t. + (hash_obstack_allocate, partial_die_hash, partial_die_eq): New + functions. + (dwarf2_build_psymtabs_hard): Call htab_create_alloc_ex. + (load_partial_dies): Call htab_find_slot_with_hash. + (find_partial_die): Call htab_find_with_hash. + +2004-02-21 Daniel Jacobowitz <drow@mvista.com> + * dwarf2read.c (struct partial_die_info): Use bitfields and rearrange members for packing. Replace spec_attr with spec_offset. (load_partial_dies): Only follow structures for C++. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 23f567b6498..abcaa23e4e7 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -45,6 +45,7 @@ #include "dwarf2loc.h" #include "cp-support.h" #include "splay-tree.h" +#include "hashtab.h" #include <fcntl.h> #include "gdb_string.h" @@ -260,7 +261,7 @@ struct dwarf2_cu fundamental types gdb knows how to construct. */ struct type *ftypes[FT_NUM_MEMBERS]; /* Fundamental types */ - splay_tree partial_dies; + htab_t partial_dies; struct obstack partial_die_obstack; }; @@ -954,6 +955,30 @@ splay_tree_obstack_deallocate (void *object, void *data) return; } +static void * +hash_obstack_allocate (void *data, size_t size, size_t count) +{ + unsigned int total = size * count; + void *ptr = obstack_alloc ((struct obstack *) data, total); + memset (ptr, 0, total); + return ptr; +} + +static hashval_t +partial_die_hash (const void *item) +{ + const struct partial_die_info *part_die = item; + return part_die->offset; +} + +static int +partial_die_eq (const void *item_lhs, const void *item_rhs) +{ + const struct partial_die_info *part_die_lhs = item_lhs; + const struct partial_die_info *part_die_rhs = item_rhs; + return part_die_lhs->offset == part_die_rhs->offset; +} + /* Try to locate the sections we need for DWARF 2 debugging information and return true if we have enough to do something. */ @@ -1318,10 +1343,12 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline) obstack_init (&cu.partial_die_obstack); cu.partial_dies - = splay_tree_new_with_allocator (splay_tree_compare_ints, NULL, - NULL, splay_tree_obstack_allocate, - splay_tree_obstack_deallocate, - &cu.partial_die_obstack); + = htab_create_alloc_ex (29, partial_die_hash, + partial_die_eq, + NULL, + &cu.partial_die_obstack, + hash_obstack_allocate, + splay_tree_obstack_deallocate); load_partial_dies (abfd, info_ptr, &cu); @@ -4501,6 +4528,7 @@ load_partial_dies (bfd *abfd, char *info_ptr, struct dwarf2_cu *cu) struct partial_die_info *parent_die, *last_die; struct abbrev_info *abbrev; unsigned int bytes_read; + void **slot; /* FIXME: Obviously we need a nesting level passed in for incremental use. */ int nesting_level = 1; @@ -4559,8 +4587,10 @@ load_partial_dies (bfd *abfd, char *info_ptr, struct dwarf2_cu *cu) last_die = part_die; // fprintf_unfiltered (gdb_stderr, "Inserting DIE %x\n", part_die->offset); - splay_tree_insert (cu->partial_dies, part_die->offset, - (splay_tree_value) part_die); + slot = htab_find_slot_with_hash (cu->partial_dies, part_die, + part_die->offset, INSERT); + // gdb_assert (*slot == NULL); + *slot = part_die; part_die = obstack_alloc (&cu->partial_die_obstack, sizeof (struct partial_die_info)); @@ -4714,14 +4744,16 @@ static struct partial_die_info * find_partial_die (unsigned long offset, struct dwarf2_cu *cu) { struct partial_die_info *lookup_die = NULL; - splay_tree_node node; + struct partial_die_info part_die; - node = splay_tree_lookup (cu->partial_dies, offset); - if (node == NULL) + part_die.offset = offset; + lookup_die = htab_find_with_hash (cu->partial_dies, &part_die, offset); + + if (lookup_die == NULL) internal_error (__FILE__, __LINE__, "could not find partial DIE in cache\n"); - return (struct partial_die_info *) node->value; + return lookup_die; } static void |