OSDN Git Service

* hpux-unwind.h (pa_fallback_frame_state): Handle return parameter
authordanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 May 2006 00:36:11 +0000 (00:36 +0000)
committerdanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 May 2006 00:36:11 +0000 (00:36 +0000)
relocation and relocation stubs.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@113640 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/pa/hpux-unwind.h

index c2223f4..242e624 100644 (file)
@@ -1,3 +1,8 @@
+2006-05-08  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+       * hpux-unwind.h (pa_fallback_frame_state): Handle return parameter
+       relocation and relocation stubs.
+
 2006-05-08  Eric Christopher  <echristo@apple.com>
 
        * unwind-dw2-fde-darwin.c (examine_objects): Only check data
index aa443bf..383b072 100644 (file)
@@ -116,6 +116,26 @@ pa_fallback_frame_state (struct _Unwind_Context *context,
   if (pc == 0)
     return _URC_END_OF_STACK;
 
+  /* Check for relocation of the return value.  */
+  if (!TARGET_64BIT
+      && *(pc + 0) == 0x2fd01224               /* fstd,ma fr4,8(sp) */
+      && *(pc + 1) == 0x0fd9109d               /* ldw -4(sp),ret1 */
+      && *(pc + 2) == 0x0fd130bc)              /* ldw,mb -8(sp),ret0 */
+    pc += 3;
+  else if (!TARGET_64BIT
+          && *(pc + 0) == 0x27d01224           /* fstw,ma fr4,8(sp) */
+          && *(pc + 1) == 0x0fd130bc)          /* ldw,mb -8(sp),ret0 */
+    pc += 2;
+  else if (!TARGET_64BIT
+          && *(pc + 0) == 0x0fdc12b0           /* stw,ma ret0,8(sp) */
+          && *(pc + 1) == 0x0fdd1299           /* stw ret1,-4(sp) */
+          && *(pc + 2) == 0x2fd13024)          /* fldd,mb -8(sp),fr4 */
+    pc += 3;
+  else if (!TARGET_64BIT
+          && *(pc + 0) == 0x0fdc12b0           /* stw,ma ret0,8(sp) */
+          && *(pc + 1) == 0x27d13024)          /* fldw,mb -8(sp),fr4 */
+    pc += 2;
+
   /* Check if the return address points to an export stub (PA 1.1 or 2.0).  */
   if ((!TARGET_64BIT
        && *(pc + 0) == 0x4bc23fd1              /* ldw -18(sp),rp */
@@ -137,6 +157,22 @@ pa_fallback_frame_state (struct _Unwind_Context *context,
 
       return _URC_NO_REASON;
     }
+  /* Check if the return address points to a relocation stub.  */
+  else if (!TARGET_64BIT
+          && *(pc + 0) == 0x0fd11082           /* ldw -8(sp),rp */
+          && (*(pc + 1) == 0xe840c002          /* bv,n r0(rp) */
+              || *(pc + 1) == 0xe840d002))     /* bve,n (rp) */
+    {
+      fs->cfa_how    = CFA_REG_OFFSET;
+      fs->cfa_reg    = 30;
+      fs->cfa_offset = 0;
+
+      fs->retaddr_column = 0;
+      fs->regs.reg[0].how = REG_SAVED_OFFSET;
+      fs->regs.reg[0].loc.offset = -8;
+
+      return _URC_NO_REASON;
+    }
 
   /* Check if the return address is an export stub as signal handlers
      may return via an export stub.  */