diff options
author | David Carlton <carlton@bactrian.org> | 2003-12-15 21:16:06 +0000 |
---|---|---|
committer | David Carlton <carlton@bactrian.org> | 2003-12-15 21:16:06 +0000 |
commit | 3b14be589cafdff0e8bfb3daca46e6dffd657711 (patch) | |
tree | 2453df63c46b4c0e1227b665fb0274952405d109 /gdb/dwarf2read.c | |
parent | 6df2e80c9eb1da23d9ab7430aa465b48cb9e22f6 (diff) | |
download | gdb-3b14be589cafdff0e8bfb3daca46e6dffd657711.zip gdb-3b14be589cafdff0e8bfb3daca46e6dffd657711.tar.gz gdb-3b14be589cafdff0e8bfb3daca46e6dffd657711.tar.bz2 |
2003-12-15 David Carlton <carlton@kealia.com>
* dwarf2read.c (get_scope_pc_bounds): New.
(psymtab_to_symtab_1): Use get_scope_pc_bounds.
(read_file_scope): Ditto.
Diffstat (limited to 'gdb/dwarf2read.c')
-rw-r--r-- | gdb/dwarf2read.c | 116 |
1 files changed, 69 insertions, 47 deletions
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index c848d0e..a42144b 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -840,6 +840,10 @@ static int dwarf2_get_pc_bounds (struct die_info *, CORE_ADDR *, CORE_ADDR *, struct objfile *, const struct comp_unit_head *); +static void get_scope_pc_bounds (struct die_info *, + CORE_ADDR *, CORE_ADDR *, struct objfile *, + const struct comp_unit_head *); + static void dwarf2_add_field (struct field_info *, struct die_info *, struct objfile *, const struct comp_unit_head *); @@ -1977,31 +1981,7 @@ psymtab_to_symtab_1 (struct partial_symtab *pst) /* Do line number decoding in read_file_scope () */ process_die (dies, objfile, &cu_header); - if (!dwarf2_get_pc_bounds (dies, &lowpc, &highpc, objfile, &cu_header)) - { - /* Some compilers don't define a DW_AT_high_pc attribute for - the compilation unit. If the DW_AT_high_pc is missing, - synthesize it, by scanning the DIE's below the compilation unit. */ - highpc = 0; - if (dies->child != NULL) - { - child_die = dies->child; - while (child_die && child_die->tag) - { - if (child_die->tag == DW_TAG_subprogram) - { - CORE_ADDR low, high; - - if (dwarf2_get_pc_bounds (child_die, &low, &high, - objfile, &cu_header)) - { - highpc = max (highpc, high); - } - } - child_die = sibling_die (child_die); - } - } - } + get_scope_pc_bounds (dies, &lowpc, &highpc, objfile, &cu_header); symtab = end_symtab (highpc + baseaddr, objfile, SECT_OFF_TEXT (objfile)); /* Set symtab language to language from DW_AT_language. @@ -2125,28 +2105,7 @@ read_file_scope (struct die_info *die, struct objfile *objfile, bfd *abfd = objfile->obfd; struct line_header *line_header = 0; - if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, objfile, cu_header)) - { - if (die->child != NULL) - { - child_die = die->child; - while (child_die && child_die->tag) - { - if (child_die->tag == DW_TAG_subprogram) - { - CORE_ADDR low, high; - - if (dwarf2_get_pc_bounds (child_die, &low, &high, - objfile, cu_header)) - { - lowpc = min (lowpc, low); - highpc = max (highpc, high); - } - } - child_die = sibling_die (child_die); - } - } - } + get_scope_pc_bounds (die, &lowpc, &highpc, objfile, cu_header); /* If we didn't find a lowpc, set it to highpc to avoid complaints from finish_block. */ @@ -2577,6 +2536,69 @@ dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc, return ret; } +/* Get the low and high pc's represented by the scope DIE, and store + them in *LOWPC and *HIGHPC. If the correct values can't be + determined, set *LOWPC to -1 and *HIGHPC to 0. */ +static void +get_scope_pc_bounds (struct die_info *die, + CORE_ADDR *lowpc, CORE_ADDR *highpc, + struct objfile *objfile, + const struct comp_unit_head *cu_header) +{ + CORE_ADDR best_low = (CORE_ADDR) -1; + CORE_ADDR best_high = (CORE_ADDR) 0; + CORE_ADDR current_low, current_high; + + if (dwarf2_get_pc_bounds (die, ¤t_low, ¤t_high, + objfile, cu_header)) + { + best_low = current_low; + best_high = current_high; + } + else + { + struct die_info *child = die->child; + + while (child && child->tag) + { + switch (child->tag) { + case DW_TAG_subprogram: + if (dwarf2_get_pc_bounds (child, ¤t_low, ¤t_high, + objfile, cu_header)); + { + best_low = min (best_low, current_low); + best_high = max (best_high, current_high); + } + break; + case DW_TAG_namespace: + /* FIXME: carlton/2003-12-15: Should we do this for + DW_TAG_class_type/DW_TAG_structure_type, too? I think + that current GCC's always generate the DIEs + corresponding to definitions methods of classes at + namespace scope, but I don't see any reason why they + have to. */ + get_scope_pc_bounds (child, ¤t_low, ¤t_high, + objfile, cu_header); + + if (current_low != ((CORE_ADDR) -1)) + { + best_low = min (best_low, current_low); + best_high = max (best_high, current_high); + } + break; + default: + /* Ignore. */ + break; + } + + child = sibling_die (child); + } + } + + *lowpc = best_low; + *highpc = best_high; +} + /* Add an aggregate field to the field list. */ static void |