configure.ac (SIGNAL_HANDLER): Set to include/sh-signal.h for all sh*-*-linux* targets.
authorKaz Kojima <kkojima@gcc.gnu.org>
Thu, 21 Oct 2004 10:44:39 +0000 (10:44 +0000)
committerKaz Kojima <kkojima@gcc.gnu.org>
Thu, 21 Oct 2004 10:44:39 +0000 (10:44 +0000)
* configure.ac (SIGNAL_HANDLER): Set to include/sh-signal.h
for all sh*-*-linux* targets.
* configure: Regenerate.
* include/sh-signal.h: New file.

From-SVN: r89368

libjava/ChangeLog
libjava/configure
libjava/configure.ac
libjava/include/sh-signal.h [new file with mode: 0644]

index 6feb54e..2bad1d4 100644 (file)
@@ -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.
index 050c528..d3ce050 100755 (executable)
@@ -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
index c0282af..80775ab 100644 (file)
@@ -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 (file)
index 0000000..9c76b57
--- /dev/null
@@ -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 */