[PATCH 2/3] Apply stub unwinder to 'bx reg' trampoline
Joel Brobecker
brobecker@adacore.com
Mon Jun 23 13:18:00 GMT 2014
> 2014-06-09 Yao Qi <yao@codesourcery.com>
>
> * arm-tdep.c (arm_skip_bx_reg): Declare.
> (arm_stub_unwind_sniffer): Return 1 if arm_skip_bx_reg returns
> non-zero.
This is OK as well. As suggested in patch #1, consider moving
arm_skip_bx_reg up to avoid the need for the declaration.
> ---
> gdb/arm-tdep.c | 11 ++++++++++-
> 1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
> index 2430a86..e3f7f0c 100644
> --- a/gdb/arm-tdep.c
> +++ b/gdb/arm-tdep.c
> @@ -2899,6 +2899,8 @@ arm_stub_this_id (struct frame_info *this_frame,
> *this_id = frame_id_build (cache->prev_sp, get_frame_pc (this_frame));
> }
>
> +static CORE_ADDR arm_skip_bx_reg (struct frame_info *frame, CORE_ADDR pc);
> +
> static int
> arm_stub_unwind_sniffer (const struct frame_unwind *self,
> struct frame_info *this_frame,
> @@ -2906,12 +2908,19 @@ arm_stub_unwind_sniffer (const struct frame_unwind *self,
> {
> CORE_ADDR addr_in_block;
> gdb_byte dummy[4];
> + CORE_ADDR pc, start_addr;
> + const char *name;
>
> addr_in_block = get_frame_address_in_block (this_frame);
> + pc = get_frame_pc (this_frame);
> if (in_plt_section (addr_in_block)
> /* We also use the stub winder if the target memory is unreadable
> to avoid having the prologue unwinder trying to read it. */
> - || target_read_memory (get_frame_pc (this_frame), dummy, 4) != 0)
> + || target_read_memory (pc, dummy, 4) != 0)
> + return 1;
> +
> + if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0
> + && arm_skip_bx_reg (this_frame, pc) != 0)
> return 1;
>
> return 0;
> --
> 1.9.0
--
Joel
More information about the Gdb-patches
mailing list