https://gcc.gnu.org/g:4f3567cf3b71ccf5447659a028d08429c2d30df7
commit r15-454-g4f3567cf3b71ccf5447659a028d08429c2d30df7 Author: Eric Botcazou <ebotca...@adacore.com> Date: Sun Feb 11 19:05:08 2024 +0100 ada: Follow-up adjustment to earlier fix in Build_Allocate_Deallocate_Proc The profile of the procedure built for an allocation on the secondary stack now includes the alignment parameter, so the parameter can just be forwarded in the call to Allocate_Any_Controlled. gcc/ada/ * exp_util.adb (Build_Allocate_Deallocate_Proc): Pass the alignment parameter in the inner call for a secondary stack allocation too. Diff: --- gcc/ada/exp_util.adb | 43 ++++++++++++++++++------------------------- 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb index 103d59e4deba..4b1c5322f621 100644 --- a/gcc/ada/exp_util.adb +++ b/gcc/ada/exp_util.adb @@ -1081,10 +1081,8 @@ package body Exp_Util is -- allocations can be performed without getting the alignment from -- the type's Type Specific Record. - if ((Is_Allocate and then No (Alloc_Expr)) - or else - not Is_Class_Wide_Type (Desig_Typ)) - and then not Use_Secondary_Stack_Pool + if (Is_Allocate and then No (Alloc_Expr)) + or else not Is_Class_Wide_Type (Desig_Typ) then Append_To (Actuals, New_Occurrence_Of (Alig_Id, Loc)); @@ -1103,9 +1101,6 @@ package body Exp_Util is -- into the code that reads the value of alignment from the TSD -- (see Expand_N_Attribute_Reference) - -- In the Use_Secondary_Stack_Pool case, Alig_Id is not - -- passed in and therefore must not be referenced. - Append_To (Actuals, Unchecked_Convert_To (RTE (RE_Storage_Offset), Make_Attribute_Reference (Loc, @@ -1255,53 +1250,51 @@ package body Exp_Util is Proc_To_Call := RTE (RE_Deallocate_Any_Controlled); end if; - -- Create a custom Allocate / Deallocate routine which has identical - -- profile to that of System.Storage_Pools. + -- Create a custom Allocate/Deallocate routine which has identical + -- profile to that of System.Storage_Pools, except for a secondary + -- stack allocation where the profile must be identical to that of + -- the System.Secondary_Stack.SS_Allocate procedure (deallocation + -- is not supported for the secondary stack). declare - -- P : Root_Storage_Pool function Pool_Param return Node_Id is ( Make_Parameter_Specification (Loc, Defining_Identifier => Make_Temporary (Loc, 'P'), Parameter_Type => New_Occurrence_Of (RTE (RE_Root_Storage_Pool), Loc))); + -- P : Root_Storage_Pool - -- A : [out] Address function Address_Param return Node_Id is ( Make_Parameter_Specification (Loc, Defining_Identifier => Addr_Id, Out_Present => Is_Allocate, Parameter_Type => New_Occurrence_Of (RTE (RE_Address), Loc))); + -- A : [out] Address - -- S : Storage_Count function Size_Param return Node_Id is ( Make_Parameter_Specification (Loc, Defining_Identifier => Size_Id, Parameter_Type => New_Occurrence_Of (RTE (RE_Storage_Count), Loc))); + -- S : Storage_Count - -- L : Storage_Count function Alignment_Param return Node_Id is ( Make_Parameter_Specification (Loc, Defining_Identifier => Alig_Id, Parameter_Type => New_Occurrence_Of (RTE (RE_Storage_Count), Loc))); + -- L : Storage_Count - Formal_Params : List_Id; + Formal_Params : constant List_Id := + (if Use_Secondary_Stack_Pool + then New_List (Address_Param, Size_Param, Alignment_Param) + else + New_List + (Pool_Param, Address_Param, Size_Param, Alignment_Param)); + -- The list of formal parameters of the routine begin - if Use_Secondary_Stack_Pool then - -- Gigi expects a different profile in the Secondary_Stack_Pool - -- case. There must be no uses of the two missing formals - -- (i.e., Pool_Param and Alignment_Param) in this case. - Formal_Params := New_List - (Address_Param, Size_Param, Alignment_Param); - else - Formal_Params := New_List ( - Pool_Param, Address_Param, Size_Param, Alignment_Param); - end if; - Insert_Action (N, Make_Subprogram_Body (Loc, Specification =>