aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/pa/hpux-unwind.h12
-rw-r--r--gcc/unwind-dw2.c4
3 files changed, 21 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9baecb1..d71b1b4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2006-05-17 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
+
+ * unwind-dw2.c: Add declarations for uw_update_context and
+ uw_frame_state_for.
+ * pa/hpux-unwind.h (pa_fallback_frame_state): When an export stub is
+ detected, advance frame state and context once to skip over stub.
+
2006-05-17 Sebastian Pop <pop@cri.ensmp.fr>
PR middle-end/20256
diff --git a/gcc/config/pa/hpux-unwind.h b/gcc/config/pa/hpux-unwind.h
index 383b072..d521498 100644
--- a/gcc/config/pa/hpux-unwind.h
+++ b/gcc/config/pa/hpux-unwind.h
@@ -155,7 +155,11 @@ pa_fallback_frame_state (struct _Unwind_Context *context,
fs->regs.reg[0].how = REG_SAVED_OFFSET;
fs->regs.reg[0].loc.offset = -24;
- return _URC_NO_REASON;
+ /* Update context to describe the stub frame. */
+ uw_update_context (context, fs);
+
+ /* Set up fs to describe the FDE for the caller of this stub. */
+ return uw_frame_state_for (context, fs);
}
/* Check if the return address points to a relocation stub. */
else if (!TARGET_64BIT
@@ -171,7 +175,11 @@ pa_fallback_frame_state (struct _Unwind_Context *context,
fs->regs.reg[0].how = REG_SAVED_OFFSET;
fs->regs.reg[0].loc.offset = -8;
- return _URC_NO_REASON;
+ /* Update context to describe the stub frame. */
+ uw_update_context (context, fs);
+
+ /* Set up fs to describe the FDE for the caller of this stub. */
+ return uw_frame_state_for (context, fs);
}
/* Check if the return address is an export stub as signal handlers
diff --git a/gcc/unwind-dw2.c b/gcc/unwind-dw2.c
index 55a6143..d205122 100644
--- a/gcc/unwind-dw2.c
+++ b/gcc/unwind-dw2.c
@@ -92,6 +92,10 @@ union unaligned
signed s8 __attribute__ ((mode (DI)));
} __attribute__ ((packed));
+static void uw_update_context (struct _Unwind_Context *, _Unwind_FrameState *);
+static _Unwind_Reason_Code uw_frame_state_for (struct _Unwind_Context *,
+ _Unwind_FrameState *);
+
static inline void *
read_pointer (const void *p) { const union unaligned *up = p; return up->p; }