]> git.unchartedbackwaters.co.uk Git - francis/libjit.git/commitdiff
add --enable-signals option and some support for signals
authorAleksey Demakov <ademakov@gmail.com>
Mon, 14 Aug 2006 19:21:19 +0000 (19:21 +0000)
committerAleksey Demakov <ademakov@gmail.com>
Mon, 14 Aug 2006 19:21:19 +0000 (19:21 +0000)
ChangeLog
configure.in
jit/Makefile.am
jit/jit-init.c
jit/jit-internal.h
jit/jit-signal.c [new file with mode: 0644]

index 68c68bf6f67ef7e92d50cbfc6676e6f56624b175..4cee899eaba416a907abbe3811d24126ab1926d7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2006-08-15  Kirill Kononenko  <Kirill.Kononenko@gmail.com>
+
+       * configure.in: add --enable-signals option;
+       * jit/Makefile.am: add jit/jit-signal.c;
+       * jit/jit-signal.c, jit/jit-internal.h: add _jit_signal_init();
+       * jit/jit-init.c: call _jit_signal_init() if JIT_USE_SIGNALS is
+       defined.
+
 2006-08-11  Thomas Cort  <linuxgeek@gmail.com>
 
        * jit/jit-rules-alpha.c jit/jit-rules-alpha.ins Properly handle
index 2f6040ca22fa253be82688ef7283e988cb6c7169..a9cc86f86be6303226db0ef5235e41c8b1cd33a7 100644 (file)
@@ -75,6 +75,18 @@ if test x$new_reg_alloc = xtrue; then
        AC_DEFINE(USE_NEW_REG_ALLOC, 1, [Define if you want to use new register allocator])
 fi
 
+dnl The "--enable-signals" option forces the use of the OS signals for exception handling.
+AC_ARG_ENABLE(signals,
+[  --enable-signals        Enable OS signal handling],
+[case "${enableval}" in
+  yes) use_signals=true ;;
+  no)  use_signals=false ;;
+  *) AC_MSG_ERROR(bad value ${enableval} for --enable-signals) ;;
+esac],[use_signals=false])
+if test x$use_signals = xtrue; then
+       AC_DEFINE(JIT_USE_SIGNALS, 1, [Define if you want to use the OS signals for exception handling])
+fi
+
 dnl The "--enable-long-double" option forces the use of long double for
 dnl jit_nfloat.
 AC_ARG_ENABLE(long-double,
index 8f84704adfdf1b91ea4b8782e1a8eb4ddc46c047..5bb4fc6fc5a8640f131b1dbc25584cd083174e6f 100644 (file)
@@ -52,6 +52,7 @@ libjit_la_SOURCES = \
                jit-rules-arm.c \
                jit-rules-x86.h \
                jit-rules-x86.c \
+               jit-signal.c \
                jit-string.c \
                jit-symbol.c \
                jit-thread.c \
index 5146d0571a2b5b935b86560dd1b4f1dffe0fad0a..c1f8282ffbe8b2ac5ad63ec152de56570ba0a201 100644 (file)
@@ -40,6 +40,11 @@ void jit_init(void)
        /* Make sure that the thread subsystem is initialized */
        _jit_thread_init();
 
+#ifdef JIT_USE_SIGNALS
+       /* Initialize the signal handlers */
+       _jit_signal_init();
+#endif
+
        /* Initialize the backend */
        _jit_init_backend();
 }
index cece21f63a30d4f110a12db45a4440d9771cff6b..4a30e7d5447e4c87836280e447a47ba9022ec4ee 100644 (file)
@@ -651,6 +651,15 @@ extern struct _jit_type const _jit_type_void_ptr_def;
  */
 #define        JIT_CALL_NATIVE         (1 << 14)
 
+#ifdef JIT_USE_SIGNALS
+
+/*
+ * Initialize the signal handlers.
+ */
+void _jit_signal_init(void);
+
+#endif
+
 #ifdef __cplusplus
 };
 #endif
diff --git a/jit/jit-signal.c b/jit/jit-signal.c
new file mode 100644 (file)
index 0000000..b2a72b6
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * jit-signal.c - Internal management routines to use Operating System
+ *               signals for libjit exceptions handling.
+ *
+ * Copyright (C) 2006  Southern Storm Software, Pty Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <config.h> 
+
+#ifdef JIT_USE_SIGNALS
+
+#include "jit-internal.h"
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/*
+ * Use SIGSEGV for builtin libjit exception.
+ */
+static void sigsegv_handler(int signum, siginfo_t *info, void *uap)
+{
+       jit_exception_builtin(JIT_RESULT_NULL_REFERENCE);
+}
+
+/*
+ * Use SIGFPE for builtin libjit exception.
+ */
+static void sigfpe_handler(int signum, siginfo_t *info, void *uap)
+{
+       switch(info->si_code)
+       {
+       case FPE_INTDIV:
+               jit_exception_builtin(JIT_RESULT_DIVISION_BY_ZERO);
+               break;
+       case FPE_INTOVF:
+               jit_exception_builtin(JIT_RESULT_OVERFLOW);
+               break;
+       case FPE_FLTDIV:
+               jit_exception_builtin(JIT_RESULT_DIVISION_BY_ZERO);
+               break;
+       case FPE_FLTOVF:
+               jit_exception_builtin(JIT_RESULT_OVERFLOW);
+               break;
+       case FPE_FLTUND:
+               jit_exception_builtin(JIT_RESULT_ARITHMETIC);
+               break;
+       case FPE_FLTSUB:
+               jit_exception_builtin(JIT_RESULT_ARITHMETIC);
+               break;
+       default:
+               jit_exception_builtin(JIT_RESULT_ARITHMETIC);
+               break;
+       }
+}
+
+/*
+ * Initialize signal handlers.
+ */
+void _jit_signal_init(void)
+{
+       struct sigaction sa_fpe, sa_segv;
+
+       sa_fpe.sa_sigaction = sigfpe_handler;
+       sigemptyset(&sa_fpe.sa_mask);
+       sa_fpe.sa_flags = SA_SIGINFO;
+       if (sigaction(SIGFPE, &sa_fpe, 0)) {
+               perror("Sigaction SIGFPE");
+               exit(1);
+       }
+
+       sa_segv.sa_sigaction = sigsegv_handler;
+       sigemptyset(&sa_segv.sa_mask);
+       sa_segv.sa_flags = SA_SIGINFO;
+       if (sigaction(SIGSEGV, &sa_segv, 0)) {
+               perror("Sigaction SIGSEGV");
+               exit(1);
+       }
+}
+
+#endif /* JIT_USE_SIGNALS */