diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2003-10-03 08:08:27 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2003-10-03 08:08:27 +0000 |
commit | 0fd8504376c457ec76beea2c3769bea717c1748f (patch) | |
tree | 448a2057857083985510f883460d208ae26182bd /gdb/dwarf2-frame.c | |
parent | b079391aac3a3f43f136143a911fa482ad0ccce5 (diff) | |
download | gdb-0fd8504376c457ec76beea2c3769bea717c1748f.zip gdb-0fd8504376c457ec76beea2c3769bea717c1748f.tar.gz gdb-0fd8504376c457ec76beea2c3769bea717c1748f.tar.bz2 |
* dwarf2-frame.c (struct comp_unit): Add tbase member to store
base for DW_EH_PE_textrel encodings.
(read_encoded_value): Add a DW_EH_PE_textrel case.
(dwarf2_build_frame_info): Set unit.tbase to beginning of text
section.
Diffstat (limited to 'gdb/dwarf2-frame.c')
-rw-r--r-- | gdb/dwarf2-frame.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c index 2f5502e..b46a382 100644 --- a/gdb/dwarf2-frame.c +++ b/gdb/dwarf2-frame.c @@ -885,6 +885,9 @@ struct comp_unit /* Base for DW_EH_PE_datarel encodings. */ bfd_vma dbase; + + /* Base for DW_EH_PE_textrel encodings. */ + bfd_vma tbase; }; const struct objfile_data *dwarf2_frame_data; @@ -1063,6 +1066,9 @@ read_encoded_value (struct comp_unit *unit, unsigned char encoding, case DW_EH_PE_datarel: base = unit->dbase; break; + case DW_EH_PE_textrel: + base = unit->tbase; + break; case DW_EH_PE_aligned: base = 0; offset = buf - unit->dwarf_frame_buffer; @@ -1523,12 +1529,13 @@ dwarf2_build_frame_info (struct objfile *objfile) unit.objfile = objfile; unit.addr_size = objfile->obfd->arch_info->bits_per_address / 8; unit.dbase = 0; + unit.tbase = 0; /* First add the information from the .eh_frame section. That way, the FDEs from that section are searched last. */ if (dwarf_eh_frame_offset) { - asection *got; + asection *got, *txt; unit.cie = NULL; unit.dwarf_frame_buffer = dwarf2_read_section (objfile, @@ -1547,6 +1554,11 @@ dwarf2_build_frame_info (struct objfile *objfile) if (got) unit.dbase = got->vma; + /* GCC emits the DW_EH_PE_textrel encoding type on sh and ia64 so far. */ + txt = bfd_get_section_by_name (unit.abfd, ".text"); + if (txt) + unit.tbase = txt->vma; + frame_ptr = unit.dwarf_frame_buffer; while (frame_ptr < unit.dwarf_frame_buffer + unit.dwarf_frame_size) frame_ptr = decode_frame_entry (&unit, frame_ptr, 1); |