aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/atree.adb
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2021-02-05 13:27:03 +0100
committerPierre-Marie de Rodat <derodat@adacore.com>2021-05-07 05:29:17 -0400
commit4c2629c28d731890e529237cb6751e803df202a8 (patch)
tree370d0e97fae5af7c73f506ce90ec5609b0b16bd4 /gcc/ada/atree.adb
parent17ba0ad5294f51c15dcf1e1a176b6f15d71e905e (diff)
downloadgcc-4c2629c28d731890e529237cb6751e803df202a8.zip
gcc-4c2629c28d731890e529237cb6751e803df202a8.tar.gz
gcc-4c2629c28d731890e529237cb6751e803df202a8.tar.bz2
[Ada] Replace packed records with integers in low-level implementation
gcc/ada/ * atree.ads (Slot): Change to modular type. (Slot_1_Bit): Delete. (Slot_2_Bit): Likewise. (Slot_4_Bit): Likewise. (Slot_8_Bit): Likewise. (Slot_32_Bit): Likewise. * atree.adb (Get_1_Bit_Val): Adjust to above change. (Get_2_Bit_Val): Likewise. (Get_4_Bit_Val): Likewise. (Get_8_Bit_Val): Likewise. (Get_32_Bit_Val): Likewise. (Set_1_Bit_Val): Likewise. (Set_2_Bit_Val): Likewise. (Set_4_Bit_Val): Likewise. (Set_8_Bit_Val): Likewise. (Set_32_Bit_Val): Likewise. (Print_Atree_Info): Likewise. (Zero): Likewise. * atree.h (Get_1_Bit_Field): Likewise. (Get_2_Bit_Field): Likewise. (Get_4_Bit_Field): Likewise. (Get_8_Bit_Field): Likewise. (Get_32_Bit_Field): Likewise. (Get_32_Bit_Field_With_Default): Likewise. * types.h (slot_1_bit): Delete. (slot_2_bit): Likewise. (slot_4_bit): Likewise. (slot_8_bit): Likewise. (slot_32_bit): Likewise. (any_slot): Change to unsigned int. (Slot_Size): New macro.
Diffstat (limited to 'gcc/ada/atree.adb')
-rw-r--r--gcc/ada/atree.adb190
1 files changed, 31 insertions, 159 deletions
diff --git a/gcc/ada/atree.adb b/gcc/ada/atree.adb
index 08b7d05..cb58e66 100644
--- a/gcc/ada/atree.adb
+++ b/gcc/ada/atree.adb
@@ -599,119 +599,55 @@ package body Atree is
(N : Node_Or_Entity_Id; Offset : Field_Offset) return Field_1_Bit
is
-- We wish we were using packed arrays, but instead we're simulating
- -- packed arrays using packed records. L here (and elsewhere) is the
- -- 'Length of that array.
- L : constant Field_Offset := 32;
+ -- them with modular integers. L here (and elsewhere) is the 'Length
+ -- of that simulated array.
+ L : constant Field_Offset := Slot_Size / 1;
pragma Debug (Validate_Node_And_Offset (N, Offset / L));
- subtype Offset_In_Slot is Field_Offset range 0 .. L - 1;
S : Slot renames Slots.Table (Node_Offsets.Table (N) + Offset / L);
+ V : constant Integer := Integer ((Offset mod L) * (Slot_Size / L));
begin
- case Offset_In_Slot'(Offset mod L) is
- when 0 => return S.Slot_1.F0;
- when 1 => return S.Slot_1.F1;
- when 2 => return S.Slot_1.F2;
- when 3 => return S.Slot_1.F3;
- when 4 => return S.Slot_1.F4;
- when 5 => return S.Slot_1.F5;
- when 6 => return S.Slot_1.F6;
- when 7 => return S.Slot_1.F7;
- when 8 => return S.Slot_1.F8;
- when 9 => return S.Slot_1.F9;
- when 10 => return S.Slot_1.F10;
- when 11 => return S.Slot_1.F11;
- when 12 => return S.Slot_1.F12;
- when 13 => return S.Slot_1.F13;
- when 14 => return S.Slot_1.F14;
- when 15 => return S.Slot_1.F15;
- when 16 => return S.Slot_1.F16;
- when 17 => return S.Slot_1.F17;
- when 18 => return S.Slot_1.F18;
- when 19 => return S.Slot_1.F19;
- when 20 => return S.Slot_1.F20;
- when 21 => return S.Slot_1.F21;
- when 22 => return S.Slot_1.F22;
- when 23 => return S.Slot_1.F23;
- when 24 => return S.Slot_1.F24;
- when 25 => return S.Slot_1.F25;
- when 26 => return S.Slot_1.F26;
- when 27 => return S.Slot_1.F27;
- when 28 => return S.Slot_1.F28;
- when 29 => return S.Slot_1.F29;
- when 30 => return S.Slot_1.F30;
- when 31 => return S.Slot_1.F31;
- end case;
+ return Field_1_Bit (Shift_Right (S, V) and 1);
end Get_1_Bit_Val;
function Get_2_Bit_Val
(N : Node_Or_Entity_Id; Offset : Field_Offset) return Field_2_Bit
is
- L : constant Field_Offset := 16;
+ L : constant Field_Offset := Slot_Size / 2;
pragma Debug (Validate_Node_And_Offset (N, Offset / L));
- subtype Offset_In_Slot is Field_Offset range 0 .. L - 1;
S : Slot renames Slots.Table (Node_Offsets.Table (N) + Offset / L);
+ V : constant Integer := Integer ((Offset mod L) * (Slot_Size / L));
begin
- case Offset_In_Slot'(Offset mod L) is
- when 0 => return S.Slot_2.F0;
- when 1 => return S.Slot_2.F1;
- when 2 => return S.Slot_2.F2;
- when 3 => return S.Slot_2.F3;
- when 4 => return S.Slot_2.F4;
- when 5 => return S.Slot_2.F5;
- when 6 => return S.Slot_2.F6;
- when 7 => return S.Slot_2.F7;
- when 8 => return S.Slot_2.F8;
- when 9 => return S.Slot_2.F9;
- when 10 => return S.Slot_2.F10;
- when 11 => return S.Slot_2.F11;
- when 12 => return S.Slot_2.F12;
- when 13 => return S.Slot_2.F13;
- when 14 => return S.Slot_2.F14;
- when 15 => return S.Slot_2.F15;
- end case;
+ return Field_2_Bit (Shift_Right (S, V) and 3);
end Get_2_Bit_Val;
function Get_4_Bit_Val
(N : Node_Or_Entity_Id; Offset : Field_Offset) return Field_4_Bit
is
- L : constant Field_Offset := 8;
+ L : constant Field_Offset := Slot_Size / 4;
pragma Debug (Validate_Node_And_Offset (N, Offset / L));
- subtype Offset_In_Slot is Field_Offset range 0 .. L - 1;
S : Slot renames Slots.Table (Node_Offsets.Table (N) + Offset / L);
+ V : constant Integer := Integer ((Offset mod L) * (Slot_Size / L));
begin
- case Offset_In_Slot'(Offset mod L) is
- when 0 => return S.Slot_4.F0;
- when 1 => return S.Slot_4.F1;
- when 2 => return S.Slot_4.F2;
- when 3 => return S.Slot_4.F3;
- when 4 => return S.Slot_4.F4;
- when 5 => return S.Slot_4.F5;
- when 6 => return S.Slot_4.F6;
- when 7 => return S.Slot_4.F7;
- end case;
+ return Field_4_Bit (Shift_Right (S, V) and 15);
end Get_4_Bit_Val;
function Get_8_Bit_Val
(N : Node_Or_Entity_Id; Offset : Field_Offset) return Field_8_Bit
is
- L : constant Field_Offset := 4;
+ L : constant Field_Offset := Slot_Size / 8;
pragma Debug (Validate_Node_And_Offset (N, Offset / L));
- subtype Offset_In_Slot is Field_Offset range 0 .. L - 1;
S : Slot renames Slots.Table (Node_Offsets.Table (N) + Offset / L);
+ V : constant Integer := Integer ((Offset mod L) * (Slot_Size / L));
begin
- case Offset_In_Slot'(Offset mod L) is
- when 0 => return S.Slot_8.F0;
- when 1 => return S.Slot_8.F1;
- when 2 => return S.Slot_8.F2;
- when 3 => return S.Slot_8.F3;
- end case;
+ return Field_8_Bit (Shift_Right (S, V) and 255);
end Get_8_Bit_Val;
function Get_32_Bit_Val
@@ -721,123 +657,59 @@ package body Atree is
S : Slot renames Slots.Table (Node_Offsets.Table (N) + Offset);
begin
- return S.Slot_32;
+ return Field_32_Bit (S);
end Get_32_Bit_Val;
procedure Set_1_Bit_Val
(N : Node_Or_Entity_Id; Offset : Field_Offset; Val : Field_1_Bit)
is
- L : constant Field_Offset := 32;
+ L : constant Field_Offset := Slot_Size / 1;
pragma Debug (Validate_Node_And_Offset_Write (N, Offset / L));
- subtype Offset_In_Slot is Field_Offset range 0 .. L - 1;
S : Slot renames Slots.Table (Node_Offsets.Table (N) + Offset / L);
+ V : constant Integer := Integer ((Offset mod L) * (Slot_Size / L));
begin
- case Offset_In_Slot'(Offset mod L) is
- when 0 => S.Slot_1.F0 := Val;
- when 1 => S.Slot_1.F1 := Val;
- when 2 => S.Slot_1.F2 := Val;
- when 3 => S.Slot_1.F3 := Val;
- when 4 => S.Slot_1.F4 := Val;
- when 5 => S.Slot_1.F5 := Val;
- when 6 => S.Slot_1.F6 := Val;
- when 7 => S.Slot_1.F7 := Val;
- when 8 => S.Slot_1.F8 := Val;
- when 9 => S.Slot_1.F9 := Val;
- when 10 => S.Slot_1.F10 := Val;
- when 11 => S.Slot_1.F11 := Val;
- when 12 => S.Slot_1.F12 := Val;
- when 13 => S.Slot_1.F13 := Val;
- when 14 => S.Slot_1.F14 := Val;
- when 15 => S.Slot_1.F15 := Val;
- when 16 => S.Slot_1.F16 := Val;
- when 17 => S.Slot_1.F17 := Val;
- when 18 => S.Slot_1.F18 := Val;
- when 19 => S.Slot_1.F19 := Val;
- when 20 => S.Slot_1.F20 := Val;
- when 21 => S.Slot_1.F21 := Val;
- when 22 => S.Slot_1.F22 := Val;
- when 23 => S.Slot_1.F23 := Val;
- when 24 => S.Slot_1.F24 := Val;
- when 25 => S.Slot_1.F25 := Val;
- when 26 => S.Slot_1.F26 := Val;
- when 27 => S.Slot_1.F27 := Val;
- when 28 => S.Slot_1.F28 := Val;
- when 29 => S.Slot_1.F29 := Val;
- when 30 => S.Slot_1.F30 := Val;
- when 31 => S.Slot_1.F31 := Val;
- end case;
+ S := (S and not Shift_Left (1, V)) or Shift_Left (Slot (Val), V);
end Set_1_Bit_Val;
procedure Set_2_Bit_Val
(N : Node_Or_Entity_Id; Offset : Field_Offset; Val : Field_2_Bit)
is
- L : constant Field_Offset := 16;
+ L : constant Field_Offset := Slot_Size / 2;
pragma Debug (Validate_Node_And_Offset_Write (N, Offset / L));
- subtype Offset_In_Slot is Field_Offset range 0 .. L - 1;
S : Slot renames Slots.Table (Node_Offsets.Table (N) + Offset / L);
+ V : constant Integer := Integer ((Offset mod L) * (Slot_Size / L));
begin
- case Offset_In_Slot'(Offset mod L) is
- when 0 => S.Slot_2.F0 := Val;
- when 1 => S.Slot_2.F1 := Val;
- when 2 => S.Slot_2.F2 := Val;
- when 3 => S.Slot_2.F3 := Val;
- when 4 => S.Slot_2.F4 := Val;
- when 5 => S.Slot_2.F5 := Val;
- when 6 => S.Slot_2.F6 := Val;
- when 7 => S.Slot_2.F7 := Val;
- when 8 => S.Slot_2.F8 := Val;
- when 9 => S.Slot_2.F9 := Val;
- when 10 => S.Slot_2.F10 := Val;
- when 11 => S.Slot_2.F11 := Val;
- when 12 => S.Slot_2.F12 := Val;
- when 13 => S.Slot_2.F13 := Val;
- when 14 => S.Slot_2.F14 := Val;
- when 15 => S.Slot_2.F15 := Val;
- end case;
+ S := (S and not Shift_Left (3, V)) or Shift_Left (Slot (Val), V);
end Set_2_Bit_Val;
procedure Set_4_Bit_Val
(N : Node_Or_Entity_Id; Offset : Field_Offset; Val : Field_4_Bit)
is
- L : constant Field_Offset := 8;
+ L : constant Field_Offset := Slot_Size / 4;
pragma Debug (Validate_Node_And_Offset_Write (N, Offset / L));
- subtype Offset_In_Slot is Field_Offset range 0 .. L - 1;
S : Slot renames Slots.Table (Node_Offsets.Table (N) + Offset / L);
+ V : constant Integer := Integer ((Offset mod L) * (Slot_Size / L));
begin
- case Offset_In_Slot'(Offset mod L) is
- when 0 => S.Slot_4.F0 := Val;
- when 1 => S.Slot_4.F1 := Val;
- when 2 => S.Slot_4.F2 := Val;
- when 3 => S.Slot_4.F3 := Val;
- when 4 => S.Slot_4.F4 := Val;
- when 5 => S.Slot_4.F5 := Val;
- when 6 => S.Slot_4.F6 := Val;
- when 7 => S.Slot_4.F7 := Val;
- end case;
+ S := (S and not Shift_Left (15, V)) or Shift_Left (Slot (Val), V);
end Set_4_Bit_Val;
procedure Set_8_Bit_Val
(N : Node_Or_Entity_Id; Offset : Field_Offset; Val : Field_8_Bit)
is
- L : constant Field_Offset := 4;
+ L : constant Field_Offset := Slot_Size / 8;
pragma Debug (Validate_Node_And_Offset_Write (N, Offset / L));
- subtype Offset_In_Slot is Field_Offset range 0 .. L - 1;
S : Slot renames Slots.Table (Node_Offsets.Table (N) + Offset / L);
+ V : constant Integer := Integer ((Offset mod L) * (Slot_Size / L));
begin
- case Offset_In_Slot'(Offset mod L) is
- when 0 => S.Slot_8.F0 := Val;
- when 1 => S.Slot_8.F1 := Val;
- when 2 => S.Slot_8.F2 := Val;
- when 3 => S.Slot_8.F3 := Val;
- end case;
+ S := (S and not Shift_Left (255, V)) or Shift_Left (Slot (Val), V);
end Set_8_Bit_Val;
procedure Set_32_Bit_Val
@@ -847,7 +719,7 @@ package body Atree is
S : Slot renames Slots.Table (Node_Offsets.Table (N) + Offset);
begin
- S.Slot_32 := Val;
+ S := Slot (Val);
end Set_32_Bit_Val;
end Atree_Private_Part;
@@ -2006,7 +1878,7 @@ package body Atree is
----------------------
procedure Print_Atree_Info (N : Node_Or_Entity_Id) is
- function Cast is new Unchecked_Conversion (Slot_32_Bit, Int);
+ function Cast is new Unchecked_Conversion (Slot, Int);
begin
Write_Int (Int (Size_In_Slots (N)));
Write_Str (" slots (");
@@ -2017,7 +1889,7 @@ package body Atree is
for Off in Off_0 (N) .. Off_L (N) loop
Write_Str (" ");
- Write_Int (Cast (Slots.Table (Off).Slot_32));
+ Write_Int (Cast (Slots.Table (Off)));
end loop;
Write_Eol;
@@ -2507,7 +2379,7 @@ package body Atree is
Locked := False;
end Unlock_Nodes;
- Zero : constant Slot := (Field_Size => 32, Slot_32 => 0);
+ Zero : constant Slot := 0;
procedure Zero_Slots (F, L : Node_Offset) is
begin