mirror of
https://git.FreeBSD.org/ports.git
synced 2024-11-05 22:43:24 +00:00
85 lines
1.9 KiB
Plaintext
85 lines
1.9 KiB
Plaintext
|
*** ./ada/a-init.c.orig Fri Sep 24 08:42:43 1999
|
||
|
--- ./ada/a-init.c Sat Nov 6 16:22:51 1999
|
||
|
***************
|
||
|
*** 1445,1450 ****
|
||
|
--- 1445,1523 ----
|
||
|
}
|
||
|
|
||
|
|
||
|
+ /*************************************************/
|
||
|
+ /* __gnat_initialize (FreeBSD version) */
|
||
|
+ /*************************************************/
|
||
|
+
|
||
|
+ #elif defined (__FreeBSD__)
|
||
|
+
|
||
|
+ #include <signal.h>
|
||
|
+ #include <unistd.h>
|
||
|
+
|
||
|
+ static void
|
||
|
+ __gnat_error_handler (sig, code, sc)
|
||
|
+ int sig;
|
||
|
+ int code;
|
||
|
+ struct sigcontext *sc;
|
||
|
+ {
|
||
|
+ struct Exception_Data *exception;
|
||
|
+ char *msg;
|
||
|
+
|
||
|
+ switch (sig)
|
||
|
+ {
|
||
|
+ case SIGFPE:
|
||
|
+ exception = &constraint_error;
|
||
|
+ msg = "SIGFPE";
|
||
|
+ break;
|
||
|
+
|
||
|
+ case SIGILL:
|
||
|
+ exception = &constraint_error;
|
||
|
+ msg = "SIGILL";
|
||
|
+ break;
|
||
|
+
|
||
|
+ case SIGSEGV:
|
||
|
+ exception = &storage_error;
|
||
|
+ msg = "stack overflow or erroneous memory access";
|
||
|
+ break;
|
||
|
+
|
||
|
+ case SIGBUS:
|
||
|
+ exception = &constraint_error;
|
||
|
+ msg = "SIGBUS";
|
||
|
+ break;
|
||
|
+
|
||
|
+ default:
|
||
|
+ exception = &program_error;
|
||
|
+ msg = "unhandled signal";
|
||
|
+ }
|
||
|
+
|
||
|
+ Raise_From_Signal_Handler (exception, msg);
|
||
|
+ }
|
||
|
+
|
||
|
+ static void
|
||
|
+ __gnat_install_handler ()
|
||
|
+ {
|
||
|
+ struct sigaction act;
|
||
|
+
|
||
|
+ /* Set up signal handler to map synchronous signals to appropriate
|
||
|
+ exceptions. Make sure that the handler isn't interrupted by another
|
||
|
+ signal that might cause a scheduling event! */
|
||
|
+
|
||
|
+ act.sa_handler = __gnat_error_handler;
|
||
|
+ act.sa_flags = SA_NODEFER | SA_RESTART;
|
||
|
+ (void) sigemptyset (&act.sa_mask);
|
||
|
+
|
||
|
+ (void) sigaction (SIGILL, &act, NULL);
|
||
|
+ (void) sigaction (SIGFPE, &act, NULL);
|
||
|
+ (void) sigaction (SIGSEGV, &act, NULL);
|
||
|
+ (void) sigaction (SIGBUS, &act, NULL);
|
||
|
+ }
|
||
|
+
|
||
|
+ void
|
||
|
+ __gnat_initialize ()
|
||
|
+ {
|
||
|
+ __gnat_install_handler ();
|
||
|
+ }
|
||
|
+
|
||
|
/***************************************/
|
||
|
/* __gnat_initialize (default version) */
|
||
|
/***************************************/
|