aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2006-02-27 18:26:26 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2006-02-27 18:26:26 +0100
commit754e45a8679ad25d2f622919749497c16dc2ea4c (patch)
tree6984337363ffe60556818a17e48ceaa2283110bb /libjava
parent6df11ca1befd286661b26a6a2a6774f4d4aa483c (diff)
downloadgcc-754e45a8679ad25d2f622919749497c16dc2ea4c.zip
gcc-754e45a8679ad25d2f622919749497c16dc2ea4c.tar.gz
gcc-754e45a8679ad25d2f622919749497c16dc2ea4c.tar.bz2
re PR other/26208 (Serious problem with unwinding through signal frames)
PR other/26208 * unwind-dw2.c (struct _Unwind_Context): Add signal_frame field. (extract_cie_info): Handle S flag in augmentation string. (execute_cfa_program): If context->signal_frame, execute also fs->pc == context->ra instructions. (uw_frame_state_for): If context->signal_frame, don't subtract one from context->ra to find FDE. (uw_update_context_1): Set context->signal_frame to fs->signal_frame. (_Unwind_GetIPInfo): New function. * unwind-dw2.h (_Unwind_FrameState): Add signal_frame field. * unwind-c.c (PERSONALITY_FUNCTION): Use _Unwind_GetIPInfo instead of _Unwind_GetIP. * unwind-sjlj.c (_Unwind_GetIPInfo): New function. * unwind-generic.h (_Unwind_GetIPInfo): New prototype. * unwind-compat.c (_Unwind_GetIPInfo): New function. * libgcc-std.ver (_Unwind_GetIPInfo): Export @@GCC_4.2.0. * config/ia64/unwind-ia64.c (_Unwind_GetIPInfo): New function. * config/arm/unwind-arm.h (_Unwind_GetIPInfo): Define. * config/i386/linux-unwind.h (x86_fallback_frame_state, x86_64_fallback_frame_state): Set fs->signal_frame. * config/rs6000/linux-unwind.h (ppc_fallback_frame_state): Likewise. (MD_FROB_UPDATE_CONTEXT): Define unconditionally. (frob_update_context): Likewise. Workaround missing S flag in Linux 2.6.12 - 2.6.16 kernel vDSOs. * config/s390/linux-unwind.h (s390_fallback_frame_state): Likewise. Remove the psw_addr + 1 hack. libjava/ * exception.cc (PERSONALITY_FUNCTION): Use _Unwind_GetIPInfo instead of _Unwind_GetIP. * include/i386-signal.h (MAKE_THROW_FRAME): Change into empty macro. (HANDLE_DIVIDE_OVERFLOW): Don't adjust _res->eip if falling through to throw. * include/x86_64-signal.h (MAKE_THROW_FRAME): Change into empty macro. * include/powerpc-signal.h (MAKE_THROW_FRAME): Change into empty macro. libstdc++-v3/ * libsupc++/eh_personality.cc (PERSONALITY_FUNCTION): Use _Unwind_GetIPInfo instead of _Unwind_GetIP. From-SVN: r111488
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog13
-rw-r--r--libjava/exception.cc11
-rw-r--r--libjava/include/i386-signal.h24
-rw-r--r--libjava/include/powerpc-signal.h18
-rw-r--r--libjava/include/x86_64-signal.h13
5 files changed, 30 insertions, 49 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 6804217..ba8b42b 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,16 @@
+2006-02-27 Jakub Jelinek <jakub@redhat.com>
+
+ PR other/26208
+ * exception.cc (PERSONALITY_FUNCTION): Use _Unwind_GetIPInfo instead
+ of _Unwind_GetIP.
+ * include/i386-signal.h (MAKE_THROW_FRAME): Change into empty macro.
+ (HANDLE_DIVIDE_OVERFLOW): Don't adjust _res->eip if falling through
+ to throw.
+ * include/x86_64-signal.h (MAKE_THROW_FRAME): Change into empty
+ macro.
+ * include/powerpc-signal.h (MAKE_THROW_FRAME): Change into empty
+ macro.
+
2006-02-23 Scott Gilbertson <scottg@mantatest.com>
* gnu/awt/j2d/IntegerGraphicsState.java (getClip): Clone clip
diff --git a/libjava/exception.cc b/libjava/exception.cc
index 367df36..65bc4ed 100644
--- a/libjava/exception.cc
+++ b/libjava/exception.cc
@@ -1,6 +1,6 @@
// Functions for Exception Support for Java.
-/* Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation
+/* Copyright (C) 1998, 1999, 2001, 2002, 2006 Free Software Foundation
This file is part of libgcj.
@@ -197,6 +197,7 @@ PERSONALITY_FUNCTION (int version,
int handler_switch_value;
bool saw_cleanup;
bool saw_handler;
+ int ip_before_insn = 0;
// Interface version check.
@@ -212,10 +213,10 @@ PERSONALITY_FUNCTION (int version,
goto install_context;
}
- // FIXME: In Phase 1, record _Unwind_GetIP in xh->obj as a part of
+ // FIXME: In Phase 1, record _Unwind_GetIPInfo in xh->obj as a part of
// the stack trace for this exception. This will only collect Java
// frames, but perhaps that is acceptable.
- // FIXME2: _Unwind_GetIP is nonsensical for SJLJ, being a call-site
+ // FIXME2: _Unwind_GetIPInfo is nonsensical for SJLJ, being a call-site
// index instead of a PC value. We could perhaps arrange for
// _Unwind_GetRegionStart to return context->fc->jbuf[1], which
// is the address of the handler label for __builtin_longjmp, but
@@ -230,7 +231,9 @@ PERSONALITY_FUNCTION (int version,
// Parse the LSDA header.
p = parse_lsda_header (context, language_specific_data, &info);
- ip = _Unwind_GetIP (context) - 1;
+ ip = _Unwind_GetIPInfo (context, &ip_before_insn);
+ if (! ip_before_insn)
+ --ip;
landing_pad = 0;
action_record = 0;
handler_switch_value = 0;
diff --git a/libjava/include/i386-signal.h b/libjava/include/i386-signal.h
index a5c8ae4..a30ceeb 100644
--- a/libjava/include/i386-signal.h
+++ b/libjava/include/i386-signal.h
@@ -1,7 +1,7 @@
// i386-signal.h - Catch runtime signals and turn them into exceptions
// on an i386 based Linux system.
-/* Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation
+/* Copyright (C) 1998, 1999, 2001, 2002, 2006 Free Software Foundation
This file is part of libgcj.
@@ -22,19 +22,7 @@ details. */
#define SIGNAL_HANDLER(_name) \
static void _name (int _dummy __attribute__ ((__unused__)))
-#define MAKE_THROW_FRAME(_exception) \
-do \
-{ \
- void **_p = (void **)&_dummy; \
- volatile struct sigcontext_struct *_regs = (struct sigcontext_struct *)++_p; \
- \
- /* Advance the program counter so that it is after the start of the \
- instruction: the x86 exception handler expects \
- the PC to point to the instruction after a call. */ \
- _regs->eip += 2; \
- \
-} \
-while (0)
+#define MAKE_THROW_FRAME(_exception)
#define HANDLE_DIVIDE_OVERFLOW \
do \
@@ -91,14 +79,6 @@ do \
_regs->eip = (unsigned long)_eip; \
return; \
} \
- else \
- { \
- /* Advance the program counter so that it is after the start \
- of the instruction: this is because the x86 exception \
- handler expects the PC to point to the instruction after a \
- call. */ \
- _regs->eip += 2; \
- } \
} \
} \
while (0)
diff --git a/libjava/include/powerpc-signal.h b/libjava/include/powerpc-signal.h
index 0d5a662..66133e9 100644
--- a/libjava/include/powerpc-signal.h
+++ b/libjava/include/powerpc-signal.h
@@ -1,7 +1,7 @@
// powerpc-signal.h - Catch runtime signals and turn them into exceptions
// on a powerpc based Linux system.
-/* Copyright (C) 2003 Free Software Foundation
+/* Copyright (C) 2003, 2006 Free Software Foundation
This file is part of libgcj.
@@ -22,18 +22,12 @@ details. */
#define SIGNAL_HANDLER(_name) \
static void _name (int /* _signal */, struct sigcontext *_sc)
-/* PPC either leaves PC pointing at a faulting instruction or the
- following instruction, depending on the signal. SEGV always does
- the former, so we adjust the saved PC to point to the following
- instruction. This is what the handler in libgcc expects. */
+/* MD_FALBACK_FRAME_STATE_FOR takes care of special casing PC
+ before the faulting instruction, so we don't need to do anything
+ here. */
+
+#define MAKE_THROW_FRAME(_exception)
-#define MAKE_THROW_FRAME(_exception) \
-do \
- { \
- _sc->regs->nip += 4; \
- } \
-while (0)
-
/* For an explanation why we cannot simply use sigaction to
install the handlers, see i386-signal.h. */
diff --git a/libjava/include/x86_64-signal.h b/libjava/include/x86_64-signal.h
index f6df7d7..b4b4c2b 100644
--- a/libjava/include/x86_64-signal.h
+++ b/libjava/include/x86_64-signal.h
@@ -1,7 +1,7 @@
// x86_64-signal.h - Catch runtime signals and turn them into exceptions
// on an x86_64 based GNU/Linux system.
-/* Copyright (C) 2003 Free Software Foundation
+/* Copyright (C) 2003, 2006 Free Software Foundation
This file is part of libgcj.
@@ -34,16 +34,7 @@ extern "C"
};
}
-#define MAKE_THROW_FRAME(_exception) \
-do \
-{ \
- /* Advance the program counter so that it is after the start of the \
- instruction: the x86_64 exception handler expects \
- the PC to point to the instruction after a call. */ \
- struct ucontext *_uc = (struct ucontext *)_p; \
- _uc->uc_mcontext.gregs[REG_RIP] += 2; \
-} \
-while (0)
+#define MAKE_THROW_FRAME(_exception)
#define RESTORE(name, syscall) RESTORE2 (name, syscall)
#define RESTORE2(name, syscall) \