diff options
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); |