yann@96: Status: Checked in to HEAD after 6.3. yann@96: yann@96: 2004-11-07 Daniel Jacobowitz yann@96: yann@96: * dwarf2-frame.c (struct dwarf2_frame_ops): Add signal_frame_p. yann@96: (dwarf2_frame_set_signal_frame_p, dwarf2_frame_signal_frame_p) yann@96: (dwarf2_signal_frame_unwind): New. yann@96: (dwarf2_frame_sniffer): Use dwarf2_frame_signal_frame_p. yann@96: * dwarf2-frame.h (dwarf2_frame_set_signal_frame_p): New prototype. yann@96: yann@96: Index: src/gdb/dwarf2-frame.c yann@96: =================================================================== yann@96: RCS file: /big/fsf/rsync/src-cvs/src/gdb/dwarf2-frame.c,v yann@96: retrieving revision 1.41 yann@96: diff -u -p -r1.41 dwarf2-frame.c yann@96: --- src/gdb/dwarf2-frame.c 4 Nov 2004 21:15:15 -0000 1.41 yann@96: +++ src/gdb/dwarf2-frame.c 7 Nov 2004 17:41:58 -0000 yann@96: @@ -471,6 +471,10 @@ struct dwarf2_frame_ops yann@96: { yann@96: /* Pre-initialize the register state REG for register REGNUM. */ yann@96: void (*init_reg) (struct gdbarch *, int, struct dwarf2_frame_state_reg *); yann@96: + yann@96: + /* Check whether the frame preceding NEXT_FRAME will be a signal yann@96: + trampoline. */ yann@96: + int (*signal_frame_p) (struct gdbarch *, struct frame_info *); yann@96: }; yann@96: yann@96: /* Default architecture-specific register state initialization yann@96: @@ -547,6 +551,33 @@ dwarf2_frame_init_reg (struct gdbarch *g yann@96: yann@96: ops->init_reg (gdbarch, regnum, reg); yann@96: } yann@96: + yann@96: +/* Set the architecture-specific signal trampoline recognition yann@96: + function for GDBARCH to SIGNAL_FRAME_P. */ yann@96: + yann@96: +void yann@96: +dwarf2_frame_set_signal_frame_p (struct gdbarch *gdbarch, yann@96: + int (*signal_frame_p) (struct gdbarch *, yann@96: + struct frame_info *)) yann@96: +{ yann@96: + struct dwarf2_frame_ops *ops = gdbarch_data (gdbarch, dwarf2_frame_data); yann@96: + yann@96: + ops->signal_frame_p = signal_frame_p; yann@96: +} yann@96: + yann@96: +/* Query the architecture-specific signal frame recognizer for yann@96: + NEXT_FRAME. */ yann@96: + yann@96: +static int yann@96: +dwarf2_frame_signal_frame_p (struct gdbarch *gdbarch, yann@96: + struct frame_info *next_frame) yann@96: +{ yann@96: + struct dwarf2_frame_ops *ops = gdbarch_data (gdbarch, dwarf2_frame_data); yann@96: + yann@96: + if (ops->signal_frame_p == NULL) yann@96: + return 0; yann@96: + return ops->signal_frame_p (gdbarch, next_frame); yann@96: +} yann@96: yann@96: yann@96: struct dwarf2_frame_cache yann@96: @@ -841,6 +872,13 @@ static const struct frame_unwind dwarf2_ yann@96: dwarf2_frame_prev_register yann@96: }; yann@96: yann@96: +static const struct frame_unwind dwarf2_signal_frame_unwind = yann@96: +{ yann@96: + SIGTRAMP_FRAME, yann@96: + dwarf2_frame_this_id, yann@96: + dwarf2_frame_prev_register yann@96: +}; yann@96: + yann@96: const struct frame_unwind * yann@96: dwarf2_frame_sniffer (struct frame_info *next_frame) yann@96: { yann@96: @@ -848,10 +886,18 @@ dwarf2_frame_sniffer (struct frame_info yann@96: function. frame_pc_unwind(), for a no-return next function, can yann@96: end up returning something past the end of this function's body. */ yann@96: CORE_ADDR block_addr = frame_unwind_address_in_block (next_frame); yann@96: - if (dwarf2_frame_find_fde (&block_addr)) yann@96: - return &dwarf2_frame_unwind; yann@96: + if (!dwarf2_frame_find_fde (&block_addr)) yann@96: + return NULL; yann@96: yann@96: - return NULL; yann@96: + /* On some targets, signal trampolines may have unwind information. yann@96: + We need to recognize them so that we set the frame type yann@96: + correctly. */ yann@96: + yann@96: + if (dwarf2_frame_signal_frame_p (get_frame_arch (next_frame), yann@96: + next_frame)) yann@96: + return &dwarf2_signal_frame_unwind; yann@96: + yann@96: + return &dwarf2_frame_unwind; yann@96: } yann@96: yann@96: yann@96: Index: src/gdb/dwarf2-frame.h yann@96: =================================================================== yann@96: RCS file: /big/fsf/rsync/src-cvs/src/gdb/dwarf2-frame.h,v yann@96: retrieving revision 1.6 yann@96: diff -u -p -r1.6 dwarf2-frame.h yann@96: --- src/gdb/dwarf2-frame.h 28 Feb 2004 16:59:32 -0000 1.6 yann@96: +++ src/gdb/dwarf2-frame.h 7 Nov 2004 17:40:41 -0000 yann@96: @@ -79,6 +79,14 @@ extern void dwarf2_frame_set_init_reg (s yann@96: void (*init_reg) (struct gdbarch *, int, yann@96: struct dwarf2_frame_state_reg *)); yann@96: yann@96: +/* Set the architecture-specific signal trampoline recognition yann@96: + function for GDBARCH to SIGNAL_FRAME_P. */ yann@96: + yann@96: +extern void yann@96: + dwarf2_frame_set_signal_frame_p (struct gdbarch *gdbarch, yann@96: + int (*signal_frame_p) (struct gdbarch *, yann@96: + struct frame_info *)); yann@96: + yann@96: /* Return the frame unwind methods for the function that contains PC, yann@96: or NULL if it can't be handled by DWARF CFI frame unwinder. */ yann@96: