[Ada] More work on efficiency improvements
gcc/ada/ * table.ads (Table_Type): Remove "aliased"; no longer needed by Atree. Besides it contradicted the comment a few lines above, "-- Note: We do not make the table components aliased...". * types.ads: Move type Slot to Atree. * atree.ads: Move type Slot fromt Types to here. Move type Node_Header from Seinfo to here. * atree.adb: Avoid the need for aliased components of the Slots table. Instead of 'Access, use a getter and setter. Misc cleanups. (Print_Statistics): Print statistics about node and entity kind frequencies. Give 3 digit fractions instead of percentages. * (Get_Original_Node_Count, Set_Original_Node_Count): Statistics for calls to Original_Node and Set_Original_Node. (Original_Node, Set_Original_Node): Gather statistics by calling the above. (Print_Field_Statistics): Print Original_Node statistics. (Update_Kind_Statistics): Remove, and put all statistics gathering under "if Atree_Statistics_Enabled", which is a flag generated in Seinfo by Gen_IL. * gen_il-gen.adb (Compute_Field_Offsets): Choose offsets of Nkind, Ekind, and Homonym first. This causes a slight efficiency improvement. Misc cleanups. Do not generate Node_Header; it is now hand-written in Atree. When choosing the order in which to assign offsets, weight by the frequency of the node type, so the more common nodes get their field offsets assigned earlier. Add more special cases. (Compute_Type_Sizes): Remove this and related things. There was a comment: "At some point we can instrument Atree to print out accurate size statistics, and remove this code." We have Atree statistics, so we now remove this code. (Put_Seinfo): Generate Atree_Statistics_Enabled, which is equal to Statistics_Enabled. This allows Atree to say "if Atree_Statistics_Enabled then <gather statistics>" for efficiency. When Atree_Statistics_Enabled is False, the "if ..." will be optimized away. * gen_il-internals.ads (Type_Frequency): New table of kind frequencies. * gen_il-internals.adb: Minor comment improvement. * gen_il-fields.ads: Remove unused subtypes. Suppress style checks in the Type_Frequency table. If we regenerate this table (see -gnatd.A) we don't want to have to fiddle with casing. * impunit.adb: Minor. * sinfo-utils.adb: Minor. * debug.adb: Minor comment improvement.
This commit is contained in:
parent
3a81dbb618
commit
3f561db7ca
11 changed files with 590 additions and 361 deletions
|
@ -211,10 +211,6 @@ package body Atree is
|
|||
(Old_N : Entity_Id; New_Kind : Entity_Kind);
|
||||
-- Above are the same as the ones for nodes, but for entities
|
||||
|
||||
procedure Update_Kind_Statistics (Field : Node_Or_Entity_Field);
|
||||
-- Increment Set_Count (Field). This is in a procedure so we can put it in
|
||||
-- pragma Debug for efficiency.
|
||||
|
||||
procedure Init_Nkind (N : Node_Id; Val : Node_Kind);
|
||||
-- Initialize the Nkind field, which must not have been set already. This
|
||||
-- cannot be used to modify an already-initialized Nkind field. See also
|
||||
|
@ -639,7 +635,7 @@ package body Atree is
|
|||
-- S is the slot at that offset. V is the amount to shift by.
|
||||
|
||||
function In_NH (Slot_Off : Field_Offset) return Boolean is
|
||||
(Slot_Off < Seinfo.N_Head);
|
||||
(Slot_Off < N_Head);
|
||||
-- In_NH stands for "in Node_Header", not "in New Hampshire"
|
||||
|
||||
function Get_Slot
|
||||
|
@ -648,8 +644,13 @@ package body Atree is
|
|||
(if In_NH (Slot_Off) then
|
||||
Node_Offsets.Table (N).Slots (Slot_Off)
|
||||
else Slots.Table (Node_Offsets.Table (N).Offset + Slot_Off));
|
||||
-- Get the slot, either directly from the node header, or indirectly
|
||||
-- from the Slots table.
|
||||
-- Get the slot value, either directly from the node header, or
|
||||
-- indirectly from the Slots table.
|
||||
|
||||
procedure Set_Slot
|
||||
(N : Node_Or_Entity_Id; Slot_Off : Field_Offset; S : Slot);
|
||||
-- Set the slot value, either directly from the node header, or
|
||||
-- indirectly from the Slots table, to S.
|
||||
|
||||
function Get_1_Bit_Val
|
||||
(N : Node_Or_Entity_Id; Offset : Field_Offset) return Field_Size_1_Bit
|
||||
|
@ -730,13 +731,15 @@ package body Atree is
|
|||
return Raw;
|
||||
end Get_32_Bit_Val;
|
||||
|
||||
type Slot_Ptr is access all Slot;
|
||||
function Get_Slot_Ptr
|
||||
(N : Node_Or_Entity_Id; Slot_Off : Field_Offset)
|
||||
return Slot_Ptr is
|
||||
(if In_NH (Slot_Off) then
|
||||
Node_Offsets.Table (N).Slots (Slot_Off)'Access
|
||||
else Slots.Table (Node_Offsets.Table (N).Offset + Slot_Off)'Access);
|
||||
procedure Set_Slot
|
||||
(N : Node_Or_Entity_Id; Slot_Off : Field_Offset; S : Slot) is
|
||||
begin
|
||||
if In_NH (Slot_Off) then
|
||||
Node_Offsets.Table (N).Slots (Slot_Off) := S;
|
||||
else
|
||||
Slots.Table (Node_Offsets.Table (N).Offset + Slot_Off) := S;
|
||||
end if;
|
||||
end Set_Slot;
|
||||
|
||||
procedure Set_1_Bit_Val
|
||||
(N : Node_Or_Entity_Id; Offset : Field_Offset; Val : Field_Size_1_Bit)
|
||||
|
@ -745,12 +748,13 @@ package body Atree is
|
|||
Mask : constant := 2**F_Size - 1;
|
||||
F_Per_Slot : constant Field_Offset := Slot_Size / F_Size;
|
||||
Slot_Off : constant Field_Offset := Offset / F_Per_Slot;
|
||||
Ptr : constant Slot_Ptr := Get_Slot_Ptr (N, Slot_Off);
|
||||
S : Slot renames Ptr.all;
|
||||
S : constant Slot := Get_Slot (N, Slot_Off);
|
||||
V : constant Natural := Natural ((Offset mod F_Per_Slot) * F_Size);
|
||||
pragma Debug (Validate_Node_And_Offset_Write (N, Slot_Off));
|
||||
begin
|
||||
S := (S and not Shift_Left (Mask, V)) or Shift_Left (Slot (Val), V);
|
||||
Set_Slot
|
||||
(N, Slot_Off,
|
||||
(S and not Shift_Left (Mask, V)) or Shift_Left (Slot (Val), V));
|
||||
end Set_1_Bit_Val;
|
||||
|
||||
procedure Set_2_Bit_Val
|
||||
|
@ -760,12 +764,13 @@ package body Atree is
|
|||
Mask : constant := 2**F_Size - 1;
|
||||
F_Per_Slot : constant Field_Offset := Slot_Size / F_Size;
|
||||
Slot_Off : constant Field_Offset := Offset / F_Per_Slot;
|
||||
Ptr : constant Slot_Ptr := Get_Slot_Ptr (N, Slot_Off);
|
||||
S : Slot renames Ptr.all;
|
||||
S : constant Slot := Get_Slot (N, Slot_Off);
|
||||
V : constant Natural := Natural ((Offset mod F_Per_Slot) * F_Size);
|
||||
pragma Debug (Validate_Node_And_Offset_Write (N, Slot_Off));
|
||||
begin
|
||||
S := (S and not Shift_Left (Mask, V)) or Shift_Left (Slot (Val), V);
|
||||
Set_Slot
|
||||
(N, Slot_Off,
|
||||
(S and not Shift_Left (Mask, V)) or Shift_Left (Slot (Val), V));
|
||||
end Set_2_Bit_Val;
|
||||
|
||||
procedure Set_4_Bit_Val
|
||||
|
@ -775,12 +780,13 @@ package body Atree is
|
|||
Mask : constant := 2**F_Size - 1;
|
||||
F_Per_Slot : constant Field_Offset := Slot_Size / F_Size;
|
||||
Slot_Off : constant Field_Offset := Offset / F_Per_Slot;
|
||||
Ptr : constant Slot_Ptr := Get_Slot_Ptr (N, Slot_Off);
|
||||
S : Slot renames Ptr.all;
|
||||
S : constant Slot := Get_Slot (N, Slot_Off);
|
||||
V : constant Natural := Natural ((Offset mod F_Per_Slot) * F_Size);
|
||||
pragma Debug (Validate_Node_And_Offset_Write (N, Slot_Off));
|
||||
begin
|
||||
S := (S and not Shift_Left (Mask, V)) or Shift_Left (Slot (Val), V);
|
||||
Set_Slot
|
||||
(N, Slot_Off,
|
||||
(S and not Shift_Left (Mask, V)) or Shift_Left (Slot (Val), V));
|
||||
end Set_4_Bit_Val;
|
||||
|
||||
procedure Set_8_Bit_Val
|
||||
|
@ -790,26 +796,25 @@ package body Atree is
|
|||
Mask : constant := 2**F_Size - 1;
|
||||
F_Per_Slot : constant Field_Offset := Slot_Size / F_Size;
|
||||
Slot_Off : constant Field_Offset := Offset / F_Per_Slot;
|
||||
Ptr : constant Slot_Ptr := Get_Slot_Ptr (N, Slot_Off);
|
||||
S : Slot renames Ptr.all;
|
||||
S : constant Slot := Get_Slot (N, Slot_Off);
|
||||
V : constant Natural := Natural ((Offset mod F_Per_Slot) * F_Size);
|
||||
pragma Debug (Validate_Node_And_Offset_Write (N, Slot_Off));
|
||||
begin
|
||||
S := (S and not Shift_Left (Mask, V)) or Shift_Left (Slot (Val), V);
|
||||
Set_Slot
|
||||
(N, Slot_Off,
|
||||
(S and not Shift_Left (Mask, V)) or Shift_Left (Slot (Val), V));
|
||||
end Set_8_Bit_Val;
|
||||
|
||||
procedure Set_32_Bit_Val
|
||||
(N : Node_Or_Entity_Id; Offset : Field_Offset; Val : Field_Size_32_Bit)
|
||||
is
|
||||
F_Size : constant := 32;
|
||||
-- No Mask needed
|
||||
-- No Mask needed; this one doesn't do read-modify-write
|
||||
F_Per_Slot : constant Field_Offset := Slot_Size / F_Size;
|
||||
Slot_Off : constant Field_Offset := Offset / F_Per_Slot;
|
||||
Ptr : constant Slot_Ptr := Get_Slot_Ptr (N, Slot_Off);
|
||||
S : Slot renames Ptr.all;
|
||||
pragma Debug (Validate_Node_And_Offset_Write (N, Slot_Off));
|
||||
begin
|
||||
S := Slot (Val);
|
||||
Set_Slot (N, Slot_Off, Slot (Val));
|
||||
end Set_32_Bit_Val;
|
||||
|
||||
----------------------
|
||||
|
@ -836,9 +841,9 @@ package body Atree is
|
|||
|
||||
end Atree_Private_Part;
|
||||
|
||||
---------------
|
||||
-- Set_Field --
|
||||
---------------
|
||||
---------------------
|
||||
-- Get_Field_Value --
|
||||
---------------------
|
||||
|
||||
function Get_Node_Field_Union is new Get_32_Bit_Field (Union_Id)
|
||||
with Inline;
|
||||
|
@ -848,10 +853,10 @@ package body Atree is
|
|||
function Get_Field_Value
|
||||
(N : Node_Id; Field : Node_Or_Entity_Field) return Field_Size_32_Bit
|
||||
is
|
||||
Desc : Seinfo.Field_Descriptor renames Field_Descriptors (Field);
|
||||
Desc : Field_Descriptor renames Field_Descriptors (Field);
|
||||
|
||||
begin
|
||||
case Seinfo.Field_Size (Desc.Kind) is
|
||||
case Field_Size (Desc.Kind) is
|
||||
when 1 => return Field_Size_32_Bit (Get_1_Bit_Val (N, Desc.Offset));
|
||||
when 2 => return Field_Size_32_Bit (Get_2_Bit_Val (N, Desc.Offset));
|
||||
when 4 => return Field_Size_32_Bit (Get_4_Bit_Val (N, Desc.Offset));
|
||||
|
@ -860,13 +865,17 @@ package body Atree is
|
|||
end case;
|
||||
end Get_Field_Value;
|
||||
|
||||
---------------------
|
||||
-- Set_Field_Value --
|
||||
---------------------
|
||||
|
||||
procedure Set_Field_Value
|
||||
(N : Node_Id; Field : Node_Or_Entity_Field; Val : Field_Size_32_Bit)
|
||||
is
|
||||
Desc : Seinfo.Field_Descriptor renames Field_Descriptors (Field);
|
||||
Desc : Field_Descriptor renames Field_Descriptors (Field);
|
||||
|
||||
begin
|
||||
case Seinfo.Field_Size (Desc.Kind) is
|
||||
case Field_Size (Desc.Kind) is
|
||||
when 1 => Set_1_Bit_Val (N, Desc.Offset, Field_Size_1_Bit (Val));
|
||||
when 2 => Set_2_Bit_Val (N, Desc.Offset, Field_Size_2_Bit (Val));
|
||||
when 4 => Set_4_Bit_Val (N, Desc.Offset, Field_Size_4_Bit (Val));
|
||||
|
@ -974,17 +983,15 @@ package body Atree is
|
|||
Nkind_Offset : constant Field_Offset :=
|
||||
Field_Descriptors (F_Nkind).Offset;
|
||||
|
||||
procedure Update_Kind_Statistics (Field : Node_Or_Entity_Field) is
|
||||
begin
|
||||
Set_Count (Field) := Set_Count (Field) + 1;
|
||||
end Update_Kind_Statistics;
|
||||
|
||||
procedure Set_Node_Kind_Type is new Set_8_Bit_Field (Node_Kind) with Inline;
|
||||
|
||||
procedure Init_Nkind (N : Node_Id; Val : Node_Kind) is
|
||||
pragma Assert (Field_Is_Initial_Zero (N, F_Nkind));
|
||||
begin
|
||||
pragma Debug (Update_Kind_Statistics (F_Nkind));
|
||||
if Atree_Statistics_Enabled then
|
||||
Set_Count (F_Nkind) := Set_Count (F_Nkind) + 1;
|
||||
end if;
|
||||
|
||||
Set_Node_Kind_Type (N, Nkind_Offset, Val);
|
||||
end Init_Nkind;
|
||||
|
||||
|
@ -1016,7 +1023,7 @@ package body Atree is
|
|||
declare
|
||||
New_Off_F : constant Node_Offset := Alloc_Slots (New_Size);
|
||||
begin
|
||||
All_Node_Offsets (N).Offset := New_Off_F - Seinfo.N_Head;
|
||||
All_Node_Offsets (N).Offset := New_Off_F - N_Head;
|
||||
Copy_Dynamic_Slots (Old_Off_F, New_Off_F, Old_Size);
|
||||
pragma Debug
|
||||
(Zero_Dynamic_Slots (Old_Off_F, Old_Off_F + Old_Size - 1));
|
||||
|
@ -1027,7 +1034,10 @@ package body Atree is
|
|||
Zero_Dynamic_Slots (Off_F (N) + Old_Size, Slots.Last);
|
||||
end if;
|
||||
|
||||
pragma Debug (Update_Kind_Statistics (F_Nkind));
|
||||
if Atree_Statistics_Enabled then
|
||||
Set_Count (F_Nkind) := Set_Count (F_Nkind) + 1;
|
||||
end if;
|
||||
|
||||
Set_Node_Kind_Type (N, Nkind_Offset, Val);
|
||||
pragma Debug (Validate_Node_Write (N));
|
||||
|
||||
|
@ -1060,7 +1070,10 @@ package body Atree is
|
|||
-- For now, we are allocating all entities with the same size, so we
|
||||
-- don't need to reallocate slots here.
|
||||
|
||||
pragma Debug (Update_Kind_Statistics (F_Ekind));
|
||||
if Atree_Statistics_Enabled then
|
||||
Set_Count (F_Nkind) := Set_Count (F_Ekind) + 1;
|
||||
end if;
|
||||
|
||||
Set_Entity_Kind_Type (N, Ekind_Offset, Val);
|
||||
pragma Debug (Validate_Node_Write (N));
|
||||
|
||||
|
@ -1078,7 +1091,7 @@ package body Atree is
|
|||
Sz : constant Slot_Count := Size_In_Slots_To_Alloc (Kind);
|
||||
Sl : constant Node_Offset := Alloc_Slots (Sz);
|
||||
begin
|
||||
Node_Offsets.Table (Result).Offset := Sl - Seinfo.N_Head;
|
||||
Node_Offsets.Table (Result).Offset := Sl - N_Head;
|
||||
Zero_Dynamic_Slots (Sl, Sl + Sz - 1);
|
||||
Zero_Header_Slots (Result);
|
||||
end;
|
||||
|
@ -1141,7 +1154,7 @@ package body Atree is
|
|||
New_Offset : constant Field_Offset := Alloc_Slots (New_Size);
|
||||
begin
|
||||
pragma Debug (Zero_Slots (N));
|
||||
Node_Offsets.Table (N).Offset := New_Offset - Seinfo.N_Head;
|
||||
Node_Offsets.Table (N).Offset := New_Offset - N_Head;
|
||||
Zero_Dynamic_Slots (New_Offset, New_Offset + New_Size - 1);
|
||||
Zero_Header_Slots (N);
|
||||
end;
|
||||
|
@ -1229,7 +1242,7 @@ package body Atree is
|
|||
if D_Size < S_Size then
|
||||
pragma Debug (Zero_Slots (Destination)); -- destroy old slots
|
||||
Node_Offsets.Table (Destination).Offset :=
|
||||
Alloc_Slots (S_Size) - Seinfo.N_Head;
|
||||
Alloc_Slots (S_Size) - N_Head;
|
||||
end if;
|
||||
|
||||
Copy_Slots (Source, Destination);
|
||||
|
@ -1447,7 +1460,7 @@ package body Atree is
|
|||
(Is_Entity (E1) and then Is_Entity (E2)
|
||||
and then not In_List (E1) and then not In_List (E2));
|
||||
|
||||
Old_E1 : constant Seinfo.Node_Header := Node_Offsets.Table (E1);
|
||||
Old_E1 : constant Node_Header := Node_Offsets.Table (E1);
|
||||
|
||||
begin
|
||||
Node_Offsets.Table (E1) := Node_Offsets.Table (E2);
|
||||
|
@ -1546,7 +1559,6 @@ package body Atree is
|
|||
begin
|
||||
for J in Fields'Range loop
|
||||
declare
|
||||
use Seinfo;
|
||||
Desc : Field_Descriptor renames Field_Descriptors (Fields (J));
|
||||
begin
|
||||
if Desc.Kind in Node_Id_Field | List_Id_Field then
|
||||
|
@ -1698,7 +1710,7 @@ package body Atree is
|
|||
|
||||
return New_Id : constant Node_Id := Alloc_Node_Id do
|
||||
Node_Offsets.Table (New_Id).Offset :=
|
||||
Alloc_Slots (S_Size) - Seinfo.N_Head;
|
||||
Alloc_Slots (S_Size) - N_Head;
|
||||
Orig_Nodes.Append (New_Id);
|
||||
Copy_Slots (Source, New_Id);
|
||||
|
||||
|
@ -1858,7 +1870,7 @@ package body Atree is
|
|||
|
||||
function Off_F (N : Node_Id) return Node_Offset is
|
||||
begin
|
||||
return Off_0 (N) + Seinfo.N_Head;
|
||||
return Off_0 (N) + N_Head;
|
||||
end Off_F;
|
||||
|
||||
-----------
|
||||
|
@ -1881,6 +1893,9 @@ package body Atree is
|
|||
function Original_Node (Node : Node_Id) return Node_Id is
|
||||
begin
|
||||
pragma Debug (Validate_Node (Node));
|
||||
if Atree_Statistics_Enabled then
|
||||
Get_Original_Node_Count := Get_Original_Node_Count + 1;
|
||||
end if;
|
||||
|
||||
return Orig_Nodes.Table (Node);
|
||||
end Original_Node;
|
||||
|
@ -2176,6 +2191,9 @@ package body Atree is
|
|||
procedure Set_Original_Node (N : Node_Id; Val : Node_Id) is
|
||||
begin
|
||||
pragma Debug (Validate_Node_Write (N));
|
||||
if Atree_Statistics_Enabled then
|
||||
Set_Original_Node_Count := Set_Original_Node_Count + 1;
|
||||
end if;
|
||||
|
||||
Orig_Nodes.Table (N) := Val;
|
||||
end Set_Original_Node;
|
||||
|
@ -2271,7 +2289,7 @@ package body Atree is
|
|||
begin
|
||||
return
|
||||
(if Kind in N_Entity then Einfo.Entities.Max_Entity_Size
|
||||
else Sinfo.Nodes.Size (Kind)) - Seinfo.N_Head;
|
||||
else Sinfo.Nodes.Size (Kind)) - N_Head;
|
||||
-- Unfortunately, we don't know the Entity_Kind, so we have to use the
|
||||
-- max.
|
||||
end Size_In_Slots_To_Alloc;
|
||||
|
@ -2300,7 +2318,7 @@ package body Atree is
|
|||
|
||||
function Size_In_Slots_Dynamic (N : Node_Or_Entity_Id) return Slot_Count is
|
||||
begin
|
||||
return Size_In_Slots (N) - Seinfo.N_Head;
|
||||
return Size_In_Slots (N) - N_Head;
|
||||
end Size_In_Slots_Dynamic;
|
||||
|
||||
-------------------
|
||||
|
@ -2492,9 +2510,104 @@ package body Atree is
|
|||
-- Print_Statistics --
|
||||
----------------------
|
||||
|
||||
procedure Print_Statistics is
|
||||
procedure Print_Node_Statistics;
|
||||
procedure Print_Field_Statistics;
|
||||
-- Helpers for Print_Statistics
|
||||
|
||||
procedure Write_Ratio (X : Nat_64; Y : Pos_64);
|
||||
-- Write the value of (X/Y) without using 'Image (approximately)
|
||||
|
||||
procedure Write_Ratio (X : Nat_64; Y : Pos_64) is
|
||||
pragma Assert (X <= Y);
|
||||
Ratio : constant Nat := Nat ((Long_Float (X) / Long_Float (Y)) * 1000.0);
|
||||
begin
|
||||
Write_Str (" (");
|
||||
|
||||
if Ratio = 0 then
|
||||
Write_Str ("0.000");
|
||||
elsif Ratio in 1 .. 9 then
|
||||
Write_Str ("0.00");
|
||||
Write_Int (Ratio);
|
||||
elsif Ratio in 10 .. 99 then
|
||||
Write_Str ("0.0");
|
||||
Write_Int (Ratio);
|
||||
elsif Ratio in 100 .. 999 then
|
||||
Write_Str ("0.");
|
||||
Write_Int (Ratio);
|
||||
else
|
||||
Write_Int (Ratio / 1000);
|
||||
end if;
|
||||
|
||||
Write_Str (")");
|
||||
end Write_Ratio;
|
||||
|
||||
procedure Print_Node_Statistics is
|
||||
subtype Count is Nat_64;
|
||||
Node_Counts : array (Node_Kind) of Count := (others => 0);
|
||||
Entity_Counts : array (Entity_Kind) of Count := (others => 0);
|
||||
|
||||
All_Node_Offsets : Node_Offsets.Table_Type renames
|
||||
Node_Offsets.Table (Node_Offsets.First .. Node_Offsets.Last);
|
||||
begin
|
||||
Write_Int (Int (Node_Offsets.Last));
|
||||
Write_Line (" nodes (including entities)");
|
||||
Write_Int (Int (Slots.Last));
|
||||
Write_Line (" non-header slots");
|
||||
|
||||
for N in All_Node_Offsets'Range loop
|
||||
declare
|
||||
K : constant Node_Kind := Nkind (N);
|
||||
|
||||
begin
|
||||
Node_Counts (K) := Node_Counts (K) + 1;
|
||||
|
||||
if K in N_Entity then
|
||||
Entity_Counts (Ekind (N)) := Entity_Counts (Ekind (N)) + 1;
|
||||
end if;
|
||||
end;
|
||||
end loop;
|
||||
|
||||
for K in Node_Kind loop
|
||||
declare
|
||||
Count : constant Nat_64 := Node_Counts (K);
|
||||
begin
|
||||
Write_Int_64 (Count);
|
||||
Write_Ratio (Count, Int_64 (Node_Offsets.Last));
|
||||
Write_Str (" ");
|
||||
Write_Str (Node_Kind'Image (K));
|
||||
Write_Str (" ");
|
||||
Write_Int (Int (Sinfo.Nodes.Size (K)));
|
||||
Write_Str (" slots");
|
||||
Write_Eol;
|
||||
end;
|
||||
end loop;
|
||||
|
||||
for K in Entity_Kind loop
|
||||
declare
|
||||
Count : constant Nat_64 := Entity_Counts (K);
|
||||
begin
|
||||
Write_Int_64 (Count);
|
||||
Write_Ratio (Count, Int_64 (Node_Offsets.Last));
|
||||
Write_Str (" ");
|
||||
Write_Str (Entity_Kind'Image (K));
|
||||
Write_Str (" ");
|
||||
Write_Int (Int (Einfo.Entities.Size (K)));
|
||||
Write_Str (" slots");
|
||||
Write_Eol;
|
||||
end;
|
||||
end loop;
|
||||
end Print_Node_Statistics;
|
||||
|
||||
procedure Print_Field_Statistics is
|
||||
Total, G_Total, S_Total : Call_Count := 0;
|
||||
begin
|
||||
Write_Int_64 (Get_Original_Node_Count);
|
||||
Write_Str (" + ");
|
||||
Write_Int_64 (Set_Original_Node_Count);
|
||||
Write_Eol;
|
||||
Write_Line (" Original_Node_Count getter and setter calls");
|
||||
Write_Eol;
|
||||
|
||||
Write_Line ("Frequency of field getter and setter calls:");
|
||||
|
||||
for Field in Node_Or_Entity_Field loop
|
||||
|
@ -2520,19 +2633,13 @@ package body Atree is
|
|||
S : constant Call_Count := Set_Count (Field);
|
||||
GS : constant Call_Count := G + S;
|
||||
|
||||
Percent : constant Int :=
|
||||
Int ((Long_Float (GS) / Long_Float (Total)) * 100.0);
|
||||
|
||||
use Seinfo;
|
||||
Desc : Field_Descriptor renames Field_Descriptors (Field);
|
||||
Slot : constant Field_Offset :=
|
||||
(Field_Size (Desc.Kind) * Desc.Offset) / Slot_Size;
|
||||
|
||||
begin
|
||||
Write_Int_64 (GS);
|
||||
Write_Str (" (");
|
||||
Write_Int (Percent);
|
||||
Write_Str ("%)");
|
||||
Write_Ratio (GS, Total);
|
||||
Write_Str (" = ");
|
||||
Write_Int_64 (G);
|
||||
Write_Str (" + ");
|
||||
|
@ -2546,6 +2653,14 @@ package body Atree is
|
|||
Write_Eol;
|
||||
end;
|
||||
end loop;
|
||||
end Print_Field_Statistics;
|
||||
|
||||
procedure Print_Statistics is
|
||||
begin
|
||||
Write_Eol;
|
||||
Write_Eol;
|
||||
Print_Node_Statistics;
|
||||
Print_Field_Statistics;
|
||||
end Print_Statistics;
|
||||
|
||||
end Atree;
|
||||
|
|
|
@ -48,7 +48,7 @@ with Alloc;
|
|||
with Sinfo.Nodes; use Sinfo.Nodes;
|
||||
with Einfo.Entities; use Einfo.Entities;
|
||||
with Types; use Types;
|
||||
with Seinfo;
|
||||
with Seinfo; use Seinfo;
|
||||
with System; use System;
|
||||
with Table;
|
||||
with Unchecked_Conversion;
|
||||
|
@ -653,11 +653,30 @@ package Atree is
|
|||
-- table. We use zero-origin addressing, so the Offset into the Slots
|
||||
-- table will point 3 slots before slot 3.
|
||||
|
||||
pragma Assert (Seinfo.N_Head <= Min_Node_Size);
|
||||
pragma Assert (Seinfo.N_Head <= Min_Entity_Size);
|
||||
pragma Assert (N_Head <= Min_Node_Size);
|
||||
pragma Assert (N_Head <= Min_Entity_Size);
|
||||
|
||||
Slot_Size : constant := 32;
|
||||
type Slot is mod 2**Slot_Size;
|
||||
for Slot'Size use Slot_Size;
|
||||
|
||||
-- The type Slot is defined in Types as a 32-bit modular integer. It
|
||||
-- is logically split into the appropriate numbers of components of
|
||||
-- appropriate size, but this splitting is not explicit because packed
|
||||
-- arrays cannot be properly interfaced in C/C++ and packed records are
|
||||
-- way too slow.
|
||||
|
||||
type Node_Header_Slots is
|
||||
array (Field_Offset range 0 .. N_Head - 1) of Slot;
|
||||
type Node_Header is record
|
||||
Slots : Node_Header_Slots;
|
||||
Offset : Node_Offset'Base;
|
||||
end record;
|
||||
pragma Assert (Node_Header'Size = (N_Head + 1) * Slot_Size);
|
||||
pragma Assert (Node_Header'Size = 16 * 8);
|
||||
|
||||
package Node_Offsets is new Table.Table
|
||||
(Table_Component_Type => Seinfo.Node_Header,
|
||||
(Table_Component_Type => Node_Header,
|
||||
Table_Index_Type => Node_Id'Base,
|
||||
Table_Low_Bound => First_Node_Id,
|
||||
Table_Initial => Alloc.Node_Offsets_Initial,
|
||||
|
@ -671,12 +690,6 @@ package Atree is
|
|||
-- Short names for use in gdb, not used in real code. Note that gdb
|
||||
-- can't find Node_Offsets.Table without a full expanded name.
|
||||
|
||||
-- The type Slot is defined in Types as a 32-bit modular integer. It
|
||||
-- is logically split into the appropriate numbers of components of
|
||||
-- appropriate size, but this splitting is not explicit because packed
|
||||
-- arrays cannot be properly interfaced in C/C++ and packed records are
|
||||
-- way too slow.
|
||||
|
||||
function Shift_Left (S : Slot; V : Natural) return Slot;
|
||||
pragma Import (Intrinsic, Shift_Left);
|
||||
|
||||
|
@ -870,6 +883,8 @@ package Atree is
|
|||
-- Number of calls to each getter and setter. See documentaton for
|
||||
-- -gnatd.A.
|
||||
|
||||
Get_Original_Node_Count, Set_Original_Node_Count : Call_Count := 0;
|
||||
|
||||
procedure Print_Statistics;
|
||||
|
||||
end Atree;
|
||||
|
|
|
@ -831,8 +831,9 @@ package body Debug is
|
|||
-- targets that do not use the GCC back end, this switch is ignored.
|
||||
|
||||
-- d.A Enable statistics printing in Atree. First set Statistics_Enabled
|
||||
-- in gen_il-gen.adb to True, then rebuild, then run the compiler with
|
||||
-- -gnatd.A. You might want to apply "sort -nr" to the output.
|
||||
-- in gen_il-gen.adb to True, then rebuild, then run the compiler
|
||||
-- with -gnatd.A. You might want to apply "sort -nr" to parts of the
|
||||
-- output.
|
||||
|
||||
-- d.B Generate a bug box when we see an abort_statement, even though
|
||||
-- there is no bug. Useful for testing Comperr.Compiler_Abort: write
|
||||
|
|
|
@ -23,8 +23,6 @@
|
|||
-- --
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
with Gen_IL.Types;
|
||||
|
||||
package Gen_IL.Fields is
|
||||
|
||||
-- The following is "optional field enumeration" -- i.e. it is Field_Enum
|
||||
|
@ -36,8 +34,7 @@ package Gen_IL.Fields is
|
|||
-- which might need to be kept in sync when modifying this.
|
||||
|
||||
-- Be sure to put new fields in the appropriate subrange (Field_Enum,
|
||||
-- Node_Header_Field, Node_Field, Entity_Field -- search for comments
|
||||
-- below).
|
||||
-- Node_Field, Entity_Field -- search for comments below).
|
||||
|
||||
type Opt_Field_Enum is
|
||||
(No_Field,
|
||||
|
@ -943,13 +940,4 @@ package Gen_IL.Fields is
|
|||
-- Enumeration of fields -- Opt_Field_Enum without the special null value
|
||||
-- No_Field.
|
||||
|
||||
subtype Node_Header_Field is Field_Enum with Predicate =>
|
||||
Node_Header_Field in Nkind .. Link | Ekind;
|
||||
|
||||
use Gen_IL.Types;
|
||||
|
||||
subtype Node_Header_Type is Type_Enum range
|
||||
Node_Kind_Type .. Union_Id;
|
||||
-- Types of node header fields
|
||||
|
||||
end Gen_IL.Fields;
|
||||
|
|
|
@ -503,8 +503,6 @@ package body Gen_IL.Gen is
|
|||
Min_Entity_Size : Field_Offset := Field_Offset'Last;
|
||||
Max_Entity_Size : Field_Offset := 0;
|
||||
|
||||
Average_Node_Size_In_Slots : Long_Float;
|
||||
|
||||
Node_Field_Types_Used, Entity_Field_Types_Used : Type_Set;
|
||||
|
||||
Setter_Needs_Parent : Field_Set :=
|
||||
|
@ -1001,16 +999,16 @@ package body Gen_IL.Gen is
|
|||
Image (Gen_IL.Internals.Bit_Offset'Last) & " is too small)";
|
||||
end Choose_Offset;
|
||||
|
||||
Num_Concrete_Have_Field : array (Field_Enum) of Type_Count :=
|
||||
Weighted_Node_Frequency : array (Field_Enum) of Type_Count :=
|
||||
(others => 0);
|
||||
-- Number of concrete types that have each field
|
||||
|
||||
function More_Types_Have_Field (F1, F2 : Field_Enum) return Boolean is
|
||||
(Num_Concrete_Have_Field (F1) > Num_Concrete_Have_Field (F2));
|
||||
(Weighted_Node_Frequency (F1) > Weighted_Node_Frequency (F2));
|
||||
-- True if F1 appears in more concrete types than F2
|
||||
|
||||
function Sort_Less (F1, F2 : Field_Enum) return Boolean is
|
||||
(if Num_Concrete_Have_Field (F1) = Num_Concrete_Have_Field (F2) then
|
||||
(if Weighted_Node_Frequency (F1) = Weighted_Node_Frequency (F2) then
|
||||
F1 < F2
|
||||
else More_Types_Have_Field (F1, F2));
|
||||
|
||||
|
@ -1019,15 +1017,18 @@ package body Gen_IL.Gen is
|
|||
|
||||
All_Fields : Field_Vector;
|
||||
|
||||
-- Start of processing for Compute_Field_Offsets
|
||||
|
||||
begin
|
||||
|
||||
-- Compute the number of types that have each field
|
||||
-- Compute the number of types that have each field, weighted by the
|
||||
-- frequency of such nodes.
|
||||
|
||||
for T in Concrete_Type loop
|
||||
for F in Field_Enum loop
|
||||
if Fields_Per_Node (T) (F) then
|
||||
Num_Concrete_Have_Field (F) :=
|
||||
Num_Concrete_Have_Field (F) + 1;
|
||||
Weighted_Node_Frequency (F) :=
|
||||
Weighted_Node_Frequency (F) + Type_Frequency (T);
|
||||
end if;
|
||||
end loop;
|
||||
end loop;
|
||||
|
@ -1042,13 +1043,6 @@ package body Gen_IL.Gen is
|
|||
Append (All_Fields, F);
|
||||
end loop;
|
||||
|
||||
-- Force Homonym to be at offset zero, which speeds up the
|
||||
-- compiler. The Sort below will place Homonym first in
|
||||
-- All_Fields.
|
||||
|
||||
Num_Concrete_Have_Field (Homonym) :=
|
||||
Num_Concrete_Have_Field (Nkind) + 1;
|
||||
|
||||
-- Sort All_Fields based on how many concrete types have the field.
|
||||
-- This is for efficiency; we want to choose the offsets of the most
|
||||
-- common fields first, so they get low numbers.
|
||||
|
@ -1069,7 +1063,22 @@ package body Gen_IL.Gen is
|
|||
-- get low offsets, so they will wind up in the node header for
|
||||
-- faster access.
|
||||
|
||||
Choose_Offset (Nkind);
|
||||
pragma Assert (Field_Table (Nkind).Offset = 0);
|
||||
Choose_Offset (Ekind);
|
||||
pragma Assert (Field_Table (Ekind).Offset = 1);
|
||||
Choose_Offset (Homonym);
|
||||
pragma Assert (Field_Table (Homonym).Offset = 1);
|
||||
Choose_Offset (Is_Immediately_Visible);
|
||||
pragma Assert (Field_Table (Is_Immediately_Visible).Offset = 16);
|
||||
Choose_Offset (From_Limited_With);
|
||||
pragma Assert (Field_Table (From_Limited_With).Offset = 17);
|
||||
Choose_Offset (Is_Potentially_Use_Visible);
|
||||
pragma Assert (Field_Table (Is_Potentially_Use_Visible).Offset = 18);
|
||||
Choose_Offset (Is_Generic_Instance);
|
||||
pragma Assert (Field_Table (Is_Generic_Instance).Offset = 19);
|
||||
Choose_Offset (Scope);
|
||||
pragma Assert (Field_Table (Scope).Offset = 2);
|
||||
|
||||
-- Then loop through them all, skipping the ones we did above
|
||||
|
||||
|
@ -1086,231 +1095,6 @@ package body Gen_IL.Gen is
|
|||
------------------------
|
||||
|
||||
procedure Compute_Type_Sizes is
|
||||
-- Node_Counts is the number of nodes of each kind created during
|
||||
-- compilation of a large example. This is used purely to compute an
|
||||
-- estimate of the average node size. New node types can default to
|
||||
-- "others => 0". At some point we can instrument Atree to print out
|
||||
-- accurate size statistics, and remove this code.
|
||||
|
||||
Node_Counts : constant array (Concrete_Node) of Natural :=
|
||||
(N_Identifier => 429298,
|
||||
N_Defining_Identifier => 231636,
|
||||
N_Integer_Literal => 90892,
|
||||
N_Parameter_Specification => 62811,
|
||||
N_Attribute_Reference => 47150,
|
||||
N_Expanded_Name => 37375,
|
||||
N_Selected_Component => 30699,
|
||||
N_Subprogram_Declaration => 20744,
|
||||
N_Freeze_Entity => 20314,
|
||||
N_Procedure_Specification => 18901,
|
||||
N_Object_Declaration => 18023,
|
||||
N_Function_Specification => 16570,
|
||||
N_Range => 16216,
|
||||
N_Explicit_Dereference => 12198,
|
||||
N_Component_Association => 11188,
|
||||
N_Unchecked_Type_Conversion => 11165,
|
||||
N_Subtype_Indication => 10727,
|
||||
N_Procedure_Call_Statement => 10056,
|
||||
N_Subtype_Declaration => 8141,
|
||||
N_Handled_Sequence_Of_Statements => 8078,
|
||||
N_Null => 7288,
|
||||
N_Aggregate => 7222,
|
||||
N_String_Literal => 7152,
|
||||
N_Function_Call => 6958,
|
||||
N_Simple_Return_Statement => 6911,
|
||||
N_And_Then => 6867,
|
||||
N_Op_Eq => 6845,
|
||||
N_Call_Marker => 6683,
|
||||
N_Pragma_Argument_Association => 6525,
|
||||
N_Component_Definition => 6487,
|
||||
N_Assignment_Statement => 6483,
|
||||
N_With_Clause => 6480,
|
||||
N_Null_Statement => 5917,
|
||||
N_Index_Or_Discriminant_Constraint => 5877,
|
||||
N_Generic_Association => 5667,
|
||||
N_Full_Type_Declaration => 5573,
|
||||
N_If_Statement => 5553,
|
||||
N_Subprogram_Body => 5455,
|
||||
N_Op_Add => 5443,
|
||||
N_Type_Conversion => 5260,
|
||||
N_Component_Declaration => 5059,
|
||||
N_Raise_Constraint_Error => 4840,
|
||||
N_Formal_Concrete_Subprogram_Declaration => 4602,
|
||||
N_Expression_With_Actions => 4598,
|
||||
N_Op_Ne => 3854,
|
||||
N_Indexed_Component => 3834,
|
||||
N_Op_Subtract => 3777,
|
||||
N_Package_Specification => 3490,
|
||||
N_Subprogram_Renaming_Declaration => 3445,
|
||||
N_Pragma => 3427,
|
||||
N_Case_Statement_Alternative => 3272,
|
||||
N_Block_Statement => 3239,
|
||||
N_Parameter_Association => 3213,
|
||||
N_Op_Lt => 3020,
|
||||
N_Op_Not => 2926,
|
||||
N_Character_Literal => 2914,
|
||||
N_Others_Choice => 2769,
|
||||
N_Or_Else => 2576,
|
||||
N_Itype_Reference => 2511,
|
||||
N_Defining_Operator_Symbol => 2487,
|
||||
N_Component_List => 2470,
|
||||
N_Formal_Object_Declaration => 2262,
|
||||
N_Generic_Subprogram_Declaration => 2227,
|
||||
N_Real_Literal => 2156,
|
||||
N_Op_Gt => 2156,
|
||||
N_Access_To_Object_Definition => 1984,
|
||||
N_Op_Le => 1975,
|
||||
N_Op_Ge => 1942,
|
||||
N_Package_Renaming_Declaration => 1811,
|
||||
N_Formal_Type_Declaration => 1756,
|
||||
N_Qualified_Expression => 1746,
|
||||
N_Package_Declaration => 1729,
|
||||
N_Record_Definition => 1651,
|
||||
N_Allocator => 1521,
|
||||
N_Op_Concat => 1377,
|
||||
N_Access_Definition => 1358,
|
||||
N_Case_Statement => 1322,
|
||||
N_Number_Declaration => 1316,
|
||||
N_Generic_Package_Declaration => 1311,
|
||||
N_Slice => 1078,
|
||||
N_Constrained_Array_Definition => 1068,
|
||||
N_Exception_Renaming_Declaration => 1011,
|
||||
N_Implicit_Label_Declaration => 978,
|
||||
N_Exception_Handler => 966,
|
||||
N_Private_Type_Declaration => 898,
|
||||
N_Operator_Symbol => 872,
|
||||
N_Formal_Private_Type_Definition => 867,
|
||||
N_Range_Constraint => 849,
|
||||
N_Aspect_Specification => 837,
|
||||
N_Variant => 834,
|
||||
N_Discriminant_Specification => 746,
|
||||
N_Loop_Statement => 744,
|
||||
N_Derived_Type_Definition => 731,
|
||||
N_Freeze_Generic_Entity => 702,
|
||||
N_Iteration_Scheme => 686,
|
||||
N_Package_Instantiation => 658,
|
||||
N_Loop_Parameter_Specification => 632,
|
||||
N_Attribute_Definition_Clause => 608,
|
||||
N_Compilation_Unit_Aux => 599,
|
||||
N_Compilation_Unit => 599,
|
||||
N_Label => 572,
|
||||
N_Goto_Statement => 572,
|
||||
N_In => 564,
|
||||
N_Enumeration_Type_Definition => 523,
|
||||
N_Object_Renaming_Declaration => 482,
|
||||
N_If_Expression => 476,
|
||||
N_Exception_Declaration => 472,
|
||||
N_Reference => 455,
|
||||
N_Incomplete_Type_Declaration => 438,
|
||||
N_Use_Package_Clause => 401,
|
||||
N_Unconstrained_Array_Definition => 360,
|
||||
N_Variant_Part => 340,
|
||||
N_Defining_Program_Unit_Name => 336,
|
||||
N_Op_And => 334,
|
||||
N_Raise_Program_Error => 329,
|
||||
N_Formal_Discrete_Type_Definition => 319,
|
||||
N_Contract => 311,
|
||||
N_Not_In => 305,
|
||||
N_Designator => 285,
|
||||
N_Component_Clause => 247,
|
||||
N_Formal_Signed_Integer_Type_Definition => 244,
|
||||
N_Raise_Statement => 214,
|
||||
N_Op_Expon => 205,
|
||||
N_Op_Minus => 202,
|
||||
N_Op_Multiply => 158,
|
||||
N_Exit_Statement => 130,
|
||||
N_Function_Instantiation => 129,
|
||||
N_Discriminant_Association => 123,
|
||||
N_Private_Extension_Declaration => 119,
|
||||
N_Extended_Return_Statement => 117,
|
||||
N_Op_Divide => 107,
|
||||
N_Op_Or => 103,
|
||||
N_Signed_Integer_Type_Definition => 101,
|
||||
N_Record_Representation_Clause => 76,
|
||||
N_Unchecked_Expression => 70,
|
||||
N_Op_Abs => 63,
|
||||
N_Elsif_Part => 62,
|
||||
N_Formal_Floating_Point_Definition => 59,
|
||||
N_Formal_Package_Declaration => 58,
|
||||
N_Modular_Type_Definition => 55,
|
||||
N_Abstract_Subprogram_Declaration => 52,
|
||||
N_Validate_Unchecked_Conversion => 49,
|
||||
N_Defining_Character_Literal => 36,
|
||||
N_Raise_Storage_Error => 33,
|
||||
N_Compound_Statement => 29,
|
||||
N_Procedure_Instantiation => 28,
|
||||
N_Access_Procedure_Definition => 25,
|
||||
N_Floating_Point_Definition => 20,
|
||||
N_Use_Type_Clause => 19,
|
||||
N_Op_Plus => 14,
|
||||
N_Package_Body => 13,
|
||||
N_Op_Rem => 13,
|
||||
N_Enumeration_Representation_Clause => 13,
|
||||
N_Access_Function_Definition => 11,
|
||||
N_Extension_Aggregate => 11,
|
||||
N_Formal_Ordinary_Fixed_Point_Definition => 10,
|
||||
N_Op_Mod => 10,
|
||||
N_Expression_Function => 9,
|
||||
N_Delay_Relative_Statement => 9,
|
||||
N_Quantified_Expression => 7,
|
||||
N_Formal_Derived_Type_Definition => 7,
|
||||
N_Free_Statement => 7,
|
||||
N_Iterator_Specification => 5,
|
||||
N_Op_Shift_Left => 5,
|
||||
N_Formal_Modular_Type_Definition => 4,
|
||||
N_Generic_Package_Renaming_Declaration => 1,
|
||||
N_Empty => 1,
|
||||
N_Real_Range_Specification => 1,
|
||||
N_Ordinary_Fixed_Point_Definition => 1,
|
||||
N_Op_Shift_Right => 1,
|
||||
N_Error => 1,
|
||||
N_Mod_Clause => 1,
|
||||
others => 0);
|
||||
|
||||
Total_Node_Count : constant Long_Float := 1370676.0;
|
||||
|
||||
type Node_Frequency_Table is array (Concrete_Node) of Long_Float;
|
||||
|
||||
function Init_Node_Frequency return Node_Frequency_Table;
|
||||
-- Compute the value of the Node_Frequency table
|
||||
|
||||
function Average_Type_Size_In_Slots return Long_Float;
|
||||
-- Compute the average over all concrete node types of the size,
|
||||
-- weighted by the frequency of that node type.
|
||||
|
||||
function Init_Node_Frequency return Node_Frequency_Table is
|
||||
Result : Node_Frequency_Table := (others => 0.0);
|
||||
|
||||
begin
|
||||
for T in Concrete_Node loop
|
||||
Result (T) := Long_Float (Node_Counts (T)) / Total_Node_Count;
|
||||
end loop;
|
||||
|
||||
return Result;
|
||||
end Init_Node_Frequency;
|
||||
|
||||
Node_Frequency : constant Node_Frequency_Table := Init_Node_Frequency;
|
||||
-- Table mapping concrete node types to the relative frequency of
|
||||
-- that node, in our large example. The sum of these values should
|
||||
-- add up to approximately 1.0. For example, if Node_Frequency(K) =
|
||||
-- 0.02, then that means that approximately 2% of all nodes are K
|
||||
-- nodes.
|
||||
|
||||
function Average_Type_Size_In_Slots return Long_Float is
|
||||
-- We don't have data on entities, so we leave those out
|
||||
|
||||
Result : Long_Float := 0.0;
|
||||
begin
|
||||
for T in Concrete_Node loop
|
||||
Result := Result +
|
||||
Node_Frequency (T) * Long_Float (Type_Size_In_Slots (T));
|
||||
end loop;
|
||||
|
||||
return Result;
|
||||
end Average_Type_Size_In_Slots;
|
||||
|
||||
-- Start of processing for Compute_Type_Sizes
|
||||
|
||||
begin
|
||||
for T in Concrete_Type loop
|
||||
declare
|
||||
|
@ -1351,8 +1135,6 @@ package body Gen_IL.Gen is
|
|||
Max_Node_Size := To_Size_In_Slots (Max_Node_Bit_Size);
|
||||
Min_Entity_Size := To_Size_In_Slots (Min_Entity_Bit_Size);
|
||||
Max_Entity_Size := To_Size_In_Slots (Max_Entity_Bit_Size);
|
||||
|
||||
Average_Node_Size_In_Slots := Average_Type_Size_In_Slots;
|
||||
end Compute_Type_Sizes;
|
||||
|
||||
----------------------------------------
|
||||
|
@ -1573,7 +1355,7 @@ package body Gen_IL.Gen is
|
|||
case Root is
|
||||
when Node_Kind =>
|
||||
Put_Getter_Decl (S, Nkind);
|
||||
Put (S, "function K (N : Node_Id) return Node_Kind renames Nkind;" & LF);
|
||||
Put (S, "function K (N : Node_Id) return Node_Kind renames " & Image (Nkind) & ";" & LF);
|
||||
Put (S, "-- Shorthand for use in predicates and preconditions below" & LF);
|
||||
Put (S, "-- There is no procedure Set_Nkind." & LF);
|
||||
Put (S, "-- See Init_Nkind and Mutate_Nkind in Atree." & LF & LF);
|
||||
|
@ -1767,7 +1549,6 @@ package body Gen_IL.Gen is
|
|||
Put (S, " with " & Inline);
|
||||
Increase_Indent (S, 2);
|
||||
Put_Precondition (S, F);
|
||||
|
||||
Decrease_Indent (S, 2);
|
||||
Put (S, ";" & LF);
|
||||
end Put_Getter_Decl;
|
||||
|
@ -1781,8 +1562,8 @@ package body Gen_IL.Gen is
|
|||
is
|
||||
Rec : Field_Info renames Field_Table (F).all;
|
||||
|
||||
Off : constant Field_Offset := Rec.Offset;
|
||||
F_Size : constant Bit_Offset := Field_Size (Rec.Field_Type);
|
||||
Off : constant Field_Offset := Rec.Offset;
|
||||
F_Per_Slot : constant Field_Offset :=
|
||||
SS / Field_Offset (Field_Size (Rec.Field_Type));
|
||||
Slot_Off : constant Field_Offset := Off / F_Per_Slot;
|
||||
|
@ -2215,8 +1996,7 @@ package body Gen_IL.Gen is
|
|||
Image (Min_Node_Size) & ";" & LF);
|
||||
Put (S, "Max_Node_Size : constant Field_Offset := " &
|
||||
Image (Max_Node_Size) & ";" & LF & LF);
|
||||
Put (S, "Average_Node_Size_In_Slots : constant := " &
|
||||
Average_Node_Size_In_Slots'Img & ";" & LF & LF);
|
||||
|
||||
when Entity_Kind =>
|
||||
Put (S, LF & "Min_Entity_Size : constant Field_Offset := " &
|
||||
Image (Min_Entity_Size) & ";" & LF);
|
||||
|
@ -2468,22 +2248,16 @@ package body Gen_IL.Gen is
|
|||
Put (S, "Kind : Field_Kind;" & LF);
|
||||
Put (S, "Offset : Field_Offset;" & LF);
|
||||
Decrease_Indent (S, 3);
|
||||
Put (S, "end record;" & LF);
|
||||
Put (S, "end record;" & LF & LF);
|
||||
|
||||
-- Print out the node header types. Note that the Offset field is of
|
||||
-- the base type, because we are using zero-origin addressing in
|
||||
-- Atree.
|
||||
|
||||
Put (S, "" & LF);
|
||||
Put (S, "N_Head : constant Field_Offset := " & N_Head & ";" & LF);
|
||||
Put (S, "type Node_Header_Slots is" & LF);
|
||||
Put (S, " array (Field_Offset range 0 .. N_Head - 1) of aliased Slot;" & LF);
|
||||
Put (S, "type Node_Header is record" & LF);
|
||||
Put (S, " Slots : Node_Header_Slots;" & LF);
|
||||
Put (S, " Offset : Node_Offset'Base;" & LF);
|
||||
Put (S, "end record;" & LF);
|
||||
Put (S, "pragma Assert (Node_Header'Size = (" & N_Head &
|
||||
" + 1) * " & SSS & ");" & LF);
|
||||
Put (S, "N_Head : constant Field_Offset := " & N_Head & ";" & LF & LF);
|
||||
|
||||
Put (S, "Atree_Statistics_Enabled : constant Boolean := " &
|
||||
Capitalize (Boolean'Image (Statistics_Enabled)) & ";" & LF);
|
||||
|
||||
Decrease_Indent (S, 3);
|
||||
Put (S, LF & "end Seinfo;" & LF);
|
||||
|
|
|
@ -255,7 +255,7 @@ package body Gen_IL.Internals is
|
|||
begin
|
||||
case F is
|
||||
-- Special cases for the same reason as in the above Image
|
||||
-- function.
|
||||
-- function for Opt_Type_Enum.
|
||||
|
||||
when Alloc_For_BIP_Return =>
|
||||
return "Alloc_For_BIP_Return";
|
||||
|
|
|
@ -277,4 +277,344 @@ package Gen_IL.Internals is
|
|||
-- Return "Node" or "Entity" depending on whether Root = Node_Kind or
|
||||
-- Entity_Kind.
|
||||
|
||||
pragma Style_Checks (Off);
|
||||
-- We don't want warnings about wrong casing in the Type_Frequency table;
|
||||
-- this table is not intended to be particularly readable.
|
||||
|
||||
-- The Type_Frequency table shows the frequency of nodes and entity kinds
|
||||
-- printed by -gnatd.A for a large example. It is used in the field offset
|
||||
-- computations for efficiency. Note that N_Defining_Identifier,
|
||||
-- N_Defining_Operator_Symbol, and N_Defining_Character_Literal are set to
|
||||
-- zero, because the Ekind is what matters for those.
|
||||
|
||||
Type_Frequency : constant array (Concrete_Type) of Type_Count :=
|
||||
(N_Identifier => 3496964, -- (0.354) 7 slots
|
||||
N_Defining_Identifier => 0, -- 1468484, -- (0.149) 8 slots
|
||||
N_Integer_Literal => 455415, -- (0.046) 6 slots
|
||||
E_In_Parameter => 391008, -- (0.040) 42 slots
|
||||
N_Attribute_Reference => 330825, -- (0.033) 9 slots
|
||||
N_Expanded_Name => 329509, -- (0.033) 8 slots
|
||||
N_Selected_Component => 328862, -- (0.033) 8 slots
|
||||
N_Parameter_Specification => 321313, -- (0.033) 7 slots
|
||||
E_Void => 173019, -- (0.018) 59 slots
|
||||
N_Explicit_Dereference => 155113, -- (0.016) 8 slots
|
||||
N_Procedure_Call_Statement => 125403, -- (0.013) 8 slots
|
||||
N_Object_Declaration => 115610, -- (0.012) 8 slots
|
||||
E_Component => 108208, -- (0.011) 49 slots
|
||||
N_Procedure_Specification => 106277, -- (0.011) 7 slots
|
||||
E_Procedure => 104063, -- (0.011) 62 slots
|
||||
N_Unchecked_Type_Conversion => 94477, -- (0.010) 7 slots
|
||||
N_Range => 91413, -- (0.009) 6 slots
|
||||
E_Function => 90035, -- (0.009) 62 slots
|
||||
N_Handled_Sequence_Of_Statements => 87930, -- (0.009) 8 slots
|
||||
N_Subprogram_Declaration => 85248, -- (0.009) 7 slots
|
||||
N_Parameter_Association => 81464, -- (0.008) 8 slots
|
||||
N_Indexed_Component => 80049, -- (0.008) 7 slots
|
||||
N_Freeze_Entity => 79904, -- (0.008) 8 slots
|
||||
N_Call_Marker => 79521, -- (0.008) 4 slots
|
||||
N_Assignment_Statement => 76554, -- (0.008) 8 slots
|
||||
N_Function_Specification => 76052, -- (0.008) 7 slots
|
||||
N_Function_Call => 75028, -- (0.008) 9 slots
|
||||
N_Op_Eq => 74874, -- (0.008) 8 slots
|
||||
E_Constant => 66667, -- (0.007) 47 slots
|
||||
N_If_Statement => 60066, -- (0.006) 8 slots
|
||||
N_Component_Association => 54642, -- (0.006) 7 slots
|
||||
N_Subprogram_Body => 53805, -- (0.005) 10 slots
|
||||
N_Type_Conversion => 53383, -- (0.005) 7 slots
|
||||
E_In_Out_Parameter => 52936, -- (0.005) 38 slots
|
||||
N_Simple_Return_Statement => 52436, -- (0.005) 7 slots
|
||||
N_Subtype_Indication => 49535, -- (0.005) 6 slots
|
||||
N_Raise_Constraint_Error => 49069, -- (0.005) 6 slots
|
||||
N_Null => 46850, -- (0.005) 5 slots
|
||||
N_Itype_Reference => 45422, -- (0.005) 4 slots
|
||||
E_Anonymous_Access_Type => 45149, -- (0.005) 44 slots
|
||||
N_And_Then => 44721, -- (0.005) 8 slots
|
||||
N_Block_Statement => 44328, -- (0.004) 10 slots
|
||||
N_Subtype_Declaration => 43149, -- (0.004) 6 slots
|
||||
N_Op_Not => 40531, -- (0.004) 7 slots
|
||||
E_Array_Subtype => 40051, -- (0.004) 50 slots
|
||||
N_Expression_With_Actions => 36726, -- (0.004) 7 slots
|
||||
E_Access_Subprogram_Type => 36700, -- (0.004) 45 slots
|
||||
E_Signed_Integer_Subtype => 36659, -- (0.004) 43 slots
|
||||
N_String_Literal => 34815, -- (0.004) 7 slots
|
||||
N_Aggregate => 33899, -- (0.003) 8 slots
|
||||
N_Index_Or_Discriminant_Constraint => 33546, -- (0.003) 4 slots
|
||||
E_Variable => 33102, -- (0.003) 55 slots
|
||||
E_Block => 32829, -- (0.003) 58 slots
|
||||
N_Op_Ne => 32127, -- (0.003) 8 slots
|
||||
N_Pragma_Argument_Association => 31504, -- (0.003) 7 slots
|
||||
N_Null_Statement => 30816, -- (0.003) 5 slots
|
||||
N_Aspect_Specification => 29667, -- (0.003) 9 slots
|
||||
N_Pragma => 28317, -- (0.003) 9 slots
|
||||
N_Generic_Association => 26297, -- (0.003) 8 slots
|
||||
N_Formal_Concrete_Subprogram_Declaration => 25843, -- (0.003) 6 slots
|
||||
N_Op_Lt => 25328, -- (0.003) 8 slots
|
||||
E_String_Literal_Subtype => 25272, -- (0.003) 48 slots
|
||||
N_Full_Type_Declaration => 25258, -- (0.003) 7 slots
|
||||
N_With_Clause => 24370, -- (0.002) 9 slots
|
||||
N_Op_Add => 23839, -- (0.002) 8 slots
|
||||
E_Subprogram_Body => 23790, -- (0.002) 42 slots
|
||||
E_Return_Statement => 23098, -- (0.002) 51 slots
|
||||
N_Or_Else => 22858, -- (0.002) 8 slots
|
||||
N_Implicit_Label_Declaration => 21687, -- (0.002) 5 slots
|
||||
N_Others_Choice => 21579, -- (0.002) 4 slots
|
||||
E_Out_Parameter => 21513, -- (0.002) 38 slots
|
||||
N_Op_Subtract => 21441, -- (0.002) 8 slots
|
||||
N_Op_Ge => 21116, -- (0.002) 8 slots
|
||||
N_Component_Definition => 21075, -- (0.002) 7 slots
|
||||
N_Case_Statement_Alternative => 19664, -- (0.002) 8 slots
|
||||
N_Loop_Statement => 19507, -- (0.002) 9 slots
|
||||
E_Package => 19029, -- (0.002) 53 slots
|
||||
N_Op_Gt => 18619, -- (0.002) 8 slots
|
||||
N_Op_Le => 16564, -- (0.002) 8 slots
|
||||
N_Formal_Object_Declaration => 16219, -- (0.002) 7 slots
|
||||
E_Discriminant => 16091, -- (0.002) 56 slots
|
||||
N_Component_Declaration => 15858, -- (0.002) 7 slots
|
||||
N_Iteration_Scheme => 15719, -- (0.002) 8 slots
|
||||
N_Access_To_Object_Definition => 14875, -- (0.002) 5 slots
|
||||
E_Record_Subtype => 14569, -- (0.001) 52 slots
|
||||
N_Generic_Subprogram_Declaration => 14320, -- (0.001) 7 slots
|
||||
N_Package_Specification => 13323, -- (0.001) 8 slots
|
||||
N_Exception_Handler => 12841, -- (0.001) 8 slots
|
||||
E_Enumeration_Literal => 11608, -- (0.001) 42 slots
|
||||
N_Subprogram_Renaming_Declaration => 10991, -- (0.001) 9 slots
|
||||
N_In => 10794, -- (0.001) 8 slots
|
||||
E_Allocator_Type => 10751, -- (0.001) 44 slots
|
||||
E_General_Access_Type => 10451, -- (0.001) 44 slots
|
||||
E_Generic_Procedure => 9837, -- (0.001) 41 slots
|
||||
N_Package_Renaming_Declaration => 9395, -- (0.001) 8 slots
|
||||
N_Access_Definition => 9388, -- (0.001) 6 slots
|
||||
N_Qualified_Expression => 9012, -- (0.001) 7 slots
|
||||
E_Enumeration_Subtype => 8560, -- (0.001) 46 slots
|
||||
N_Allocator => 8474, -- (0.001) 8 slots
|
||||
N_Package_Declaration => 8099, -- (0.001) 10 slots
|
||||
N_Formal_Type_Declaration => 7964, -- (0.001) 7 slots
|
||||
N_Exit_Statement => 7960, -- (0.001) 8 slots
|
||||
N_Component_List => 7829, -- (0.001) 5 slots
|
||||
N_Defining_Operator_Symbol => 0, -- 7525, -- (0.001) 8 slots
|
||||
N_Case_Statement => 7271, -- (0.001) 7 slots
|
||||
N_Expression_Function => 7242, -- (0.001) 9 slots
|
||||
N_Loop_Parameter_Specification => 7042, -- (0.001) 7 slots
|
||||
N_Character_Literal => 6842, -- (0.001) 7 slots
|
||||
N_Op_Concat => 6565, -- (0.001) 8 slots
|
||||
N_Not_In => 6341, -- (0.001) 8 slots
|
||||
N_Label => 6133, -- (0.001) 9 slots
|
||||
N_Goto_Statement => 6133, -- (0.001) 8 slots
|
||||
E_Label => 6133, -- (0.001) 57 slots
|
||||
E_Loop => 6008, -- (0.001) 41 slots
|
||||
N_Generic_Package_Declaration => 5808, -- (0.001) 10 slots
|
||||
N_If_Expression => 5800, -- (0.001) 7 slots
|
||||
N_Record_Definition => 5628, -- (0.001) 7 slots
|
||||
N_Slice => 5461, -- (0.001) 7 slots
|
||||
N_Reference => 5332, -- (0.001) 7 slots
|
||||
E_Generic_Package => 5268, -- (0.001) 59 slots
|
||||
E_Record_Type => 4838, -- (0.000) 51 slots
|
||||
N_Raise_Program_Error => 4675, -- (0.000) 6 slots
|
||||
N_Raise_Statement => 4628, -- (0.000) 8 slots
|
||||
N_Use_Type_Clause => 4487, -- (0.000) 9 slots
|
||||
E_Array_Type => 4325, -- (0.000) 48 slots
|
||||
E_Operator => 4308, -- (0.000) 55 slots
|
||||
N_Freeze_Generic_Entity => 4249, -- (0.000) 4 slots
|
||||
N_Constrained_Array_Definition => 4244, -- (0.000) 5 slots
|
||||
N_Object_Renaming_Declaration => 4067, -- (0.000) 8 slots
|
||||
N_Formal_Private_Type_Definition => 4018, -- (0.000) 8 slots
|
||||
E_Loop_Parameter => 3870, -- (0.000) 38 slots
|
||||
N_Real_Literal => 3759, -- (0.000) 7 slots
|
||||
N_Attribute_Definition_Clause => 3724, -- (0.000) 8 slots
|
||||
N_Exception_Renaming_Declaration => 3697, -- (0.000) 8 slots
|
||||
E_Class_Wide_Type => 3674, -- (0.000) 48 slots
|
||||
E_Exception => 3632, -- (0.000) 24 slots
|
||||
N_Range_Constraint => 3506, -- (0.000) 4 slots
|
||||
E_Access_Type => 3487, -- (0.000) 44 slots
|
||||
E_Subprogram_Type => 3248, -- (0.000) 47 slots
|
||||
N_Package_Instantiation => 3005, -- (0.000) 8 slots
|
||||
E_Access_Attribute_Type => 2959, -- (0.000) 44 slots
|
||||
N_Op_And => 2957, -- (0.000) 8 slots
|
||||
E_Generic_In_Parameter => 2704, -- (0.000) 31 slots
|
||||
N_Derived_Type_Definition => 2688, -- (0.000) 7 slots
|
||||
N_Variant => 2535, -- (0.000) 8 slots
|
||||
E_Record_Subtype_With_Private => 2327, -- (0.000) 50 slots
|
||||
N_Private_Type_Declaration => 2287, -- (0.000) 6 slots
|
||||
E_Private_Type => 1890, -- (0.000) 48 slots
|
||||
N_Discriminant_Specification => 1864, -- (0.000) 7 slots
|
||||
N_Procedure_Instantiation => 1659, -- (0.000) 8 slots
|
||||
N_Op_Multiply => 1634, -- (0.000) 8 slots
|
||||
E_Access_Subtype => 1606, -- (0.000) 44 slots
|
||||
N_Defining_Program_Unit_Name => 1463, -- (0.000) 8 slots
|
||||
N_Number_Declaration => 1461, -- (0.000) 7 slots
|
||||
E_Named_Integer => 1430, -- (0.000) 19 slots
|
||||
N_Use_Package_Clause => 1369, -- (0.000) 9 slots
|
||||
N_Compilation_Unit_Aux => 1341, -- (0.000) 8 slots
|
||||
N_Compilation_Unit => 1341, -- (0.000) 8 slots
|
||||
N_Elsif_Part => 1331, -- (0.000) 7 slots
|
||||
N_Operator_Symbol => 1305, -- (0.000) 7 slots
|
||||
E_Limited_Private_Type => 1299, -- (0.000) 48 slots
|
||||
E_Generic_Function => 1292, -- (0.000) 41 slots
|
||||
E_Enumeration_Type => 1186, -- (0.000) 47 slots
|
||||
N_Enumeration_Type_Definition => 1169, -- (0.000) 6 slots
|
||||
N_Unchecked_Expression => 1112, -- (0.000) 7 slots
|
||||
N_Op_Or => 1107, -- (0.000) 8 slots
|
||||
N_Designator => 1100, -- (0.000) 9 slots
|
||||
N_Formal_Discrete_Type_Definition => 1086, -- (0.000) 4 slots
|
||||
N_Variant_Part => 1072, -- (0.000) 8 slots
|
||||
N_Formal_Package_Declaration => 1047, -- (0.000) 8 slots
|
||||
N_Quantified_Expression => 1033, -- (0.000) 8 slots
|
||||
E_Record_Type_With_Private => 1017, -- (0.000) 51 slots
|
||||
N_Package_Body => 999, -- (0.000) 9 slots
|
||||
N_Unconstrained_Array_Definition => 973, -- (0.000) 5 slots
|
||||
E_Private_Subtype => 971, -- (0.000) 48 slots
|
||||
N_Incomplete_Type_Declaration => 863, -- (0.000) 6 slots
|
||||
E_Incomplete_Type => 863, -- (0.000) 48 slots
|
||||
N_Contract => 859, -- (0.000) 6 slots
|
||||
E_Package_Body => 852, -- (0.000) 46 slots
|
||||
N_Extended_Return_Statement => 801, -- (0.000) 8 slots
|
||||
N_Op_Divide => 724, -- (0.000) 8 slots
|
||||
N_Extension_Aggregate => 718, -- (0.000) 8 slots
|
||||
N_Function_Instantiation => 642, -- (0.000) 8 slots
|
||||
N_Exception_Declaration => 594, -- (0.000) 7 slots
|
||||
N_Discriminant_Association => 552, -- (0.000) 7 slots
|
||||
N_Iterator_Specification => 543, -- (0.000) 8 slots
|
||||
N_Private_Extension_Declaration => 540, -- (0.000) 8 slots
|
||||
N_Formal_Signed_Integer_Type_Definition => 512, -- (0.000) 4 slots
|
||||
E_Modular_Integer_Subtype => 490, -- (0.000) 44 slots
|
||||
N_Component_Clause => 468, -- (0.000) 7 slots
|
||||
E_Signed_Integer_Type => 399, -- (0.000) 43 slots
|
||||
N_Op_Minus => 356, -- (0.000) 7 slots
|
||||
N_Raise_Expression => 337, -- (0.000) 8 slots
|
||||
N_Case_Expression_Alternative => 336, -- (0.000) 8 slots
|
||||
N_Op_Expon => 280, -- (0.000) 8 slots
|
||||
N_Abstract_Subprogram_Declaration => 250, -- (0.000) 6 slots
|
||||
E_Modular_Integer_Type => 232, -- (0.000) 44 slots
|
||||
N_Modular_Type_Definition => 214, -- (0.000) 7 slots
|
||||
N_Compound_Statement => 212, -- (0.000) 6 slots
|
||||
N_Free_Statement => 209, -- (0.000) 8 slots
|
||||
N_Record_Representation_Clause => 197, -- (0.000) 9 slots
|
||||
N_Access_Procedure_Definition => 195, -- (0.000) 6 slots
|
||||
E_Limited_Private_Subtype => 178, -- (0.000) 48 slots
|
||||
N_Access_Function_Definition => 172, -- (0.000) 7 slots
|
||||
N_Op_Mod => 163, -- (0.000) 8 slots
|
||||
N_Validate_Unchecked_Conversion => 156, -- (0.000) 5 slots
|
||||
E_Anonymous_Access_Subprogram_Type => 155, -- (0.000) 44 slots
|
||||
N_Op_Rem => 147, -- (0.000) 8 slots
|
||||
N_Formal_Incomplete_Type_Definition => 140, -- (0.000) 4 slots
|
||||
N_Signed_Integer_Type_Definition => 137, -- (0.000) 6 slots
|
||||
N_Case_Expression => 132, -- (0.000) 7 slots
|
||||
N_Op_Plus => 129, -- (0.000) 7 slots
|
||||
E_Incomplete_Subtype => 129, -- (0.000) 48 slots
|
||||
N_Op_Abs => 119, -- (0.000) 7 slots
|
||||
N_Op_Shift_Right => 109, -- (0.000) 8 slots
|
||||
E_Floating_Point_Subtype => 94, -- (0.000) 43 slots
|
||||
N_Op_Shift_Left => 72, -- (0.000) 8 slots
|
||||
E_Floating_Point_Type => 59, -- (0.000) 43 slots
|
||||
N_Formal_Derived_Type_Definition => 53, -- (0.000) 7 slots
|
||||
N_Formal_Floating_Point_Definition => 40, -- (0.000) 4 slots
|
||||
N_Defining_Character_Literal => 0, -- 36, -- (0.000) 8 slots
|
||||
N_Formal_Modular_Type_Definition => 27, -- (0.000) 4 slots
|
||||
E_Ordinary_Fixed_Point_Subtype => 23, -- (0.000) 44 slots
|
||||
E_Abstract_State => 22, -- (0.000) 48 slots
|
||||
E_Named_Real => 20, -- (0.000) 19 slots
|
||||
N_Floating_Point_Definition => 19, -- (0.000) 6 slots
|
||||
N_Subunit => 17, -- (0.000) 8 slots
|
||||
N_Enumeration_Representation_Clause => 17, -- (0.000) 9 slots
|
||||
N_Entry_Declaration => 17, -- (0.000) 7 slots
|
||||
N_Subprogram_Body_Stub => 16, -- (0.000) 8 slots
|
||||
N_Unused_At_Start => 15, -- (0.000) 4 slots
|
||||
E_Entry => 14, -- (0.000) 42 slots
|
||||
N_Formal_Ordinary_Fixed_Point_Definition => 12, -- (0.000) 4 slots
|
||||
E_Class_Wide_Subtype => 9, -- (0.000) 52 slots
|
||||
E_Protected_Subtype => 8, -- (0.000) 48 slots
|
||||
E_Ordinary_Fixed_Point_Type => 8, -- (0.000) 44 slots
|
||||
N_Op_Xor => 7, -- (0.000) 8 slots
|
||||
E_Generic_In_Out_Parameter => 7, -- (0.000) 31 slots
|
||||
N_Protected_Type_Declaration => 6, -- (0.000) 8 slots
|
||||
N_Protected_Definition => 6, -- (0.000) 8 slots
|
||||
N_Task_Type_Declaration => 4, -- (0.000) 8 slots
|
||||
N_Task_Definition => 4, -- (0.000) 8 slots
|
||||
N_Protected_Body => 4, -- (0.000) 9 slots
|
||||
E_Task_Subtype => 4, -- (0.000) 50 slots
|
||||
E_Protected_Type => 4, -- (0.000) 49 slots
|
||||
E_Access_Protected_Subprogram_Type => 4, -- (0.000) 45 slots
|
||||
N_Entry_Call_Statement => 3, -- (0.000) 8 slots
|
||||
E_Task_Type => 3, -- (0.000) 50 slots
|
||||
N_Raise_Storage_Error => 2, -- (0.000) 6 slots
|
||||
N_Package_Body_Stub => 2, -- (0.000) 8 slots
|
||||
N_Generic_Procedure_Renaming_Declaration => 2, -- (0.000) 8 slots
|
||||
N_Task_Body => 1, -- (0.000) 10 slots
|
||||
N_Single_Protected_Declaration => 1, -- (0.000) 8 slots
|
||||
N_Real_Range_Specification => 1, -- (0.000) 6 slots
|
||||
N_Ordinary_Fixed_Point_Definition => 1, -- (0.000) 6 slots
|
||||
N_Error => 1, -- (0.000) 6 slots
|
||||
N_Entry_Body_Formal_Part => 1, -- (0.000) 6 slots
|
||||
N_Entry_Body => 1, -- (0.000) 10 slots
|
||||
N_Empty => 1, -- (0.000) 6 slots
|
||||
N_Delay_Relative_Statement => 1, -- (0.000) 7 slots
|
||||
E_Protected_Body => 1, -- (0.000) 35 slots
|
||||
|
||||
Between_Concrete_Node_And_Concrete_Entity_Types => 0,
|
||||
|
||||
-- The rest had frequency 0 (i.e. no such nodes were created in the
|
||||
-- example), but we set them to 1, so we won't lose information when
|
||||
-- multiplying. We use "others", so that if new node types are added,
|
||||
-- we don't have to modify the table; new node types are unlikely to
|
||||
-- be very common.
|
||||
|
||||
others => 1
|
||||
-- N_Variable_Reference_Marker => 0, (0.000) 4 slots
|
||||
-- N_Unused_At_End => 0, (0.000) 4 slots
|
||||
-- N_Triggering_Alternative => 0, (0.000) 6 slots
|
||||
-- N_Timed_Entry_Call => 0, (0.000) 5 slots
|
||||
-- N_Terminate_Alternative => 0, (0.000) 6 slots
|
||||
-- N_Task_Body_Stub => 0, (0.000) 8 slots
|
||||
-- N_Target_Name => 0, (0.000) 5 slots
|
||||
-- N_Single_Task_Declaration => 0, (0.000) 8 slots
|
||||
-- N_Selective_Accept => 0, (0.000) 5 slots
|
||||
-- N_Scil_Membership_Test => 0, (0.000) 5 slots
|
||||
-- N_Scil_Dispatch_Table_Tag_Init => 0, (0.000) 4 slots
|
||||
-- N_Scil_Dispatching_Call => 0, (0.000) 6 slots
|
||||
-- N_Return_When_Statement => 0, (0.000) 7 slots
|
||||
-- N_Requeue_Statement => 0, (0.000) 8 slots
|
||||
-- N_Raise_When_Statement => 0, (0.000) 8 slots
|
||||
-- N_Push_Storage_Error_Label => 0, (0.000) 4 slots
|
||||
-- N_Push_Program_Error_Label => 0, (0.000) 4 slots
|
||||
-- N_Push_Constraint_Error_Label => 0, (0.000) 4 slots
|
||||
-- N_Protected_Body_Stub => 0, (0.000) 8 slots
|
||||
-- N_Pop_Storage_Error_Label => 0, (0.000) 4 slots
|
||||
-- N_Pop_Program_Error_Label => 0, (0.000) 4 slots
|
||||
-- N_Pop_Constraint_Error_Label => 0, (0.000) 4 slots
|
||||
-- N_Op_Shift_Right_Arithmetic => 0, (0.000) 8 slots
|
||||
-- N_Op_Rotate_Right => 0, (0.000) 8 slots
|
||||
-- N_Op_Rotate_Left => 0, (0.000) 8 slots
|
||||
-- N_Mod_Clause => 0, (0.000) 7 slots
|
||||
-- N_Iterated_Element_Association => 0, (0.000) 8 slots
|
||||
-- N_Iterated_Component_Association => 0, (0.000) 8 slots
|
||||
-- N_Goto_When_Statement => 0, (0.000) 8 slots
|
||||
-- N_Generic_Package_Renaming_Declaration => 0, (0.000) 8 slots
|
||||
-- N_Generic_Function_Renaming_Declaration => 0, (0.000) 8 slots
|
||||
-- N_Formal_Decimal_Fixed_Point_Definition => 0, (0.000) 4 slots
|
||||
-- N_Formal_Abstract_Subprogram_Declaration => 0, (0.000) 6 slots
|
||||
-- N_Entry_Index_Specification => 0, (0.000) 7 slots
|
||||
-- N_Entry_Call_Alternative => 0, (0.000) 6 slots
|
||||
-- N_Digits_Constraint => 0, (0.000) 6 slots
|
||||
-- N_Delta_Constraint => 0, (0.000) 6 slots
|
||||
-- N_Delta_Aggregate => 0, (0.000) 8 slots
|
||||
-- N_Delay_Until_Statement => 0, (0.000) 7 slots
|
||||
-- N_Delay_Alternative => 0, (0.000) 7 slots
|
||||
-- N_Decimal_Fixed_Point_Definition => 0, (0.000) 6 slots
|
||||
-- N_Conditional_Entry_Call => 0, (0.000) 5 slots
|
||||
-- N_Code_Statement => 0, (0.000) 7 slots
|
||||
-- N_At_Clause => 0, (0.000) 9 slots
|
||||
-- N_Asynchronous_Select => 0, (0.000) 5 slots
|
||||
-- N_Accept_Statement => 0, (0.000) 8 slots
|
||||
-- N_Accept_Alternative => 0, (0.000) 8 slots
|
||||
-- N_Abort_Statement => 0, (0.000) 4 slots
|
||||
-- N_Abortable_Part => 0, (0.000) 5 slots
|
||||
-- E_Task_Body => 0, (0.000) 39 slots
|
||||
-- E_Exception_Type => 0, (0.000) 45 slots
|
||||
-- E_Entry_Index_Parameter => 0, (0.000) 19 slots
|
||||
-- E_Entry_Family => 0, (0.000) 42 slots
|
||||
-- E_Decimal_Fixed_Point_Type => 0, (0.000) 52 slots
|
||||
-- E_Decimal_Fixed_Point_Subtype => 0, (0.000) 52 slots
|
||||
-- E_Anonymous_Access_Protected_Subprogram_Type => 0, (0.000) 45 slots
|
||||
); -- Type_Frequency
|
||||
|
||||
end Gen_IL.Internals;
|
||||
|
|
|
@ -23,14 +23,14 @@
|
|||
-- --
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
with Errout; use Errout;
|
||||
with Sinfo; use Sinfo;
|
||||
with Sinfo.Nodes; use Sinfo.Nodes;
|
||||
with Fname.UF; use Fname.UF;
|
||||
with Lib; use Lib;
|
||||
with Namet; use Namet;
|
||||
with Opt; use Opt;
|
||||
with Uname; use Uname;
|
||||
with Errout; use Errout;
|
||||
with Sinfo; use Sinfo;
|
||||
with Sinfo.Nodes; use Sinfo.Nodes;
|
||||
with Fname.UF; use Fname.UF;
|
||||
with Lib; use Lib;
|
||||
with Namet; use Namet;
|
||||
with Opt; use Opt;
|
||||
with Uname; use Uname;
|
||||
|
||||
-- Note: this package body is used by GNAT Studio and GNATBench to supply a
|
||||
-- list of entries for help on available library routines.
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
-- --
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
with Atree;
|
||||
with Atree; use Atree;
|
||||
with Debug; use Debug;
|
||||
with Output; use Output;
|
||||
with Seinfo;
|
||||
|
|
|
@ -102,7 +102,7 @@ package Table is
|
|||
-- mode parameters with scalar values.
|
||||
|
||||
type Table_Type is
|
||||
array (Table_Index_Type range <>) of aliased Table_Component_Type;
|
||||
array (Table_Index_Type range <>) of Table_Component_Type;
|
||||
|
||||
subtype Big_Table_Type is
|
||||
Table_Type (Table_Low_Bound .. Table_Index_Type'Last);
|
||||
|
|
|
@ -1014,8 +1014,4 @@ package Types is
|
|||
type Offset_Array is
|
||||
array (Offset_Array_Index range <>) of Opt_Field_Offset;
|
||||
|
||||
Slot_Size : constant := 32;
|
||||
type Slot is mod 2**Slot_Size;
|
||||
for Slot'Size use Slot_Size;
|
||||
|
||||
end Types;
|
||||
|
|
Loading…
Add table
Reference in a new issue