From: Piotr Trojanek Date: Tue, 14 Jun 2022 11:08:38 +0000 (+0200) Subject: ada: Refactor GNAT.Directory_Operations.Read to minimise runtime checks X-Git-Tag: basepoints/gcc-16~9157 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=105bba84b10625848ca39a26a42deaa1b2783d71;p=thirdparty%2Fgcc.git ada: Refactor GNAT.Directory_Operations.Read to minimise runtime checks Array assignments are likely more efficient than element-by-element copying; in particular, they avoid constraints checks in every iteration of a loop (when the runtime is compiled with checks enabled). A cleanup and improvement opportunity spotted while working on improved detection of uninitialised local scalar objects. gcc/ada/ * libgnat/g-dirope.adb (Read): Use null-excluding, access-to-constant type; replace element-by-element copy with array assignments. --- diff --git a/gcc/ada/libgnat/g-dirope.adb b/gcc/ada/libgnat/g-dirope.adb index c23aa68b700..428d27d9e8d 100644 --- a/gcc/ada/libgnat/g-dirope.adb +++ b/gcc/ada/libgnat/g-dirope.adb @@ -676,13 +676,9 @@ package body GNAT.Directory_Operations is return; end if; - Last := - (if Str'Length > Filename_Len then Str'First + Filename_Len - 1 - else Str'Last); - declare subtype Path_String is String (1 .. Filename_Len); - type Path_String_Access is access Path_String; + type Path_String_Access is not null access constant Path_String; function Address_To_Access is new Ada.Unchecked_Conversion @@ -693,9 +689,13 @@ package body GNAT.Directory_Operations is Address_To_Access (Filename_Addr); begin - for J in Str'First .. Last loop - Str (J) := Path_Access (J - Str'First + 1); - end loop; + if Str'Length > Filename_Len then + Last := Str'First + Filename_Len - 1; + Str (Str'First .. Last) := Path_Access.all; + else + Last := Str'Last; + Str := Path_Access (1 .. Str'Length); + end if; end; end Read;