From: Arnaud Charlet Date: Tue, 22 Sep 2020 08:50:22 +0000 (-0400) Subject: [Ada] New flag Transform_Function_Array X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b36ec51873ba05c1ac3d5e568f400dd5f59d2cb9;p=gcc.git [Ada] New flag Transform_Function_Array gcc/ada/ * exp_ch6.adb, freeze.adb, gnat1drv.adb, opt.ads, sem_ch6.adb (Transform_Function_Array): New flag, split from Modify_Tree_For_C. * exp_unst.adb: Minor reformatting. --- diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb index b7620262e2f..4f1357648ed 100644 --- a/gcc/ada/exp_ch6.adb +++ b/gcc/ada/exp_ch6.adb @@ -3665,7 +3665,7 @@ package body Exp_Ch6 is return; end if; - if Modify_Tree_For_C + if Transform_Function_Array and then Nkind (Call_Node) = N_Function_Call and then Is_Entity_Name (Name (Call_Node)) then @@ -6691,7 +6691,7 @@ package body Exp_Ch6 is -- are not needed by the C generator (and this also produces cleaner -- output). - if Modify_Tree_For_C + if Transform_Function_Array and then Nkind (Specification (N)) = N_Function_Specification and then Is_Array_Type (Etype (Subp)) and then Is_Constrained (Etype (Subp)) diff --git a/gcc/ada/exp_unst.adb b/gcc/ada/exp_unst.adb index ffc30c304d1..e0f2bd1c6c0 100644 --- a/gcc/ada/exp_unst.adb +++ b/gcc/ada/exp_unst.adb @@ -882,8 +882,8 @@ package body Exp_Unst is -- outside the nested structure do not affect us. if Scope_Within (Ent, Subp) - and then Is_Subprogram (Ent) - and then not Is_Imported (Ent) + and then Is_Subprogram (Ent) + and then not Is_Imported (Ent) then Append_Unique_Call ((N, Current_Subprogram, Ent)); end if; diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb index 05a43c741a6..0779165a49c 100644 --- a/gcc/ada/freeze.adb +++ b/gcc/ada/freeze.adb @@ -9142,7 +9142,7 @@ package body Freeze is Check_Overriding_Indicator (E, Empty, Is_Primitive (E)); end if; - if Modify_Tree_For_C + if Transform_Function_Array and then Nkind (Parent (E)) = N_Function_Specification and then Is_Array_Type (Etype (E)) and then Is_Constrained (Etype (E)) diff --git a/gcc/ada/gnat1drv.adb b/gcc/ada/gnat1drv.adb index 180a1405eeb..1ea7d763175 100644 --- a/gcc/ada/gnat1drv.adb +++ b/gcc/ada/gnat1drv.adb @@ -167,6 +167,7 @@ procedure Gnat1drv is if Debug_Flag_Dot_U then Modify_Tree_For_C := True; + Transform_Function_Array := True; end if; -- -gnatd_A disables generation of ALI files @@ -179,6 +180,7 @@ procedure Gnat1drv is if Generate_C_Code then Modify_Tree_For_C := True; + Transform_Function_Array := True; Unnest_Subprogram_Mode := True; Building_Static_Dispatch_Tables := False; Minimize_Expression_With_Actions := True; @@ -246,9 +248,10 @@ procedure Gnat1drv is -- this way when we are doing CodePeer tests on existing test suites -- that may have -gnateg set, to avoid the need for special casing. - Modify_Tree_For_C := False; - Generate_C_Code := False; - Unnest_Subprogram_Mode := False; + Modify_Tree_For_C := False; + Transform_Function_Array := False; + Generate_C_Code := False; + Unnest_Subprogram_Mode := False; -- Turn off inlining, confuses CodePeer output and gains nothing @@ -454,9 +457,10 @@ procedure Gnat1drv is -- this way when we are doing GNATprove tests on existing test suites -- that may have -gnateg set, to avoid the need for special casing. - Modify_Tree_For_C := False; - Generate_C_Code := False; - Unnest_Subprogram_Mode := False; + Modify_Tree_For_C := False; + Transform_Function_Array := False; + Generate_C_Code := False; + Unnest_Subprogram_Mode := False; -- Turn off inlining, which would confuse formal verification output -- and gain nothing. diff --git a/gcc/ada/opt.ads b/gcc/ada/opt.ads index 7ec44dc687d..3e9f36edc7e 100644 --- a/gcc/ada/opt.ads +++ b/gcc/ada/opt.ads @@ -1588,6 +1588,12 @@ package Opt is -- Tolerate time stamp and other consistency errors. If this flag is set to -- True (-t), then inconsistencies result in warnings rather than errors. + Transform_Function_Array : Boolean := False; + -- GNAT + -- If this switch is set True, then functions returning constrained arrays + -- are transformed into a procedure with an out parameter, and all calls + -- are updated accordingly. + Treat_Categorization_Errors_As_Warnings : Boolean := False; -- Normally categorization errors are true illegalities. If this switch -- is set, then such errors result in warning messages rather than error diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index 88bbdf76c77..c476e45765c 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -3023,10 +3023,10 @@ package body Sem_Ch6 is -- Required to ensure that Expand_Call rewrites calls to this -- function by calls to the built procedure. - if Modify_Tree_For_C + if Transform_Function_Array and then Nkind (Body_Spec) = N_Function_Specification and then - Rewritten_For_C (Defining_Entity (Specification (Subp_Decl))) + Rewritten_For_C (Defining_Entity (Specification (Subp_Decl))) then Set_Rewritten_For_C (Defining_Entity (Body_Spec)); Set_Corresponding_Procedure (Defining_Entity (Body_Spec), @@ -4073,11 +4073,11 @@ package body Sem_Ch6 is Build_Subprogram_Declaration; -- If this is a function that returns a constrained array, and - -- we are generating C code, create subprogram declaration - -- to simplify subsequent C generation. + -- Transform_Function_Array is set, create subprogram + -- declaration to simplify e.g. subsequent C generation. elsif No (Spec_Id) - and then Modify_Tree_For_C + and then Transform_Function_Array and then Nkind (Body_Spec) = N_Function_Specification and then Is_Array_Type (Etype (Body_Id)) and then Is_Constrained (Etype (Body_Id)) @@ -4171,17 +4171,18 @@ package body Sem_Ch6 is Spec_Id := Build_Internal_Protected_Declaration (N); end if; - -- If we are generating C and this is a function returning a constrained - -- array type for which we must create a procedure with an extra out - -- parameter, build and analyze the body now. The procedure declaration - -- has already been created. We reuse the source body of the function, - -- because in an instance it may contain global references that cannot - -- be reanalyzed. The source function itself is not used any further, - -- so we mark it as having a completion. If the subprogram is a stub the - -- transformation is done later, when the proper body is analyzed. + -- If Transform_Function_Array is set and this is a function returning a + -- constrained array type for which we must create a procedure with an + -- extra out parameter, build and analyze the body now. The procedure + -- declaration has already been created. We reuse the source body of the + -- function, because in an instance it may contain global references + -- that cannot be reanalyzed. The source function itself is not used any + -- further, so we mark it as having a completion. If the subprogram is a + -- stub the transformation is done later, when the proper body is + -- analyzed. if Expander_Active - and then Modify_Tree_For_C + and then Transform_Function_Array and then Present (Spec_Id) and then Ekind (Spec_Id) = E_Function and then Nkind (N) /= N_Subprogram_Body_Stub