summaryrefslogtreecommitdiff
path: root/gdb/dwarf2read.c
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2008-05-04 17:19:06 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2008-05-04 17:19:06 +0000
commitd8cc2ad1a2cde1006b6befbbe723e49129bf4066 (patch)
tree7553104da42dfb64f28d3d5c9401be769f485003 /gdb/dwarf2read.c
parentc21c1d817c79ab781931b6e0aea8c95107b2b2b7 (diff)
downloadgdb-d8cc2ad1a2cde1006b6befbbe723e49129bf4066.tar.gz
Set CU BASE_ADDRESS already from partial DIEs.
* dwarf2read.c (read_partial_die): New variables BASE_ADDRESS and BASE_ADDRESS_TYPE. Set these variables from DW_AT_LOW_PC and DW_AT_ENTRY_PC. Set CU->HEADER.BASE_KNOWN and CU->HEADER.BASE_ADDRESS from these variables if it was still unset.
Diffstat (limited to 'gdb/dwarf2read.c')
-rw-r--r--gdb/dwarf2read.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 40eb412e29d..952f3ae6320 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -5814,6 +5814,15 @@ read_partial_die (struct partial_die_info *part_die,
struct attribute attr;
int has_low_pc_attr = 0;
int has_high_pc_attr = 0;
+ CORE_ADDR base_address;
+ enum
+ {
+ base_address_none,
+ base_address_low_pc,
+ /* Overrides BASE_ADDRESS_LOW_PC. */
+ base_address_entry_pc
+ }
+ base_address_type = base_address_none;
memset (part_die, 0, sizeof (struct partial_die_info));
@@ -5851,11 +5860,25 @@ read_partial_die (struct partial_die_info *part_die,
case DW_AT_low_pc:
has_low_pc_attr = 1;
part_die->lowpc = DW_ADDR (&attr);
+ if (part_die->tag == DW_TAG_compile_unit
+ && base_address_type < base_address_low_pc)
+ {
+ base_address = DW_ADDR (&attr);
+ base_address_type = base_address_low_pc;
+ }
break;
case DW_AT_high_pc:
has_high_pc_attr = 1;
part_die->highpc = DW_ADDR (&attr);
break;
+ case DW_AT_entry_pc:
+ if (part_die->tag == DW_TAG_compile_unit
+ && base_address_type < base_address_entry_pc)
+ {
+ base_address = DW_ADDR (&attr);
+ base_address_type = base_address_entry_pc;
+ }
+ break;
case DW_AT_ranges:
if (dwarf2_ranges_read (DW_UNSND (&attr), &part_die->lowpc,
&part_die->highpc, cu))
@@ -5948,6 +5971,14 @@ read_partial_die (struct partial_die_info *part_die,
&& (part_die->lowpc != 0
|| dwarf2_per_objfile->has_section_at_zero))
part_die->has_pc_info = 1;
+
+ if (base_address_type != base_address_none && !cu->header.base_known)
+ {
+ gdb_assert (part_die->tag == DW_TAG_compile_unit);
+ cu->header.base_known = 1;
+ cu->header.base_address = base_address;
+ }
+
return info_ptr;
}