https://gcc.gnu.org/g:f31bd00088a737c78d10f359b946d3950de29de0

commit r15-6129-gf31bd00088a737c78d10f359b946d3950de29de0
Author: Johannes Kliemann <kliem...@adacore.com>
Date:   Tue Nov 12 17:53:34 2024 +0100

    ada: Ensure minimum stack size for preallocated task stacks
    
    On targets with preallocated task stacks the minimum stack size is
    defined as a constant in System.Parameters. When adding preallocated
    tasks to the expanded code the compiler does not have direct access to
    that value. Instead generate the expression
    Max (Task_Size, Minimum_Task_Size) in the expanded tree and let it be
    resolved later in the compilation process.
    
    gcc/ada/ChangeLog:
    
            * exp_ch9.adb (Expand_N_Task_Type_Declaration): Take
            Minimum_Stack_Size into account when preallocating task stacks.
            * rtsfind.ads (RE_Id, RE_Unit_Table): Add RE_Minimum_Stack_Size.

Diff:
---
 gcc/ada/exp_ch9.adb | 29 +++++++++++++++++++++++++++++
 gcc/ada/rtsfind.ads |  2 ++
 2 files changed, 31 insertions(+)

diff --git a/gcc/ada/exp_ch9.adb b/gcc/ada/exp_ch9.adb
index cf4d4d822562..df51856f9c90 100644
--- a/gcc/ada/exp_ch9.adb
+++ b/gcc/ada/exp_ch9.adb
@@ -11945,6 +11945,35 @@ package body Exp_Ch9 is
                else
                   Task_Size := New_Copy_Tree (Expr_N);
                end if;
+
+               --  On targets with a preallocated task stack the minimum stack
+               --  size is defined in System.Parameters. Since we do not have
+               --  access to the value of that definition here we replace the
+               --  static task size with the static expression
+               --  Size_Type'Max (Task_Size, Minimum_Stack_Size).
+               --  The compiler will evaluate this expression and replace the
+               --  task size with the Minimum_Stack_Size if needed. It is
+               --  important for this expression to be static to avoid
+               --  introducing implicit heap allocations that would break code
+               --  with the No_Implicit_Heap_Allocations restriction.
+               --  On some runtimes the allocation of the minimum stack size is
+               --  ensured by a call to Adjust_Storage_Size. We cannot use this
+               --  function here as it is not static and evaluated at runtime.
+               --  Note: This expression may not appear in the expanded code
+               --  as the compiler evaluates this expression before code
+               --  generation.
+
+               Task_Size :=
+                 Convert_To
+                   (RTE (RE_Storage_Offset),
+                    Make_Attribute_Reference (Loc,
+                      Attribute_Name => Name_Max,
+                      Prefix         =>
+                        New_Occurrence_Of
+                          (RTE (RE_Size_Type), Loc), Expressions => New_List (
+                             Convert_To (RTE (RE_Size_Type), Task_Size),
+                             New_Occurrence_Of (RTE (RE_Minimum_Stack_Size),
+                               Loc))));
             end;
 
          else
diff --git a/gcc/ada/rtsfind.ads b/gcc/ada/rtsfind.ads
index 9cfd2ed4c48c..16c817dc37ed 100644
--- a/gcc/ada/rtsfind.ads
+++ b/gcc/ada/rtsfind.ads
@@ -1618,6 +1618,7 @@ package Rtsfind is
 
      RE_Adjust_Storage_Size,             -- System.Parameters
      RE_Default_Stack_Size,              -- System.Parameters
+     RE_Minimum_Stack_Size,              -- System.Parameters
      RE_Size_Type,                       -- System.Parameters
      RE_Unspecified_Size,                -- System.Parameters
 
@@ -3274,6 +3275,7 @@ package Rtsfind is
 
      RE_Adjust_Storage_Size              => System_Parameters,
      RE_Default_Stack_Size               => System_Parameters,
+     RE_Minimum_Stack_Size               => System_Parameters,
      RE_Size_Type                        => System_Parameters,
      RE_Unspecified_Size                 => System_Parameters,

Reply via email to