Blame SOURCES/gdb-rhbz1225569-oom-killer-aarch64-frame-same-id-6of8.patch

2c2fa1
commit 62261490a36c6911c5eb61be7cddcfb1bd19ba18
2c2fa1
Author: Pedro Alves <palves@redhat.com>
2c2fa1
Date:   Thu Jan 16 17:43:26 2014 +0000
2c2fa1
2c2fa1
    Fix gdb.trace/mi-traceframe-changed.exp on s390.
2c2fa1
    
2c2fa1
    The test fails on s390 with:
2c2fa1
    
2c2fa1
      -trace-find frame-number 0^M
2c2fa1
      &"PC not available\n"^M
2c2fa1
      ^done,found="1",tracepoint="1",traceframe="0",frame={level="-1",addr="<unavailable>",func="??",args=[]}^M
2c2fa1
      (gdb) ^M
2c2fa1
      FAIL: gdb.trace/mi-traceframe-changed.exp: tfile: -trace-find frame-number 0
2c2fa1
    
2c2fa1
    tfile knows to infer the PC from the tracepoint's address if the PC
2c2fa1
    wasn't collected (tfile_fetch_registers) but, that only works on
2c2fa1
    targets whose PC register is a raw register, and on s390, the PC
2c2fa1
    register is a pseudo register.
2c2fa1
    
2c2fa1
    But even if GDB doesn't know how to infer the value of PC, saying the
2c2fa1
    current frame is level -1 is a bug:
2c2fa1
    
2c2fa1
      ^done,found="1",tracepoint="1",traceframe="0",frame={level="-1",addr="<unavailable>",func="??",args=[]}^M
2c2fa1
                                                           ^^^^^^^^^
2c2fa1
    
2c2fa1
    '-1' is the level of the sentinel frame, which should never be visible.
2c2fa1
    
2c2fa1
    This is caused by the s390's heuristic unwinder accepting the frame
2c2fa1
    (the fallback heuristic unwinders _always_ accept the frame), but then
2c2fa1
    the unwind->this_id method throws that "PC not available\n" error.
2c2fa1
    
2c2fa1
    IOW, the s390's heuristic unwinder was never adjusted to handle
2c2fa1
    unavailable register values gracefully, which can happen with e.g., a
2c2fa1
    trimmed core file too.
2c2fa1
    
2c2fa1
    This is just the minimal necessary for
2c2fa1
    <unavailable> frames, which at least gets us:
2c2fa1
    
2c2fa1
      (gdb) tfind
2c2fa1
      Found trace frame 0, tracepoint 1
2c2fa1
      #0  <unavailable> in ?? ()
2c2fa1
    
2c2fa1
    That is, frame #0 instead of -1.
2c2fa1
    
2c2fa1
    We could get better info out of "info frame" (this patch makes us show
2c2fa1
    "outermost"), but this change would still be necessary.
2c2fa1
    
2c2fa1
    gdb/
2c2fa1
    2014-01-16  Pedro Alves  <palves@redhat.com>
2c2fa1
    
2c2fa1
    	* s390-linux-tdep.c (s390_frame_unwind_cache): Swallow
2c2fa1
    	NOT_AVAILABLE_ERROR errors while parsing the prologue or reading
2c2fa1
    	the backchain.
2c2fa1
2c2fa1
Index: gdb-7.6.1/gdb/s390-tdep.c
2c2fa1
===================================================================
2c2fa1
--- gdb-7.6.1.orig/gdb/s390-tdep.c
2c2fa1
+++ gdb-7.6.1/gdb/s390-tdep.c
2c2fa1
@@ -1995,7 +1995,9 @@ static struct s390_unwind_cache *
2c2fa1
 s390_frame_unwind_cache (struct frame_info *this_frame,
2c2fa1
 			 void **this_prologue_cache)
2c2fa1
 {
2c2fa1
+  volatile struct gdb_exception ex;
2c2fa1
   struct s390_unwind_cache *info;
2c2fa1
+
2c2fa1
   if (*this_prologue_cache)
2c2fa1
     return *this_prologue_cache;
2c2fa1
 
2c2fa1
@@ -2006,10 +2008,15 @@ s390_frame_unwind_cache (struct frame_in
2c2fa1
   info->frame_base = -1;
2c2fa1
   info->local_base = -1;
2c2fa1
 
2c2fa1
-  /* Try to use prologue analysis to fill the unwind cache.
2c2fa1
-     If this fails, fall back to reading the stack backchain.  */
2c2fa1
-  if (!s390_prologue_frame_unwind_cache (this_frame, info))
2c2fa1
-    s390_backchain_frame_unwind_cache (this_frame, info);
2c2fa1
+  TRY_CATCH (ex, RETURN_MASK_ERROR)
2c2fa1
+    {
2c2fa1
+      /* Try to use prologue analysis to fill the unwind cache.
2c2fa1
+	 If this fails, fall back to reading the stack backchain.  */
2c2fa1
+      if (!s390_prologue_frame_unwind_cache (this_frame, info))
2c2fa1
+	s390_backchain_frame_unwind_cache (this_frame, info);
2c2fa1
+    }
2c2fa1
+  if (ex.reason < 0 && ex.error != NOT_AVAILABLE_ERROR)
2c2fa1
+    throw_exception (ex);
2c2fa1
 
2c2fa1
   return info;
2c2fa1
 }