[Ada] Use static stack allocation for small dynamic string concatenations

This changes the expanded code generated for dynamic concatenations to
use a static array subtype for the temporary created on the stack if a
small upper bound can be computed for the length of the result.  Static
stack allocation is preferred over dynamic allocation for code
generation purposes.

gcc/ada/

	* exp_ch3.adb (Expand_N_Object_Declaration.Rewrite_As_Renaming):
	Be prepared for slices.
	* exp_ch4.adb (Get_First_Index_Bounds): New procedure.
	(Expand_Array_Comparison.Length_Less_Than_4): Call it.
	(Expand_Concatenate): Try to compute a maximum length for
	operands with variable length and a maximum total length at the
	end.  If the concatenation is dynamic, but a sensible maximum
	total length has been computed, use this length to create a
	static array subtype for the temporary and return a slice of it.
2 files changed