dwarf2-signal.h (MAKE_THROW_FRAME): Add for IA-64.

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.

From-SVN: r51458
This commit is contained in:
Andrew Haley 2002-03-27 17:06:17 +00:00 committed by Andrew Haley
parent d705c69ab6
commit 975e3fae17
2 changed files with 62 additions and 0 deletions

View File

@ -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-24 Tom Tromey <tromey@redhat.com>
* java/awt/TextComponent.java (TextComponent): Editable by

View File

@ -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 */