* dwarf2-frame.c (dwarf2_frame_cache, dwarf2_frame_this_id)
(dwarf2_frame_sniffer): Update. (dwarf2_signal_frame_this_id): New function. (dwarf2_signal_frame_unwind): Use it. (dwarf2_frame_base_sniffer): Use frame_unwind_address_in_block. * frame.c (frame_func_unwind): Add this_type argument. (get_frame_func): Update. (frame_unwind_address_in_block): Add this_type argument and check it. Fix a typo. (get_frame_address_in_block): Update. * frame.h (enum frame_type): Move higher in the file. (frame_unwind_address_in_block, frame_func_unwind): Add enum frame_type argument. * alpha-mdebug-tdep.c, alpha-tdep.c, amd64-tdep.c, amd64obsd-tdep.c, arm-tdep.c, avr-tdep.c, cris-tdep.c, frv-tdep.c, h8300-tdep.c, hppa-tdep.c, i386-tdep.c, i386obsd-tdep.c, ia64-tdep.c, libunwind-frame.c, m32c-tdep.c, m32r-linux-tdep.c, m32r-tdep.c, m68hc11-tdep.c, m68k-tdep.c, m88k-tdep.c, mips-mdebug-tdep.c, mips-tdep.c, mn10300-tdep.c, mt-tdep.c, rs6000-tdep.c, s390-tdep.c, score-tdep.c, sh-tdep.c, sh64-tdep.c, sparc-tdep.c, sparc64obsd-tdep.c, spu-tdep.c, v850-tdep.c, vax-tdep.c, xstormy16-tdep.c, xtensa-tdep.c: Update calls to frame_func_unwind and frame_unwind_address_in_block to specify the frame type. Use frame_unwind_address_in_block instead of frame_pc_unwind in sniffers. * gdb.arch/i386-signal.c, gdb.arch/i386-signal.exp: New files.
This commit is contained in:
parent
206415a3ea
commit
93d42b302e
43 changed files with 313 additions and 111 deletions
|
@ -1,3 +1,32 @@
|
|||
2007-02-27 Daniel Jacobowitz <dan@codesourcery.com>
|
||||
|
||||
* dwarf2-frame.c (dwarf2_frame_cache, dwarf2_frame_this_id)
|
||||
(dwarf2_frame_sniffer): Update.
|
||||
(dwarf2_signal_frame_this_id): New function.
|
||||
(dwarf2_signal_frame_unwind): Use it.
|
||||
(dwarf2_frame_base_sniffer): Use frame_unwind_address_in_block.
|
||||
* frame.c (frame_func_unwind): Add this_type argument.
|
||||
(get_frame_func): Update.
|
||||
(frame_unwind_address_in_block): Add this_type argument and check it.
|
||||
Fix a typo.
|
||||
(get_frame_address_in_block): Update.
|
||||
* frame.h (enum frame_type): Move higher in the file.
|
||||
(frame_unwind_address_in_block, frame_func_unwind): Add enum frame_type
|
||||
argument.
|
||||
|
||||
* alpha-mdebug-tdep.c, alpha-tdep.c, amd64-tdep.c, amd64obsd-tdep.c,
|
||||
arm-tdep.c, avr-tdep.c, cris-tdep.c, frv-tdep.c, h8300-tdep.c,
|
||||
hppa-tdep.c, i386-tdep.c, i386obsd-tdep.c, ia64-tdep.c,
|
||||
libunwind-frame.c, m32c-tdep.c, m32r-linux-tdep.c, m32r-tdep.c,
|
||||
m68hc11-tdep.c, m68k-tdep.c, m88k-tdep.c, mips-mdebug-tdep.c,
|
||||
mips-tdep.c, mn10300-tdep.c, mt-tdep.c, rs6000-tdep.c, s390-tdep.c,
|
||||
score-tdep.c, sh-tdep.c, sh64-tdep.c, sparc-tdep.c,
|
||||
sparc64obsd-tdep.c, spu-tdep.c, v850-tdep.c, vax-tdep.c,
|
||||
xstormy16-tdep.c, xtensa-tdep.c: Update calls to
|
||||
frame_func_unwind and frame_unwind_address_in_block to specify
|
||||
the frame type. Use frame_unwind_address_in_block instead of
|
||||
frame_pc_unwind in sniffers.
|
||||
|
||||
2007-02-27 Daniel Jacobowitz <dan@codesourcery.com>
|
||||
|
||||
* frame.c (deprecated_selected_frame): Rename to...
|
||||
|
|
|
@ -246,7 +246,8 @@ alpha_mdebug_frame_this_id (struct frame_info *next_frame,
|
|||
struct alpha_mdebug_unwind_cache *info
|
||||
= alpha_mdebug_frame_unwind_cache (next_frame, this_prologue_cache);
|
||||
|
||||
*this_id = frame_id_build (info->vfp, frame_func_unwind (next_frame));
|
||||
*this_id = frame_id_build (info->vfp,
|
||||
frame_func_unwind (next_frame, NORMAL_FRAME));
|
||||
}
|
||||
|
||||
/* Retrieve the value of REGNUM in FRAME. Don't give up! */
|
||||
|
@ -311,7 +312,7 @@ static const struct frame_unwind alpha_mdebug_frame_unwind = {
|
|||
const struct frame_unwind *
|
||||
alpha_mdebug_frame_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
CORE_ADDR pc = frame_unwind_address_in_block (next_frame, NORMAL_FRAME);
|
||||
struct mdebug_extra_func_info *proc_desc;
|
||||
|
||||
/* If this PC does not map to a PDR, then clearly this isn't an
|
||||
|
@ -368,7 +369,7 @@ static const struct frame_base alpha_mdebug_frame_base = {
|
|||
static const struct frame_base *
|
||||
alpha_mdebug_frame_base_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
CORE_ADDR pc = frame_unwind_address_in_block (next_frame, NORMAL_FRAME);
|
||||
struct mdebug_extra_func_info *proc_desc;
|
||||
|
||||
/* If this PC does not map to a PDR, then clearly this isn't an
|
||||
|
|
|
@ -820,7 +820,7 @@ alpha_sigtramp_frame_this_id (struct frame_info *next_frame,
|
|||
code_addr = 0;
|
||||
}
|
||||
else
|
||||
code_addr = frame_func_unwind (next_frame);
|
||||
code_addr = frame_func_unwind (next_frame, SIGTRAMP_FRAME);
|
||||
|
||||
/* The stack address is trivially read from the sigcontext. */
|
||||
stack_addr = alpha_sigtramp_register_address (info->sigcontext_addr,
|
||||
|
|
|
@ -833,7 +833,7 @@ amd64_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||
cache = amd64_alloc_frame_cache ();
|
||||
*this_cache = cache;
|
||||
|
||||
cache->pc = frame_func_unwind (next_frame);
|
||||
cache->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
if (cache->pc != 0)
|
||||
amd64_analyze_prologue (cache->pc, frame_pc_unwind (next_frame), cache);
|
||||
|
||||
|
|
|
@ -356,7 +356,9 @@ amd64obsd_trapframe_cache(struct frame_info *next_frame, void **this_cache)
|
|||
cache = trad_frame_cache_zalloc (next_frame);
|
||||
*this_cache = cache;
|
||||
|
||||
func = frame_func_unwind (next_frame);
|
||||
/* NORMAL_FRAME matches the type in amd64obsd_trapframe_unwind, but
|
||||
SIGTRAMP_FRAME might be more appropriate. */
|
||||
func = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
sp = frame_unwind_register_unsigned (next_frame, AMD64_RSP_REGNUM);
|
||||
|
||||
find_pc_partial_function (func, &name, NULL, NULL);
|
||||
|
|
|
@ -931,7 +931,7 @@ arm_prologue_this_id (struct frame_info *next_frame,
|
|||
*this_cache = arm_make_prologue_cache (next_frame);
|
||||
cache = *this_cache;
|
||||
|
||||
func = frame_func_unwind (next_frame);
|
||||
func = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
|
||||
/* This is meant to halt the backtrace at "_start". Make sure we
|
||||
don't halt it at a generic dummy frame. */
|
||||
|
@ -1036,9 +1036,11 @@ struct frame_unwind arm_stub_unwind = {
|
|||
static const struct frame_unwind *
|
||||
arm_stub_unwind_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR addr_in_block;
|
||||
char dummy[4];
|
||||
|
||||
if (in_plt_section (frame_unwind_address_in_block (next_frame), NULL)
|
||||
addr_in_block = frame_unwind_address_in_block (next_frame, NORMAL_FRAME);
|
||||
if (in_plt_section (addr_in_block, NULL)
|
||||
|| target_read_memory (frame_pc_unwind (next_frame), dummy, 4) != 0)
|
||||
return &arm_stub_unwind;
|
||||
|
||||
|
|
|
@ -875,7 +875,7 @@ avr_frame_unwind_cache (struct frame_info *next_frame,
|
|||
info->size = 0;
|
||||
info->prologue_type = AVR_PROLOGUE_NONE;
|
||||
|
||||
pc = frame_func_unwind (next_frame);
|
||||
pc = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
|
||||
if ((pc > 0) && (pc < frame_pc_unwind (next_frame)))
|
||||
avr_scan_prologue (pc, info);
|
||||
|
@ -958,7 +958,7 @@ avr_frame_this_id (struct frame_info *next_frame,
|
|||
struct frame_id id;
|
||||
|
||||
/* The FUNC is easy. */
|
||||
func = frame_func_unwind (next_frame);
|
||||
func = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
|
||||
/* Hopefully the prologue analysis either correctly determined the
|
||||
frame's base (which is the SP from the previous frame), or set
|
||||
|
|
|
@ -792,9 +792,11 @@ cris_frame_unwind_cache (struct frame_info *next_frame,
|
|||
|
||||
/* Prologue analysis does the rest... */
|
||||
if (cris_version () == 32)
|
||||
crisv32_scan_prologue (frame_func_unwind (next_frame), next_frame, info);
|
||||
crisv32_scan_prologue (frame_func_unwind (next_frame, NORMAL_FRAME),
|
||||
next_frame, info);
|
||||
else
|
||||
cris_scan_prologue (frame_func_unwind (next_frame), next_frame, info);
|
||||
cris_scan_prologue (frame_func_unwind (next_frame, NORMAL_FRAME),
|
||||
next_frame, info);
|
||||
|
||||
return info;
|
||||
}
|
||||
|
@ -814,7 +816,7 @@ cris_frame_this_id (struct frame_info *next_frame,
|
|||
struct frame_id id;
|
||||
|
||||
/* The FUNC is easy. */
|
||||
func = frame_func_unwind (next_frame);
|
||||
func = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
|
||||
/* Hopefully the prologue analysis either correctly determined the
|
||||
frame's base (which is the SP from the previous frame), or set
|
||||
|
|
|
@ -848,7 +848,7 @@ dwarf2_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||
frame_unwind_address_in_block does just this. It's not clear how
|
||||
reliable the method is though; there is the potential for the
|
||||
register state pre-call being different to that on return. */
|
||||
fs->pc = frame_unwind_address_in_block (next_frame);
|
||||
fs->pc = frame_unwind_address_in_block (next_frame, NORMAL_FRAME);
|
||||
|
||||
/* Find the correct FDE. */
|
||||
fde = dwarf2_frame_find_fde (&fs->pc);
|
||||
|
@ -1011,7 +1011,22 @@ dwarf2_frame_this_id (struct frame_info *next_frame, void **this_cache,
|
|||
if (cache->undefined_retaddr)
|
||||
return;
|
||||
|
||||
(*this_id) = frame_id_build (cache->cfa, frame_func_unwind (next_frame));
|
||||
(*this_id) = frame_id_build (cache->cfa,
|
||||
frame_func_unwind (next_frame, NORMAL_FRAME));
|
||||
}
|
||||
|
||||
static void
|
||||
dwarf2_signal_frame_this_id (struct frame_info *next_frame, void **this_cache,
|
||||
struct frame_id *this_id)
|
||||
{
|
||||
struct dwarf2_frame_cache *cache =
|
||||
dwarf2_frame_cache (next_frame, this_cache);
|
||||
|
||||
if (cache->undefined_retaddr)
|
||||
return;
|
||||
|
||||
(*this_id) = frame_id_build (cache->cfa,
|
||||
frame_func_unwind (next_frame, SIGTRAMP_FRAME));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1179,7 +1194,7 @@ static const struct frame_unwind dwarf2_frame_unwind =
|
|||
static const struct frame_unwind dwarf2_signal_frame_unwind =
|
||||
{
|
||||
SIGTRAMP_FRAME,
|
||||
dwarf2_frame_this_id,
|
||||
dwarf2_signal_frame_this_id,
|
||||
dwarf2_frame_prev_register
|
||||
};
|
||||
|
||||
|
@ -1188,8 +1203,12 @@ dwarf2_frame_sniffer (struct frame_info *next_frame)
|
|||
{
|
||||
/* Grab an address that is guarenteed to reside somewhere within the
|
||||
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);
|
||||
end up returning something past the end of this function's body.
|
||||
If the frame we're sniffing for is a signal frame whose start
|
||||
address is placed on the stack by the OS, its FDE must
|
||||
extend one byte before its start address or we will miss it. */
|
||||
CORE_ADDR block_addr = frame_unwind_address_in_block (next_frame,
|
||||
NORMAL_FRAME);
|
||||
struct dwarf2_fde *fde = dwarf2_frame_find_fde (&block_addr);
|
||||
if (!fde)
|
||||
return NULL;
|
||||
|
@ -1233,8 +1252,9 @@ static const struct frame_base dwarf2_frame_base =
|
|||
const struct frame_base *
|
||||
dwarf2_frame_base_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
if (dwarf2_frame_find_fde (&pc))
|
||||
CORE_ADDR block_addr = frame_unwind_address_in_block (next_frame,
|
||||
NORMAL_FRAME);
|
||||
if (dwarf2_frame_find_fde (&block_addr))
|
||||
return &dwarf2_frame_base;
|
||||
|
||||
return NULL;
|
||||
|
|
26
gdb/frame.c
26
gdb/frame.c
|
@ -471,13 +471,13 @@ frame_pc_unwind (struct frame_info *this_frame)
|
|||
}
|
||||
|
||||
CORE_ADDR
|
||||
frame_func_unwind (struct frame_info *fi)
|
||||
frame_func_unwind (struct frame_info *fi, enum frame_type this_type)
|
||||
{
|
||||
if (!fi->prev_func.p)
|
||||
{
|
||||
/* Make certain that this, and not the adjacent, function is
|
||||
found. */
|
||||
CORE_ADDR addr_in_block = frame_unwind_address_in_block (fi);
|
||||
CORE_ADDR addr_in_block = frame_unwind_address_in_block (fi, this_type);
|
||||
fi->prev_func.p = 1;
|
||||
fi->prev_func.addr = get_pc_function_start (addr_in_block);
|
||||
if (frame_debug)
|
||||
|
@ -491,7 +491,7 @@ frame_func_unwind (struct frame_info *fi)
|
|||
CORE_ADDR
|
||||
get_frame_func (struct frame_info *fi)
|
||||
{
|
||||
return frame_func_unwind (fi->next);
|
||||
return frame_func_unwind (fi->next, get_frame_type (fi));
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -1496,20 +1496,31 @@ get_frame_pc (struct frame_info *frame)
|
|||
return frame_pc_unwind (frame->next);
|
||||
}
|
||||
|
||||
/* Return an address of that falls within the frame's code block. */
|
||||
/* Return an address that falls within NEXT_FRAME's caller's code
|
||||
block, assuming that the caller is a THIS_TYPE frame. */
|
||||
|
||||
CORE_ADDR
|
||||
frame_unwind_address_in_block (struct frame_info *next_frame)
|
||||
frame_unwind_address_in_block (struct frame_info *next_frame,
|
||||
enum frame_type this_type)
|
||||
{
|
||||
/* A draft address. */
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
|
||||
/* If NEXT_FRAME was called by a signal frame or dummy frame, then
|
||||
we shold not adjust the unwound PC. These frames may not call
|
||||
their next frame in the normal way; the operating system or GDB
|
||||
may have pushed their resume address manually onto the stack, so
|
||||
it may be the very first instruction. Even if the resume address
|
||||
was not manually pushed, they expect to be returned to. */
|
||||
if (this_type != NORMAL_FRAME)
|
||||
return pc;
|
||||
|
||||
/* If THIS frame is not inner most (i.e., NEXT isn't the sentinel),
|
||||
and NEXT is `normal' (i.e., not a sigtramp, dummy, ....) THIS
|
||||
frame's PC ends up pointing at the instruction fallowing the
|
||||
"call". Adjust that PC value so that it falls on the call
|
||||
instruction (which, hopefully, falls within THIS frame's code
|
||||
block. So far it's proved to be a very good approximation. See
|
||||
block). So far it's proved to be a very good approximation. See
|
||||
get_frame_type() for why ->type can't be used. */
|
||||
if (next_frame->level >= 0
|
||||
&& get_frame_type (next_frame) == NORMAL_FRAME)
|
||||
|
@ -1520,7 +1531,8 @@ frame_unwind_address_in_block (struct frame_info *next_frame)
|
|||
CORE_ADDR
|
||||
get_frame_address_in_block (struct frame_info *this_frame)
|
||||
{
|
||||
return frame_unwind_address_in_block (this_frame->next);
|
||||
return frame_unwind_address_in_block (this_frame->next,
|
||||
get_frame_type (this_frame));
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
51
gdb/frame.h
51
gdb/frame.h
|
@ -184,6 +184,25 @@ extern int frame_id_inner (struct frame_id l, struct frame_id r);
|
|||
extern void fprint_frame_id (struct ui_file *file, struct frame_id id);
|
||||
|
||||
|
||||
/* Frame types. Some are real, some are signal trampolines, and some
|
||||
are completely artificial (dummy). */
|
||||
|
||||
enum frame_type
|
||||
{
|
||||
/* A true stack frame, created by the target program during normal
|
||||
execution. */
|
||||
NORMAL_FRAME,
|
||||
/* A fake frame, created by GDB when performing an inferior function
|
||||
call. */
|
||||
DUMMY_FRAME,
|
||||
/* In a signal handler, various OSs handle this in various ways.
|
||||
The main thing is that the frame may be far from normal. */
|
||||
SIGTRAMP_FRAME,
|
||||
/* Sentinel or registers frame. This frame obtains register values
|
||||
direct from the inferior's registers. */
|
||||
SENTINEL_FRAME
|
||||
};
|
||||
|
||||
/* For every stopped thread, GDB tracks two frames: current and
|
||||
selected. Current frame is the inner most frame of the selected
|
||||
thread. Selected frame is the one being examined by the the GDB
|
||||
|
@ -265,7 +284,13 @@ extern CORE_ADDR get_frame_pc (struct frame_info *);
|
|||
the frame's block. */
|
||||
|
||||
extern CORE_ADDR get_frame_address_in_block (struct frame_info *this_frame);
|
||||
extern CORE_ADDR frame_unwind_address_in_block (struct frame_info *next_frame);
|
||||
|
||||
/* Similar to get_frame_address_in_block, find an address in the
|
||||
block which logically called NEXT_FRAME, assuming it is a THIS_TYPE
|
||||
frame. */
|
||||
|
||||
extern CORE_ADDR frame_unwind_address_in_block (struct frame_info *next_frame,
|
||||
enum frame_type this_type);
|
||||
|
||||
/* The frame's inner-most bound. AKA the stack-pointer. Confusingly
|
||||
known as top-of-stack. */
|
||||
|
@ -277,9 +302,13 @@ extern CORE_ADDR frame_sp_unwind (struct frame_info *);
|
|||
/* Following on from the `resume' address. Return the entry point
|
||||
address of the function containing that resume address, or zero if
|
||||
that function isn't known. */
|
||||
extern CORE_ADDR frame_func_unwind (struct frame_info *fi);
|
||||
extern CORE_ADDR get_frame_func (struct frame_info *fi);
|
||||
|
||||
/* Similar to get_frame_func, find the start of the function which
|
||||
logically called NEXT_FRAME, assuming it is a THIS_TYPE frame. */
|
||||
extern CORE_ADDR frame_func_unwind (struct frame_info *next_frame,
|
||||
enum frame_type this_type);
|
||||
|
||||
/* Closely related to the resume address, various symbol table
|
||||
attributes that are determined by the PC. Note that for a normal
|
||||
frame, the PC refers to the resume address after the return, and
|
||||
|
@ -375,24 +404,8 @@ extern CORE_ADDR get_frame_args_address (struct frame_info *);
|
|||
for an invalid frame). */
|
||||
extern int frame_relative_level (struct frame_info *fi);
|
||||
|
||||
/* Return the frame's type. Some are real, some are signal
|
||||
trampolines, and some are completely artificial (dummy). */
|
||||
/* Return the frame's type. */
|
||||
|
||||
enum frame_type
|
||||
{
|
||||
/* A true stack frame, created by the target program during normal
|
||||
execution. */
|
||||
NORMAL_FRAME,
|
||||
/* A fake frame, created by GDB when performing an inferior function
|
||||
call. */
|
||||
DUMMY_FRAME,
|
||||
/* In a signal handler, various OSs handle this in various ways.
|
||||
The main thing is that the frame may be far from normal. */
|
||||
SIGTRAMP_FRAME,
|
||||
/* Sentinel or registers frame. This frame obtains register values
|
||||
direct from the inferior's registers. */
|
||||
SENTINEL_FRAME
|
||||
};
|
||||
extern enum frame_type get_frame_type (struct frame_info *);
|
||||
|
||||
/* For frames where we can not unwind further, describe why. */
|
||||
|
|
|
@ -1016,7 +1016,8 @@ frv_frame_unwind_cache (struct frame_info *next_frame,
|
|||
info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
|
||||
|
||||
/* Prologue analysis does the rest... */
|
||||
frv_analyze_prologue (frame_func_unwind (next_frame), next_frame, info);
|
||||
frv_analyze_prologue (frame_func_unwind (next_frame, NORMAL_FRAME),
|
||||
next_frame, info);
|
||||
|
||||
return info;
|
||||
}
|
||||
|
@ -1346,7 +1347,7 @@ frv_frame_this_id (struct frame_info *next_frame,
|
|||
struct frame_id id;
|
||||
|
||||
/* The FUNC is easy. */
|
||||
func = frame_func_unwind (next_frame);
|
||||
func = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
|
||||
/* Check if the stack is empty. */
|
||||
msym_stack = lookup_minimal_symbol ("_stack", NULL, NULL);
|
||||
|
|
|
@ -447,7 +447,7 @@ h8300_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||
|
||||
cache->saved_regs[E_PC_REGNUM] = -BINWORD;
|
||||
|
||||
cache->pc = frame_func_unwind (next_frame);
|
||||
cache->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
current_pc = frame_pc_unwind (next_frame);
|
||||
if (cache->pc != 0)
|
||||
h8300_analyze_prologue (cache->pc, current_pc, cache);
|
||||
|
|
|
@ -1787,9 +1787,14 @@ hppa_skip_prologue (CORE_ADDR pc)
|
|||
static struct unwind_table_entry *
|
||||
hppa_find_unwind_entry_in_block (struct frame_info *f)
|
||||
{
|
||||
CORE_ADDR pc;
|
||||
CORE_ADDR pc = frame_unwind_address_in_block (f, NORMAL_FRAME);
|
||||
|
||||
pc = frame_unwind_address_in_block (f);
|
||||
/* FIXME drow/20070101: Calling gdbarch_addr_bits_remove on the
|
||||
result of frame_unwind_address_in_block implies a problem.
|
||||
The bits should have been removed earlier, before the return
|
||||
value of frame_pc_unwind. That might be happening already;
|
||||
if it isn't, it should be fixed. Then this call can be
|
||||
removed. */
|
||||
pc = gdbarch_addr_bits_remove (get_frame_arch (f), pc);
|
||||
return find_unwind_entry (pc);
|
||||
}
|
||||
|
@ -1899,7 +1904,7 @@ hppa_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||
if ((u->Region_description & 0x2) == 0)
|
||||
start_pc = u->region_start;
|
||||
else
|
||||
start_pc = frame_func_unwind (next_frame);
|
||||
start_pc = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
|
||||
prologue_end = skip_prologue_hard_way (start_pc, 0);
|
||||
end_pc = frame_pc_unwind (next_frame);
|
||||
|
@ -2267,7 +2272,7 @@ hppa_fallback_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||
(*this_cache) = cache;
|
||||
cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
|
||||
|
||||
start_pc = frame_func_unwind (next_frame);
|
||||
start_pc = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
if (start_pc)
|
||||
{
|
||||
CORE_ADDR cur_pc = frame_pc_unwind (next_frame);
|
||||
|
@ -2326,7 +2331,8 @@ hppa_fallback_frame_this_id (struct frame_info *next_frame, void **this_cache,
|
|||
{
|
||||
struct hppa_frame_cache *info =
|
||||
hppa_fallback_frame_cache (next_frame, this_cache);
|
||||
(*this_id) = frame_id_build (info->base, frame_func_unwind (next_frame));
|
||||
(*this_id) = frame_id_build (info->base,
|
||||
frame_func_unwind (next_frame, NORMAL_FRAME));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2409,7 +2415,8 @@ hppa_stub_frame_this_id (struct frame_info *next_frame,
|
|||
= hppa_stub_frame_unwind_cache (next_frame, this_prologue_cache);
|
||||
|
||||
if (info)
|
||||
*this_id = frame_id_build (info->base, frame_func_unwind (next_frame));
|
||||
*this_id = frame_id_build (info->base,
|
||||
frame_func_unwind (next_frame, NORMAL_FRAME));
|
||||
else
|
||||
*this_id = null_frame_id;
|
||||
}
|
||||
|
@ -2441,7 +2448,7 @@ static const struct frame_unwind hppa_stub_frame_unwind = {
|
|||
static const struct frame_unwind *
|
||||
hppa_stub_unwind_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
CORE_ADDR pc = frame_unwind_address_in_block (next_frame, NORMAL_FRAME);
|
||||
struct gdbarch *gdbarch = get_frame_arch (next_frame);
|
||||
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||
|
||||
|
|
|
@ -949,7 +949,7 @@ i386_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||
/* For normal frames, %eip is stored at 4(%ebp). */
|
||||
cache->saved_regs[I386_EIP_REGNUM] = 4;
|
||||
|
||||
cache->pc = frame_func_unwind (next_frame);
|
||||
cache->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
if (cache->pc != 0)
|
||||
i386_analyze_prologue (cache->pc, frame_pc_unwind (next_frame), cache);
|
||||
|
||||
|
|
|
@ -353,7 +353,9 @@ i386obsd_trapframe_cache(struct frame_info *next_frame, void **this_cache)
|
|||
cache = trad_frame_cache_zalloc (next_frame);
|
||||
*this_cache = cache;
|
||||
|
||||
func = frame_func_unwind (next_frame);
|
||||
/* NORMAL_FRAME matches the type in i386obsd_trapframe_unwind, but
|
||||
SIGTRAMP_FRAME might be more appropriate. */
|
||||
func = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
sp = frame_unwind_register_unsigned (next_frame, I386_ESP_REGNUM);
|
||||
|
||||
find_pc_partial_function (func, &name, NULL, NULL);
|
||||
|
|
|
@ -1555,7 +1555,7 @@ ia64_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||
|
||||
cache->cfm = cfm;
|
||||
|
||||
cache->pc = frame_func_unwind (next_frame);
|
||||
cache->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
|
||||
if (cache->pc != 0)
|
||||
examine_prologue (cache->pc, frame_pc_unwind (next_frame), next_frame, cache);
|
||||
|
|
|
@ -141,7 +141,10 @@ libunwind_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||
/* Allocate a new cache. */
|
||||
cache = FRAME_OBSTACK_ZALLOC (struct libunwind_frame_cache);
|
||||
|
||||
cache->func_addr = frame_func_unwind (next_frame);
|
||||
/* We can assume we are unwinding a normal frame. Even if this is
|
||||
for a signal trampoline, ia64 signal "trampolines" use a normal
|
||||
subroutine call to start the signal handler. */
|
||||
cache->func_addr = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
if (cache->func_addr == 0
|
||||
&& frame_relative_level (next_frame) > 0
|
||||
&& get_frame_type (next_frame) != SIGTRAMP_FRAME)
|
||||
|
|
|
@ -1836,7 +1836,7 @@ m32c_analyze_frame_prologue (struct frame_info *next_frame,
|
|||
{
|
||||
if (! *this_prologue_cache)
|
||||
{
|
||||
CORE_ADDR func_start = frame_func_unwind (next_frame);
|
||||
CORE_ADDR func_start = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
CORE_ADDR stop_addr = frame_pc_unwind (next_frame);
|
||||
|
||||
/* If we couldn't find any function containing the PC, then
|
||||
|
@ -1900,7 +1900,8 @@ m32c_this_id (struct frame_info *next_frame,
|
|||
CORE_ADDR base = m32c_frame_base (next_frame, this_prologue_cache);
|
||||
|
||||
if (base)
|
||||
*this_id = frame_id_build (base, frame_func_unwind (next_frame));
|
||||
*this_id = frame_id_build (base,
|
||||
frame_func_unwind (next_frame, NORMAL_FRAME));
|
||||
/* Otherwise, leave it unset, and that will terminate the backtrace. */
|
||||
}
|
||||
|
||||
|
|
|
@ -250,7 +250,7 @@ m32r_linux_sigtramp_frame_cache (struct frame_info *next_frame,
|
|||
if (addr)
|
||||
sigcontext_addr += 128;
|
||||
else
|
||||
addr = frame_func_unwind (next_frame);
|
||||
addr = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
}
|
||||
cache->pc = addr;
|
||||
|
||||
|
|
|
@ -536,7 +536,7 @@ m32r_frame_unwind_cache (struct frame_info *next_frame,
|
|||
info->uses_frame = 0;
|
||||
|
||||
scan_limit = frame_pc_unwind (next_frame);
|
||||
for (pc = frame_func_unwind (next_frame);
|
||||
for (pc = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
pc > 0 && pc < scan_limit; pc += 2)
|
||||
{
|
||||
if ((pc & 2) == 0)
|
||||
|
@ -835,7 +835,7 @@ m32r_frame_this_id (struct frame_info *next_frame,
|
|||
struct frame_id id;
|
||||
|
||||
/* The FUNC is easy. */
|
||||
func = frame_func_unwind (next_frame);
|
||||
func = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
|
||||
/* Check if the stack is empty. */
|
||||
msym_stack = lookup_minimal_symbol ("_stack", NULL, NULL);
|
||||
|
|
|
@ -798,7 +798,7 @@ m68hc11_frame_unwind_cache (struct frame_info *next_frame,
|
|||
(*this_prologue_cache) = info;
|
||||
info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
|
||||
|
||||
info->pc = frame_func_unwind (next_frame);
|
||||
info->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
|
||||
info->size = 0;
|
||||
info->return_kind = m68hc11_get_return_insn (info->pc);
|
||||
|
@ -889,7 +889,7 @@ m68hc11_frame_this_id (struct frame_info *next_frame,
|
|||
struct frame_id id;
|
||||
|
||||
/* The FUNC is easy. */
|
||||
func = frame_func_unwind (next_frame);
|
||||
func = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
|
||||
/* Hopefully the prologue analysis either correctly determined the
|
||||
frame's base (which is the SP from the previous frame), or set
|
||||
|
|
|
@ -819,7 +819,7 @@ m68k_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||
/* For normal frames, %pc is stored at 4(%fp). */
|
||||
cache->saved_regs[M68K_PC_REGNUM] = 4;
|
||||
|
||||
cache->pc = frame_func_unwind (next_frame);
|
||||
cache->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
if (cache->pc != 0)
|
||||
m68k_analyze_prologue (cache->pc, frame_pc_unwind (next_frame), cache);
|
||||
|
||||
|
|
|
@ -659,12 +659,9 @@ m88k_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||
cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
|
||||
cache->fp_offset = -1;
|
||||
|
||||
cache->pc = frame_func_unwind (next_frame);
|
||||
cache->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
if (cache->pc != 0)
|
||||
{
|
||||
CORE_ADDR addr_in_block = frame_unwind_address_in_block (next_frame);
|
||||
m88k_analyze_prologue (cache->pc, addr_in_block, cache);
|
||||
}
|
||||
m88k_analyze_prologue (cache->pc, frame_pc_unwind (next_frame), cache);
|
||||
|
||||
/* Calculate the stack pointer used in the prologue. */
|
||||
if (cache->fp_offset != -1)
|
||||
|
|
|
@ -386,7 +386,8 @@ mips_mdebug_frame_this_id (struct frame_info *next_frame, void **this_cache,
|
|||
{
|
||||
struct mips_frame_cache *info = mips_mdebug_frame_cache (next_frame,
|
||||
this_cache);
|
||||
(*this_id) = frame_id_build (info->base, frame_func_unwind (next_frame));
|
||||
(*this_id) = frame_id_build (info->base,
|
||||
frame_func_unwind (next_frame, NORMAL_FRAME));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -412,7 +413,7 @@ static const struct frame_unwind mips_mdebug_frame_unwind =
|
|||
static const struct frame_unwind *
|
||||
mips_mdebug_frame_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
CORE_ADDR pc = frame_unwind_address_in_block (next_frame, NORMAL_FRAME);
|
||||
CORE_ADDR startaddr = 0;
|
||||
struct mdebug_extra_func_info *proc_desc;
|
||||
int kernel_trap;
|
||||
|
|
|
@ -1666,7 +1666,8 @@ mips_insn16_frame_this_id (struct frame_info *next_frame, void **this_cache,
|
|||
{
|
||||
struct mips_frame_cache *info = mips_insn16_frame_cache (next_frame,
|
||||
this_cache);
|
||||
(*this_id) = frame_id_build (info->base, frame_func_unwind (next_frame));
|
||||
(*this_id) = frame_id_build (info->base,
|
||||
frame_func_unwind (next_frame, NORMAL_FRAME));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1692,7 +1693,7 @@ static const struct frame_unwind mips_insn16_frame_unwind =
|
|||
static const struct frame_unwind *
|
||||
mips_insn16_frame_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
CORE_ADDR pc = frame_unwind_address_in_block (next_frame, NORMAL_FRAME);
|
||||
if (mips_pc_is_mips16 (pc))
|
||||
return &mips_insn16_frame_unwind;
|
||||
return NULL;
|
||||
|
@ -1986,7 +1987,8 @@ mips_insn32_frame_this_id (struct frame_info *next_frame, void **this_cache,
|
|||
{
|
||||
struct mips_frame_cache *info = mips_insn32_frame_cache (next_frame,
|
||||
this_cache);
|
||||
(*this_id) = frame_id_build (info->base, frame_func_unwind (next_frame));
|
||||
(*this_id) = frame_id_build (info->base,
|
||||
frame_func_unwind (next_frame, NORMAL_FRAME));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2012,7 +2014,7 @@ static const struct frame_unwind mips_insn32_frame_unwind =
|
|||
static const struct frame_unwind *
|
||||
mips_insn32_frame_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
CORE_ADDR pc = frame_unwind_address_in_block (next_frame, NORMAL_FRAME);
|
||||
if (! mips_pc_is_mips16 (pc))
|
||||
return &mips_insn32_frame_unwind;
|
||||
return NULL;
|
||||
|
@ -2107,7 +2109,7 @@ static const struct frame_unwind *
|
|||
mips_stub_frame_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
struct obj_section *s;
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
CORE_ADDR pc = frame_unwind_address_in_block (next_frame, NORMAL_FRAME);
|
||||
|
||||
if (in_plt_section (pc, NULL))
|
||||
return &mips_stub_frame_unwind;
|
||||
|
|
|
@ -850,9 +850,12 @@ mn10300_frame_unwind_cache (struct frame_info *next_frame,
|
|||
frame_id_build (trad_frame_get_this_base (cache),
|
||||
start));
|
||||
else
|
||||
trad_frame_set_id (cache,
|
||||
frame_id_build (trad_frame_get_this_base (cache),
|
||||
frame_func_unwind (next_frame)));
|
||||
{
|
||||
start = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
trad_frame_set_id (cache,
|
||||
frame_id_build (trad_frame_get_this_base (cache),
|
||||
start));
|
||||
}
|
||||
|
||||
(*this_prologue_cache) = cache;
|
||||
return cache;
|
||||
|
|
|
@ -891,7 +891,7 @@ mt_frame_unwind_cache (struct frame_info *next_frame,
|
|||
frame_unwind_unsigned_register (next_frame, MT_SP_REGNUM, &sp);
|
||||
frame_unwind_unsigned_register (next_frame, MT_FP_REGNUM, &fp);
|
||||
|
||||
start_addr = frame_func_unwind (next_frame);
|
||||
start_addr = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
|
||||
/* Return early if GDB couldn't find the function. */
|
||||
if (start_addr == 0)
|
||||
|
@ -1041,10 +1041,9 @@ mt_frame_this_id (struct frame_info *next_frame,
|
|||
mt_frame_unwind_cache (next_frame, this_prologue_cache);
|
||||
|
||||
if (!(info == NULL || info->prev_sp == 0))
|
||||
{
|
||||
(*this_id) = frame_id_build (info->prev_sp,
|
||||
frame_func_unwind (next_frame));
|
||||
}
|
||||
(*this_id) = frame_id_build (info->prev_sp,
|
||||
frame_func_unwind (next_frame, NORMAL_FRAME));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -2977,7 +2977,7 @@ rs6000_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||
(*this_cache) = cache;
|
||||
cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
|
||||
|
||||
func = frame_func_unwind (next_frame);
|
||||
func = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
pc = frame_pc_unwind (next_frame);
|
||||
skip_prologue (func, pc, &fdata);
|
||||
|
||||
|
@ -3129,7 +3129,8 @@ rs6000_frame_this_id (struct frame_info *next_frame, void **this_cache,
|
|||
{
|
||||
struct rs6000_frame_cache *info = rs6000_frame_cache (next_frame,
|
||||
this_cache);
|
||||
(*this_id) = frame_id_build (info->base, frame_func_unwind (next_frame));
|
||||
(*this_id) = frame_id_build (info->base,
|
||||
frame_func_unwind (next_frame, NORMAL_FRAME));
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -1232,7 +1232,7 @@ s390_prologue_frame_unwind_cache (struct frame_info *next_frame,
|
|||
bother searching for it -- with modern compilers this would be mostly
|
||||
pointless anyway. Trust that we'll either have valid DWARF-2 CFI data
|
||||
or else a valid backchain ... */
|
||||
func = frame_func_unwind (next_frame);
|
||||
func = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
if (!func)
|
||||
return 0;
|
||||
|
||||
|
@ -1556,14 +1556,15 @@ static const struct frame_unwind s390_stub_frame_unwind = {
|
|||
static const struct frame_unwind *
|
||||
s390_stub_frame_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
CORE_ADDR addr_in_block;
|
||||
bfd_byte insn[S390_MAX_INSTR_SIZE];
|
||||
|
||||
/* If the current PC points to non-readable memory, we assume we
|
||||
have trapped due to an invalid function pointer call. We handle
|
||||
the non-existing current function like a PLT stub. */
|
||||
if (in_plt_section (pc, NULL)
|
||||
|| s390_readinstruction (insn, pc) < 0)
|
||||
addr_in_block = frame_unwind_address_in_block (next_frame, NORMAL_FRAME);
|
||||
if (in_plt_section (addr_in_block, NULL)
|
||||
|| s390_readinstruction (insn, frame_pc_unwind (next_frame)) < 0)
|
||||
return &s390_stub_frame_unwind;
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -801,7 +801,8 @@ score_prologue_this_id (struct frame_info *next_frame, void **this_cache,
|
|||
{
|
||||
struct score_frame_cache *info = score_make_prologue_cache (next_frame,
|
||||
this_cache);
|
||||
(*this_id) = frame_id_build (info->base, frame_func_unwind (next_frame));
|
||||
(*this_id) = frame_id_build (info->base,
|
||||
frame_func_unwind (next_frame, NORMAL_FRAME));
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -2215,7 +2215,7 @@ sh_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||
if (cache->base == 0)
|
||||
return cache;
|
||||
|
||||
cache->pc = frame_func_unwind (next_frame);
|
||||
cache->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
current_pc = frame_pc_unwind (next_frame);
|
||||
if (cache->pc != 0)
|
||||
sh_analyze_prologue (cache->pc, current_pc, cache);
|
||||
|
|
|
@ -2253,7 +2253,7 @@ sh64_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||
if (cache->base == 0)
|
||||
return cache;
|
||||
|
||||
cache->pc = frame_func_unwind (next_frame);
|
||||
cache->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
if (cache->pc != 0)
|
||||
sh64_analyze_prologue (current_gdbarch, cache, cache->pc, current_pc);
|
||||
|
||||
|
|
|
@ -699,12 +699,9 @@ sparc_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||
cache = sparc_alloc_frame_cache ();
|
||||
*this_cache = cache;
|
||||
|
||||
cache->pc = frame_func_unwind (next_frame);
|
||||
cache->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
if (cache->pc != 0)
|
||||
{
|
||||
CORE_ADDR addr_in_block = frame_unwind_address_in_block (next_frame);
|
||||
sparc_analyze_prologue (cache->pc, addr_in_block, cache);
|
||||
}
|
||||
sparc_analyze_prologue (cache->pc, frame_pc_unwind (next_frame), cache);
|
||||
|
||||
if (cache->frameless_p)
|
||||
{
|
||||
|
@ -1054,7 +1051,7 @@ sparc32_stabs_argument_has_addr (struct gdbarch *gdbarch, struct type *type)
|
|||
static int
|
||||
sparc32_dwarf2_struct_return_p (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_unwind_address_in_block (next_frame);
|
||||
CORE_ADDR pc = frame_unwind_address_in_block (next_frame, NORMAL_FRAME);
|
||||
struct symbol *sym = find_pc_function (pc);
|
||||
|
||||
if (sym)
|
||||
|
|
|
@ -205,7 +205,7 @@ sparc64obsd_sigtramp_frame_sniffer (struct frame_info *next_frame)
|
|||
/* Kernel debugging support. */
|
||||
|
||||
static struct sparc_frame_cache *
|
||||
sparc64obsd_trapframe_cache(struct frame_info *next_frame, void **this_cache)
|
||||
sparc64obsd_trapframe_cache (struct frame_info *next_frame, void **this_cache)
|
||||
{
|
||||
struct sparc_frame_cache *cache;
|
||||
CORE_ADDR sp, trapframe_addr;
|
||||
|
@ -267,15 +267,17 @@ static const struct frame_unwind sparc64obsd_trapframe_unwind =
|
|||
static const struct frame_unwind *
|
||||
sparc64obsd_trapframe_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc;
|
||||
ULONGEST pstate;
|
||||
char *name;
|
||||
|
||||
/* Check whether we are in privileged mode, and bail out if we're not. */
|
||||
pstate = frame_unwind_register_unsigned(next_frame, SPARC64_PSTATE_REGNUM);
|
||||
pstate = frame_unwind_register_unsigned (next_frame, SPARC64_PSTATE_REGNUM);
|
||||
if ((pstate & SPARC64_PSTATE_PRIV) == 0)
|
||||
return NULL;
|
||||
|
||||
find_pc_partial_function (frame_pc_unwind (next_frame), &name, NULL, NULL);
|
||||
pc = frame_unwind_address_in_block (next_frame, NORMAL_FRAME);
|
||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
if (name && strcmp (name, "Lslowtrap_reenter") == 0)
|
||||
return &sparc64obsd_trapframe_unwind;
|
||||
|
||||
|
|
|
@ -587,7 +587,7 @@ spu_frame_unwind_cache (struct frame_info *next_frame,
|
|||
info->local_base = 0;
|
||||
|
||||
/* Find the start of the current function, and analyze its prologue. */
|
||||
info->func = frame_func_unwind (next_frame);
|
||||
info->func = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
if (info->func == 0)
|
||||
{
|
||||
/* Fall back to using the current PC as frame ID. */
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2007-02-27 Daniel Jacobowitz <dan@codesourcery.com>
|
||||
|
||||
* gdb.arch/i386-signal.c, gdb.arch/i386-signal.exp: New files.
|
||||
|
||||
2007-02-27 Daniel Jacobowitz <dan@codesourcery.com>
|
||||
|
||||
* gdb.base/maint.exp: Remove full paths from test names.
|
||||
|
|
55
gdb/testsuite/gdb.arch/i386-signal.c
Normal file
55
gdb/testsuite/gdb.arch/i386-signal.c
Normal file
|
@ -0,0 +1,55 @@
|
|||
/* Unwinder test program for signal frames.
|
||||
|
||||
Copyright 2007 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
void sigframe (void);
|
||||
void setup (void);
|
||||
|
||||
void
|
||||
func (void)
|
||||
{
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
setup ();
|
||||
}
|
||||
|
||||
/* Create an imitation signal frame. This will work on any x86 or
|
||||
x86-64 target which uses a version of GAS recent enough for
|
||||
.cfi_signal_frame (added 2006-02-27 and included in binutils 2.17).
|
||||
The default CIE created by gas suffices to unwind from an empty
|
||||
function. */
|
||||
|
||||
asm(".text\n"
|
||||
" .align 8\n"
|
||||
" .globl setup\n"
|
||||
"setup:\n"
|
||||
" push $sigframe\n"
|
||||
" jmp func\n"
|
||||
"\n"
|
||||
" .cfi_startproc\n"
|
||||
" .cfi_signal_frame\n"
|
||||
" nop\n"
|
||||
" .globl sigframe\n"
|
||||
"sigframe:\n"
|
||||
" ret\n"
|
||||
" .cfi_endproc");
|
43
gdb/testsuite/gdb.arch/i386-signal.exp
Normal file
43
gdb/testsuite/gdb.arch/i386-signal.exp
Normal file
|
@ -0,0 +1,43 @@
|
|||
# Copyright 2007 Free Software Foundation, Inc.
|
||||
|
||||
# This file is part of the GDB testsuite.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } then {
|
||||
verbose "Skipping i386 unwinder tests."
|
||||
return
|
||||
}
|
||||
|
||||
set testfile "i386-signal"
|
||||
set srcfile ${testfile}.c
|
||||
set binfile ${objdir}/${subdir}/${testfile}
|
||||
|
||||
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
|
||||
executable { debug }] != "" } {
|
||||
untested i386-sigframe.exp
|
||||
return -1
|
||||
}
|
||||
|
||||
gdb_exit
|
||||
gdb_start
|
||||
gdb_reinitialize_dir $srcdir/$subdir
|
||||
gdb_load ${binfile}
|
||||
|
||||
runto func
|
||||
gdb_test "backtrace 10" \
|
||||
"#0 ($hex in )?func.*\r\n#1 <signal handler called>\r\n#2 ($hex in)?main.*"
|
||||
|
||||
gdb_test "finish" "Run till exit from \#0 func.*<signal handler called>"
|
|
@ -856,7 +856,7 @@ v850_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||
if (cache->base == 0)
|
||||
return cache;
|
||||
|
||||
cache->pc = frame_func_unwind (next_frame);
|
||||
cache->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
current_pc = frame_pc_unwind (next_frame);
|
||||
if (cache->pc != 0)
|
||||
v850_analyze_prologue (cache->pc, current_pc, cache);
|
||||
|
|
|
@ -384,7 +384,8 @@ vax_frame_this_id (struct frame_info *next_frame, void **this_cache,
|
|||
if (cache->base == 0)
|
||||
return;
|
||||
|
||||
(*this_id) = frame_id_build (cache->base, frame_func_unwind (next_frame));
|
||||
(*this_id) = frame_id_build (cache->base,
|
||||
frame_func_unwind (next_frame, NORMAL_FRAME));
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -655,7 +655,7 @@ xstormy16_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||
if (cache->base == 0)
|
||||
return cache;
|
||||
|
||||
cache->pc = frame_func_unwind (next_frame);
|
||||
cache->pc = frame_func_unwind (next_frame, NORMAL_FRAME);
|
||||
current_pc = frame_pc_unwind (next_frame);
|
||||
if (cache->pc)
|
||||
xstormy16_analyze_prologue (cache->pc, current_pc, cache, next_frame);
|
||||
|
|
|
@ -924,7 +924,7 @@ xtensa_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||
cache->ws = ws & ~(1 << wb);
|
||||
}
|
||||
|
||||
cache->pc = ((frame_func_unwind (next_frame) & 0xc0000000)
|
||||
cache->pc = ((frame_func_unwind (next_frame, NORMAL_FRAME) & 0xc0000000)
|
||||
| (ra & 0x3fffffff));
|
||||
cache->ps = (ps & ~PS_CALLINC_MASK) | ((WINSIZE(ra)/4) << PS_CALLINC_SHIFT);
|
||||
|
||||
|
|
Loading…
Reference in a new issue