This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH] [ARM] minor opt in thumb_stack_frame_destroyed_p
- From: Pedro Alves <palves at redhat dot com>
- To: Yao Qi <qiyaoltc at gmail dot com>, gdb-patches at sourceware dot org
- Date: Fri, 15 Apr 2016 17:24:35 +0100
- Subject: Re: [PATCH] [ARM] minor opt in thumb_stack_frame_destroyed_p
- Authentication-results: sourceware.org; auth=none
- References: <1460730578-28723-1-git-send-email-yao dot qi at linaro dot org>
On 04/15/2016 03:29 PM, Yao Qi wrote:
> --- a/gdb/arm-tdep.c
> +++ b/gdb/arm-tdep.c
> @@ -3135,6 +3135,14 @@ thumb_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
> if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
> return 0;
>
> + if (func_end - pc > 4 * 4)
> + {
> + /* There shouldn't be more than four instructions in epilogue.
> + If PC is still 16 bytes away from FUNC_END, it isn't in
> + epilogue. */
This assumes epilogue sequences are always at the end of the function.
I suspected this isn't a safe assumption, and I asked gcc folks.
The answer I got was that gcc can and does emit epilogues in the
middle of functions. Below's an example I was given, and the
corresponding x86-64 and ARM disassembly. Note the 'retq' / 'bx lr'
in the middle.
#include <stdlib.h>
void f (int x)
{
if (x == 0)
abort();
}
Compile with -O2.
x86-64:
0000000000000000 <f>:
0: 85 ff test %edi,%edi
2: 74 02 je 6 <f+0x6>
4: f3 c3 repz retq
6: 50 push %rax
7: e8 00 00 00 00 callq c <f+0xc>
ARM:
00000000 <f>:
0: b100 cbz r0, 4 <f+0x4>
2: 4770 bx lr
4: b508 push {r3, lr}
6: f7ff fffe bl 0 <abort>
a: bf00 nop
Thanks,
Pedro Alves