From b0e4b369d519f9c604bddd6305e64dbb9f794256 Mon Sep 17 00:00:00 2001 From: Alan Hayward Date: Fri, 24 Feb 2017 16:09:48 +0000 Subject: [PATCH] Remove use of MAX_REGISTER_SIZE gdb/ * stack.c (frame_info): Use frame_unwind_register_value to avoid buf. --- gdb/ChangeLog | 4 +++ gdb/stack.c | 83 ++++++++++++++++++++++++++------------------------- 2 files changed, 46 insertions(+), 41 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 321070467f3..ed9fc6a707d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2017-02-24 Alan Hayward + + * stack.c (frame_info): Use frame_unwind_register_value to avoid buf. + 2017-02-24 Alan Hayward * i386-tdep.c (i386_pseudo_register_read_into_value): Use diff --git a/gdb/stack.c b/gdb/stack.c index aa3a80e9a82..1bad88e3247 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -1630,57 +1630,52 @@ frame_info (char *addr_exp, int from_tty) /* Print as much information as possible on the location of all the registers. */ { - enum lval_type lval; - int optimized; - int unavailable; - CORE_ADDR addr; - int realnum; int count; int i; int need_nl = 1; + int sp_regnum = gdbarch_sp_regnum (gdbarch); /* The sp is special; what's displayed isn't the save address, but the value of the previous frame's sp. This is a legacy thing, at one stage the frame cached the previous frame's SP instead of its address, hence it was easiest to just display the cached value. */ - if (gdbarch_sp_regnum (gdbarch) >= 0) + if (sp_regnum >= 0) { - /* Find out the location of the saved stack pointer with out - actually evaluating it. */ - frame_register_unwind (fi, gdbarch_sp_regnum (gdbarch), - &optimized, &unavailable, &lval, &addr, - &realnum, NULL); - if (!optimized && !unavailable && lval == not_lval) - { - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - int sp_size = register_size (gdbarch, gdbarch_sp_regnum (gdbarch)); - gdb_byte value[MAX_REGISTER_SIZE]; - CORE_ADDR sp; - - frame_register_unwind (fi, gdbarch_sp_regnum (gdbarch), - &optimized, &unavailable, &lval, &addr, - &realnum, value); - /* NOTE: cagney/2003-05-22: This is assuming that the - stack pointer was packed as an unsigned integer. That - may or may not be valid. */ - sp = extract_unsigned_integer (value, sp_size, byte_order); - printf_filtered (" Previous frame's sp is "); - fputs_filtered (paddress (gdbarch, sp), gdb_stdout); - printf_filtered ("\n"); - need_nl = 0; - } - else if (!optimized && !unavailable && lval == lval_memory) - { - printf_filtered (" Previous frame's sp at "); - fputs_filtered (paddress (gdbarch, addr), gdb_stdout); - printf_filtered ("\n"); - need_nl = 0; - } - else if (!optimized && !unavailable && lval == lval_register) + struct value *value = frame_unwind_register_value (fi, sp_regnum); + gdb_assert (value != NULL); + + if (!value_optimized_out (value) && value_entirely_available (value)) { - printf_filtered (" Previous frame's sp in %s\n", - gdbarch_register_name (gdbarch, realnum)); + if (VALUE_LVAL (value) == not_lval) + { + CORE_ADDR sp; + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + int sp_size = register_size (gdbarch, sp_regnum); + + sp = extract_unsigned_integer (value_contents_all (value), + sp_size, byte_order); + + printf_filtered (" Previous frame's sp is "); + fputs_filtered (paddress (gdbarch, sp), gdb_stdout); + printf_filtered ("\n"); + } + else if (VALUE_LVAL (value) == lval_memory) + { + printf_filtered (" Previous frame's sp at "); + fputs_filtered (paddress (gdbarch, value_address (value)), + gdb_stdout); + printf_filtered ("\n"); + } + else if (VALUE_LVAL (value) == lval_register) + { + printf_filtered (" Previous frame's sp in %s\n", + gdbarch_register_name (gdbarch, + VALUE_REGNUM (value))); + } + + release_value (value); + value_free (value); need_nl = 0; } /* else keep quiet. */ @@ -1690,9 +1685,15 @@ frame_info (char *addr_exp, int from_tty) numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch); for (i = 0; i < numregs; i++) - if (i != gdbarch_sp_regnum (gdbarch) + if (i != sp_regnum && gdbarch_register_reggroup_p (gdbarch, i, all_reggroup)) { + enum lval_type lval; + int optimized; + int unavailable; + CORE_ADDR addr; + int realnum; + /* Find out the location of the saved register without fetching the corresponding value. */ frame_register_unwind (fi, i, &optimized, &unavailable, -- 2.30.2