public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [Ada] Get rid of secondary stack for controlled components
@ 2022-05-19 14:15 Pierre-Marie de Rodat
  0 siblings, 0 replies; only message in thread
From: Pierre-Marie de Rodat @ 2022-05-19 14:15 UTC (permalink / raw)
  To: gcc-patches; +Cc: Eric Botcazou

[-- Attachment #1: Type: text/plain, Size: 2865 bytes --]

This eliminates the use of the secondary stack to return composite types
with controlled components from functions, by exposing the return slot of
these functions through the support interface of memory pools, much like
for the secondary stack itself.  This is piggybacked on the support of a
specific intrinsic function by the code generator, and can be disabled if
this support is not available, as well with the -gnatd_r debug switch.

The change also streamlines a bit the implementation by consistently using
the Needs_Finalization predicate, or its derivatives, in various places.

Tested on x86_64-pc-linux-gnu, committed on trunk

gcc/ada/

	* Makefile.rtl (GNATRTL_NONTASKING_OBJS): Add s-retsta.
	* debug.adb (d_r): Document usage.
	* exp_ch4.adb (Expand_N_Allocato): Deal with the return stack pool.
	* exp_ch6.adb (Expand_Simple_Function_Return): Replace calls to
	Requires_Transient_Scope with Returns_On_Secondary_Stack.  Deal
	with types that need finalization returned on the primary stack,
	use CW_Or_Needs_Finalization for those returned on the secondary.
	* exp_util.adb (Build_Allocate_Deallocate_Proc): Return early
	for the return stack pool.
	(Remove_Side_Effects): Call CW_Or_Needs_Finalization.
	* fe.h (Requires_Transient_Scope): Delete.
	(Returns_On_Secondary_Stack): Declare.
	* gnat1drv.adb (Adjust_Global_Switches): Set Back_End_Return_Slot
	to False when generating C code or if -gnatd_r is specified.
	* opt.ads (Back_End_Return_Slot): New boolean variable.
	* rtsfind.ads (RTU_Id): Add System_Return_Stack.
	(RE_Id): Add RE_RS_Allocate and RE_RS_Pool.
	(RE_Unit_Table): Add entries for RE_RS_Allocate and RE_RS_Pool.
	* sem_util.ads (CW_Or_Has_Controlled_Part): Delete.
	(CW_Or_Needs_Finalization): Declare.
	(Requires_Transient_Scope): Adjust description.
	(Returns_On_Secondary_Stack): Declare.
	* sem_util.adb (Compute_Returns_By_Ref): Set Returns_By_Ref on types
	which need finalization if they are returned on the secondary stack.
	(CW_Or_Has_Controlled_Part): Rename to...
	(CW_Or_Needs_Finalization): ...this.
	(Requires_Transient_Scope): Move bulk of implementation to...
	(Returns_On_Secondary_Stack): ...here.  Return true for types which
	need finalization only if the back-end return slot is not supported.
	* libgnat/s-retsta.ads: New file.
	* gcc-interface/ada-builtin-types.def (BT_FN_PTR_SSIZE): Define.
	* gcc-interface/ada-builtins.def (return_slot): Likewise.
	* gcc-interface/ada-tree.h (BUILT_IN_RETURN_SLOT): Likewise.
	* gcc-interface/decl.cc (gnat_to_gnu_subprog_type): Replace call to
	Requires_Transient_Scope with Returns_On_Secondary_Stack.
	* gcc-interface/trans.cc (gnat_to_gnu) <N_Simple_Return_Statement>:
	In the return by invisible reference, skip the copy if the source
	is the same as the destination.
	* gcc-interface/utils2.cc (build_call_alloc_dealloc_proc): Deal with
	the return stack pool.

[-- Attachment #2: patch.diff.gz --]
[-- Type: application/gzip, Size: 10042 bytes --]

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-05-19 14:15 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-19 14:15 [Ada] Get rid of secondary stack for controlled components Pierre-Marie de Rodat

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).