stack: check frame_unwind_caller_id

Callers of frame_unwind_caller_* functions are supposed to check
frame_unwind_caller_id.

Add such a check to frame_info and treat an invalid caller ID as if the caller
PC were not available.

gdb/
	* stack.c (frame_info): Check frame_unwind_caller_id.
This commit is contained in:
Markus Metzger 2016-02-11 11:07:09 +01:00
parent 2f3ef606b9
commit a038fa3e14
2 changed files with 26 additions and 17 deletions

View File

@ -1,3 +1,7 @@
2016-02-12 Markus Metzger <markus.t.metzger@intel.com>
* stack.c (frame_info): Check frame_unwind_caller_id.
2016-02-12 Markus Metzger <markus.t.metzger@intel.com>
* frame.h (skip_tailcall_frames): New.

View File

@ -1509,27 +1509,32 @@ frame_info (char *addr_exp, int from_tty)
wrap_here (" ");
printf_filtered ("saved %s = ", pc_regname);
TRY
if (!frame_id_p (frame_unwind_caller_id (fi)))
val_print_unavailable (gdb_stdout);
else
{
caller_pc = frame_unwind_caller_pc (fi);
caller_pc_p = 1;
}
CATCH (ex, RETURN_MASK_ERROR)
{
switch (ex.error)
TRY
{
case NOT_AVAILABLE_ERROR:
val_print_unavailable (gdb_stdout);
break;
case OPTIMIZED_OUT_ERROR:
val_print_not_saved (gdb_stdout);
break;
default:
fprintf_filtered (gdb_stdout, _("<error: %s>"), ex.message);
break;
caller_pc = frame_unwind_caller_pc (fi);
caller_pc_p = 1;
}
CATCH (ex, RETURN_MASK_ERROR)
{
switch (ex.error)
{
case NOT_AVAILABLE_ERROR:
val_print_unavailable (gdb_stdout);
break;
case OPTIMIZED_OUT_ERROR:
val_print_not_saved (gdb_stdout);
break;
default:
fprintf_filtered (gdb_stdout, _("<error: %s>"), ex.message);
break;
}
}
END_CATCH
}
END_CATCH
if (caller_pc_p)
fputs_filtered (paddress (gdbarch, caller_pc), gdb_stdout);