* 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.
This commit is contained in:
parent
4fb31ed045
commit
3ed09a3267
3 changed files with 65 additions and 3 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
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.
|
||||||
|
|
||||||
2004-11-07 Mark Kettenis <kettenis@gnu.org>
|
2004-11-07 Mark Kettenis <kettenis@gnu.org>
|
||||||
|
|
||||||
* Makefile.in (mips64obsd-tdep.o): Fix typo.
|
* Makefile.in (mips64obsd-tdep.o): Fix typo.
|
||||||
|
|
|
@ -471,6 +471,10 @@ struct dwarf2_frame_ops
|
||||||
{
|
{
|
||||||
/* Pre-initialize the register state REG for register REGNUM. */
|
/* Pre-initialize the register state REG for register REGNUM. */
|
||||||
void (*init_reg) (struct gdbarch *, int, struct dwarf2_frame_state_reg *);
|
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
|
/* Default architecture-specific register state initialization
|
||||||
|
@ -547,6 +551,33 @@ dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
|
||||||
|
|
||||||
ops->init_reg (gdbarch, regnum, reg);
|
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
|
struct dwarf2_frame_cache
|
||||||
|
@ -845,6 +876,13 @@ static const struct frame_unwind dwarf2_frame_unwind =
|
||||||
dwarf2_frame_prev_register
|
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 *
|
const struct frame_unwind *
|
||||||
dwarf2_frame_sniffer (struct frame_info *next_frame)
|
dwarf2_frame_sniffer (struct frame_info *next_frame)
|
||||||
{
|
{
|
||||||
|
@ -852,10 +890,18 @@ dwarf2_frame_sniffer (struct frame_info *next_frame)
|
||||||
function. frame_pc_unwind(), for a no-return next function, can
|
function. frame_pc_unwind(), for a no-return next function, can
|
||||||
end up returning something past the end of this function's body. */
|
end up returning something past the end of this function's body. */
|
||||||
CORE_ADDR block_addr = frame_unwind_address_in_block (next_frame);
|
CORE_ADDR block_addr = frame_unwind_address_in_block (next_frame);
|
||||||
if (dwarf2_frame_find_fde (&block_addr))
|
if (!dwarf2_frame_find_fde (&block_addr))
|
||||||
return &dwarf2_frame_unwind;
|
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -79,6 +79,14 @@ extern void dwarf2_frame_set_init_reg (struct gdbarch *gdbarch,
|
||||||
void (*init_reg) (struct gdbarch *, int,
|
void (*init_reg) (struct gdbarch *, int,
|
||||||
struct dwarf2_frame_state_reg *));
|
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,
|
/* Return the frame unwind methods for the function that contains PC,
|
||||||
or NULL if it can't be handled by DWARF CFI frame unwinder. */
|
or NULL if it can't be handled by DWARF CFI frame unwinder. */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue