mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-23 10:54:07 +08:00
ada: Small cleanup in expansion of array aggregates in allocators
Convert_Array_Aggr_In_Allocator does nothing that Late_Expansion cannot do, so this deletes the former and moves its support code for Storage_Model to the latter. No functional changes. gcc/ada/ChangeLog: * exp_aggr.adb (Convert_Array_Aggr_In_Allocator): Delete. (Convert_Aggr_In_Allocator): Do not call above procedure. (Late_Expansion): Deal with a target that is the dereference of a prefix with a Storage_Model. Remove an useless actual parameter in the call to Build_Array_Aggr_Code.
This commit is contained in:
parent
7eafe8e9e9
commit
856467a7e6
@ -296,13 +296,6 @@ package body Exp_Aggr is
|
||||
-- Indexes is the current list of expressions used to index the object we
|
||||
-- are writing into.
|
||||
|
||||
procedure Convert_Array_Aggr_In_Allocator (N : Node_Id; Target : Node_Id);
|
||||
-- If the aggregate appears within an allocator and can be expanded in
|
||||
-- place, this routine generates the individual assignments to components
|
||||
-- of the designated object. This is an optimization over the general
|
||||
-- case, where a temporary is first created on the stack and then used to
|
||||
-- construct the allocated object on the heap.
|
||||
|
||||
procedure Convert_To_Positional
|
||||
(N : Node_Id;
|
||||
Handle_Bit_Packed : Boolean := False);
|
||||
@ -3519,10 +3512,7 @@ package body Exp_Aggr is
|
||||
Make_Explicit_Dereference (Loc, New_Occurrence_Of (Temp, Loc)));
|
||||
|
||||
begin
|
||||
if Is_Array_Type (Typ) then
|
||||
Convert_Array_Aggr_In_Allocator (N, Occ);
|
||||
|
||||
elsif Has_Default_Init_Comps (Aggr) then
|
||||
if Has_Default_Init_Comps (Aggr) then
|
||||
declare
|
||||
Init_Stmts : constant List_Id := Late_Expansion (Aggr, Typ, Occ);
|
||||
|
||||
@ -3742,66 +3732,6 @@ package body Exp_Aggr is
|
||||
Initialize_Discriminants (N, Typ);
|
||||
end Convert_Aggr_In_Object_Decl;
|
||||
|
||||
-------------------------------------
|
||||
-- Convert_Array_Aggr_In_Allocator --
|
||||
-------------------------------------
|
||||
|
||||
procedure Convert_Array_Aggr_In_Allocator (N : Node_Id; Target : Node_Id) is
|
||||
Aggr : constant Node_Id := Unqualify (Expression (N));
|
||||
Typ : constant Entity_Id := Etype (Aggr);
|
||||
Ctyp : constant Entity_Id := Component_Type (Typ);
|
||||
|
||||
Aggr_Code : List_Id;
|
||||
New_Aggr : Node_Id;
|
||||
|
||||
begin
|
||||
-- The target is an explicit dereference of the allocated object
|
||||
|
||||
-- If the assignment can be done directly by the back end, then
|
||||
-- reset Set_Expansion_Delayed and do not expand further.
|
||||
|
||||
if not CodePeer_Mode
|
||||
and then Aggr_Assignment_OK_For_Backend (Aggr)
|
||||
then
|
||||
New_Aggr := New_Copy_Tree (Aggr);
|
||||
Set_Expansion_Delayed (New_Aggr, False);
|
||||
|
||||
-- In the case of Target's type using the Designated_Storage_Model
|
||||
-- aspect with a Copy_To procedure, insert a temporary and have the
|
||||
-- back end handle the assignment to it. Copy the result to the
|
||||
-- original target.
|
||||
|
||||
if Has_Designated_Storage_Model_Aspect
|
||||
(Etype (Prefix (Expression (Target))))
|
||||
and then Present (Storage_Model_Copy_To
|
||||
(Storage_Model_Object
|
||||
(Etype (Prefix (Expression (Target))))))
|
||||
then
|
||||
Aggr_Code :=
|
||||
Build_Assignment_With_Temporary (Target, Typ, New_Aggr);
|
||||
|
||||
else
|
||||
Aggr_Code :=
|
||||
New_List (
|
||||
Make_OK_Assignment_Statement (Sloc (New_Aggr),
|
||||
Name => Target,
|
||||
Expression => New_Aggr));
|
||||
end if;
|
||||
|
||||
-- Or else, generate component assignments to it, as for an aggregate
|
||||
-- that appears on the right-hand side of an assignment statement.
|
||||
else
|
||||
Aggr_Code :=
|
||||
Build_Array_Aggr_Code (Aggr,
|
||||
Ctype => Ctyp,
|
||||
Index => First_Index (Typ),
|
||||
Into => Target,
|
||||
Scalar_Comp => Is_Scalar_Type (Ctyp));
|
||||
end if;
|
||||
|
||||
Insert_Actions (N, Aggr_Code);
|
||||
end Convert_Array_Aggr_In_Allocator;
|
||||
|
||||
------------------------
|
||||
-- In_Place_Assign_OK --
|
||||
------------------------
|
||||
@ -9028,11 +8958,29 @@ package body Exp_Aggr is
|
||||
New_Aggr := New_Copy_Tree (N);
|
||||
Set_Expansion_Delayed (New_Aggr, False);
|
||||
|
||||
Aggr_Code :=
|
||||
New_List (
|
||||
Make_OK_Assignment_Statement (Sloc (New_Aggr),
|
||||
Name => Target,
|
||||
Expression => New_Aggr));
|
||||
-- In case of Target's type having the Designated_Storage_Model
|
||||
-- aspect with a Copy_To procedure, first insert a temporary and
|
||||
-- have the back end handle the assignment to it, then copy the
|
||||
-- result to the original target.
|
||||
|
||||
if Nkind (Target) = N_Unchecked_Type_Conversion
|
||||
and then Nkind (Expression (Target)) = N_Explicit_Dereference
|
||||
and then Has_Designated_Storage_Model_Aspect
|
||||
(Etype (Prefix (Expression (Target))))
|
||||
and then Present (Storage_Model_Copy_To
|
||||
(Storage_Model_Object
|
||||
(Etype (Prefix (Expression (Target))))))
|
||||
then
|
||||
Aggr_Code :=
|
||||
Build_Assignment_With_Temporary (Target, Typ, New_Aggr);
|
||||
|
||||
else
|
||||
Aggr_Code :=
|
||||
New_List (
|
||||
Make_OK_Assignment_Statement (Sloc (New_Aggr),
|
||||
Name => Target,
|
||||
Expression => New_Aggr));
|
||||
end if;
|
||||
|
||||
-- Or else, generate component assignments to it
|
||||
|
||||
@ -9043,8 +8991,7 @@ package body Exp_Aggr is
|
||||
Ctype => Component_Type (Typ),
|
||||
Index => First_Index (Typ),
|
||||
Into => Target,
|
||||
Scalar_Comp => Is_Scalar_Type (Component_Type (Typ)),
|
||||
Indexes => No_List);
|
||||
Scalar_Comp => Is_Scalar_Type (Component_Type (Typ)));
|
||||
end if;
|
||||
|
||||
-- Directly or indirectly (e.g. access protected procedure) a record
|
||||
|
Loading…
Reference in New Issue
Block a user