2004-05-17 Randolph Chung <tausq@debian.org>
authorRandolph Chung <tausq@debian.org>
Mon, 17 May 2004 16:46:06 +0000 (16:46 +0000)
committerRandolph Chung <tausq@debian.org>
Mon, 17 May 2004 16:46:06 +0000 (16:46 +0000)
* hppa-tdep.c (hppa_stub_frame_unwind_cache): For HPUX stub unwinding,
check to see if we are unwinding an export stub.  Export stubs clobber
the %rp in the call path and stores the original rp in a stack slot.

gdb/ChangeLog
gdb/hppa-tdep.c

index cf1dd11fc4254e8ccfc45640526f0512272e7fd1..de9b2fa1c05cbeba8cc402a7251499fd536e1750 100644 (file)
@@ -1,3 +1,9 @@
+2004-05-17  Randolph Chung  <tausq@debian.org>
+
+       * hppa-tdep.c (hppa_stub_frame_unwind_cache): For HPUX stub unwinding,
+       check to see if we are unwinding an export stub.  Export stubs clobber
+       the %rp in the call path and stores the original rp in a stack slot.
+
 2004-05-17  Jim Blandy  <jimb@redhat.com>
 
        * MAINTAINERS: Update address for J.T. Conklin.
index 8ed50f9311c0fb61cce46f869dc12846481dd725..a872e4f89a44bb891a0acd3517eb4796187b4df8 100644 (file)
@@ -1987,6 +1987,7 @@ hppa_stub_frame_unwind_cache (struct frame_info *next_frame,
 {
   struct gdbarch *gdbarch = get_frame_arch (next_frame);
   struct hppa_stub_unwind_cache *info;
+  struct unwind_table_entry *u;
 
   if (*this_cache)
     return *this_cache;
@@ -1995,9 +1996,27 @@ hppa_stub_frame_unwind_cache (struct frame_info *next_frame,
   *this_cache = info;
   info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
 
-  info->saved_regs[HPPA_PCOQ_HEAD_REGNUM].realreg = HPPA_RP_REGNUM;
   info->base = frame_unwind_register_unsigned (next_frame, HPPA_SP_REGNUM);
 
+  if (gdbarch_osabi (gdbarch) == GDB_OSABI_HPUX_ELF 
+      || gdbarch_osabi (gdbarch) == GDB_OSABI_HPUX_SOM)
+    {
+      /* HPUX uses export stubs in function calls; the export stub clobbers
+         the return value of the caller, and, later restores it from the
+        stack.  */
+      u = find_unwind_entry (frame_pc_unwind (next_frame));
+
+      if (u && u->stub_unwind.stub_type == EXPORT)
+       {
+          info->saved_regs[HPPA_PCOQ_HEAD_REGNUM].addr = info->base - 24;
+
+         return info;
+       }
+    }
+
+  /* By default we assume that stubs do not change the rp.  */
+  info->saved_regs[HPPA_PCOQ_HEAD_REGNUM].realreg = HPPA_RP_REGNUM;
+
   return info;
 }