From: Bob Duff Date: Fri, 26 Mar 2021 19:41:31 +0000 (-0400) Subject: [Ada] Zero-size slices X-Git-Tag: basepoints/gcc-13~6628 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=148be9292380a66a81b4dc51ef58e8d5c4d72dcc;p=thirdparty%2Fgcc.git [Ada] Zero-size slices gcc/ada/ * libgnat/s-bituti.ads (Small_Size): Do not include 0 in this type. * libgnat/s-bituti.adb (Copy_Bitfield): Do nothing for 0-bit bitfields. --- diff --git a/gcc/ada/libgnat/s-bituti.adb b/gcc/ada/libgnat/s-bituti.adb index fbb53893f0f3..3e584e72bfe2 100644 --- a/gcc/ada/libgnat/s-bituti.adb +++ b/gcc/ada/libgnat/s-bituti.adb @@ -402,11 +402,22 @@ package body System.Bitfield_Utils is pragma Assert (Al_Src_Address mod Val'Alignment = 0); pragma Assert (Al_Dest_Address mod Val'Alignment = 0); begin + -- Optimized small case + if Size in Small_Size then Copy_Small_Bitfield (Al_Src_Address, Al_Src_Offset, Al_Dest_Address, Al_Dest_Offset, Size); + + -- Do nothing for zero size. This is necessary to avoid doing invalid + -- reads, which are detected by valgrind. + + elsif Size = 0 then + null; + + -- Large case + else Copy_Large_Bitfield (Al_Src_Address, Al_Src_Offset, diff --git a/gcc/ada/libgnat/s-bituti.ads b/gcc/ada/libgnat/s-bituti.ads index eb1662df7e98..c9c4b9184b9d 100644 --- a/gcc/ada/libgnat/s-bituti.ads +++ b/gcc/ada/libgnat/s-bituti.ads @@ -98,9 +98,9 @@ package System.Bitfield_Utils is pragma Assert (Val_Array'Component_Size = Val'Size); subtype Bit_Size is Natural; -- Size in bits of a bit field - subtype Small_Size is Bit_Size range 0 .. Val'Size; + subtype Small_Size is Bit_Size range 1 .. Val'Size; -- Size of a small one - subtype Bit_Offset is Small_Size range 0 .. Val'Size - 1; + subtype Bit_Offset is Small_Size'Base range 0 .. Val'Size - 1; -- Starting offset subtype Bit_Offset_In_Byte is Bit_Offset range 0 .. Storage_Unit - 1;