diff options
author | Arnaud Charlet <charlet@adacore.com> | 2022-02-25 04:39:57 -0500 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2022-05-13 08:04:45 +0000 |
commit | 78e26388edb20bc827a8c0504010621f01204af2 (patch) | |
tree | 45983969bf72eccb0c0640be8c1291bf80edcb12 /gcc | |
parent | 8150f295ec3b9b147c1355d136609c8226300375 (diff) | |
download | gcc-78e26388edb20bc827a8c0504010621f01204af2.zip gcc-78e26388edb20bc827a8c0504010621f01204af2.tar.gz gcc-78e26388edb20bc827a8c0504010621f01204af2.tar.bz2 |
[Ada] Only use alternate stack when needed
If we're not going to install a signal handler for SIGSEGV then we do
not need an alternate stack to handle this signal (and e.g. stack
overflows).
gcc/ada/
* libgnarl/s-taprop__linux.adb (Initialize): Do not use an
alternate stack if no handler for SEGV is installed.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/libgnarl/s-taprop__linux.adb | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/gcc/ada/libgnarl/s-taprop__linux.adb b/gcc/ada/libgnarl/s-taprop__linux.adb index 4ff784f..42a95ea 100644 --- a/gcc/ada/libgnarl/s-taprop__linux.adb +++ b/gcc/ada/libgnarl/s-taprop__linux.adb @@ -96,7 +96,7 @@ package body System.Task_Primitives.Operations is Foreign_Task_Elaborated : aliased Boolean := True; -- Used to identified fake tasks (i.e., non-Ada Threads) - Use_Alternate_Stack : constant Boolean := Alternate_Stack_Size /= 0; + Use_Alternate_Stack : Boolean := Alternate_Stack_Size /= 0; -- Whether to use an alternate signal stack for stack overflows Abort_Handler_Installed : Boolean := False; @@ -1375,9 +1375,9 @@ package body System.Task_Primitives.Operations is function State (Int : System.Interrupt_Management.Interrupt_ID) return Character; pragma Import (C, State, "__gnat_get_interrupt_state"); - -- Get interrupt state. Defined in a-init.c - -- The input argument is the interrupt number, - -- and the result is one of the following: + -- Get interrupt state. Defined in init.c. + -- The input argument is the interrupt number, and the result is one of + -- the following: Default : constant Character := 's'; -- 'n' this interrupt not set by any Interrupt_State pragma @@ -1409,6 +1409,12 @@ package body System.Task_Primitives.Operations is Specific.Initialize (Environment_Task); + -- Do not use an alternate stack if no handler for SEGV is installed + + if State (SIGSEGV) = Default then + Use_Alternate_Stack := False; + end if; + if Use_Alternate_Stack then Environment_Task.Common.Task_Alternate_Stack := Alternate_Stack'Address; |