gdb/
* frame.h (frame_unwind_caller_pc_if_available): Declare. * frame.c (frame_unwind_caller_pc_if_available): New. * stack.c (frame_info): Handle unavailable PC.
This commit is contained in:
parent
e3eebbd742
commit
008f8f2ee9
4 changed files with 36 additions and 7 deletions
|
@ -710,6 +710,13 @@ frame_unwind_caller_pc (struct frame_info *this_frame)
|
|||
return frame_unwind_pc (skip_inlined_frames (this_frame));
|
||||
}
|
||||
|
||||
int
|
||||
frame_unwind_caller_pc_if_available (struct frame_info *this_frame,
|
||||
CORE_ADDR *pc)
|
||||
{
|
||||
return frame_unwind_pc_if_available (skip_inlined_frames (this_frame), pc);
|
||||
}
|
||||
|
||||
int
|
||||
get_frame_func_if_available (struct frame_info *this_frame, CORE_ADDR *pc)
|
||||
{
|
||||
|
|
|
@ -562,6 +562,14 @@ extern void put_frame_register_bytes (struct frame_info *frame, int regnum,
|
|||
|
||||
extern CORE_ADDR frame_unwind_caller_pc (struct frame_info *frame);
|
||||
|
||||
/* Same as frame_unwind_caller_pc, but returns a boolean indication of
|
||||
whether the caller PC is determinable (when the PC is unavailable,
|
||||
it will not be), instead of possibly throwing an error trying to
|
||||
read unavailable memory or registers. */
|
||||
|
||||
extern int frame_unwind_caller_pc_if_available (struct frame_info *this_frame,
|
||||
CORE_ADDR *pc);
|
||||
|
||||
/* Discard the specified frame. Restoring the registers to the state
|
||||
of the caller. */
|
||||
extern void frame_pop (struct frame_info *frame);
|
||||
|
|
20
gdb/stack.c
20
gdb/stack.c
|
@ -1031,6 +1031,9 @@ frame_info (char *addr_exp, int from_tty)
|
|||
int selected_frame_p;
|
||||
struct gdbarch *gdbarch;
|
||||
struct cleanup *back_to = make_cleanup (null_cleanup, NULL);
|
||||
CORE_ADDR frame_pc;
|
||||
int frame_pc_p;
|
||||
CORE_ADDR caller_pc;
|
||||
|
||||
fi = parse_frame_specification_1 (addr_exp, "No stack.", &selected_frame_p);
|
||||
gdbarch = get_frame_arch (fi);
|
||||
|
@ -1049,11 +1052,10 @@ frame_info (char *addr_exp, int from_tty)
|
|||
get_frame_pc(). */
|
||||
pc_regname = "pc";
|
||||
|
||||
frame_pc_p = get_frame_pc_if_available (fi, &frame_pc);
|
||||
find_frame_sal (fi, &sal);
|
||||
func = get_frame_function (fi);
|
||||
/* FIXME: cagney/2002-11-28: Why bother? Won't sal.symtab contain
|
||||
the same value? */
|
||||
s = find_pc_symtab (get_frame_pc (fi));
|
||||
s = sal.symtab;
|
||||
if (func)
|
||||
{
|
||||
funname = SYMBOL_PRINT_NAME (func);
|
||||
|
@ -1074,11 +1076,11 @@ frame_info (char *addr_exp, int from_tty)
|
|||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
else if (frame_pc_p)
|
||||
{
|
||||
struct minimal_symbol *msymbol;
|
||||
|
||||
msymbol = lookup_minimal_symbol_by_pc (get_frame_pc (fi));
|
||||
msymbol = lookup_minimal_symbol_by_pc (frame_pc);
|
||||
if (msymbol != NULL)
|
||||
{
|
||||
funname = SYMBOL_PRINT_NAME (msymbol);
|
||||
|
@ -1099,7 +1101,10 @@ frame_info (char *addr_exp, int from_tty)
|
|||
fputs_filtered (paddress (gdbarch, get_frame_base (fi)), gdb_stdout);
|
||||
printf_filtered (":\n");
|
||||
printf_filtered (" %s = ", pc_regname);
|
||||
if (frame_pc_p)
|
||||
fputs_filtered (paddress (gdbarch, get_frame_pc (fi)), gdb_stdout);
|
||||
else
|
||||
fputs_filtered ("<unavailable>", gdb_stdout);
|
||||
|
||||
wrap_here (" ");
|
||||
if (funname)
|
||||
|
@ -1114,7 +1119,10 @@ frame_info (char *addr_exp, int from_tty)
|
|||
puts_filtered ("; ");
|
||||
wrap_here (" ");
|
||||
printf_filtered ("saved %s ", pc_regname);
|
||||
fputs_filtered (paddress (gdbarch, frame_unwind_caller_pc (fi)), gdb_stdout);
|
||||
if (frame_unwind_caller_pc_if_available (fi, &caller_pc))
|
||||
fputs_filtered (paddress (gdbarch, caller_pc), gdb_stdout);
|
||||
else
|
||||
fputs_filtered ("<unavailable>", gdb_stdout);
|
||||
printf_filtered ("\n");
|
||||
|
||||
if (calling_frame_info == NULL)
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2011-03-18 Pedro Alves <pedro@codesourcery.com>
|
||||
|
||||
* frame.h (frame_unwind_caller_pc_if_available): Declare.
|
||||
* frame.c (frame_unwind_caller_pc_if_available): New.
|
||||
* stack.c (frame_info): Handle unavailable PC.
|
||||
|
||||
2011-03-18 Pedro Alves <pedro@codesourcery.com>
|
||||
|
||||
* frame.c (frame_unwind_pc): Rename to ...
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue