Skip to content
Snippets Groups Projects
Commit 151d1533 authored by Eric Botcazou's avatar Eric Botcazou Committed by Marc Poulhiès
Browse files

ada: Decouple attachment from dynamic allocation for controlled objects

This decouples the attachment to the appropriate finalization collection of
dynamically allocated objects that need finalization from their allocation.

The current implementation immediately attaches them after allocating them,
which means that they will be finalized even if their initialization does
not complete successfully.  The new implementation instead generates the
same sequence as the one generated for (statically) declared objects, that
is to say, allocation, initialization and attachment in this order.

gcc/ada/

	* exp_ch3.adb (Build_Default_Initialization): Do not generate the
	protection for finalization collections.
	(Build_Heap_Or_Pool_Allocator): Set the No_Initialization flag on
	the declaration of the temporary.
	* exp_ch4.adb (Build_Aggregate_In_Place): Do not build an allocation
	procedure here.
	(Expand_Allocator_Expression): Build an allocation procedure, if it
	is required, only just before rewriting the allocator.
	(Expand_N_Allocator): Do not build an allocation procedure if the
	No_Initialization flag is set on the allocator, except for those
	generated for special return objects.  In other cases, build an
	allocation procedure, if it is required, only before rewriting
	the allocator.
	* exp_ch7.ads (Make_Address_For_Finalize): New function declaration.
	* exp_ch7.adb (Finalization Management): Update description for
	dynamically allocated objects.
	(Make_Address_For_Finalize): Remove declaration.
	(Find_Last_Init): Change to function and move to...
	(Process_Object_Declaration): Adjust to above change.
	* exp_util.ads (Build_Allocate_Deallocate_Proc): Add Mark parameter
	with Empty default and document it.
	(Find_Last_Init): New function declaration.
	* exp_util.adb (Build_Allocate_Deallocate_Proc): Add Mark parameter
	with Empty default and pass it in recursive call.  Deal with type
	conversions created for interface types.  Adjust call sequence to
	Allocate_Any_Controlled by changing Collection to In/Out parameter
	and removing Finalize_Address parameter.  For a controlled object,
	generate a conditional call to Attach_Object_To_Collection for an
	allocation and to Detach_Object_From_Collection for a deallocation.
	(Find_Last_Init): ...here.  Compute the initialization type for an
	allocator whose designating type is class wide specifically and also
	handle concurrent types.
	* rtsfind.ads (RE_Id): Add RE_Attach_Object_To_Collection and
	RE_Detach_Object_From_Collection.
	(RE_Unit_Table): Add entries for RE_Attach_Object_To_Collection and
	RE_Detach_Object_From_Collection.
	* libgnat/s-finpri.ads (Finalization_Started): Delete.
	(Attach_Node_To_Collection): Likewise.
	(Detach_Node_From_Collection): Move to...
	(Attach_Object_To_Collection): New procedure declaration.
	(Detach_Object_From_Collection): Likewise.
	(Finalization_Collection): Remove Atomic for Finalization_Started.
	Add pragma Inline for Initialize.
	* libgnat/s-finpri.adb: Add clause for Ada.Unchecked_Conversion.
	(To_Collection_Node_Ptr): New instance of Ada.Unchecked_Conversion.
	(Detach_Node_From_Collection): ...here.
	(Attach_Object_To_Collection): New procedure.
	(Detach_Object_From_Collection): Likewise.
	(Finalization_Started): Delete.
	(Finalize): Replace allocation with attachment in comments.
	* libgnat/s-stposu.ads (Allocate_Any_Controlled): Rename parameter
	Context_Subpool into Named_Subpool, parameter Context_Collection
	into Collection and change it to In/Out, and remove Fin_Address.
	* libgnat/s-stposu.adb: Remove clause for Ada.Unchecked_Conversion
	and Finalization_Primitives.
	(To_Collection_Node_Ptr): Delete.
	(Allocate_Any_Controlled): Rename parameter Context_Subpool into
	Named_Subpool, parameter Context_Collection into Collection and
	change it to In/Out, and remove Fin_Address.  Do not lock/unlock
	and do not attach the object, instead only displace its address.
	(Deallocate_Any_Controlled): Do not lock/unlock and do not detach
	the object.
	(Header_Size_With_Padding): Use qualified name for Header_Size.
parent 00c7f229
No related branches found
No related tags found
No related merge requests found
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment