This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH v2] Rename in_function_epilogue_p to stack_frame_destroyed_p
- From: Martin Galvan <martin dot galvan at tallertechnologies dot com>
- To: Yao Qi <qiyaoltc at gmail dot com>
- Cc: gdb-patches <gdb-patches at sourceware dot org>, Pedro Alves <palves at redhat dot com>, Daniel Gutson <daniel dot gutson at tallertechnologies dot com>
- Date: Tue, 26 May 2015 09:35:43 -0300
- Subject: Re: [PATCH v2] Rename in_function_epilogue_p to stack_frame_destroyed_p
- Authentication-results: sourceware.org; auth=none
- References: <1432341054-12148-1-git-send-email-martin dot galvan at tallertechnologies dot com> <86pp5nr41x dot fsf at gmail dot com>
Thanks a lot, Yao! Yes, I have a couple more patches on the works.
I'll see if I can get a "commit after approval" access; Doug Evans
suggested the same on a previous patch.
Again, thanks a lot for reviewing this.
On Tue, May 26, 2015 at 8:06 AM, Yao Qi <qiyaoltc@gmail.com> wrote:
> Martin Galvan <martin.galvan@tallertechnologies.com> writes:
>
>> * Changes in v2: Re-created the patch from the current sources and rewrote
>> some comments.
>
> Hi Martin,
> Thanks a lot for doing this ....
>
>>
>> I have a company-wide copyright assignment for gdb. I don't have write
>> access
>
> Yes, I checked /gd/gnuorg/copyright.list and your assignment is there.
>
>> though, so it would be great if someone could commit this for me.
>
> The patch is OK to me except for some minor things in changelog entry
> and comment style. I point them out here. I fix them in the patch
> below and will push it in. If you have GDB patches to contribute in the
> future, you can apply for an account on sourceware.org.
>
>>
>> gdb/
>> 2015-05-22 Martin Galvan <martin.galvan@tallertechnologies.com>
>>
>> * amd64-tdep.c: Replace in_function_epilogue_p with
>> stack_frame_destroyed_p throughout.
>> * arch-utils.c: Ditto.
>> * arch-utils.h: Ditto.
>> * arm-tdep.c: Ditto.
>> * breakpoint.c: Ditto.
>> * gdbarch.c: Ditto.
>> * gdbarch.h: Ditto.
>> * gdbarch.sh: Ditto.
>
> gdbarch.c and gdbarch.h is re-generated by changed gdbarsh.sh, so we
> usually describe the changes in this way:
>
> * gdbarch.c, gdbarch.h: Re-generated.
>
>> diff --git a/gdb/score-tdep.c b/gdb/score-tdep.c
>> index 9cd5038..7ba3a61 100644
>> --- a/gdb/score-tdep.c
>> +++ b/gdb/score-tdep.c
>> @@ -737,8 +737,9 @@ score3_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
>> return pc;
>> }
>>
>> +/* Implement the stack_frame_destroyed_p gdbarch method. */
>
> A blank line is needed here.
>
>> static int
>> -score7_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR cur_pc)
>> +score7_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR cur_pc)
>> {
>> inst_t *inst = score7_fetch_inst (gdbarch, cur_pc, NULL);
>>
>> @@ -761,8 +762,9 @@ score7_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR cur_pc)
>> return 0;
>> }
>>
>> +/* Implement the stack_frame_destroyed_p gdbarch method. */
>
> Likewise.
>
> I rebuild GDB with --enable-targets=all --enable-64-bit-bfd. I'll push
> it in soon.
>
> --
> Yao (éå)
>
> From: Martin Galvan <martin.galvan@tallertechnologies.com>
> Date: Tue, 26 May 2015 11:59:17 +0100
> Subject: [PATCH] Rename in_function_epilogue_p to stack_frame_destroyed_p
>
> We concluded that gdbarch_in_function_epilogue_p is misnamed, since it
> returns true if the given PC is one instruction after the one that
> destroyed the stack (which isn't necessarily inside an epilogue),
> therefore it should be renamed to stack_frame_destroyed_p.
>
> I also took the liberty of renaming the arch-specific implementations to
> *_stack_frame_destroyed_p as well for consistency.
>
> gdb:
>
> 2015-05-26 Martin Galvan <martin.galvan@tallertechnologies.com>
>
> * amd64-tdep.c: Replace in_function_epilogue_p with
> stack_frame_destroyed_p throughout.
> * arch-utils.c: Ditto.
> * arch-utils.h: Ditto.
> * arm-tdep.c: Ditto.
> * breakpoint.c: Ditto.
> * gdbarch.sh: Ditto.
> * hppa-tdep.c: Ditto.
> * i386-tdep.c: Ditto.
> * mips-tdep.c: Ditto.
> * nios2-tdep.c: Ditto.
> * rs6000-tdep.c: Ditto.
> * s390-linux-tdep.c: Ditto.
> * score-tdep.c: Ditto.
> * sh-tdep.c: Ditto.
> * sparc-tdep.c: Ditto.
> * sparc-tdep.h: Ditto.
> * sparc64-tdep.c: Ditto.
> * spu-tdep.c: Ditto.
> * tic6x-tdep.c: Ditto.
> * tilegx-tdep.c: Ditto.
> * xstormy16-tdep.c: Ditto.
> * gdbarch.c, gdbarch.h: Re-generated.
>
> diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
> index 461b701..5e63b5e 100644
> --- a/gdb/amd64-tdep.c
> +++ b/gdb/amd64-tdep.c
> @@ -2719,12 +2719,14 @@ static const struct frame_base amd64_frame_base =
>
> /* Normal frames, but in a function epilogue. */
>
> -/* The epilogue is defined here as the 'ret' instruction, which will
> +/* Implement the stack_frame_destroyed_p gdbarch method.
> +
> + The epilogue is defined here as the 'ret' instruction, which will
> follow any instruction such as 'leave' or 'pop %ebp' that destroys
> the function's stack frame. */
>
> static int
> -amd64_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +amd64_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> gdb_byte insn;
> struct compunit_symtab *cust;
> @@ -2748,8 +2750,8 @@ amd64_epilogue_frame_sniffer (const struct frame_unwind *self,
> void **this_prologue_cache)
> {
> if (frame_relative_level (this_frame) == 0)
> - return amd64_in_function_epilogue_p (get_frame_arch (this_frame),
> - get_frame_pc (this_frame));
> + return amd64_stack_frame_destroyed_p (get_frame_arch (this_frame),
> + get_frame_pc (this_frame));
> else
> return 0;
> }
> diff --git a/gdb/arch-utils.c b/gdb/arch-utils.c
> index e1c8ab0..8c3eb7c 100644
> --- a/gdb/arch-utils.c
> +++ b/gdb/arch-utils.c
> @@ -127,7 +127,7 @@ generic_in_solib_return_trampoline (struct gdbarch *gdbarch,
> }
>
> int
> -generic_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +generic_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> return 0;
> }
> diff --git a/gdb/arch-utils.h b/gdb/arch-utils.h
> index ed3bec9..1be323b 100644
> --- a/gdb/arch-utils.h
> +++ b/gdb/arch-utils.h
> @@ -104,8 +104,8 @@ extern CORE_ADDR generic_skip_solib_resolver (struct gdbarch *gdbarch,
> extern int generic_in_solib_return_trampoline (struct gdbarch *gdbarch,
> CORE_ADDR pc, const char *name);
>
> -extern int generic_in_function_epilogue_p (struct gdbarch *gdbarch,
> - CORE_ADDR pc);
> +extern int generic_stack_frame_destroyed_p (struct gdbarch *gdbarch,
> + CORE_ADDR pc);
>
> /* By default, registers are not convertible. */
> extern int generic_convert_register_p (struct gdbarch *gdbarch, int regnum,
> diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
> index 8181f25..638855b 100644
> --- a/gdb/arm-tdep.c
> +++ b/gdb/arm-tdep.c
> @@ -3223,11 +3223,10 @@ arm_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
> }
> }
>
> -/* Return true if we are in the function's epilogue, i.e. after the
> - instruction that destroyed the function's stack frame. */
> +/* Implement the stack_frame_destroyed_p gdbarch method. */
>
> static int
> -thumb_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +thumb_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
> unsigned int insn, insn2;
> @@ -3334,11 +3333,10 @@ thumb_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> return found_stack_adjust;
> }
>
> -/* Return true if we are in the function's epilogue, i.e. after the
> - instruction that destroyed the function's stack frame. */
> +/* Implement the stack_frame_destroyed_p gdbarch method. */
>
> static int
> -arm_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +arm_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
> unsigned int insn;
> @@ -3346,7 +3344,7 @@ arm_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> CORE_ADDR func_start, func_end;
>
> if (arm_pc_is_thumb (gdbarch, pc))
> - return thumb_in_function_epilogue_p (gdbarch, pc);
> + return thumb_stack_frame_destroyed_p (gdbarch, pc);
>
> if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
> return 0;
> @@ -10356,8 +10354,8 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
> /* Advance PC across function entry code. */
> set_gdbarch_skip_prologue (gdbarch, arm_skip_prologue);
>
> - /* Detect whether PC is in function epilogue. */
> - set_gdbarch_in_function_epilogue_p (gdbarch, arm_in_function_epilogue_p);
> + /* Detect whether PC is at a point where the stack has been destroyed. */
> + set_gdbarch_stack_frame_destroyed_p (gdbarch, arm_stack_frame_destroyed_p);
>
> /* Skip trampolines. */
> set_gdbarch_skip_trampoline_code (gdbarch, arm_skip_stub);
> diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
> index a3531a0..657c58e 100644
> --- a/gdb/breakpoint.c
> +++ b/gdb/breakpoint.c
> @@ -1837,10 +1837,11 @@ update_watchpoint (struct watchpoint *b, int reparse)
> struct gdbarch *frame_arch = get_frame_arch (fi);
> CORE_ADDR frame_pc = get_frame_pc (fi);
>
> - /* If we're in a function epilogue, unwinding may not work
> - properly, so do not attempt to recreate locations at this
> + /* If we're at a point where the stack has been destroyed
> + (e.g. in a function epilogue), unwinding may not work
> + properly. Do not attempt to recreate locations at this
> point. See similar comments in watchpoint_check. */
> - if (gdbarch_in_function_epilogue_p (frame_arch, frame_pc))
> + if (gdbarch_stack_frame_destroyed_p (frame_arch, frame_pc))
> return;
>
> /* Save the current frame's ID so we can restore it after
> @@ -5037,7 +5038,7 @@ watchpoint_check (void *p)
> struct gdbarch *frame_arch = get_frame_arch (frame);
> CORE_ADDR frame_pc = get_frame_pc (frame);
>
> - /* in_function_epilogue_p() returns a non-zero value if we're
> + /* stack_frame_destroyed_p() returns a non-zero value if we're
> still in the function but the stack frame has already been
> invalidated. Since we can't rely on the values of local
> variables after the stack has been destroyed, we are treating
> @@ -5046,7 +5047,7 @@ watchpoint_check (void *p)
> frame is in an epilogue - even if they are in some other
> frame, our view of the stack is likely to be wrong and
> frame_find_by_id could error out. */
> - if (gdbarch_in_function_epilogue_p (frame_arch, frame_pc))
> + if (gdbarch_stack_frame_destroyed_p (frame_arch, frame_pc))
> return WP_IGNORE;
>
> fr = frame_find_by_id (b->watchpoint_frame);
> diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c
> index 97874c9..821ad5e 100644
> --- a/gdb/gdbarch.c
> +++ b/gdb/gdbarch.c
> @@ -249,7 +249,7 @@ struct gdbarch
> gdbarch_skip_trampoline_code_ftype *skip_trampoline_code;
> gdbarch_skip_solib_resolver_ftype *skip_solib_resolver;
> gdbarch_in_solib_return_trampoline_ftype *in_solib_return_trampoline;
> - gdbarch_in_function_epilogue_p_ftype *in_function_epilogue_p;
> + gdbarch_stack_frame_destroyed_p_ftype *stack_frame_destroyed_p;
> gdbarch_elf_make_msymbol_special_ftype *elf_make_msymbol_special;
> gdbarch_coff_make_msymbol_special_ftype *coff_make_msymbol_special;
> gdbarch_make_symbol_special_ftype *make_symbol_special;
> @@ -402,7 +402,7 @@ gdbarch_alloc (const struct gdbarch_info *info,
> gdbarch->skip_trampoline_code = generic_skip_trampoline_code;
> gdbarch->skip_solib_resolver = generic_skip_solib_resolver;
> gdbarch->in_solib_return_trampoline = generic_in_solib_return_trampoline;
> - gdbarch->in_function_epilogue_p = generic_in_function_epilogue_p;
> + gdbarch->stack_frame_destroyed_p = generic_stack_frame_destroyed_p;
> gdbarch->coff_make_msymbol_special = default_coff_make_msymbol_special;
> gdbarch->make_symbol_special = default_make_symbol_special;
> gdbarch->adjust_dwarf2_addr = default_adjust_dwarf2_addr;
> @@ -580,7 +580,7 @@ verify_gdbarch (struct gdbarch *gdbarch)
> /* Skip verify of skip_trampoline_code, invalid_p == 0 */
> /* Skip verify of skip_solib_resolver, invalid_p == 0 */
> /* Skip verify of in_solib_return_trampoline, invalid_p == 0 */
> - /* Skip verify of in_function_epilogue_p, invalid_p == 0 */
> + /* Skip verify of stack_frame_destroyed_p, invalid_p == 0 */
> /* Skip verify of elf_make_msymbol_special, has predicate. */
> /* Skip verify of coff_make_msymbol_special, invalid_p == 0 */
> /* Skip verify of make_symbol_special, invalid_p == 0 */
> @@ -1020,8 +1020,8 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
> "gdbarch_dump: have_nonsteppable_watchpoint = %s\n",
> plongest (gdbarch->have_nonsteppable_watchpoint));
> fprintf_unfiltered (file,
> - "gdbarch_dump: in_function_epilogue_p = <%s>\n",
> - host_address_to_string (gdbarch->in_function_epilogue_p));
> + "gdbarch_dump: stack_frame_destroyed_p = <%s>\n",
> + host_address_to_string (gdbarch->stack_frame_destroyed_p));
> fprintf_unfiltered (file,
> "gdbarch_dump: in_solib_return_trampoline = <%s>\n",
> host_address_to_string (gdbarch->in_solib_return_trampoline));
> @@ -3110,20 +3110,20 @@ set_gdbarch_in_solib_return_trampoline (struct gdbarch *gdbarch,
> }
>
> int
> -gdbarch_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR addr)
> +gdbarch_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR addr)
> {
> gdb_assert (gdbarch != NULL);
> - gdb_assert (gdbarch->in_function_epilogue_p != NULL);
> + gdb_assert (gdbarch->stack_frame_destroyed_p != NULL);
> if (gdbarch_debug >= 2)
> - fprintf_unfiltered (gdb_stdlog, "gdbarch_in_function_epilogue_p called\n");
> - return gdbarch->in_function_epilogue_p (gdbarch, addr);
> + fprintf_unfiltered (gdb_stdlog, "gdbarch_stack_frame_destroyed_p called\n");
> + return gdbarch->stack_frame_destroyed_p (gdbarch, addr);
> }
>
> void
> -set_gdbarch_in_function_epilogue_p (struct gdbarch *gdbarch,
> - gdbarch_in_function_epilogue_p_ftype in_function_epilogue_p)
> +set_gdbarch_stack_frame_destroyed_p (struct gdbarch *gdbarch,
> + gdbarch_stack_frame_destroyed_p_ftype stack_frame_destroyed_p)
> {
> - gdbarch->in_function_epilogue_p = in_function_epilogue_p;
> + gdbarch->stack_frame_destroyed_p = stack_frame_destroyed_p;
> }
>
> int
> diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h
> index c94c19c..6f9e844 100644
> --- a/gdb/gdbarch.h
> +++ b/gdb/gdbarch.h
> @@ -685,7 +685,7 @@ extern void set_gdbarch_in_solib_return_trampoline (struct gdbarch *gdbarch, gdb
>
> /* A target might have problems with watchpoints as soon as the stack
> frame of the current function has been destroyed. This mostly happens
> - as the first action in a funtion's epilogue. in_function_epilogue_p()
> + as the first action in a function's epilogue. stack_frame_destroyed_p()
> is defined to return a non-zero value if either the given addr is one
> instruction after the stack destroying instruction up to the trailing
> return instruction or if we can figure out that the stack frame has
> @@ -693,9 +693,9 @@ extern void set_gdbarch_in_solib_return_trampoline (struct gdbarch *gdbarch, gdb
> which don't suffer from that problem could just let this functionality
> untouched. */
>
> -typedef int (gdbarch_in_function_epilogue_p_ftype) (struct gdbarch *gdbarch, CORE_ADDR addr);
> -extern int gdbarch_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR addr);
> -extern void set_gdbarch_in_function_epilogue_p (struct gdbarch *gdbarch, gdbarch_in_function_epilogue_p_ftype *in_function_epilogue_p);
> +typedef int (gdbarch_stack_frame_destroyed_p_ftype) (struct gdbarch *gdbarch, CORE_ADDR addr);
> +extern int gdbarch_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR addr);
> +extern void set_gdbarch_stack_frame_destroyed_p (struct gdbarch *gdbarch, gdbarch_stack_frame_destroyed_p_ftype *stack_frame_destroyed_p);
>
> /* Process an ELF symbol in the minimal symbol table in a backend-specific
> way. Normally this hook is supposed to do nothing, however if required,
> diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh
> index 0f303a4..668e3eb 100755
> --- a/gdb/gdbarch.sh
> +++ b/gdb/gdbarch.sh
> @@ -627,14 +627,14 @@ m:int:in_solib_return_trampoline:CORE_ADDR pc, const char *name:pc, name::generi
>
> # A target might have problems with watchpoints as soon as the stack
> # frame of the current function has been destroyed. This mostly happens
> -# as the first action in a funtion's epilogue. in_function_epilogue_p()
> +# as the first action in a function's epilogue. stack_frame_destroyed_p()
> # is defined to return a non-zero value if either the given addr is one
> # instruction after the stack destroying instruction up to the trailing
> # return instruction or if we can figure out that the stack frame has
> # already been invalidated regardless of the value of addr. Targets
> # which don't suffer from that problem could just let this functionality
> # untouched.
> -m:int:in_function_epilogue_p:CORE_ADDR addr:addr:0:generic_in_function_epilogue_p::0
> +m:int:stack_frame_destroyed_p:CORE_ADDR addr:addr:0:generic_stack_frame_destroyed_p::0
> # Process an ELF symbol in the minimal symbol table in a backend-specific
> # way. Normally this hook is supposed to do nothing, however if required,
> # then this hook can be used to apply tranformations to symbols that are
> diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c
> index 8964ec0..01a7c80 100644
> --- a/gdb/hppa-tdep.c
> +++ b/gdb/hppa-tdep.c
> @@ -560,13 +560,16 @@ find_unwind_entry (CORE_ADDR pc)
> return NULL;
> }
>
> -/* The epilogue is defined here as the area either on the `bv' instruction
> +/* Implement the stack_frame_destroyed_p gdbarch method.
> +
> + The epilogue is defined here as the area either on the `bv' instruction
> itself or an instruction which destroys the function's stack frame.
>
> We do not assume that the epilogue is at the end of a function as we can
> also have return sequences in the middle of a function. */
> +
> static int
> -hppa_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +hppa_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> unsigned long status;
> @@ -3135,8 +3138,8 @@ hppa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
> /* The following gdbarch vector elements do not depend on the address
> size, or in any other gdbarch element previously set. */
> set_gdbarch_skip_prologue (gdbarch, hppa_skip_prologue);
> - set_gdbarch_in_function_epilogue_p (gdbarch,
> - hppa_in_function_epilogue_p);
> + set_gdbarch_stack_frame_destroyed_p (gdbarch,
> + hppa_stack_frame_destroyed_p);
> set_gdbarch_inner_than (gdbarch, core_addr_greaterthan);
> set_gdbarch_sp_regnum (gdbarch, HPPA_SP_REGNUM);
> set_gdbarch_fp0_regnum (gdbarch, HPPA_FP0_REGNUM);
> diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
> index 0c7eb5a..b4ffe1b 100644
> --- a/gdb/i386-tdep.c
> +++ b/gdb/i386-tdep.c
> @@ -2178,12 +2178,14 @@ static const struct frame_unwind i386_frame_unwind =
>
> /* Normal frames, but in a function epilogue. */
>
> -/* The epilogue is defined here as the 'ret' instruction, which will
> +/* Implement the stack_frame_destroyed_p gdbarch method.
> +
> + The epilogue is defined here as the 'ret' instruction, which will
> follow any instruction such as 'leave' or 'pop %ebp' that destroys
> the function's stack frame. */
>
> static int
> -i386_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +i386_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> gdb_byte insn;
> struct compunit_symtab *cust;
> @@ -2207,8 +2209,8 @@ i386_epilogue_frame_sniffer (const struct frame_unwind *self,
> void **this_prologue_cache)
> {
> if (frame_relative_level (this_frame) == 0)
> - return i386_in_function_epilogue_p (get_frame_arch (this_frame),
> - get_frame_pc (this_frame));
> + return i386_stack_frame_destroyed_p (get_frame_arch (this_frame),
> + get_frame_pc (this_frame));
> else
> return 0;
> }
> diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
> index 6e8ccd6..e0706db 100644
> --- a/gdb/mips-tdep.c
> +++ b/gdb/mips-tdep.c
> @@ -6693,10 +6693,11 @@ mips_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
> return mips32_scan_prologue (gdbarch, pc, limit_pc, NULL, NULL);
> }
>
> -/* Check whether the PC is in a function epilogue (32-bit version).
> - This is a helper function for mips_in_function_epilogue_p. */
> +/* Implement the stack_frame_destroyed_p gdbarch method (32-bit version).
> + This is a helper function for mips_stack_frame_destroyed_p. */
> +
> static int
> -mips32_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +mips32_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> CORE_ADDR func_addr = 0, func_end = 0;
>
> @@ -6731,11 +6732,11 @@ mips32_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> return 0;
> }
>
> -/* Check whether the PC is in a function epilogue (microMIPS version).
> - This is a helper function for mips_in_function_epilogue_p. */
> +/* Implement the stack_frame_destroyed_p gdbarch method (microMIPS version).
> + This is a helper function for mips_stack_frame_destroyed_p. */
>
> static int
> -micromips_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +micromips_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> CORE_ADDR func_addr = 0;
> CORE_ADDR func_end = 0;
> @@ -6832,10 +6833,11 @@ micromips_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> return 1;
> }
>
> -/* Check whether the PC is in a function epilogue (16-bit version).
> - This is a helper function for mips_in_function_epilogue_p. */
> +/* Implement the stack_frame_destroyed_p gdbarch method (16-bit version).
> + This is a helper function for mips_stack_frame_destroyed_p. */
> +
> static int
> -mips16_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +mips16_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> CORE_ADDR func_addr = 0, func_end = 0;
>
> @@ -6872,17 +6874,20 @@ mips16_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> return 0;
> }
>
> -/* The epilogue is defined here as the area at the end of a function,
> +/* Implement the stack_frame_destroyed_p gdbarch method.
> +
> + The epilogue is defined here as the area at the end of a function,
> after an instruction which destroys the function's stack frame. */
> +
> static int
> -mips_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +mips_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> if (mips_pc_is_mips16 (gdbarch, pc))
> - return mips16_in_function_epilogue_p (gdbarch, pc);
> + return mips16_stack_frame_destroyed_p (gdbarch, pc);
> else if (mips_pc_is_micromips (gdbarch, pc))
> - return micromips_in_function_epilogue_p (gdbarch, pc);
> + return micromips_stack_frame_destroyed_p (gdbarch, pc);
> else
> - return mips32_in_function_epilogue_p (gdbarch, pc);
> + return mips32_stack_frame_destroyed_p (gdbarch, pc);
> }
>
> /* Root of all "set mips "/"show mips " commands. This will eventually be
> @@ -8843,7 +8848,7 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>
> set_gdbarch_skip_prologue (gdbarch, mips_skip_prologue);
>
> - set_gdbarch_in_function_epilogue_p (gdbarch, mips_in_function_epilogue_p);
> + set_gdbarch_stack_frame_destroyed_p (gdbarch, mips_stack_frame_destroyed_p);
>
> set_gdbarch_pointer_to_address (gdbarch, signed_pointer_to_address);
> set_gdbarch_address_to_pointer (gdbarch, address_to_signed_pointer);
> diff --git a/gdb/nios2-tdep.c b/gdb/nios2-tdep.c
> index 988b9fc..1968a88 100644
> --- a/gdb/nios2-tdep.c
> +++ b/gdb/nios2-tdep.c
> @@ -658,10 +658,10 @@ nios2_in_epilogue_p (struct gdbarch *gdbarch,
> return 0;
> }
>
> -/* Implement the in_function_epilogue_p gdbarch method. */
> +/* Implement the stack_frame_destroyed_p gdbarch method. */
>
> static int
> -nios2_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +nios2_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> CORE_ADDR func_addr;
>
> @@ -1775,7 +1775,7 @@ nios2_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
> set_gdbarch_return_value (gdbarch, nios2_return_value);
>
> set_gdbarch_skip_prologue (gdbarch, nios2_skip_prologue);
> - set_gdbarch_in_function_epilogue_p (gdbarch, nios2_in_function_epilogue_p);
> + set_gdbarch_stack_frame_destroyed_p (gdbarch, nios2_stack_frame_destroyed_p);
> set_gdbarch_breakpoint_from_pc (gdbarch, nios2_breakpoint_from_pc);
>
> set_gdbarch_dummy_id (gdbarch, nios2_dummy_id);
> diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
> index a125000..eb40430 100644
> --- a/gdb/rs6000-tdep.c
> +++ b/gdb/rs6000-tdep.c
> @@ -934,10 +934,10 @@ rs6000_in_function_epilogue_frame_p (struct frame_info *curfrm,
> return 0;
> }
>
> -/* Implementation of gdbarch_in_function_epilogue_p. */
> +/* Implement the stack_frame_destroyed_p gdbarch method. */
>
> static int
> -rs6000_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +rs6000_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> return rs6000_in_function_epilogue_frame_p (get_current_frame (),
> gdbarch, pc);
> @@ -5890,7 +5890,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
> set_gdbarch_push_dummy_call (gdbarch, ppc64_sysv_abi_push_dummy_call);
>
> set_gdbarch_skip_prologue (gdbarch, rs6000_skip_prologue);
> - set_gdbarch_in_function_epilogue_p (gdbarch, rs6000_in_function_epilogue_p);
> + set_gdbarch_stack_frame_destroyed_p (gdbarch, rs6000_stack_frame_destroyed_p);
> set_gdbarch_skip_main_prologue (gdbarch, rs6000_skip_main_prologue);
>
> set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
> diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c
> index edc0da1..0650c27 100644
> --- a/gdb/s390-linux-tdep.c
> +++ b/gdb/s390-linux-tdep.c
> @@ -1487,10 +1487,9 @@ s390_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
> return skip_pc ? skip_pc : pc;
> }
>
> -/* Return true if we are in the functin's epilogue, i.e. after the
> - instruction that destroyed the function's stack frame. */
> +/* Implmement the stack_frame_destroyed_p gdbarch method. */
> static int
> -s390_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +s390_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> int word_size = gdbarch_ptr_bit (gdbarch) / 8;
>
> @@ -1838,9 +1837,9 @@ s390_prologue_frame_unwind_cache (struct frame_info *this_frame,
> && (next_frame == NULL
> || get_frame_type (get_next_frame (this_frame)) != NORMAL_FRAME))
> {
> - /* See the comment in s390_in_function_epilogue_p on why this is
> + /* See the comment in s390_stack_frame_destroyed_p on why this is
> not completely reliable ... */
> - if (s390_in_function_epilogue_p (gdbarch, get_frame_pc (this_frame)))
> + if (s390_stack_frame_destroyed_p (gdbarch, get_frame_pc (this_frame)))
> {
> memset (&data, 0, sizeof (data));
> size = 0;
> @@ -3220,7 +3219,7 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
> set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
> set_gdbarch_breakpoint_from_pc (gdbarch, s390_breakpoint_from_pc);
> set_gdbarch_skip_prologue (gdbarch, s390_skip_prologue);
> - set_gdbarch_in_function_epilogue_p (gdbarch, s390_in_function_epilogue_p);
> + set_gdbarch_stack_frame_destroyed_p (gdbarch, s390_stack_frame_destroyed_p);
>
> set_gdbarch_num_regs (gdbarch, S390_NUM_REGS);
> set_gdbarch_sp_regnum (gdbarch, S390_SP_REGNUM);
> diff --git a/gdb/score-tdep.c b/gdb/score-tdep.c
> index 9cd5038..ef9336e 100644
> --- a/gdb/score-tdep.c
> +++ b/gdb/score-tdep.c
> @@ -737,8 +737,10 @@ score3_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
> return pc;
> }
>
> +/* Implement the stack_frame_destroyed_p gdbarch method. */
> +
> static int
> -score7_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR cur_pc)
> +score7_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR cur_pc)
> {
> inst_t *inst = score7_fetch_inst (gdbarch, cur_pc, NULL);
>
> @@ -761,8 +763,10 @@ score7_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR cur_pc)
> return 0;
> }
>
> +/* Implement the stack_frame_destroyed_p gdbarch method. */
> +
> static int
> -score3_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR cur_pc)
> +score3_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR cur_pc)
> {
> CORE_ADDR pc = cur_pc;
> inst_t *inst
> @@ -1494,8 +1498,8 @@ score_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
> case bfd_mach_score7:
> set_gdbarch_breakpoint_from_pc (gdbarch, score7_breakpoint_from_pc);
> set_gdbarch_skip_prologue (gdbarch, score7_skip_prologue);
> - set_gdbarch_in_function_epilogue_p (gdbarch,
> - score7_in_function_epilogue_p);
> + set_gdbarch_stack_frame_destroyed_p (gdbarch,
> + score7_stack_frame_destroyed_p);
> set_gdbarch_register_name (gdbarch, score7_register_name);
> set_gdbarch_num_regs (gdbarch, SCORE7_NUM_REGS);
> /* Core file support. */
> @@ -1506,8 +1510,8 @@ score_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
> case bfd_mach_score3:
> set_gdbarch_breakpoint_from_pc (gdbarch, score3_breakpoint_from_pc);
> set_gdbarch_skip_prologue (gdbarch, score3_skip_prologue);
> - set_gdbarch_in_function_epilogue_p (gdbarch,
> - score3_in_function_epilogue_p);
> + set_gdbarch_stack_frame_destroyed_p (gdbarch,
> + score3_stack_frame_destroyed_p);
> set_gdbarch_register_name (gdbarch, score3_register_name);
> set_gdbarch_num_regs (gdbarch, SCORE3_NUM_REGS);
> break;
> diff --git a/gdb/sh-tdep.c b/gdb/sh-tdep.c
> index 82cf2f4..6f66f0e 100644
> --- a/gdb/sh-tdep.c
> +++ b/gdb/sh-tdep.c
> @@ -2050,11 +2050,14 @@ static const struct frame_unwind sh_stub_unwind =
> sh_stub_unwind_sniffer
> };
>
> -/* The epilogue is defined here as the area at the end of a function,
> +/* Implement the stack_frame_destroyed_p gdbarch method.
> +
> + The epilogue is defined here as the area at the end of a function,
> either on the `ret' instruction itself or after an instruction which
> destroys the function's stack frame. */
> +
> static int
> -sh_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +sh_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> CORE_ADDR func_addr = 0, func_end = 0;
> @@ -2294,7 +2297,7 @@ sh_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
> set_gdbarch_dummy_id (gdbarch, sh_dummy_id);
> frame_base_set_default (gdbarch, &sh_frame_base);
>
> - set_gdbarch_in_function_epilogue_p (gdbarch, sh_in_function_epilogue_p);
> + set_gdbarch_stack_frame_destroyed_p (gdbarch, sh_stack_frame_destroyed_p);
>
> dwarf2_frame_set_init_reg (gdbarch, sh_dwarf2_frame_init_reg);
>
> diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c
> index aae4604..5c77784 100644
> --- a/gdb/sparc-tdep.c
> +++ b/gdb/sparc-tdep.c
> @@ -452,10 +452,10 @@ sparc32_pseudo_register_write (struct gdbarch *gdbarch,
> regcache_raw_write (regcache, regnum + 1, buf + 4);
> }
>
> -/* Implement "in_function_epilogue_p". */
> +/* Implement the stack_frame_destroyed_p gdbarch method. */
>
> int
> -sparc_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +sparc_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> /* This function must return true if we are one instruction after an
> instruction that destroyed the stack frame of the current
> diff --git a/gdb/sparc-tdep.h b/gdb/sparc-tdep.h
> index b216529..905d213 100644
> --- a/gdb/sparc-tdep.h
> +++ b/gdb/sparc-tdep.h
> @@ -194,7 +194,7 @@ extern struct sparc_frame_cache *
> sparc32_frame_cache (struct frame_info *this_frame, void **this_cache);
>
> extern int
> - sparc_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc);
> + sparc_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc);
>
>
>
> diff --git a/gdb/sparc64-tdep.c b/gdb/sparc64-tdep.c
> index eba8101..4978863 100644
> --- a/gdb/sparc64-tdep.c
> +++ b/gdb/sparc64-tdep.c
> @@ -1211,7 +1211,7 @@ sparc64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
> (gdbarch, default_stabs_argument_has_addr);
>
> set_gdbarch_skip_prologue (gdbarch, sparc64_skip_prologue);
> - set_gdbarch_in_function_epilogue_p (gdbarch, sparc_in_function_epilogue_p);
> + set_gdbarch_stack_frame_destroyed_p (gdbarch, sparc_stack_frame_destroyed_p);
>
> /* Hook in the DWARF CFI frame unwinder. */
> dwarf2_frame_set_init_reg (gdbarch, sparc64_dwarf2_frame_init_reg);
> diff --git a/gdb/spu-tdep.c b/gdb/spu-tdep.c
> index 7e05834..e2cd91f 100644
> --- a/gdb/spu-tdep.c
> +++ b/gdb/spu-tdep.c
> @@ -881,8 +881,7 @@ spu_virtual_frame_pointer (struct gdbarch *gdbarch, CORE_ADDR pc,
> }
> }
>
> -/* Return true if we are in the function's epilogue, i.e. after the
> - instruction that destroyed the function's stack frame.
> +/* Implement the stack_frame_destroyed_p gdbarch method.
>
> 1) scan forward from the point of execution:
> a) If you find an instruction that modifies the stack pointer
> @@ -899,7 +898,7 @@ spu_virtual_frame_pointer (struct gdbarch *gdbarch, CORE_ADDR pc,
> limit for the size of an epilogue. */
>
> static int
> -spu_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +spu_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> CORE_ADDR scan_pc, func_start, func_end, epilogue_start, epilogue_end;
> @@ -2785,7 +2784,7 @@ spu_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
> set_gdbarch_virtual_frame_pointer (gdbarch, spu_virtual_frame_pointer);
> set_gdbarch_frame_args_skip (gdbarch, 0);
> set_gdbarch_skip_prologue (gdbarch, spu_skip_prologue);
> - set_gdbarch_in_function_epilogue_p (gdbarch, spu_in_function_epilogue_p);
> + set_gdbarch_stack_frame_destroyed_p (gdbarch, spu_stack_frame_destroyed_p);
>
> /* Cell/B.E. cross-architecture unwinder support. */
> frame_unwind_prepend_unwinder (gdbarch, &spu2ppu_unwind);
> diff --git a/gdb/tic6x-tdep.c b/gdb/tic6x-tdep.c
> index 140ffbc..2603f91 100644
> --- a/gdb/tic6x-tdep.c
> +++ b/gdb/tic6x-tdep.c
> @@ -1122,10 +1122,10 @@ tic6x_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
> return sp;
> }
>
> -/* This is the implementation of gdbarch method in_function_epilogue_p. */
> +/* This is the implementation of gdbarch method stack_frame_destroyed_p. */
>
> static int
> -tic6x_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +tic6x_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> unsigned long inst = tic6x_fetch_instruction (gdbarch, pc);
> /* Normally, the epilogue is composed by instruction `b .S2 b3'. */
> @@ -1328,7 +1328,7 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>
> set_gdbarch_get_longjmp_target (gdbarch, tic6x_get_longjmp_target);
>
> - set_gdbarch_in_function_epilogue_p (gdbarch, tic6x_in_function_epilogue_p);
> + set_gdbarch_stack_frame_destroyed_p (gdbarch, tic6x_stack_frame_destroyed_p);
>
> set_gdbarch_return_in_first_hidden_param_p (gdbarch,
> tic6x_return_in_first_hidden_param_p);
> diff --git a/gdb/tilegx-tdep.c b/gdb/tilegx-tdep.c
> index 7c5eea7..18b1832 100644
> --- a/gdb/tilegx-tdep.c
> +++ b/gdb/tilegx-tdep.c
> @@ -771,10 +771,10 @@ tilegx_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
> NULL, NULL);
> }
>
> -/* This is the implementation of gdbarch method in_function_epilogue_p. */
> +/* This is the implementation of gdbarch method stack_frame_destroyed_p. */
>
> static int
> -tilegx_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +tilegx_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> CORE_ADDR func_addr = 0, func_end = 0;
>
> @@ -1051,8 +1051,7 @@ tilegx_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>
> set_gdbarch_skip_prologue (gdbarch, tilegx_skip_prologue);
>
> - set_gdbarch_in_function_epilogue_p (gdbarch,
> - tilegx_in_function_epilogue_p);
> + set_gdbarch_stack_frame_destroyed_p (gdbarch, tilegx_stack_frame_destroyed_p);
>
> /* Map debug registers into internal register numbers. */
> set_gdbarch_dwarf2_reg_to_regnum (gdbarch, tilegx_dwarf2_reg_to_regnum);
> diff --git a/gdb/xstormy16-tdep.c b/gdb/xstormy16-tdep.c
> index 135e43a..4faad2e 100644
> --- a/gdb/xstormy16-tdep.c
> +++ b/gdb/xstormy16-tdep.c
> @@ -453,11 +453,14 @@ xstormy16_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
> return (CORE_ADDR) pc;
> }
>
> -/* The epilogue is defined here as the area at the end of a function,
> +/* Implement the stack_frame_destroyed_p gdbarch method.
> +
> + The epilogue is defined here as the area at the end of a function,
> either on the `ret' instruction itself or after an instruction which
> destroys the function's stack frame. */
> +
> static int
> -xstormy16_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> +xstormy16_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> {
> enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
> CORE_ADDR func_addr = 0, func_end = 0;
> @@ -835,8 +838,8 @@ xstormy16_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
> frame_base_set_default (gdbarch, &xstormy16_frame_base);
>
> set_gdbarch_skip_prologue (gdbarch, xstormy16_skip_prologue);
> - set_gdbarch_in_function_epilogue_p (gdbarch,
> - xstormy16_in_function_epilogue_p);
> + set_gdbarch_stack_frame_destroyed_p (gdbarch,
> + xstormy16_stack_frame_destroyed_p);
>
> /* These values and methods are used when gdb calls a target function. */
> set_gdbarch_push_dummy_call (gdbarch, xstormy16_push_dummy_call);
--
Martin Galvan
Software Engineer
Taller Technologies Argentina
San Lorenzo 47, 3rd Floor, Office 5
CÃrdoba, Argentina
Phone: 54 351 4217888 / +54 351 4218211