summaryrefslogtreecommitdiff
path: root/libjava/include/dwarf2-signal.h
diff options
context:
space:
mode:
authordavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>2002-04-27 00:04:14 +0000
committerdavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>2002-04-27 00:04:14 +0000
commit364730256d41b15e14dc2acc2c1362a161aa5547 (patch)
tree8bed0913f39b308ccc8db5c01cfe920e5e291d46 /libjava/include/dwarf2-signal.h
parent18fe6a56d778e0e419820df8ebfc9739df31b79d (diff)
downloadgcc-364730256d41b15e14dc2acc2c1362a161aa5547.tar.gz
2002-04-25 David S. Miller <davem@redhat.com>
PR target/6422 * include/dwarf2-signal.h (MAKE_THROW_FRAME for sparc*): Set program counter to next program counter minus 8. Update comments in this macro to explain why. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@52820 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/include/dwarf2-signal.h')
-rw-r--r--libjava/include/dwarf2-signal.h34
1 files changed, 20 insertions, 14 deletions
diff --git a/libjava/include/dwarf2-signal.h b/libjava/include/dwarf2-signal.h
index fa55d4d15a7..b7530b2cbf3 100644
--- a/libjava/include/dwarf2-signal.h
+++ b/libjava/include/dwarf2-signal.h
@@ -67,11 +67,15 @@ while (0)
do \
{ \
/* Sparc-32 leaves PC pointing at a faulting instruction \
- always. So we adjust the saved PC to point to the following \
- instruction; this is what the handler in libgcc expects. */ \
- /* Note that we are lying to the unwinder here, which expects the \
- faulting pc, not pc+1. But we claim the unwind information can't \
- be changed by such a ld or st instruction, so it doesn't matter. */ \
+ always. \
+ We advance the PC one instruction past the exception causing PC. \
+ This is done because FDEs are found with "context->ra - 1" in the \
+ unwinder. \
+ Also, the dwarf2 unwind machinery is going to add 8 to the \
+ PC it uses on Sparc. So we adjust the PC here. We do it here \
+ because we run once for such an exception, however the Sparc specific\
+ unwind can run multiple times for the same exception and it would \
+ adjust the PC more than once resulting in a bogus value. */ \
struct sig_regs { \
unsigned int psr, pc, npc, y, u_regs[16]; \
} *regp; \
@@ -83,8 +87,7 @@ do \
else \
/* mov __NR_rt_sigaction, %g1; New signal stack layout */ \
regp = (struct sig_regs *) (_sip + 1); \
- regp->pc = regp->npc; \
- regp->npc += 4; \
+ regp->pc = ((regp->pc + 4) - 8); \
} \
while (0)
#else
@@ -92,18 +95,21 @@ while (0)
do \
{ \
/* Sparc-64 leaves PC pointing at a faulting instruction \
- always. So we adjust the saved PC to point to the following \
- instruction; this is what the handler in libgcc expects. */ \
- /* Note that we are lying to the unwinder here, which expects the \
- faulting pc, not pc+1. But we claim the unwind information can't \
- be changed by such a ld or st instruction, so it doesn't matter. */ \
+ always. \
+ We advance the PC one instruction past the exception causing PC. \
+ This is done because FDEs are found with "context->ra - 1" in the \
+ unwinder. \
+ Also, the dwarf2 unwind machinery is going to add 8 to the \
+ PC it uses on Sparc. So we adjust the PC here. We do it here \
+ because we run once for such an exception, however the Sparc specific\
+ unwind can run multiple times for the same exception and it would \
+ adjust the PC more than once resulting in a bogus value. */ \
struct pt_regs { \
unsigned long u_regs[16]; \
unsigned long tstate, tpc, tnpc; \
unsigned int y, fprs; \
} *regp = (struct pt_regs *) (_sip + 1); \
- regp->tpc = regp->tnpc; \
- regp->tnpc += 4; \
+ regp->tpc = ((regp->tpc + 4) - 8); \
} \
while (0)
#endif