aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/sinfo-utils.ads
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ada/sinfo-utils.ads')
-rw-r--r--gcc/ada/sinfo-utils.ads162
1 files changed, 162 insertions, 0 deletions
diff --git a/gcc/ada/sinfo-utils.ads b/gcc/ada/sinfo-utils.ads
new file mode 100644
index 0000000..2023e67
--- /dev/null
+++ b/gcc/ada/sinfo-utils.ads
@@ -0,0 +1,162 @@
+------------------------------------------------------------------------------
+-- --
+-- GNAT COMPILER COMPONENTS --
+-- --
+-- S I N F O . U T I L S --
+-- --
+-- S p e c --
+-- --
+-- Copyright (C) 2020-2021, 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. See the GNU General Public License --
+-- for more details. You should have received a copy of the GNU General --
+-- Public License distributed with GNAT; see file COPYING3. If not, go to --
+-- http://www.gnu.org/licenses for a complete copy of the license. --
+-- --
+-- GNAT was originally developed by the GNAT team at New York University. --
+-- Extensive contributions were provided by Ada Core Technologies Inc. --
+-- --
+------------------------------------------------------------------------------
+
+with Sinfo.Nodes; use Sinfo.Nodes;
+
+package Sinfo.Utils is
+
+ -------------------------------
+ -- Parent-related operations --
+ -------------------------------
+
+ procedure Copy_Parent (To, From : Node_Or_Entity_Id);
+ -- Does Set_Parent (To, Parent (From)), except that if To or From are
+ -- empty, does nothing. If From is empty but To is not, then Parent (To)
+ -- should already be Empty.
+
+ function Parent_Kind (N : Node_Id) return Node_Kind;
+ -- Same as Nkind (Parent (N)), except if N is Empty, return N_Empty
+
+ -------------------------
+ -- Iterator Procedures --
+ -------------------------
+
+ -- The call to Next_xxx (N) is equivalent to N := Next_xxx (N)
+
+ procedure Next_Entity (N : in out Node_Id);
+ procedure Next_Named_Actual (N : in out Node_Id);
+ procedure Next_Rep_Item (N : in out Node_Id);
+ procedure Next_Use_Clause (N : in out Node_Id);
+
+ -------------------------------------------
+ -- Miscellaneous Tree Access Subprograms --
+ -------------------------------------------
+
+ function End_Location (N : Node_Id) return Source_Ptr;
+ -- N is an N_If_Statement or N_Case_Statement node, and this function
+ -- returns the location of the IF token in the END IF sequence by
+ -- translating the value of the End_Span field.
+
+ -- WARNING: There is a matching C declaration of this subprogram in fe.h
+
+ procedure Set_End_Location (N : Node_Id; S : Source_Ptr);
+ -- N is an N_If_Statement or N_Case_Statement node. This procedure sets
+ -- the End_Span field to correspond to the given value S. In other words,
+ -- End_Span is set to the difference between S and Sloc (N), the starting
+ -- location.
+
+ function Get_Pragma_Arg (Arg : Node_Id) return Node_Id;
+ -- Given an argument to a pragma Arg, this function returns the expression
+ -- for the argument. This is Arg itself, or, in the case where Arg is a
+ -- pragma argument association node, the expression from this node.
+
+ -----------------------
+ -- Utility Functions --
+ -----------------------
+
+ procedure Map_Pragma_Name (From, To : Name_Id);
+ -- Used in the implementation of pragma Rename_Pragma. Maps pragma name
+ -- From to pragma name To, so From can be used as a synonym for To.
+
+ Too_Many_Pragma_Mappings : exception;
+ -- Raised if Map_Pragma_Name is called too many times. We expect that few
+ -- programs will use it at all, and those that do will use it approximately
+ -- once or twice.
+
+ function Pragma_Name (N : Node_Id) return Name_Id;
+ -- Obtain the name of pragma N from the Chars field of its identifier. If
+ -- the pragma has been renamed using Rename_Pragma, this routine returns
+ -- the name of the renaming.
+
+ function Pragma_Name_Unmapped (N : Node_Id) return Name_Id;
+ -- Obtain the name of pragma N from the Chars field of its identifier. This
+ -- form of name extraction does not take into account renamings performed
+ -- by Rename_Pragma.
+
+ generic
+ with procedure Action (U : Union_Id);
+ procedure Walk_Sinfo_Fields (N : Node_Id);
+ -- Walk the Sinfo fields of N, for all field types that Union_Id includes,
+ -- and call Action on each one. However, skip the Link field, which is the
+ -- Parent, and would cause us to wander off into the weeds.
+
+ generic
+ with function Transform (U : Union_Id) return Union_Id;
+ procedure Walk_Sinfo_Fields_Pairwise (N1, N2 : Node_Id);
+ -- Walks the Sinfo fields of N1 and N2 pairwise, calls Tranform on each N2
+ -- field, copying the resut into the corresponding field of N1. The Nkinds
+ -- must match. Link is skipped.
+
+ -------------------------------------------
+ -- Aliases for Entity_Or_Associated_Node --
+ -------------------------------------------
+
+ -- Historically, the Entity, Associated_Node, and Entity_Or_Associated_Node
+ -- fields shared the same slot. A further complication is that there is an
+ -- N_Has_Entity that does not include all node types that have the Entity
+ -- field. N_Inclusive_Has_Entity are the node types that have the Entity
+ -- field.
+
+ subtype N_Inclusive_Has_Entity is Node_Id with Predicate =>
+ N_Inclusive_Has_Entity in
+ N_Has_Entity_Id
+ | N_Attribute_Definition_Clause_Id
+ | N_Aspect_Specification_Id
+ | N_Freeze_Entity_Id
+ | N_Freeze_Generic_Entity_Id;
+
+ subtype N_Has_Associated_Node is Node_Id with Predicate =>
+ N_Has_Associated_Node in
+ N_Has_Entity_Id
+ | N_Aggregate_Id
+ | N_Extension_Aggregate_Id
+ | N_Selected_Component_Id
+ | N_Use_Package_Clause_Id;
+
+ function Associated_Node
+ (N : N_Has_Associated_Node) return Node_Id
+ renames Entity_Or_Associated_Node;
+
+ function Entity
+ (N : N_Inclusive_Has_Entity) return Node_Id
+ renames Entity_Or_Associated_Node;
+
+ procedure Set_Associated_Node
+ (N : N_Has_Associated_Node; Val : Node_Id)
+ renames Set_Entity_Or_Associated_Node;
+
+ procedure Set_Entity
+ (N : N_Inclusive_Has_Entity; Val : Node_Id)
+ renames Set_Entity_Or_Associated_Node;
+
+ ---------------
+ -- Debugging --
+ ---------------
+
+ procedure New_Node_Debugging_Output (N : Node_Id);
+ pragma Inline (New_Node_Debugging_Output);
+ -- See package body for documentation
+
+end Sinfo.Utils;