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,
--- /dev/null
+/*
+ * 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 */