aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authoraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>2002-03-27 17:08:47 +0000
committeraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>2002-03-27 17:08:47 +0000
commit4598eaac9498833e275c3574994e83fd0ec321e3 (patch)
treeea513140d8d39b278904ffee2b2456d22ec84f39 /libjava
parent1096416e8a0c8d3cc6a8c3c200763a0366b8aa7a (diff)
2002-03-25 Andrew Haley <aph@cambridge.redhat.com>, Hans Boehm <Hans_Boehm@hp.com>
* include/dwarf2-signal.h (MAKE_THROW_FRAME): Add for IA-64. (INIT_SEGV, INIT_FPE): Add versions that use __libc_sigaction instead of syscall on IA-64. Add FIXME comment. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@51459 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog7
-rw-r--r--libjava/include/dwarf2-signal.h55
2 files changed, 62 insertions, 0 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 2a57cc407bd..878854b9220 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,10 @@
+2002-03-25 Andrew Haley <aph@cambridge.redhat.com>, Hans Boehm <Hans_Boehm@hp.com>
+
+ * include/dwarf2-signal.h (MAKE_THROW_FRAME): Add for IA-64.
+ (INIT_SEGV, INIT_FPE): Add versions that use __libc_sigaction
+ instead of syscall on IA-64.
+ Add FIXME comment.
+
2002-03-27 Anthony Green <green@redhat.com>
* libgcj.spec.in: Add CHECKREFSPEC.
diff --git a/libjava/include/dwarf2-signal.h b/libjava/include/dwarf2-signal.h
index 3a662aec2d9..cde0fa9d8cc 100644
--- a/libjava/include/dwarf2-signal.h
+++ b/libjava/include/dwarf2-signal.h
@@ -41,6 +41,23 @@ do \
_sc->sc_pc += 4; \
} \
while (0)
+
+#elif defined(__ia64__)
+
+#define MAKE_THROW_FRAME(_exception) \
+do \
+{ \
+ /* IA-64 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. */ \
+ /* 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. */ \
+ struct sigcontext *_sc = (struct sigcontext *)_p; \
+ _sc->sc_ip++; \
+} \
+while (0)
#else
#define MAKE_THROW_FRAME(_exception) \
do \
@@ -50,6 +67,7 @@ do \
while (0)
#endif
+#ifndef __ia64__
#define INIT_SEGV \
do \
{ \
@@ -82,4 +100,41 @@ while (0)
* go away once all systems have pthreads libraries that are
* compiled with full unwind info. */
+#else /* __ia64__ */
+
+// FIXME: We shouldn't be using libc_sigaction here, since it should
+// be glibc private. But using syscall here would mean translating to
+// the kernel's struct sigaction and argument sequence, which we
+// shouldn't either. The right solution is to call sigaction and to
+// make sure that we can unwind correctly through the pthread signal
+// wrapper.
+extern "C" int __libc_sigaction (int __sig,
+ __const struct sigaction *__restrict __act,
+ struct sigaction *__restrict __oact) throw ();
+
+#define INIT_SEGV \
+do \
+ { \
+ nullp = new java::lang::NullPointerException (); \
+ struct sigaction act; \
+ act.sa_sigaction = _Jv_catch_segv; \
+ sigemptyset (&act.sa_mask); \
+ act.sa_flags = SA_SIGINFO; \
+ __libc_sigaction (SIGSEGV, &act, NULL); \
+ } \
+while (0)
+
+#define INIT_FPE \
+do \
+ { \
+ arithexception = new java::lang::ArithmeticException \
+ (JvNewStringLatin1 ("/ by zero")); \
+ struct sigaction act; \
+ act.sa_sigaction = _Jv_catch_fpe; \
+ sigemptyset (&act.sa_mask); \
+ act.sa_flags = SA_SIGINFO; \
+ __libc_sigaction (SIGFPE, &act, NULL); \
+ } \
+while (0)
+#endif /* __ia64__ */
#endif /* JAVA_SIGNAL_H */