You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
2.3 KiB

/*
* 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 */