This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: add support for `S´ augmentation in dwarf2 debug info
- From: Alexandre Oliva <aoliva at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Sun, 28 May 2006 02:56:03 -0300
- Subject: Re: add support for `S´ augmentation in dwarf2 debug info
- References: <orbqwnpne4.fsf@free.oliva.athome.lsd.ic.unicamp.br> <20060304150719.GD20187@nevyn.them.org> <orek1erfpd.fsf@free.oliva.athome.lsd.ic.unicamp.br> <20060328223959.GE11817@nevyn.them.org>
On Mar 28, 2006, Daniel Jacobowitz <drow@false.org> wrote:
> On Tue, Mar 07, 2006 at 02:23:10AM -0300, Alexandre Oliva wrote:
>> If the code changes are fine without the testcase, I'll be more than
>> happy to check them in as such. Are they?
> Yes, the code changes are OK. Thanks and sorry for the delay.
Checking this in now...
for gdb/ChangeLog
from Alexandre Oliva <aoliva@redhat.com>
* dwarf2-frame.c (struct dwarf2_cie): Add signal_frame field.
(dwarf2_frame_sniffer): Use it.
(decode_frame_entry_1): Set it according to augmentation "S".
Index: gdb/dwarf2-frame.c
===================================================================
--- gdb/dwarf2-frame.c.orig 2006-05-28 02:42:30.000000000 -0300
+++ gdb/dwarf2-frame.c 2006-05-28 02:44:41.000000000 -0300
@@ -70,6 +70,9 @@ struct dwarf2_cie
/* True if a 'z' augmentation existed. */
unsigned char saw_z_augmentation;
+ /* True if an 'S' augmentation existed. */
+ unsigned char signal_frame;
+
struct dwarf2_cie *next;
};
@@ -1053,15 +1056,17 @@ dwarf2_frame_sniffer (struct frame_info
function. frame_pc_unwind(), for a no-return next function, can
end up returning something past the end of this function's body. */
CORE_ADDR block_addr = frame_unwind_address_in_block (next_frame);
- if (!dwarf2_frame_find_fde (&block_addr))
+ struct dwarf2_fde *fde = dwarf2_frame_find_fde (&block_addr);
+ if (!fde)
return NULL;
/* On some targets, signal trampolines may have unwind information.
We need to recognize them so that we set the frame type
correctly. */
- if (dwarf2_frame_signal_frame_p (get_frame_arch (next_frame),
- next_frame))
+ if (fde->cie->signal_frame
+ || dwarf2_frame_signal_frame_p (get_frame_arch (next_frame),
+ next_frame))
return &dwarf2_signal_frame_unwind;
return &dwarf2_frame_unwind;
@@ -1521,6 +1526,10 @@ decode_frame_entry_1 (struct comp_unit *
depends on the target address size. */
cie->encoding = DW_EH_PE_absptr;
+ /* We'll determine the final value later, but we need to
+ initialize it conservatively. */
+ cie->signal_frame = 0;
+
/* Check version number. */
cie_version = read_1_byte (unit->abfd, buf);
if (cie_version != 1 && cie_version != 3)
@@ -1604,6 +1613,17 @@ decode_frame_entry_1 (struct comp_unit *
augmentation++;
}
+ /* "S" indicates a signal frame, such that the return
+ address must not be decremented to locate the call frame
+ info for the previous frame; it might even be the first
+ instruction of a function, so decrementing it would take
+ us to a different function. */
+ else if (*augmentation == 'S')
+ {
+ cie->signal_frame = 1;
+ augmentation++;
+ }
+
/* Otherwise we have an unknown augmentation.
Bail out unless we saw a 'z' prefix. */
else
--
Alexandre Oliva http://www.lsd.ic.unicamp.br/~oliva/
Secretary for FSF Latin America http://www.fsfla.org/
Red Hat Compiler Engineer aoliva@{redhat.com, gcc.gnu.org}
Free Software Evangelist oliva@{lsd.ic.unicamp.br, gnu.org}