aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/init.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ada/init.c')
-rw-r--r--gcc/ada/init.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/gcc/ada/init.c b/gcc/ada/init.c
index 00f986b..fdfd31a 100644
--- a/gcc/ada/init.c
+++ b/gcc/ada/init.c
@@ -1713,19 +1713,24 @@ __gnat_map_signal (int sig)
msg = "SIGBUS: possible stack overflow";
break;
#else
+#ifdef __RTP__
+ /* In RTP mode a SIGSEGV is most likely due to a stack overflow,
+ since stack checking uses the probing mechanism. */
case SIGILL:
exception = &constraint_error;
msg = "SIGILL";
break;
-/* In RTP mode a SIGSEGV is most likely due to a stack overflow. This is not
- the case in kernel mode where stack overflow detection uses a comparison
- method instead of memory probes. */
-#ifdef __RTP__
case SIGSEGV:
exception = &storage_error;
msg = "SIGSEGV: possible stack overflow";
break;
#else
+ /* In kernel mode a SIGILL is most likely due to a stack overflow,
+ since stack checking uses the stack limit mechanism. */
+ case SIGILL:
+ exception = &storage_error;
+ msg = "SIGILL: possible stack overflow";
+ break;
case SIGSEGV:
exception = &program_error;
msg = "SIGSEGV";
@@ -1826,6 +1831,14 @@ __gnat_init_float (void)
#endif
}
+/* This subprogram is called by System.Task_Primitives.Operations.Enter_Task
+ (if not null) when a new task is created. It is initialized by
+ System.Stack_Checking.Operations.Initialize_Stack_Limit.
+ The use of a hook avoids to drag stack checking subprograms if stack
+ checking is not used. */
+void (*__gnat_set_stack_limit_hook)(void) = (void (*)(void))0;
+
+
/******************/
/* NetBSD Section */
/******************/