home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / exp_util.ads < prev    next >
Text File  |  1996-09-28  |  17KB  |  317 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                             E X P _ U T I L                              --
  6. --                                                                          --
  7. --                                 S p e c                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.58 $                             --
  10. --                                                                          --
  11. --        Copyright (c) 1992,1993,1994,1995 NYU, All Rights Reserved        --
  12. --                                                                          --
  13. -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  14. -- terms of the  GNU General Public License as published  by the Free Soft- --
  15. -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
  16. -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  17. -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  18. -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  19. -- for  more details.  You should have  received  a copy of the GNU General --
  20. -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
  21. -- to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. --
  22. --                                                                          --
  23. ------------------------------------------------------------------------------
  24.  
  25. --  Package containing utility procedures used throughout the expander
  26.  
  27. with Snames;  use Snames;
  28. with Rtsfind; use Rtsfind;
  29. with Types;   use Types;
  30.  
  31. package Exp_Util is
  32.  
  33.    ------------------------
  34.    -- Multi-Use Facility --
  35.    ------------------------
  36.  
  37.    --  It is often the case that an expression appears only once in the code
  38.    --  but must be referenced many times by the expanded code without being
  39.    --  evaluated more than once. This package provides an abstraction that
  40.    --  satisfies this requirement. Such an expression is represented by an
  41.    --  object of type Exp_Id that is initialized with Prepare or New_Exp_Id
  42.    --  then each reference to the expression is done with New_Ref.
  43.  
  44.    --  Multi-Use may be used both for expressions of the form of names, in
  45.    --  which case a reference to the named object is captured, or for the
  46.    --  case of simple values, in which case the value is captured.
  47.  
  48.    package Multi_Use is
  49.  
  50.       type Exp_Id is private;
  51.  
  52.       procedure Prepare
  53.         (Exp      : Node_Id;
  54.          Res      : out Exp_Id;
  55.          Code     : out List_Id;
  56.          Name_Req : Boolean := False);
  57.       --  Given an Exp, create an new Exp_Id (Res) that can be used later for
  58.       --  new references to this expression without forcing a re-evaluation.
  59.       --  For simple cases, no special code is generated and Code is set to
  60.       --  No_List. For complex cases, Code is a sequence of code that creates
  61.       --  a temporary to be referenced in copies. The code must be elaborated
  62.       --  before any of the copies are elaborated. The Name_Req parameter is
  63.       --  set to true if the input Exp is a name, and the resulting copies
  64.       --  must also be names (this is true if at least one of the copies is
  65.       --  to be used as a name, e.g. on the left side of an assignment). If
  66.       --  Name_Req is False, the normal case, then the assumption is that the
  67.       --  result is only referenced for its value, and need not be a name.
  68.  
  69.       procedure New_Exp_Id
  70.         (Exp      : Node_Id;
  71.          N        : Node_Id;
  72.          Res      : out Exp_Id;
  73.          Name_Req : Boolean := False);
  74.       --  Same as Prepare but the code is inserted before N and analyzed.
  75.       --  Typically, N is the instruction containing Exp.
  76.  
  77.       procedure New_Exp_Id
  78.         (Exp      : Node_Id;
  79.          L        : List_Id;
  80.          Res      : out Exp_Id;
  81.          Name_Req : Boolean := False);
  82.  
  83.       --  Same as Prepare but the code is inserted at the end of L and not
  84.       --  analyzed. Typically L is the Actions of an expression_actions.
  85.  
  86.       function New_Ref (E : Exp_Id) return  Node_Id;
  87.       --  Return a new reference to an expression referenced by E
  88.  
  89.       function Wrap (Code : List_Id; N : Node_Id) return Node_Id;
  90.       --  Given a code list returned by a call to Prepare, and a node N
  91.       --  for an expression typically containing references constructed
  92.       --  using New_Ref, returns the node unchanged if the code list is
  93.       --  empty, and otherwise returns an expression actions node which
  94.       --  contains the required code.
  95.  
  96.    private
  97.       type Exp_Id is new Node_Id;
  98.       --  Exp_Id references a node which can be used by New_Ref the first
  99.       --  time unchanged, and which then must be copied using New_Copy_Tree
  100.       --  for subsequent calls to New_Ref. In simple cases, where copying
  101.       --  has no semantic effect, e.g. a simple variable reference, this
  102.       --  is simply the original expression node, but in cases where the
  103.       --  copy would have a semantic effect (i.e. the cases in which the
  104.       --  use of Multi_Use is critical), Exp_Id points to a new safely
  105.       --  copyable node (which is e.g. an identifier for a temporary entity
  106.       --  constructed to hold the value).
  107.  
  108.    end Multi_Use;
  109.  
  110.    -----------------------------------------------
  111.    -- Handling of Actions Associated with Nodes --
  112.    -----------------------------------------------
  113.  
  114.    --  The evaluation of certain expression nodes involves the elaboration
  115.    --  of associated types and other declarations, and the execution of
  116.    --  statement sequences. The tree node N_Expression_Actions is used in
  117.    --  the tree to represent this semantic requirement. However these nodes
  118.    --  appear only temporarily in the tree, since if code is being generated,
  119.    --  Gigi expects that all expression actions nodes must be removed from
  120.    --  the tree, since it does not have the capability of handling complex
  121.    --  declarations in the middle of evaluation of an expression.
  122.  
  123.    --  This means that the expansion routine for expression actions nodes must
  124.    --  find an appropriate place in the tree to rehang the actions so that they
  125.    --  will be evaluated at the appropriate point.
  126.  
  127.    --  Some cases are simple:
  128.  
  129.    --    For an expression occurring in a simple statement that is in a list
  130.    --    of statements, the actions are simply inserted into the list before
  131.    --    the associated statement.
  132.  
  133.    --    For an expression occurring in a declaration (declarations always
  134.    --    appear in lists), the actions are similarly inserted into the list
  135.    --    just before the associated declaration.
  136.  
  137.    --  The following special cases arise:
  138.  
  139.    --    For actions associated with the right operand of a short circuit
  140.    --    form, the actions are first stored in the short circuit form node
  141.    --    in the Actions field. The expansion of these forms subsequently
  142.    --    expands the short circuit forms into if statements which can then
  143.    --    be moved as described above.
  144.  
  145.    --    For actions appearing in the Condition expression of a while loop,
  146.    --    or an elsif clause, the actions are similarly temporarily stored in
  147.    --    in the node (N_Elsif_Part or N_Iteration_Scheme) associated with
  148.    --    the expression using the Condition_Actions field. Sunsequently, the
  149.    --    expansion of these nodes rewrites the control structures involved to
  150.    --    reposition the actions in normal statement sequence.
  151.  
  152.    --    For actions appearing in the then or else expression of a conditional
  153.    --    expression, these actions are similarly placed in the node, using the
  154.    --    Then_Actions or Else_Actions field as appropriate. Once again the
  155.    --    expansion of the N_Conditional_Expression node rewrites the node so
  156.    --    that the actions can be normally positioned.
  157.  
  158.    --  Basically what we do is to climb up to the tree looking for the proper
  159.    --  insertion point, as described by one of the above cases.
  160.  
  161.    --  In addition to the actions of expression actions nodes, the definition
  162.    --  of implicit types (i.e. the N_Implicit_Type node) that are associated
  163.    --  with expression actions must also be inserted in the tree in a similar
  164.    --  manner.
  165.  
  166.    --  Note: in some cases, actions are inserted directly without first being
  167.    --  placed in expression actions nodes.
  168.  
  169.    procedure Insert_Action
  170.      (Assoc_Node : Node_Id; Ins_Action  : Node_Id);
  171.    procedure Insert_Action
  172.      (Assoc_Node : Node_Id; Ins_Action  : Node_Id; Suppress : Check_Id);
  173.    procedure Insert_Actions
  174.      (Assoc_Node : Node_Id; Ins_Actions : List_Id);
  175.    procedure Insert_Actions
  176.      (Assoc_Node : Node_Id; Ins_Actions : List_Id; Suppress : Check_Id);
  177.    --  These routines are used to promote a single action or list of actions
  178.    --  to the top level. Typical actions that are promoted in this way are
  179.    --  the declaration of an Itype, or the actions of an expression actions
  180.    --  node. For an exact definition of what top-level means, see body. The
  181.    --  first argument is the node to which the action is originally attached.
  182.    --  No_List is a valid argument for Actions and results in nothing being
  183.    --  done. These routines also analyze the actions once attached, so they
  184.    --  return with the actions analyzed. If a Suppress argument is given,
  185.    --  then the analysis is done with the specified check suppressed, which
  186.    --  can be All_Checks to suppress all checks.
  187.  
  188.    -----------------------
  189.    -- Other Subprograms --
  190.    -----------------------
  191.  
  192.    function Build_Runtime_Call (Loc : Source_Ptr; RE : RE_Id) return Node_Id;
  193.    --  Build an N_Procedure_Call_Statement calling the given runtime entity.
  194.    --  The call has no parameters. The first argument provides the location
  195.    --  information for the tree and for error messages. The call node is not
  196.    --  analyzed on return, the caller is responsible for analyzing it.
  197.  
  198.    type Compare_Result is (LT, LE, EQ, NE, GT, GE, Unknown);
  199.    function Compile_Time_Compare (L, R : Node_Id) return Compare_Result;
  200.    --  Given two expression nodes, finds out whether it can be determined
  201.    --  at compile time how the runtime values will compare. An Unknown
  202.    --  result means that the result of a comparison cannot be determined at
  203.    --  compile time, otherwise the returned result indicates the known result
  204.    --  of the comparison, given as tightly as possible (i.e. EQ or LT is a
  205.    --  preferred returned value to LE). This routine is only used in cases
  206.    --  where the caller knows that the expression types are scalar.
  207.  
  208.    function Convert_To (Typ : Entity_Id; Expr : Node_Id) return Node_Id;
  209.    --  Returns an expression that represents the result of a checked convert
  210.    --  of expression Exp to type T. If the base type of Exp is T, then no
  211.    --  conversion is required, and Exp is returned unchanged. Otherwise an
  212.    --  N_Type_Conversion node is constructed to convert the expression.
  213.    --  If an N_Type_Conversion node is required, Relocate_Node is used on
  214.    --  Exp. This means that it is safe to replace a node by a Convert_To
  215.    --  of itself to some other type.
  216.  
  217.    function Unchecked_Convert_To
  218.      (Typ  : Entity_Id;
  219.       Expr : Node_Id)
  220.       return Node_Id;
  221.    --  Like Convert_To, but if a conversion is actually needed, constructs
  222.    --  an N_Unchecked_Type_Conversion node to do the required conversion.
  223.  
  224.    function Convert_To_Actual_Subtype (Exp : Node_Id) return Node_Id;
  225.    --  The Etype of an expression is the nominal type of the expression,
  226.    --  not the actual subtype. Often these are the same, but not always.
  227.    --  For example, a reference to a formal of unconstrained type has the
  228.    --  unconstrained type as its Etype, but the actual subtype is obtained
  229.    --  by applying the actual bounds. This routine is given an expression,
  230.    --  Exp, and (if necessary), replaces it using Rewrite_Substitute_Tree,
  231.    --  with a conversion to the actual subtype, building the actual subtype
  232.    --  if necessary. The returned value is the possibly modified expression
  233.    --  (which will always have the same Node_Id as Exp). Exp is analyzed and
  234.    --  resolved on entry and on exit.
  235.  
  236.    function Find_Prim_Op (T : Entity_Id; Name : Name_Id) return Entity_Id;
  237.    --  Find the first primitive operation of type T whose name is 'Name'.
  238.    --  this function allows the use of a primitive operation which is not
  239.    --  directly visible
  240.  
  241.    procedure Expand_Subtype_From_Expr
  242.      (N             : Node_Id;
  243.       Unc_Type      : Entity_Id;
  244.       Subtype_Indic : Node_Id;
  245.       Exp           : Node_Id);
  246.    --  Build a constrained subtype from the initial value in object
  247.    --  declarations and/or allocations when the type is indefinite (including
  248.    --  class-wide).
  249.  
  250.    procedure Expand_Tagged_Copy
  251.      (N   : Node_Id;
  252.       Lhs : Multi_Use.Exp_Id;
  253.       Rhs : Multi_Use.Exp_Id;
  254.       Typ : Entity_Id);
  255.    --  Expand the code for copying the value of Rhs to Lhs. The arguments are
  256.    --  entities rather than expressions because this procedure is
  257.    --  used in conjunction with prepare_multi_use_of_Exp. The value of a
  258.    --  tagged type excludes its tag. If the type is controlled it also excludes
  259.    --  the finalization pointers
  260.  
  261.    procedure Append_Freeze_Action (T : Entity_Id; N : Node_Id);
  262.    --  Add a new freeze action for the given type. The freeze action is
  263.    --  attached to the freeze node for the type. Actions will be elaborated
  264.    --  in the order in which they are added. Note that the added node is not
  265.    --  analyzed. The analyze call is found in Sem_Ch13.Expand_N_Freeze_Entity.
  266.  
  267.    procedure Append_Freeze_Actions (T : Entity_Id; L : List_Id);
  268.    --  Adds the given list of freeze actions (declarations or statements)
  269.    --  for the given type. The freeze actions are attached to the freeze
  270.    --  node for the type. Actions will be elaborated in the order in which
  271.    --  they are added, and the actions within the list will be elaborated in
  272.    --  list order. Note that the added nodes are not analyzed. The analyze
  273.    --  call is found in Sem_Ch13.Expand_N_Freeze_Entity.
  274.  
  275.    procedure Wrap_Cleanup_Procedure (N : Node_Id);
  276.    --  Given an N_Subprogram_Body node, this procedure adds an Abort_Defer
  277.    --  call at the start of the statement sequence, and an Abort_Undefer call
  278.    --  at the end of the statement sequence. All cleanup routines (i.e. those
  279.    --  that are called from "at end" handlers) must defer abort on entry and
  280.    --  undefer abort on exit. Note that it is assumed that the code for the
  281.    --  procedure does not contain any return statements which would allow the
  282.    --  flow of control to escape doing the undefer call.
  283.  
  284.    procedure Remove_Side_Effects
  285.      (Exp      : Node_Id;
  286.       Name_Req : Boolean := False);
  287.    --  Given the node for a subexpression, this function replaces the node
  288.    --  if necessary by an equivalent subexpression that is guaranteed to be
  289.    --  side effect free. This is done by extracting any actions that could
  290.    --  cause side effects, and inserting them using Insert_Actions into the
  291.    --  tree to which Exp is attached. Exp must be analayzed and resolved
  292.    --  before the call and is analyzed and resolved on return. The Name_Req
  293.    --  may only be set to True if Exp has the form of a name, and the effect
  294.    --  is to guarantee that any replacement maintains the form of a name.
  295.  
  296.    function Duplicate_Subexpr
  297.      (Exp      : Node_Id;
  298.       Name_Req : Boolean := False)
  299.       return     Node_Id;
  300.    --  Given the node for a subexpression, this function makes a logical
  301.    --  copy of the subexpression, and returns it. This is intended for use
  302.    --  when the expansion of an expression needs to repeat part of it. For
  303.    --  example, replacing a**2 by a*a requires two references to a which
  304.    --  may be a complex subexpression. Duplicate_Subexpression guarantees
  305.    --  not to duplicate side effects. If necessary, it generates actions
  306.    --  to save the expression value in a temporary, inserting these actions
  307.    --  into the tree using Insert_Actions with Exp as the insertion location.
  308.    --  The original expression and the returned result then become references
  309.    --  to this saved value. Exp must be analyzed on entry. On return, Exp
  310.    --  is analyzed, but the caller is responsible for analyzing the returned
  311.    --  copy after it is attached to the tree. The Name_Req flag is set to
  312.    --  ensure that the result is suitable for use in a context requiring a
  313.    --  name (e.g. the prefix of an attribute reference).
  314.    --  Note: this will eventually replace multi-use completely ???
  315.  
  316. end Exp_Util;
  317.