configure.in, configure: enable dwarf2-exception-style exception handling on IA-64.
* configure.in, configure: enable dwarf2-exception-style exception handling on IA-64. * include/dwarf2-signal.h (MAKE_THROW_FRAME): Add for IA-64. (INIT_SEGV, INIT_FPE): Use __libc_sigaction instead of syscall. Add FIXME comment. From-SVN: r51367
This commit is contained in:
parent
caba570b31
commit
90b2d2afa1
@ -1,3 +1,11 @@
|
||||
2002-03-25 Andrew Haley <aph@cambridge.redhat.com>, Hans Boehm <Hans_Boehm@hp.com>
|
||||
|
||||
* configure.in, configure: enable dwarf2-exception-style
|
||||
exception handling on IA-64.
|
||||
* include/dwarf2-signal.h (MAKE_THROW_FRAME): Add for IA-64.
|
||||
(INIT_SEGV, INIT_FPE): Use __libc_sigaction instead of syscall.
|
||||
Add FIXME comment.
|
||||
|
||||
2002-03-25 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* Makefile.am (libgcj_la_LDFLAGS): Use THREADLDFLAGS.
|
||||
|
3
libjava/configure
vendored
3
libjava/configure
vendored
@ -6400,6 +6400,9 @@ case "${host}" in
|
||||
# SYSDEP_SOURCES=sysdep/ia64.c
|
||||
# test -d sysdep || mkdir sysdep
|
||||
# ;;
|
||||
ia64-*-linux*)
|
||||
SIGNAL_HANDLER=include/dwarf2-signal.h
|
||||
;;
|
||||
powerpc-*-linux*)
|
||||
SIGNAL_HANDLER=include/dwarf2-signal.h
|
||||
;;
|
||||
|
@ -852,6 +852,9 @@ case "${host}" in
|
||||
# SYSDEP_SOURCES=sysdep/ia64.c
|
||||
# test -d sysdep || mkdir sysdep
|
||||
# ;;
|
||||
ia64-*-linux*)
|
||||
SIGNAL_HANDLER=include/dwarf2-signal.h
|
||||
;;
|
||||
powerpc-*-linux*)
|
||||
SIGNAL_HANDLER=include/dwarf2-signal.h
|
||||
;;
|
||||
|
@ -41,7 +41,25 @@ 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
|
||||
#error
|
||||
#define MAKE_THROW_FRAME(_exception) \
|
||||
do \
|
||||
{ \
|
||||
@ -50,6 +68,16 @@ do \
|
||||
while (0)
|
||||
#endif
|
||||
|
||||
// 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 \
|
||||
{ \
|
||||
@ -58,7 +86,7 @@ do \
|
||||
act.sa_sigaction = _Jv_catch_segv; \
|
||||
sigemptyset (&act.sa_mask); \
|
||||
act.sa_flags = SA_SIGINFO; \
|
||||
syscall (SYS_sigaction, SIGSEGV, &act, NULL); \
|
||||
__libc_sigaction (SIGSEGV, &act, NULL); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
@ -71,7 +99,7 @@ do \
|
||||
act.sa_sigaction = _Jv_catch_fpe; \
|
||||
sigemptyset (&act.sa_mask); \
|
||||
act.sa_flags = SA_SIGINFO; \
|
||||
syscall (SYS_sigaction, SIGFPE, &act, NULL); \
|
||||
__libc_sigaction (SIGFPE, &act, NULL); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user