Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Pierre Langlois <pierre.langlois@arm.com>
To: qiyaoltc@gmail.com
Cc: Pierre Langlois <pierre.langlois@arm.com>,	gdb-patches@sourceware.org
Subject: [PATCH v2 5/8] [AArch64] Teach stub unwinder to terminate gracefully
Date: Thu, 09 Jul 2015 11:12:00 -0000	[thread overview]
Message-ID: <1436440319-22580-1-git-send-email-pierre.langlois@arm.com> (raw)
In-Reply-To: <86lheqmwux.fsf@gmail.com>

Here is the updated patch.

Thanks,
Pierre

---

The stub unwinder is used on AArch64 if the target's memory is not
readable at the current PC.  For example, the user could try to call at
an invalid address such as 0x0, as covered in the gdb.base/signull.exp
test case.  Many GDB ports use a similar unwinder to handle this case
too.

If we purposely kill the inferior before examining the trace then we get
the following issue:

~~~
...
(gdb) trace f
Tracepoint 3 at 0x7fb7fc28c0
(gdb) tstart
(gdb) continue
...
(gdb) tstop
(gdb) tsave /tmp/trace
(gdb) kill
...
(gdb) target tfile /tmp/trace
...
(gdb) tfind
Register 31 is not available.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Found trace frame 0, tracepoint 3
#-1 0x0000007fb7fc28c0 in f () ...
^^^
~~~

This patch teaches the stub unwinder to report to the core frame code
with UNWIND_UNAVAILABLE when either the stack pointer of the return
address are unavailable to read from the target.

gdb/ChangeLog:

	* aarch64-tdep.c (aarch64_make_stub_cache): Set available_p and
	swallow NOT_AVAILABLE_ERROR.
	(aarch64_stub_this_id): Call frame_id_build_unavailable_stack if
	available_p is not set.
	(aarch64_stub_frame_unwind_stop_reason): New function.
	(aarch64_stub_unwind): Install it.
---
 gdb/aarch64-tdep.c | 38 +++++++++++++++++++++++++++++++++-----
 1 file changed, 33 insertions(+), 5 deletions(-)

diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c
index 4a6df25..e791fcf 100644
--- a/gdb/aarch64-tdep.c
+++ b/gdb/aarch64-tdep.c
@@ -1119,13 +1119,38 @@ aarch64_make_stub_cache (struct frame_info *this_frame, void **this_cache)
   cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
   *this_cache = cache;
 
-  cache->prev_sp
-    = get_frame_register_unsigned (this_frame, AARCH64_SP_REGNUM);
-  cache->prev_pc = get_frame_pc (this_frame);
+  TRY
+    {
+      cache->prev_sp = get_frame_register_unsigned (this_frame,
+						    AARCH64_SP_REGNUM);
+      cache->prev_pc = get_frame_pc (this_frame);
+      cache->available_p = 1;
+    }
+  CATCH (ex, RETURN_MASK_ERROR)
+    {
+      if (ex.error != NOT_AVAILABLE_ERROR)
+	throw_exception (ex);
+    }
+  END_CATCH
 
   return cache;
 }
 
+/* Implement the "stop_reason" frame_unwind method.  */
+
+static enum unwind_stop_reason
+aarch64_stub_frame_unwind_stop_reason (struct frame_info *this_frame,
+				       void **this_cache)
+{
+  struct aarch64_prologue_cache *cache
+    = aarch64_make_stub_cache (this_frame, this_cache);
+
+  if (!cache->available_p)
+    return UNWIND_UNAVAILABLE;
+
+  return UNWIND_NO_REASON;
+}
+
 /* Our frame ID for a stub frame is the current SP and LR.  */
 
 static void
@@ -1135,7 +1160,10 @@ aarch64_stub_this_id (struct frame_info *this_frame,
   struct aarch64_prologue_cache *cache
     = aarch64_make_stub_cache (this_frame, this_cache);
 
-  *this_id = frame_id_build (cache->prev_sp, cache->prev_pc);
+  if (cache->available_p)
+    *this_id = frame_id_build (cache->prev_sp, cache->prev_pc);
+  else
+    *this_id = frame_id_build_unavailable_stack (cache->prev_pc);
 }
 
 /* Implement the "sniffer" frame_unwind method.  */
