diff options
Diffstat (limited to 'gcc')
| -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; |
