summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Carlton <carlton@bactrian.org>2003-12-15 21:16:06 +0000
committerDavid Carlton <carlton@bactrian.org>2003-12-15 21:16:06 +0000
commit8bd48f0c8298ea2740b1893db60663130918c385 (patch)
tree4b8e5ff4a9bc02dd9751beddc88c45e28051d1fe
parent99918b4c21249c47f25726fbfebd8124c8bdb152 (diff)
downloadgdb-8bd48f0c8298ea2740b1893db60663130918c385.tar.gz
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.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/dwarf2read.c116
2 files changed, 75 insertions, 47 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1ad5a43e283..c3825b8705a 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+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.
+
2003-11-11 David Carlton <carlton@kealia.com>
* valops.c: Tweak comments to match proposed patch.
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index c848d0ea757..a42144bb145 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, &current_low, &current_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, &current_low, &current_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, &current_low, &current_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