--- ./gdb/rs6000-tdep.h_orig	2018-01-09 06:37:49.000000000 -0600
+++ ./gdb/rs6000-tdep.h	2018-01-13 04:47:50.000000000 -0600
@@ -18,3 +18,25 @@
  /* Minimum possible text address in AIX.  */
  #define AIX_TEXT_SEGMENT_BASE 0x10000000
  
+ /* For sighandler.
+ 
+    In case of signal handler, sigcontext is saved on the stack along with
+    minimum stack size.
+  
+    sigconext structure have the mstsave saved under the sc_jmpbuf.jmp_context.
+ 
+    STKMIN(minimum stack size) is 56 for 32-bit processes, and iar offset
+    under sc_jmpbuf.jmp_context is 40 for the signal context.
+    ie offsetof(struct sigcontext, sc_jmpbuf.jmp_context.iar).
+    so PC offset in this case is STKIM+iar offset, which is 96 */
+ 
+ #define SIG_FRAME_PC_OFFSET 96
+ #define SIG_FRAME_LR_OFFSET 108
+ /* STKMIN+grp1 offset, which is 56+228=284 */
+ #define SIG_FRAME_FP_OFFSET 284
+ 
+ /* 64 bit process */
+ /* STKMIN64  is 112 and iar offset is 312. So 112+312=424 */
+ #define SIG_FRAME_PC_OFFSET64 424
+ /* STKMIN64+grp1 offset. 112+56=168 */
+ #define SIG_FRAME_FP_OFFSET64 168 
--- ./gdb/rs6000-tdep.c_orig	2018-01-09 06:53:04.000000000 -0600
+++ ./gdb/rs6000-tdep.c	2018-01-10 07:28:10.000000000 -0600
@@ -61,6 +61,8 @@
  #include "trad-frame.h"
  #include "frame-unwind.h"
  #include "frame-base.h"
+ #include "rs6000-tdep.h"
+ #include "xcoffread.h"
  
  #include "ax.h"
  #include "ax-gdb.h"
@@ -3238,8 +3240,24 @@
  static CORE_ADDR
  rs6000_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
  {
-   return frame_unwind_register_unsigned (next_frame,
- 					 gdbarch_pc_regnum (gdbarch));
+   ULONGEST r;
+   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+   int size = register_size (gdbarch, gdbarch_pc_regnum (gdbarch));
+ 
+   r = frame_unwind_register_unsigned (next_frame,
+                                       gdbarch_pc_regnum (gdbarch));
+   if (r && (r < AIX_TEXT_SEGMENT_BASE )) {
+     if (is64)  {
+       r = read_memory_unsigned_integer
+             (get_frame_base (next_frame) + SIG_FRAME_PC_OFFSET64,
+              size, byte_order); 
+     } else {
+       r = read_memory_unsigned_integer
+             (get_frame_base (next_frame) + SIG_FRAME_PC_OFFSET+8,
+              size, byte_order);
+     }
+   }
+   return r;
  }
  
  static struct frame_id
@@ -3273,7 +3291,7 @@
    enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    struct rs6000_framedata fdata;
    int wordsize = tdep->wordsize;
-   CORE_ADDR func = 0, pc = 0;
+   CORE_ADDR func = 0, pc = 0, save_cache_base = 0;
  
    if ((*this_cache) != NULL)
      return (struct rs6000_frame_cache *) (*this_cache);
@@ -3298,6 +3316,7 @@
  	 base address of this frame.  */
        cache->base = get_frame_register_unsigned
  	(this_frame, gdbarch_sp_regnum (gdbarch));
+       save_cache_base = cache->base;
      }
    CATCH (ex, RETURN_MASK_ERROR)
      {
@@ -3347,6 +3366,31 @@
  					     byte_order, &backchain))
          cache->base = (CORE_ADDR) backchain;
      }
+ 
+   /* If frame is a AIX signal handler frame, we need to read the base
+      address from sigconext offset. Backchain at an offset 0 will be
+      0, so backchain will be at an offset SIG_FRAME_FP_OFFSET(284)+8
+      for 32-bit applications. */
+   if (!cache->base && !fdata.frameless)
+   {
+     LONGEST backchain, sig_pc = 0;
+     
+     if (is64) {
+       if (safe_read_memory_integer (save_cache_base + 16, wordsize,
+                byte_order, &sig_pc)
+                && (sig_pc && (sig_pc < AIX_TEXT_SEGMENT_BASE)))
+         if (safe_read_memory_integer (save_cache_base + SIG_FRAME_FP_OFFSET64,
+                                       wordsize, byte_order, &backchain))
+           cache->base = (CORE_ADDR) backchain;
+     } else {
+       if (safe_read_memory_integer (save_cache_base + 8, wordsize,
+                byte_order, &sig_pc)
+                && (sig_pc && (sig_pc < AIX_TEXT_SEGMENT_BASE)))
+         if (safe_read_memory_integer (save_cache_base + SIG_FRAME_FP_OFFSET + 8,
+                                       wordsize, byte_order, &backchain))
+           cache->base = (CORE_ADDR) backchain;
+     }
+   }
  
    trad_frame_set_value (cache->saved_regs,
  			gdbarch_sp_regnum (gdbarch), cache->base);
--- ./gdb/xcoffread.h_orig	2018-01-09 07:12:34.000000000 -0600
+++ ./gdb/xcoffread.h	2018-01-09 07:12:53.000000000 -0600
@@ -23,4 +23,6 @@
  
  extern int xcoff_get_n_import_files (bfd *abfd);
  
+ extern int is64;
+ 
  #endif /* xcoffread.h */
--- ./gdb/xcoffread.c_orig	2018-01-09 07:13:53.000000000 -0600
+++ ./gdb/xcoffread.c	2018-01-09 07:15:31.000000000 -0600
@@ -52,6 +52,8 @@
  /* For interface with stabsread.c.  */
  #include "aout/stab_gnu.h"
  
+ int is64;
+ 
  
  /* Key for XCOFF-associated data.  */
  
@@ -1747,6 +1749,7 @@
  {
    struct objfile *objfile = this_symtab_objfile;
    int xcoff64 = bfd_xcoff_is_xcoff64 (objfile->obfd);
+   is64 = xcoff64;
  
    struct coff_symfile_info *info = XCOFF_DATA (objfile);
    int nsyms = info->symtbl_num_syms;
