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