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.
This commit is contained in:
Jan Kratochvil 2008-05-04 17:19:06 +00:00
parent a7f1256dcb
commit 85cbf3d35d
2 changed files with 39 additions and 0 deletions

View File

@ -1,3 +1,11 @@
2008-05-04 Jan Kratochvil <jan.kratochvil@redhat.com>
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.
2008-05-04 Ulrich Weigand <uweigand@de.ibm.com> 2008-05-04 Ulrich Weigand <uweigand@de.ibm.com>
* arch-utils.c (gdbarch_update_p): Use default values for * arch-utils.c (gdbarch_update_p): Use default values for

View File

@ -5814,6 +5814,15 @@ read_partial_die (struct partial_die_info *part_die,
struct attribute attr; struct attribute attr;
int has_low_pc_attr = 0; int has_low_pc_attr = 0;
int has_high_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)); 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: case DW_AT_low_pc:
has_low_pc_attr = 1; has_low_pc_attr = 1;
part_die->lowpc = DW_ADDR (&attr); 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; break;
case DW_AT_high_pc: case DW_AT_high_pc:
has_high_pc_attr = 1; has_high_pc_attr = 1;
part_die->highpc = DW_ADDR (&attr); part_die->highpc = DW_ADDR (&attr);
break; 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: case DW_AT_ranges:
if (dwarf2_ranges_read (DW_UNSND (&attr), &part_die->lowpc, if (dwarf2_ranges_read (DW_UNSND (&attr), &part_die->lowpc,
&part_die->highpc, cu)) &part_die->highpc, cu))
@ -5948,6 +5971,14 @@ read_partial_die (struct partial_die_info *part_die,
&& (part_die->lowpc != 0 && (part_die->lowpc != 0
|| dwarf2_per_objfile->has_section_at_zero)) || dwarf2_per_objfile->has_section_at_zero))
part_die->has_pc_info = 1; 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; return info_ptr;
} }