diff options
author | Bob Duff <duff@adacore.com> | 2021-03-26 15:41:31 -0400 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2021-06-21 06:45:10 -0400 |
commit | 148be9292380a66a81b4dc51ef58e8d5c4d72dcc (patch) | |
tree | 4b75bf8511989d5a5f0187565f37decbe5bc32d5 | |
parent | c1f1ef183691543a6dd342803f814252512fa249 (diff) | |
download | gcc-148be9292380a66a81b4dc51ef58e8d5c4d72dcc.zip gcc-148be9292380a66a81b4dc51ef58e8d5c4d72dcc.tar.gz gcc-148be9292380a66a81b4dc51ef58e8d5c4d72dcc.tar.bz2 |
[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.
-rw-r--r-- | gcc/ada/libgnat/s-bituti.adb | 11 | ||||
-rw-r--r-- | gcc/ada/libgnat/s-bituti.ads | 4 |
2 files changed, 13 insertions, 2 deletions
diff --git a/gcc/ada/libgnat/s-bituti.adb b/gcc/ada/libgnat/s-bituti.adb index fbb5389..3e584e7 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 eb1662d..c9c4b91 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; |