summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYao Qi <yao.qi@linaro.org>2016-04-15 15:30:01 +0100
committerYao Qi <yao.qi@linaro.org>2016-04-15 15:30:01 +0100
commit415fa612334afb70600c2a7dbd2c2ff56ebbc4f3 (patch)
tree53ac2411174d11112a855f0ab2dbe2c98bfbba10
parent05f7541ea79d4922f71641e287b610c67ba32b52 (diff)
downloadbinutils-gdb-415fa612334afb70600c2a7dbd2c2ff56ebbc4f3.tar.gz
[ARM] minor opt in thumb_stack_frame_destroyed_p
thumb_stack_frame_destroyed_p scans the instructions from PC to the end of the function, but if PC is far from the end of pc, we don't have to scan, because PC should be in epilogue if it is still far from the end of the function. The criterion I use here is 16 bytes, which is more than 4 instructions. Regression tested on aarch64-linux with mutli-arch debug. gdb: 2016-04-15 Yao Qi <yao.qi@linaro.org> * arm-tdep.c (thumb_stack_frame_destroyed_p): Return zero if PC is far from the end of function.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/arm-tdep.c8
2 files changed, 13 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 09937a917c8..e85023e0627 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2016-04-15 Yao Qi <yao.qi@linaro.org>
+
+ * arm-tdep.c (thumb_stack_frame_destroyed_p): Return zero if
+ PC is far from the end of function.
+
2016-04-14 Pedro Alves <palves@redhat.com>
* cli/cli-cmds.c (alias_usage_error): New function.
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index 0412f71d24a..36b0bcda341 100644
--- 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. */
+ return 0;
+ }
+
/* The epilogue is a sequence of instructions along the following lines:
- add stack frame size to SP or FP