diff options
author | aph <aph@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-03-27 17:08:47 +0000 |
---|---|---|
committer | aph <aph@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-03-27 17:08:47 +0000 |
commit | 4598eaac9498833e275c3574994e83fd0ec321e3 (patch) | |
tree | ea513140d8d39b278904ffee2b2456d22ec84f39 /libjava | |
parent | 1096416e8a0c8d3cc6a8c3c200763a0366b8aa7a (diff) | |
download | gcc-4598eaac9498833e275c3574994e83fd0ec321e3.tar.gz |
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/ChangeLog | 7 | ||||
-rw-r--r-- | libjava/include/dwarf2-signal.h | 55 |
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 */ |