@@ -1162,7 +1190,7 @@ aarch64_stub_unwind_sniffer (const struct frame_unwind *self,
 struct frame_unwind aarch64_stub_unwind =
 {
   NORMAL_FRAME,
-  default_frame_unwind_stop_reason,
+  aarch64_stub_frame_unwind_stop_reason,
   aarch64_stub_this_id,
   aarch64_prologue_prev_register,
   NULL,
-- 
2.1.0


  reply	other threads:[~2015-07-09 11:12 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-07 12:52 [PATCH 0/8] [AArch64] Add support for tracepoints Pierre Langlois
2015-07-07 12:52 ` [PATCH 3/8] [AArch64] Only access inferior registers when creating a frame cache Pierre Langlois
2015-07-08 16:15   ` Yao Qi
2015-07-09 15:40     ` Pierre Langlois
2015-07-07 12:52 ` [PATCH 7/8] [testsuite][AArch64] Port gdb.trace Pierre Langlois
2015-07-08 16:39   ` Yao Qi
2015-07-09 12:25     ` [PATCH v2 " Pierre Langlois
2015-07-09 15:46       ` Pierre Langlois
2015-07-07 12:53 ` [PATCH 1/8] [AArch64] Refactor aarch64_make_prologue_cache Pierre Langlois
2015-07-08 16:09   ` Yao Qi
2015-07-09 10:36     ` [PATCH] " Pierre Langlois
2015-07-09 15:38       ` Pierre Langlois
2015-07-07 12:53 ` [PATCH 4/8] [AArch64] Teach prologue unwinder to terminate gracefully Pierre Langlois
2015-07-08 16:24   ` Yao Qi
2015-07-09 10:49     ` [PATCH v2 " Pierre Langlois
2015-07-09 10:53       ` Pierre Langlois
2015-07-09 10:56         ` [PATCH v3 " Pierre Langlois
2015-07-09 15:41           ` Pierre Langlois
2015-07-09 12:47       ` [PATCH v2 " Yao Qi
2015-07-09 12:51         ` Pierre Langlois
2015-07-07 12:53 ` [PATCH 5/8] [AArch64] Teach stub " Pierre Langlois
2015-07-08 16:34   ` Yao Qi
2015-07-09 11:12     ` Pierre Langlois [this message]
2015-07-09 15:45       ` [PATCH v2 " Pierre Langlois
2015-07-07 12:53 ` [PATCH 2/8] [AArch64] Refactor aarch64_make_stub_cache Pierre Langlois
2015-07-08 16:10   ` Yao Qi
2015-07-09 10:41     ` [PATCH v2 " Pierre Langlois
2015-07-09 15:39       ` Pierre Langlois
2015-07-07 12:54 ` [PATCH 6/8] [AArch64] Implement gdbarch_gen_return_address gdbarch method Pierre Langlois
2015-07-08 16:35   ` Yao Qi
2015-07-09 15:45     ` Pierre Langlois
2015-07-07 12:58 ` [PATCH 8/8] [GDBServer][AArch64] Enable support for tracepoints Pierre Langlois
2015-07-08 16:40   ` Yao Qi
2015-07-09 15:46     ` Pierre Langlois
2015-07-08 10:57 ` [PATCH 0/8] [AArch64] Add " Pedro Alves
2015-07-08 16:42 ` Yao Qi
2015-07-09 13:16   ` [PATCH] Add NEWS entry for tracepoints support on aarch64-linux Pierre Langlois
2015-07-09 14:44     ` Eli Zaretskii
2015-07-09 15:46       ` Pierre Langlois

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1436440319-22580-1-git-send-email-pierre.langlois@arm.com \
    --to=pierre.langlois@arm.com \
    --cc=gdb-patches@sourceware.org \
    --cc=qiyaoltc@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox