aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2022-06-16 13:22:18 +0200
committerPierre-Marie de Rodat <derodat@adacore.com>2022-07-06 13:29:49 +0000
commitcd7d1f448a4a826a4210121ed6bec989913ba4e7 (patch)
treef7d156baba193fc3eb1bbae1958e110714284605 /gcc
parente5802d60130bd804663559471f9c5f3561dfab4d (diff)
downloadgcc-cd7d1f448a4a826a4210121ed6bec989913ba4e7.zip
gcc-cd7d1f448a4a826a4210121ed6bec989913ba4e7.tar.gz
gcc-cd7d1f448a4a826a4210121ed6bec989913ba4e7.tar.bz2
[Ada] Document the various function return mechanisms
gcc/ada/ * exp_ch6.adb (Function return mechanisms): New paragraph.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/exp_ch6.adb43
1 files changed, 42 insertions, 1 deletions
diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb
index b5764ad..bf51e64 100644
--- a/gcc/ada/exp_ch6.adb
+++ b/gcc/ada/exp_ch6.adb
@@ -83,7 +83,48 @@ with Validsw; use Validsw;
package body Exp_Ch6 is
- -- Suffix for BIP formals
+ --------------------------------
+ -- Function return mechanisms --
+ --------------------------------
+
+ -- This is a summary of the various function return mechanisms implemented
+ -- in GNAT for Ada 2005 and later versions of the language. In the below
+ -- table, the first column must be read as an if expression: if the result
+ -- type of the function is limited, then the return mechanism is and ...;
+ -- elsif the result type is indefinite or large definite, then ...; elsif
+ -- ...; else ... The different mechanisms are implemented either in the
+ -- front end, or in the back end, or partly in both ends, depending on the
+ -- result type.
+
+ -- Result type | Return mechanism | Front end | Back end
+ -- --------------------------------------------------------------------
+
+ -- Limited Build In Place All
+
+ -- Indefinite/ Secondary Stack Needs Fin. Others
+ -- Large definite
+
+ -- Needs Fin. Secondary Stack All
+ -- (BERS False)
+
+ -- Needs Fin. Invisible Parameter All All
+ -- (BERS True) (return) (call)
+
+ -- By Reference Invisible Parameter All
+
+ -- Others Primary stack/ All
+ -- Registers
+
+ -- Needs Fin.: type needs finalization [RM 7.6(9.1/2-9.6/2)]
+ -- BERS: Opt.Back_End_Return_Slot setting
+
+ -- The table is valid for all calls except for those dispatching on result;
+ -- the latter calls are considered as returning a class-wide type and thus
+ -- always return on the secondary stack, with the help of a small wrapper
+ -- function (thunk) if the original result type is not itself returned on
+ -- the secondary stack as per the above table.
+
+ -- Suffixes for Build-In-Place extra formals
BIP_Alloc_Suffix : constant String := "BIPalloc";
BIP_Storage_Pool_Suffix : constant String := "BIPstoragepool";