This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] [ARM] minor opt in thumb_stack_frame_destroyed_p


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=415fa612334afb70600c2a7dbd2c2ff56ebbc4f3

commit 415fa612334afb70600c2a7dbd2c2ff56ebbc4f3
Author: Yao Qi <yao.qi@linaro.org>
Date:   Fri Apr 15 15:30:01 2016 +0100

    [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.

Diff:
---
 gdb/ChangeLog  | 5 +++++
 gdb/arm-tdep.c | 8 ++++++++
 2 files changed, 13 insertions(+)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 09937a9..e85023e 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 0412f71..36b0bcd 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]