aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.4.0/gcc/ada/nlists.adb
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.4.0/gcc/ada/nlists.adb')
-rw-r--r--gcc-4.4.0/gcc/ada/nlists.adb1384
1 files changed, 0 insertions, 1384 deletions
diff --git a/gcc-4.4.0/gcc/ada/nlists.adb b/gcc-4.4.0/gcc/ada/nlists.adb
deleted file mode 100644
index 7a2b4b4a1..000000000
--- a/gcc-4.4.0/gcc/ada/nlists.adb
+++ /dev/null
@@ -1,1384 +0,0 @@
-------------------------------------------------------------------------------
--- --
--- GNAT COMPILER COMPONENTS --
--- --
--- N L I S T S --
--- --
--- B o d y --
--- --
--- Copyright (C) 1992-2009, Free Software Foundation, Inc. --
--- --
--- GNAT is free software; you can redistribute it and/or modify it under --
--- terms of the GNU General Public License as published by the Free Soft- --
--- ware Foundation; either version 3, or (at your option) any later ver- --
--- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
--- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
--- or FITNESS FOR A PARTICULAR PURPOSE. --
--- --
--- As a special exception under Section 7 of GPL version 3, you are granted --
--- additional permissions described in the GCC Runtime Library Exception, --
--- version 3.1, as published by the Free Software Foundation. --
--- --
--- You should have received a copy of the GNU General Public License and --
--- a copy of the GCC Runtime Library Exception along with this program; --
--- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
--- <http://www.gnu.org/licenses/>. --
--- --
--- GNAT was originally developed by the GNAT team at New York University. --
--- Extensive contributions were provided by Ada Core Technologies Inc. --
--- --
-------------------------------------------------------------------------------
-
--- WARNING: There is a C version of this package. Any changes to this source
--- file must be properly reflected in the corresponding C header a-nlists.h
-
-with Alloc;
-with Atree; use Atree;
-with Debug; use Debug;
-with Output; use Output;
-with Sinfo; use Sinfo;
-with Table;
-
-package body Nlists is
-
- use Atree_Private_Part;
- -- Get access to Nodes table
-
- ----------------------------------
- -- Implementation of Node Lists --
- ----------------------------------
-
- -- A node list is represented by a list header which contains
- -- three fields:
-
- type List_Header is record
- First : Node_Id;
- -- Pointer to first node in list. Empty if list is empty
-
- Last : Node_Id;
- -- Pointer to last node in list. Empty if list is empty
-
- Parent : Node_Id;
- -- Pointer to parent of list. Empty if list has no parent
- end record;
-
- -- The node lists are stored in a table indexed by List_Id values
-
- package Lists is new Table.Table (
- Table_Component_Type => List_Header,
- Table_Index_Type => List_Id'Base,
- Table_Low_Bound => First_List_Id,
- Table_Initial => Alloc.Lists_Initial,
- Table_Increment => Alloc.Lists_Increment,
- Table_Name => "Lists");
-
- -- The nodes in the list all have the In_List flag set, and their Link
- -- fields (which otherwise point to the parent) contain the List_Id of
- -- the list header giving immediate access to the list containing the
- -- node, and its parent and first and last elements.
-
- -- Two auxiliary tables, indexed by Node_Id values and built in parallel
- -- with the main nodes table and always having the same size contain the
- -- list link values that allow locating the previous and next node in a
- -- list. The entries in these tables are valid only if the In_List flag
- -- is set in the corresponding node. Next_Node is Empty at the end of a
- -- list and Prev_Node is Empty at the start of a list.
-
- package Next_Node is new Table.Table (
- Table_Component_Type => Node_Id,
- Table_Index_Type => Node_Id'Base,
- Table_Low_Bound => First_Node_Id,
- Table_Initial => Alloc.Orig_Nodes_Initial,
- Table_Increment => Alloc.Orig_Nodes_Increment,
- Table_Name => "Next_Node");
-
- package Prev_Node is new Table.Table (
- Table_Component_Type => Node_Id,
- Table_Index_Type => Node_Id'Base,
- Table_Low_Bound => First_Node_Id,
- Table_Initial => Alloc.Orig_Nodes_Initial,
- Table_Increment => Alloc.Orig_Nodes_Increment,
- Table_Name => "Prev_Node");
-
- -----------------------
- -- Local Subprograms --
- -----------------------
-
- procedure Set_First (List : List_Id; To : Node_Id);
- pragma Inline (Set_First);
- -- Sets First field of list header List to reference To
-
- procedure Set_Last (List : List_Id; To : Node_Id);
- pragma Inline (Set_Last);
- -- Sets Last field of list header List to reference To
-
- procedure Set_List_Link (Node : Node_Id; To : List_Id);
- pragma Inline (Set_List_Link);
- -- Sets list link of Node to list header To
-
- procedure Set_Next (Node : Node_Id; To : Node_Id);
- pragma Inline (Set_Next);
- -- Sets the Next_Node pointer for Node to reference To
-
- procedure Set_Prev (Node : Node_Id; To : Node_Id);
- pragma Inline (Set_Prev);
- -- Sets the Prev_Node pointer for Node to reference To
-
- --------------------------
- -- Allocate_List_Tables --
- --------------------------
-
- procedure Allocate_List_Tables (N : Node_Id) is
- Old_Last : constant Node_Id'Base := Next_Node.Last;
-
- begin
- pragma Assert (N >= Old_Last);
- Next_Node.Set_Last (N);
- Prev_Node.Set_Last (N);
-
- -- Make sure we have no uninitialized junk in any new entires added.
- -- This ensures that Tree_Gen will not write out any uninitialized junk.
-
- for J in Old_Last + 1 .. N loop
- Next_Node.Table (J) := Empty;
- Prev_Node.Table (J) := Empty;
- end loop;
- end Allocate_List_Tables;
-
- ------------
- -- Append --
- ------------
-
- procedure Append (Node : Node_Id; To : List_Id) is
- L : constant Node_Id := Last (To);
-
- procedure Append_Debug;
- pragma Inline (Append_Debug);
- -- Output debug information if Debug_Flag_N set
-
- ------------------
- -- Append_Debug --
- ------------------
-
- procedure Append_Debug is
- begin
- if Debug_Flag_N then
- Write_Str ("Append node ");
- Write_Int (Int (Node));
- Write_Str (" to list ");
- Write_Int (Int (To));
- Write_Eol;
- end if;
- end Append_Debug;
-
- -- Start of processing for Append
-
- begin
- pragma Assert (not Is_List_Member (Node));
-
- if Node = Error then
- return;
- end if;
-
- pragma Debug (Append_Debug);
-
- if No (L) then
- Set_First (To, Node);
- else
- Set_Next (L, Node);
- end if;
-
- Set_Last (To, Node);
-
- Nodes.Table (Node).In_List := True;
-
- Set_Next (Node, Empty);
- Set_Prev (Node, L);
- Set_List_Link (Node, To);
- end Append;
-
- -----------------
- -- Append_List --
- -----------------
-
- procedure Append_List (List : List_Id; To : List_Id) is
-
- procedure Append_List_Debug;
- pragma Inline (Append_List_Debug);
- -- Output debug information if Debug_Flag_N set
-
- -----------------------
- -- Append_List_Debug --
- -----------------------
-
- procedure Append_List_Debug is
- begin
- if Debug_Flag_N then
- Write_Str ("Append list ");
- Write_Int (Int (List));
- Write_Str (" to list ");
- Write_Int (Int (To));
- Write_Eol;
- end if;
- end Append_List_Debug;
-
- -- Start of processing for Append_List
-
- begin
- if Is_Empty_List (List) then
- return;
-
- else
- declare
- L : constant Node_Id := Last (To);
- F : constant Node_Id := First (List);
- N : Node_Id;
-
- begin
- pragma Debug (Append_List_Debug);
-
- N := F;
- loop
- Set_List_Link (N, To);
- N := Next (N);
- exit when No (N);
- end loop;
-
- if No (L) then
- Set_First (To, F);
- else
- Set_Next (L, F);
- end if;
-
- Set_Prev (F, L);
- Set_Last (To, Last (List));
-
- Set_First (List, Empty);
- Set_Last (List, Empty);
- end;
- end if;
- end Append_List;
-
- --------------------
- -- Append_List_To --
- --------------------
-
- procedure Append_List_To (To : List_Id; List : List_Id) is
- begin
- Append_List (List, To);
- end Append_List_To;
-
- ---------------
- -- Append_To --
- ---------------
-
- procedure Append_To (To : List_Id; Node : Node_Id) is
- begin
- Append (Node, To);
- end Append_To;
-
- -----------
- -- First --
- -----------
-
- function First (List : List_Id) return Node_Id is
- begin
- if List = No_List then
- return Empty;
- else
- pragma Assert (List <= Lists.Last);
- return Lists.Table (List).First;
- end if;
- end First;
-
- ----------------------
- -- First_Non_Pragma --
- ----------------------
-
- function First_Non_Pragma (List : List_Id) return Node_Id is
- N : constant Node_Id := First (List);
- begin
- if Nkind (N) /= N_Pragma
- and then
- Nkind (N) /= N_Null_Statement
- then
- return N;
- else
- return Next_Non_Pragma (N);
- end if;
- end First_Non_Pragma;
-
- ----------------
- -- Initialize --
- ----------------
-
- procedure Initialize is
- E : constant List_Id := Error_List;
-
- begin
- Lists.Init;
- Next_Node.Init;
- Prev_Node.Init;
-
- -- Allocate Error_List list header
-
- Lists.Increment_Last;
- Set_Parent (E, Empty);
- Set_First (E, Empty);
- Set_Last (E, Empty);
- end Initialize;
-
- ------------------
- -- Insert_After --
- ------------------
-
- procedure Insert_After (After : Node_Id; Node : Node_Id) is
-
- procedure Insert_After_Debug;
- pragma Inline (Insert_After_Debug);
- -- Output debug information if Debug_Flag_N set
-
- ------------------------
- -- Insert_After_Debug --
- ------------------------
-
- procedure Insert_After_Debug is
- begin
- if Debug_Flag_N then
- Write_Str ("Insert node");
- Write_Int (Int (Node));
- Write_Str (" after node ");
- Write_Int (Int (After));
- Write_Eol;
- end if;
- end Insert_After_Debug;
-
- -- Start of processing for Insert_After
-
- begin
- pragma Assert
- (Is_List_Member (After) and then not Is_List_Member (Node));
-
- if Node = Error then
- return;
- end if;
-
- pragma Debug (Insert_After_Debug);
-
- declare
- Before : constant Node_Id := Next (After);
- LC : constant List_Id := List_Containing (After);
-
- begin
- if Present (Before) then
- Set_Prev (Before, Node);
- else
- Set_Last (LC, Node);
- end if;
-
- Set_Next (After, Node);
-
- Nodes.Table (Node).In_List := True;
-
- Set_Prev (Node, After);
- Set_Next (Node, Before);
- Set_List_Link (Node, LC);
- end;
- end Insert_After;
-
- -------------------
- -- Insert_Before --
- -------------------
-
- procedure Insert_Before (Before : Node_Id; Node : Node_Id) is
-
- procedure Insert_Before_Debug;
- pragma Inline (Insert_Before_Debug);
- -- Output debug information if Debug_Flag_N set
-
- -------------------------
- -- Insert_Before_Debug --
- -------------------------
-
- procedure Insert_Before_Debug is
- begin
- if Debug_Flag_N then
- Write_Str ("Insert node");
- Write_Int (Int (Node));
- Write_Str (" before node ");
- Write_Int (Int (Before));
- Write_Eol;
- end if;
- end Insert_Before_Debug;
-
- -- Start of processing for Insert_Before
-
- begin
- pragma Assert
- (Is_List_Member (Before) and then not Is_List_Member (Node));
-
- if Node = Error then
- return;
- end if;
-
- pragma Debug (Insert_Before_Debug);
-
- declare
- After : constant Node_Id := Prev (Before);
- LC : constant List_Id := List_Containing (Before);
-
- begin
- if Present (After) then
- Set_Next (After, Node);
- else
- Set_First (LC, Node);
- end if;
-
- Set_Prev (Before, Node);
-
- Nodes.Table (Node).In_List := True;
-
- Set_Prev (Node, After);
- Set_Next (Node, Before);
- Set_List_Link (Node, LC);
- end;
- end Insert_Before;
-
- -----------------------
- -- Insert_List_After --
- -----------------------
-
- procedure Insert_List_After (After : Node_Id; List : List_Id) is
-
- procedure Insert_List_After_Debug;
- pragma Inline (Insert_List_After_Debug);
- -- Output debug information if Debug_Flag_N set
-
- -----------------------------
- -- Insert_List_After_Debug --
- -----------------------------
-
- procedure Insert_List_After_Debug is
- begin
- if Debug_Flag_N then
- Write_Str ("Insert list ");
- Write_Int (Int (List));
- Write_Str (" after node ");
- Write_Int (Int (After));
- Write_Eol;
- end if;
- end Insert_List_After_Debug;
-
- -- Start of processing for Insert_List_After
-
- begin
- pragma Assert (Is_List_Member (After));
-
- if Is_Empty_List (List) then
- return;
-
- else
- declare
- Before : constant Node_Id := Next (After);
- LC : constant List_Id := List_Containing (After);
- F : constant Node_Id := First (List);
- L : constant Node_Id := Last (List);
- N : Node_Id;
-
- begin
- pragma Debug (Insert_List_After_Debug);
-
- N := F;
- loop
- Set_List_Link (N, LC);
- exit when N = L;
- N := Next (N);
- end loop;
-
- if Present (Before) then
- Set_Prev (Before, L);
- else
- Set_Last (LC, L);
- end if;
-
- Set_Next (After, F);
- Set_Prev (F, After);
- Set_Next (L, Before);
-
- Set_First (List, Empty);
- Set_Last (List, Empty);
- end;
- end if;
- end Insert_List_After;
-
- ------------------------
- -- Insert_List_Before --
- ------------------------
-
- procedure Insert_List_Before (Before : Node_Id; List : List_Id) is
-
- procedure Insert_List_Before_Debug;
- pragma Inline (Insert_List_Before_Debug);
- -- Output debug information if Debug_Flag_N set
-
- ------------------------------
- -- Insert_List_Before_Debug --
- ------------------------------
-
- procedure Insert_List_Before_Debug is
- begin
- if Debug_Flag_N then
- Write_Str ("Insert list ");
- Write_Int (Int (List));
- Write_Str (" before node ");
- Write_Int (Int (Before));
- Write_Eol;
- end if;
- end Insert_List_Before_Debug;
-
- -- Start of processing for Insert_List_Before
-
- begin
- pragma Assert (Is_List_Member (Before));
-
- if Is_Empty_List (List) then
- return;
-
- else
- declare
- After : constant Node_Id := Prev (Before);
- LC : constant List_Id := List_Containing (Before);
- F : constant Node_Id := First (List);
- L : constant Node_Id := Last (List);
- N : Node_Id;
-
- begin
- pragma Debug (Insert_List_Before_Debug);
-
- N := F;
- loop
- Set_List_Link (N, LC);
- exit when N = L;
- N := Next (N);
- end loop;
-
- if Present (After) then
- Set_Next (After, F);
- else
- Set_First (LC, F);
- end if;
-
- Set_Prev (Before, L);
- Set_Prev (F, After);
- Set_Next (L, Before);
-
- Set_First (List, Empty);
- Set_Last (List, Empty);
- end;
- end if;
- end Insert_List_Before;
-
- -------------------
- -- Is_Empty_List --
- -------------------
-
- function Is_Empty_List (List : List_Id) return Boolean is
- begin
- return First (List) = Empty;
- end Is_Empty_List;
-
- --------------------
- -- Is_List_Member --
- --------------------
-
- function Is_List_Member (Node : Node_Id) return Boolean is
- begin
- return Nodes.Table (Node).In_List;
- end Is_List_Member;
-
- -----------------------
- -- Is_Non_Empty_List --
- -----------------------
-
- function Is_Non_Empty_List (List : List_Id) return Boolean is
- begin
- return First (List) /= Empty;
- end Is_Non_Empty_List;
-
- ----------
- -- Last --
- ----------
-
- function Last (List : List_Id) return Node_Id is
- begin
- pragma Assert (List <= Lists.Last);
- return Lists.Table (List).Last;
- end Last;
-
- ------------------
- -- Last_List_Id --
- ------------------
-
- function Last_List_Id return List_Id is
- begin
- return Lists.Last;
- end Last_List_Id;
-
- ---------------------
- -- Last_Non_Pragma --
- ---------------------
-
- function Last_Non_Pragma (List : List_Id) return Node_Id is
- N : constant Node_Id := Last (List);
- begin
- if Nkind (N) /= N_Pragma then
- return N;
- else
- return Prev_Non_Pragma (N);
- end if;
- end Last_Non_Pragma;
-
- ---------------------
- -- List_Containing --
- ---------------------
-
- function List_Containing (Node : Node_Id) return List_Id is
- begin
- pragma Assert (Is_List_Member (Node));
- return List_Id (Nodes.Table (Node).Link);
- end List_Containing;
-
- -----------------
- -- List_Length --
- -----------------
-
- function List_Length (List : List_Id) return Nat is
- Result : Nat;
- Node : Node_Id;
-
- begin
- Result := 0;
- Node := First (List);
- while Present (Node) loop
- Result := Result + 1;
- Node := Next (Node);
- end loop;
-
- return Result;
- end List_Length;
-
- -------------------
- -- Lists_Address --
- -------------------
-
- function Lists_Address return System.Address is
- begin
- return Lists.Table (First_List_Id)'Address;
- end Lists_Address;
-
- ----------
- -- Lock --
- ----------
-
- procedure Lock is
- begin
- Lists.Locked := True;
- Lists.Release;
-
- Prev_Node.Locked := True;
- Next_Node.Locked := True;
-
- Prev_Node.Release;
- Next_Node.Release;
- end Lock;
-
- -------------------
- -- New_Copy_List --
- -------------------
-
- function New_Copy_List (List : List_Id) return List_Id is
- NL : List_Id;
- E : Node_Id;
-
- begin
- if List = No_List then
- return No_List;
-
- else
- NL := New_List;
- E := First (List);
-
- while Present (E) loop
- Append (New_Copy (E), NL);
- E := Next (E);
- end loop;
-
- return NL;
- end if;
- end New_Copy_List;
-
- ----------------------------
- -- New_Copy_List_Original --
- ----------------------------
-
- function New_Copy_List_Original (List : List_Id) return List_Id is
- NL : List_Id;
- E : Node_Id;
-
- begin
- if List = No_List then
- return No_List;
-
- else
- NL := New_List;
- E := First (List);
-
- while Present (E) loop
- if Comes_From_Source (E) then
- Append (New_Copy (E), NL);
- end if;
-
- E := Next (E);
- end loop;
-
- return NL;
- end if;
- end New_Copy_List_Original;
-
- ------------------------
- -- New_Copy_List_Tree --
- ------------------------
-
- function New_Copy_List_Tree (List : List_Id) return List_Id is
- NL : List_Id;
- E : Node_Id;
-
- begin
- if List = No_List then
- return No_List;
-
- else
- NL := New_List;
- E := First (List);
-
- while Present (E) loop
- Append (New_Copy_Tree (E), NL);
- E := Next (E);
- end loop;
-
- return NL;
- end if;
- end New_Copy_List_Tree;
-
- --------------
- -- New_List --
- --------------
-
- function New_List return List_Id is
-
- procedure New_List_Debug;
- pragma Inline (New_List_Debug);
- -- Output debugging information if Debug_Flag_N is set
-
- --------------------
- -- New_List_Debug --
- --------------------
-
- procedure New_List_Debug is
- begin
- if Debug_Flag_N then
- Write_Str ("Allocate new list, returned ID = ");
- Write_Int (Int (Lists.Last));
- Write_Eol;
- end if;
- end New_List_Debug;
-
- -- Start of processing for New_List
-
- begin
- Lists.Increment_Last;
-
- declare
- List : constant List_Id := Lists.Last;
-
- begin
- Set_Parent (List, Empty);
- Set_First (List, Empty);
- Set_Last (List, Empty);
-
- pragma Debug (New_List_Debug);
- return (List);
- end;
- end New_List;
-
- -- Since the one argument case is common, we optimize to build the right
- -- list directly, rather than first building an empty list and then doing
- -- the insertion, which results in some unnecessary work.
-
- function New_List (Node : Node_Id) return List_Id is
-
- procedure New_List_Debug;
- pragma Inline (New_List_Debug);
- -- Output debugging information if Debug_Flag_N is set
-
- --------------------
- -- New_List_Debug --
- --------------------
-
- procedure New_List_Debug is
- begin
- if Debug_Flag_N then
- Write_Str ("Allocate new list, returned ID = ");
- Write_Int (Int (Lists.Last));
- Write_Eol;
- end if;
- end New_List_Debug;
-
- -- Start of processing for New_List
-
- begin
- if Node = Error then
- return New_List;
-
- else
- pragma Assert (not Is_List_Member (Node));
-
- Lists.Increment_Last;
-
- declare
- List : constant List_Id := Lists.Last;
-
- begin
- Set_Parent (List, Empty);
- Set_First (List, Node);
- Set_Last (List, Node);
-
- Nodes.Table (Node).In_List := True;
- Set_List_Link (Node, List);
- Set_Prev (Node, Empty);
- Set_Next (Node, Empty);
- pragma Debug (New_List_Debug);
- return List;
- end;
- end if;
- end New_List;
-
- function New_List (Node1, Node2 : Node_Id) return List_Id is
- L : constant List_Id := New_List (Node1);
- begin
- Append (Node2, L);
- return L;
- end New_List;
-
- function New_List (Node1, Node2, Node3 : Node_Id) return List_Id is
- L : constant List_Id := New_List (Node1);
- begin
- Append (Node2, L);
- Append (Node3, L);
- return L;
- end New_List;
-
- function New_List (Node1, Node2, Node3, Node4 : Node_Id) return List_Id is
- L : constant List_Id := New_List (Node1);
- begin
- Append (Node2, L);
- Append (Node3, L);
- Append (Node4, L);
- return L;
- end New_List;
-
- function New_List
- (Node1 : Node_Id;
- Node2 : Node_Id;
- Node3 : Node_Id;
- Node4 : Node_Id;
- Node5 : Node_Id) return List_Id
- is
- L : constant List_Id := New_List (Node1);
- begin
- Append (Node2, L);
- Append (Node3, L);
- Append (Node4, L);
- Append (Node5, L);
- return L;
- end New_List;
-
- function New_List
- (Node1 : Node_Id;
- Node2 : Node_Id;
- Node3 : Node_Id;
- Node4 : Node_Id;
- Node5 : Node_Id;
- Node6 : Node_Id) return List_Id
- is
- L : constant List_Id := New_List (Node1);
- begin
- Append (Node2, L);
- Append (Node3, L);
- Append (Node4, L);
- Append (Node5, L);
- Append (Node6, L);
- return L;
- end New_List;
-
- ----------
- -- Next --
- ----------
-
- function Next (Node : Node_Id) return Node_Id is
- begin
- pragma Assert (Is_List_Member (Node));
- return Next_Node.Table (Node);
- end Next;
-
- procedure Next (Node : in out Node_Id) is
- begin
- Node := Next (Node);
- end Next;
-
- -----------------------
- -- Next_Node_Address --
- -----------------------
-
- function Next_Node_Address return System.Address is
- begin
- return Next_Node.Table (First_Node_Id)'Address;
- end Next_Node_Address;
-
- ---------------------
- -- Next_Non_Pragma --
- ---------------------
-
- function Next_Non_Pragma (Node : Node_Id) return Node_Id is
- N : Node_Id;
-
- begin
- N := Node;
- loop
- N := Next (N);
- exit when Nkind (N) /= N_Pragma
- and then
- Nkind (N) /= N_Null_Statement;
- end loop;
-
- return N;
- end Next_Non_Pragma;
-
- procedure Next_Non_Pragma (Node : in out Node_Id) is
- begin
- Node := Next_Non_Pragma (Node);
- end Next_Non_Pragma;
-
- --------
- -- No --
- --------
-
- function No (List : List_Id) return Boolean is
- begin
- return List = No_List;
- end No;
-
- ---------------
- -- Num_Lists --
- ---------------
-
- function Num_Lists return Nat is
- begin
- return Int (Lists.Last) - Int (Lists.First) + 1;
- end Num_Lists;
-
- -------
- -- p --
- -------
-
- function p (U : Union_Id) return Node_Id is
- begin
- if U in Node_Range then
- return Parent (Node_Id (U));
- elsif U in List_Range then
- return Parent (List_Id (U));
- else
- return 99_999_999;
- end if;
- end p;
-
- ------------
- -- Parent --
- ------------
-
- function Parent (List : List_Id) return Node_Id is
- begin
- pragma Assert (List <= Lists.Last);
- return Lists.Table (List).Parent;
- end Parent;
-
- ----------
- -- Pick --
- ----------
-
- function Pick (List : List_Id; Index : Pos) return Node_Id is
- Elmt : Node_Id;
-
- begin
- Elmt := First (List);
- for J in 1 .. Index - 1 loop
- Elmt := Next (Elmt);
- end loop;
-
- return Elmt;
- end Pick;
-
- -------------
- -- Prepend --
- -------------
-
- procedure Prepend (Node : Node_Id; To : List_Id) is
- F : constant Node_Id := First (To);
-
- procedure Prepend_Debug;
- pragma Inline (Prepend_Debug);
- -- Output debug information if Debug_Flag_N set
-
- -------------------
- -- Prepend_Debug --
- -------------------
-
- procedure Prepend_Debug is
- begin
- if Debug_Flag_N then
- Write_Str ("Prepend node ");
- Write_Int (Int (Node));
- Write_Str (" to list ");
- Write_Int (Int (To));
- Write_Eol;
- end if;
- end Prepend_Debug;
-
- -- Start of processing for Prepend_Debug
-
- begin
- pragma Assert (not Is_List_Member (Node));
-
- if Node = Error then
- return;
- end if;
-
- pragma Debug (Prepend_Debug);
-
- if No (F) then
- Set_Last (To, Node);
- else
- Set_Prev (F, Node);
- end if;
-
- Set_First (To, Node);
-
- Nodes.Table (Node).In_List := True;
-
- Set_Next (Node, F);
- Set_Prev (Node, Empty);
- Set_List_Link (Node, To);
- end Prepend;
-
- ----------------
- -- Prepend_To --
- ----------------
-
- procedure Prepend_To (To : List_Id; Node : Node_Id) is
- begin
- Prepend (Node, To);
- end Prepend_To;
-
- -------------
- -- Present --
- -------------
-
- function Present (List : List_Id) return Boolean is
- begin
- return List /= No_List;
- end Present;
-
- ----------
- -- Prev --
- ----------
-
- function Prev (Node : Node_Id) return Node_Id is
- begin
- pragma Assert (Is_List_Member (Node));
- return Prev_Node.Table (Node);
- end Prev;
-
- procedure Prev (Node : in out Node_Id) is
- begin
- Node := Prev (Node);
- end Prev;
-
- -----------------------
- -- Prev_Node_Address --
- -----------------------
-
- function Prev_Node_Address return System.Address is
- begin
- return Prev_Node.Table (First_Node_Id)'Address;
- end Prev_Node_Address;
-
- ---------------------
- -- Prev_Non_Pragma --
- ---------------------
-
- function Prev_Non_Pragma (Node : Node_Id) return Node_Id is
- N : Node_Id;
-
- begin
- N := Node;
- loop
- N := Prev (N);
- exit when Nkind (N) /= N_Pragma;
- end loop;
-
- return N;
- end Prev_Non_Pragma;
-
- procedure Prev_Non_Pragma (Node : in out Node_Id) is
- begin
- Node := Prev_Non_Pragma (Node);
- end Prev_Non_Pragma;
-
- ------------
- -- Remove --
- ------------
-
- procedure Remove (Node : Node_Id) is
- Lst : constant List_Id := List_Containing (Node);
- Prv : constant Node_Id := Prev (Node);
- Nxt : constant Node_Id := Next (Node);
-
- procedure Remove_Debug;
- pragma Inline (Remove_Debug);
- -- Output debug information if Debug_Flag_N set
-
- ------------------
- -- Remove_Debug --
- ------------------
-
- procedure Remove_Debug is
- begin
- if Debug_Flag_N then
- Write_Str ("Remove node ");
- Write_Int (Int (Node));
- Write_Eol;
- end if;
- end Remove_Debug;
-
- -- Start of processing for Remove
-
- begin
- pragma Debug (Remove_Debug);
-
- if No (Prv) then
- Set_First (Lst, Nxt);
- else
- Set_Next (Prv, Nxt);
- end if;
-
- if No (Nxt) then
- Set_Last (Lst, Prv);
- else
- Set_Prev (Nxt, Prv);
- end if;
-
- Nodes.Table (Node).In_List := False;
- Set_Parent (Node, Empty);
- end Remove;
-
- -----------------
- -- Remove_Head --
- -----------------
-
- function Remove_Head (List : List_Id) return Node_Id is
- Frst : constant Node_Id := First (List);
-
- procedure Remove_Head_Debug;
- pragma Inline (Remove_Head_Debug);
- -- Output debug information if Debug_Flag_N set
-
- -----------------------
- -- Remove_Head_Debug --
- -----------------------
-
- procedure Remove_Head_Debug is
- begin
- if Debug_Flag_N then
- Write_Str ("Remove head of list ");
- Write_Int (Int (List));
- Write_Eol;
- end if;
- end Remove_Head_Debug;
-
- -- Start of processing for Remove_Head
-
- begin
- pragma Debug (Remove_Head_Debug);
-
- if Frst = Empty then
- return Empty;
-
- else
- declare
- Nxt : constant Node_Id := Next (Frst);
-
- begin
- Set_First (List, Nxt);
-
- if No (Nxt) then
- Set_Last (List, Empty);
- else
- Set_Prev (Nxt, Empty);
- end if;
-
- Nodes.Table (Frst).In_List := False;
- Set_Parent (Frst, Empty);
- return Frst;
- end;
- end if;
- end Remove_Head;
-
- -----------------
- -- Remove_Next --
- -----------------
-
- function Remove_Next (Node : Node_Id) return Node_Id is
- Nxt : constant Node_Id := Next (Node);
-
- procedure Remove_Next_Debug;
- pragma Inline (Remove_Next_Debug);
- -- Output debug information if Debug_Flag_N set
-
- -----------------------
- -- Remove_Next_Debug --
- -----------------------
-
- procedure Remove_Next_Debug is
- begin
- if Debug_Flag_N then
- Write_Str ("Remove next node after ");
- Write_Int (Int (Node));
- Write_Eol;
- end if;
- end Remove_Next_Debug;
-
- -- Start of processing for Remove_Next
-
- begin
- if Present (Nxt) then
- declare
- Nxt2 : constant Node_Id := Next (Nxt);
- LC : constant List_Id := List_Containing (Node);
-
- begin
- pragma Debug (Remove_Next_Debug);
- Set_Next (Node, Nxt2);
-
- if No (Nxt2) then
- Set_Last (LC, Node);
- else
- Set_Prev (Nxt2, Node);
- end if;
-
- Nodes.Table (Nxt).In_List := False;
- Set_Parent (Nxt, Empty);
- end;
- end if;
-
- return Nxt;
- end Remove_Next;
-
- ---------------
- -- Set_First --
- ---------------
-
- procedure Set_First (List : List_Id; To : Node_Id) is
- begin
- Lists.Table (List).First := To;
- end Set_First;
-
- --------------
- -- Set_Last --
- --------------
-
- procedure Set_Last (List : List_Id; To : Node_Id) is
- begin
- Lists.Table (List).Last := To;
- end Set_Last;
-
- -------------------
- -- Set_List_Link --
- -------------------
-
- procedure Set_List_Link (Node : Node_Id; To : List_Id) is
- begin
- Nodes.Table (Node).Link := Union_Id (To);
- end Set_List_Link;
-
- --------------
- -- Set_Next --
- --------------
-
- procedure Set_Next (Node : Node_Id; To : Node_Id) is
- begin
- Next_Node.Table (Node) := To;
- end Set_Next;
-
- ----------------
- -- Set_Parent --
- ----------------
-
- procedure Set_Parent (List : List_Id; Node : Node_Id) is
- begin
- pragma Assert (List <= Lists.Last);
- Lists.Table (List).Parent := Node;
- end Set_Parent;
-
- --------------
- -- Set_Prev --
- --------------
-
- procedure Set_Prev (Node : Node_Id; To : Node_Id) is
- begin
- Prev_Node.Table (Node) := To;
- end Set_Prev;
-
- ---------------
- -- Tree_Read --
- ---------------
-
- procedure Tree_Read is
- begin
- Lists.Tree_Read;
- Next_Node.Tree_Read;
- Prev_Node.Tree_Read;
- end Tree_Read;
-
- ----------------
- -- Tree_Write --
- ----------------
-
- procedure Tree_Write is
- begin
- Lists.Tree_Write;
- Next_Node.Tree_Write;
- Prev_Node.Tree_Write;
- end Tree_Write;
-
- ------------
- -- Unlock --
- ------------
-
- procedure Unlock is
- begin
- Lists.Locked := False;
- Prev_Node.Locked := False;
- Next_Node.Locked := False;
- end Unlock;
-
-end Nlists;