From e9a82df9b0ff6f58b78c2a2093fe1254b0a87467 Mon Sep 17 00:00:00 2001 From: kkojima <kkojima@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Thu, 21 Oct 2004 10:44:39 +0000 Subject: [PATCH] * configure.ac (SIGNAL_HANDLER): Set to include/sh-signal.h for all sh*-*-linux* targets. * configure: Regenerate. * include/sh-signal.h: New file. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@89368 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/ChangeLog | 7 +++ libjava/configure | 4 +- libjava/configure.ac | 4 +- libjava/include/sh-signal.h | 96 +++++++++++++++++++++++++++++++++++++ 4 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 libjava/include/sh-signal.h diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 6feb54e0ff1c..2bad1d497502 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,10 @@ +2004-10-21 Kaz Kojima <kkojima@gcc.gnu.org> + + * configure.ac (SIGNAL_HANDLER): Set to include/sh-signal.h + for all sh*-*-linux* targets. + * configure: Regenerate. + * include/sh-signal.h: New file. + 2004-10-21 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com> * java/lang/ieeefp.h: Add m32r support. diff --git a/libjava/configure b/libjava/configure index 050c5281a71c..d3ce0509d0fb 100755 --- a/libjava/configure +++ b/libjava/configure @@ -16211,8 +16211,8 @@ case "${host}" in sparc*-*-linux*) SIGNAL_HANDLER=include/dwarf2-signal.h ;; - sh-*-linux* | sh[34]*-*-linux*) - SIGNAL_HANDLER=include/dwarf2-signal.h + sh*-*-linux*) + SIGNAL_HANDLER=include/sh-signal.h ;; *mingw*) SIGNAL_HANDLER=include/win32-signal.h diff --git a/libjava/configure.ac b/libjava/configure.ac index c0282afda5ba..80775ab6219a 100644 --- a/libjava/configure.ac +++ b/libjava/configure.ac @@ -1310,8 +1310,8 @@ case "${host}" in sparc*-*-linux*) SIGNAL_HANDLER=include/dwarf2-signal.h ;; - sh-*-linux* | sh[[34]]*-*-linux*) - SIGNAL_HANDLER=include/dwarf2-signal.h + sh*-*-linux*) + SIGNAL_HANDLER=include/sh-signal.h ;; *mingw*) SIGNAL_HANDLER=include/win32-signal.h diff --git a/libjava/include/sh-signal.h b/libjava/include/sh-signal.h new file mode 100644 index 000000000000..9c76b5716beb --- /dev/null +++ b/libjava/include/sh-signal.h @@ -0,0 +1,96 @@ +// sh-signal.h - Catch runtime signals and turn them into exceptions +// on a SuperH based Linux system. + +/* Copyright (C) 2004 Free Software Foundation + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + + +#ifndef JAVA_SIGNAL_H +#define JAVA_SIGNAL_H 1 + +#include <signal.h> +#include <sys/syscall.h> + +#define HANDLE_SEGV 1 +#define HANDLE_FPE 1 + +/* The third parameter to the signal handler points to something with + * this structure defined in asm/ucontext.h, but the name clashes with + * struct ucontext from sys/ucontext.h so this private copy is used. */ +typedef struct _sig_ucontext { + unsigned long uc_flags; + struct _sig_ucontext *uc_link; + stack_t uc_stack; + struct sigcontext uc_mcontext; + sigset_t uc_sigmask; +} sig_ucontext_t; + +#define SIGNAL_HANDLER(_name) \ + static void _name (int , siginfo_t *, sig_ucontext_t *_uc) + +/* SH 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. */ + +#ifdef __SH5__ +#define MAKE_THROW_FRAME(_exception) \ +do \ + { \ + volatile struct sigcontext *_sc = &_uc->uc_mcontext; \ + _sc->sc_pc += 4; \ + } \ +while (0) +#else +#define MAKE_THROW_FRAME(_exception) \ +do \ + { \ + volatile struct sigcontext *_sc = &_uc->uc_mcontext; \ + _sc->sc_pc += 2; \ + } \ +while (0) +#endif + +/* For an explanation why we cannot simply use sigaction to + install the handlers, see i386-signal.h. */ + +/* We use kernel_old_sigaction here because we're calling the kernel + directly rather than via glibc. The sigaction structure that the + syscall uses is a different shape from the one in userland and not + visible to us in a header file so we define it here. */ + +struct kernel_old_sigaction { + void (*k_sa_handler) (int, siginfo_t *, sig_ucontext_t *); + unsigned long k_sa_mask; + unsigned long k_sa_flags; + void (*k_sa_restorer) (void); +}; + +#define INIT_SEGV \ +do \ + { \ + struct kernel_old_sigaction kact; \ + kact.k_sa_handler = catch_segv; \ + kact.k_sa_mask = 0; \ + kact.k_sa_flags = SA_SIGINFO | SA_NODEFER; \ + syscall (SYS_sigaction, SIGSEGV, &kact, NULL); \ + } \ +while (0) + +#define INIT_FPE \ +do \ + { \ + struct kernel_old_sigaction kact; \ + kact.k_sa_handler = catch_fpe; \ + kact.k_sa_mask = 0; \ + kact.k_sa_flags = SA_SIGINFO | SA_NODEFER; \ + syscall (SYS_sigaction, SIGFPE, &kact, NULL); \ + } \ +while (0) + +#endif /* JAVA_SIGNAL_H */ -- GitLab