summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Jacobowitz <dan@debian.org>2004-02-21 21:27:48 +0000
committerDaniel Jacobowitz <dan@debian.org>2004-02-21 21:27:48 +0000
commitd00932c0696de33bcb070a0a6d2da4f3456d340d (patch)
treef3c60ac6a1fea4ef14fae7b9daad7040dc64f547
parentd283432b0b6f0684c56dafc543a90eff44f26422 (diff)
downloadgdb-d00932c0696de33bcb070a0a6d2da4f3456d340d.tar.gz
* dwarf2read.c (peek_die_abbrev): Add prototype.
(load_partial_die): Take an abbrev and its uleb128 length as arguments. (dwarf2_build_psymtabs_hard): Adjust call to load_partial_die. (load_partial_dies): Likewise.
-rw-r--r--gdb/ChangeLog.intercu8
-rw-r--r--gdb/dwarf2read.c36
2 files changed, 27 insertions, 17 deletions
diff --git a/gdb/ChangeLog.intercu b/gdb/ChangeLog.intercu
index 664822d1b1a..a6e53fedd96 100644
--- a/gdb/ChangeLog.intercu
+++ b/gdb/ChangeLog.intercu
@@ -1,5 +1,13 @@
2004-02-21 Daniel Jacobowitz <drow@mvista.com>
+ * dwarf2read.c (peek_die_abbrev): Add prototype.
+ (load_partial_die): Take an abbrev and its uleb128 length as
+ arguments.
+ (dwarf2_build_psymtabs_hard): Adjust call to load_partial_die.
+ (load_partial_dies): Likewise.
+
+2004-02-21 Daniel Jacobowitz <drow@mvista.com>
+
* dwarf2read.c (splay_tree_obstack_allocate): Disable.
(add_partial_symbol): Fix a warning.
(fixup_partial_die): Recurse if necessary.
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index d1c01ef8b04..d74c59e9ef8 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -685,12 +685,15 @@ static void dwarf2_read_abbrevs (bfd *abfd, struct dwarf2_cu *cu);
static void dwarf2_empty_abbrev_table (void *);
+static struct abbrev_info *peek_die_abbrev (char *, int *, struct dwarf2_cu *);
+
static struct abbrev_info *dwarf2_lookup_abbrev (unsigned int,
struct dwarf2_cu *);
static void load_partial_dies (bfd *, char *, struct dwarf2_cu *);
static char *load_partial_die (struct partial_die_info *,
+ struct abbrev_info *abbrev, unsigned int,
bfd *, char *, struct dwarf2_cu *);
static struct partial_die_info *find_partial_die (unsigned long,
@@ -1267,6 +1270,9 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
{
struct cleanup *back_to_inner;
struct dwarf2_cu cu;
+ struct abbrev_info *abbrev;
+ unsigned int bytes_read;
+
beg_of_comp_unit = info_ptr;
cu.objfile = objfile;
@@ -1308,8 +1314,9 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
back_to_inner = make_cleanup (dwarf2_empty_abbrev_table, &cu);
/* Read the compilation unit die */
- info_ptr = load_partial_die (&comp_unit_die, abfd, info_ptr,
- &cu);
+ abbrev = peek_die_abbrev (info_ptr, &bytes_read, &cu);
+ info_ptr = load_partial_die (&comp_unit_die, abbrev, bytes_read,
+ abfd, info_ptr, &cu);
/* Set the language we're debugging */
set_cu_language (comp_unit_die.language, &cu);
@@ -4578,7 +4585,8 @@ load_partial_dies (bfd *abfd, char *info_ptr, struct dwarf2_cu *cu)
}
// fprintf_unfiltered (gdb_stderr, "Loading DIE %x\n", info_ptr - dwarf_info_buffer);
- info_ptr = load_partial_die (part_die, abfd, info_ptr, cu);
+ info_ptr = load_partial_die (part_die, abbrev, bytes_read,
+ abfd, info_ptr, cu);
/* We'll save this DIE so link it in. */
part_die->die_parent = parent_die;
@@ -4628,11 +4636,12 @@ load_partial_dies (bfd *abfd, char *info_ptr, struct dwarf2_cu *cu)
/* Read a minimal amount of information into the minimal die structure. */
static char *
-load_partial_die (struct partial_die_info *part_die, bfd *abfd,
+load_partial_die (struct partial_die_info *part_die,
+ struct abbrev_info *abbrev,
+ unsigned int abbrev_len, bfd *abfd,
char *info_ptr, struct dwarf2_cu *cu)
{
- unsigned int abbrev_number, bytes_read, i;
- struct abbrev_info *abbrev;
+ unsigned int bytes_read, i;
struct attribute attr;
int has_low_pc_attr = 0;
int has_high_pc_attr = 0;
@@ -4641,21 +4650,14 @@ load_partial_die (struct partial_die_info *part_die, bfd *abfd,
part_die->offset = info_ptr - dwarf_info_buffer;
- abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
- info_ptr += bytes_read;
- if (!abbrev_number)
- return info_ptr;
+ info_ptr += abbrev_len;
- abbrev = dwarf2_lookup_abbrev (abbrev_number, cu);
- if (!abbrev)
- {
- error ("Dwarf Error: Could not find abbrev number %d [in module %s]", abbrev_number,
- bfd_get_filename (abfd));
- }
+ if (abbrev == NULL)
+ return info_ptr;
part_die->tag = abbrev->tag;
part_die->has_children = abbrev->has_children;
- part_die->abbrev = abbrev_number;
+ part_die->abbrev = abbrev->number;
for (i = 0; i < abbrev->num_attrs; ++i)
{