aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBob Duff <duff@adacore.com>2021-03-26 15:41:31 -0400
committerPierre-Marie de Rodat <derodat@adacore.com>2021-06-21 06:45:10 -0400
commit148be9292380a66a81b4dc51ef58e8d5c4d72dcc (patch)
tree4b75bf8511989d5a5f0187565f37decbe5bc32d5 /gcc
parentc1f1ef183691543a6dd342803f814252512fa249 (diff)
downloadgcc-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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/libgnat/s-bituti.adb11
-rw-r--r--gcc/ada/libgnat/s-bituti.ads4
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;