aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/init.c
diff options
context:
space:
mode:
authorPatrick Bernardi <bernardi@adacore.com>2021-11-12 17:55:57 -0500
committerPierre-Marie de Rodat <derodat@adacore.com>2021-12-01 10:24:40 +0000
commitff46a531c52c25272038fefbfeb858feeb943a51 (patch)
tree9ae9fdf3bb5d9c1507ca00621a69094ff85a714a /gcc/ada/init.c
parent38df84ae8aaa0c9e753218f5b1d087e95b13c546 (diff)
downloadgcc-ff46a531c52c25272038fefbfeb858feeb943a51.zip
gcc-ff46a531c52c25272038fefbfeb858feeb943a51.tar.gz
gcc-ff46a531c52c25272038fefbfeb858feeb943a51.tar.bz2
[Ada] Add signal to exception mapping for RTEMS
gcc/ada/ * init.c: Add __gnat_error_handler and __gnat_install_handler for RTEMS.
Diffstat (limited to 'gcc/ada/init.c')
-rw-r--r--gcc/ada/init.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/gcc/ada/init.c b/gcc/ada/init.c
index dbd8516..6c260fe 100644
--- a/gcc/ada/init.c
+++ b/gcc/ada/init.c
@@ -2645,6 +2645,68 @@ __gnat_install_handler (void)
__gnat_handler_installed = 1;
}
+/*****************/
+/* RTEMS Section */
+/*****************/
+
+#elif defined(__rtems__)
+
+#include <signal.h>
+#include <unistd.h>
+
+static void
+__gnat_error_handler (int sig)
+{
+ struct Exception_Data *exception;
+ const 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 = "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);
+}
+
+void
+__gnat_install_handler (void)
+{
+ struct sigaction act;
+
+ act.sa_handler = __gnat_error_handler;
+ sigemptyset (&act.sa_mask);
+
+ /* Do not install handlers if interrupt state is "System". */
+ if (__gnat_get_interrupt_state (SIGFPE) != 's')
+ sigaction (SIGFPE, &act, NULL);
+ if (__gnat_get_interrupt_state (SIGILL) != 's')
+ sigaction (SIGILL, &act, NULL);
+ if (__gnat_get_interrupt_state (SIGSEGV) != 's')
+ sigaction (SIGSEGV, &act, NULL);
+ if (__gnat_get_interrupt_state (SIGBUS) != 's')
+ sigaction (SIGBUS, &act, NULL);
+
+ __gnat_handler_installed = 1;
+}
+
#elif defined (__DJGPP__)
void