------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                             E X P _ U N S T                              --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--          Copyright (C) 2014-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.      --
--                                                                          --
------------------------------------------------------------------------------

--  Expand routines for unnesting subprograms

with Table;
with Types; use Types;

package Exp_Unst is

   --  -----------------
   --  -- The Problem --
   --  -----------------

   --  Normally, nested subprograms in the source result in corresponding
   --  nested subprograms in the resulting tree. We then expect the back end
   --  to handle such nested subprograms, including all cases of uplevel
   --  references. For example, the GCC back end can do this relatively easily
   --  since GNU C (as an extension) allows nested functions with uplevel
   --  references, and implements an appropriate static chain approach to
   --  dealing with such uplevel references.

   --  However, we also want to be able to interface with back ends that do
   --  not easily handle such uplevel references. One example is the back end
   --  that translates the tree into standard C source code. In the future,
   --  other back ends might need the same capability (e.g. a back end that
   --  generated LLVM intermediate code).

   --  We could imagine simply handling such references in the appropriate
   --  back end. For example the back end that generates C could recognize
   --  nested subprograms and rig up some way of translating them, e.g. by
   --  making a static-link source level visible.

   --  Rather than take that approach, we prefer to do a semantics-preserving
   --  transformation on the GNAT tree, that eliminates the problem before we
   --  hand the tree over to the back end. There are two reasons for preferring
   --  this approach:

   --     First: the work needs only to be done once for all affected back ends
   --     and we can remain within the semantics of the tree. The front end is
   --     full of tree transformations, so we have all the infrastructure for
   --     doing transformations of this type.

   --     Second: given that the transformation will be semantics-preserving,
   --     we can still use the standard GCC back end to build code from it.
   --     This means we can easily run our full test suite to verify that the
   --     transformations are indeed semantics preserving. It is a lot more
   --     work to thoroughly test the output of specialized back ends.

   --  Looking at the problem, we have three situations to deal with. Note
   --  that in these examples, we use all lower case, since that is the way
   --  the internal tree is cased.

   --     First, cases where there are no uplevel references, for example

   --       procedure case1 is
   --          function max (m, n : Integer) return integer is
   --          begin
   --             return integer'max (m, n);
   --          end max;
   --          ...
   --       end case1;

   --     Second, cases where there are explicit uplevel references.

   --       procedure case2 (b : integer) is
   --          procedure Inner (bb : integer);
   --
   --          procedure inner2 is
   --          begin
   --            inner(5);
   --          end;
   --
   --          x  : integer := 77;
   --          y  : constant integer := 15 * 16;
   --          rv : integer := 10;
   --
   --          procedure inner (bb : integer) is
   --          begin
   --             x := rv + y + bb + b;
   --          end;
   --
   --       begin
   --          inner2;
   --       end case2;

   --     In this second example, B, X, RV are uplevel referenced. Y is not
   --     considered as an uplevel reference since it is a static constant
   --     where references are replaced by the value at compile time.

   --   Third, cases where there are implicit uplevel references via types
   --   whose bounds depend on locally declared constants or variables:

   --       function case3 (x, y : integer) return boolean is
   --          subtype dynam is integer range x .. y + 3;
   --          subtype static is integer range 42 .. 73;
   --          xx : dynam := y;
   --
   --          type darr is array (dynam) of Integer;
   --          type darec is record
   --             A : darr;
   --             B : integer;
   --          end record;
   --          darecv : darec;
   --
   --          function inner (b : integer) return boolean is
   --          begin
   --            return b in dynam and then darecv.b in static;
   --          end inner;
   --
   --       begin
   --         return inner (42) and then inner (xx * 3 - y * 2);
   --       end case3;
   --
   --     In this third example, the membership test implicitly references the
   --     the bounds of Dynam, which both involve uplevel references.

   --  ------------------
   --  -- The Solution --
   --  ------------------

   --  Looking at the three cases above, the first case poses no problem at
   --  all. Indeed the subprogram could have been declared at the outer level
   --  (perhaps changing the name). But this style is quite common as a way
   --  of limiting the scope of a local procedure called only within the outer
   --  procedure. We could move it to the outer level (with a name change if
   --  needed), but we don't bother. We leave it nested, and the back end just
   --  translates it as though it were not nested.

   --  In general we leave nested procedures nested, rather than trying to move
   --  them to the outer level (the back end may do that, e.g. as part of the
   --  translation to C, but we don't do it in the tree itself). This saves a
   --  LOT of trouble in terms of visibility and semantics.

   --  But of course we have to deal with the uplevel references. The idea is
   --  to rewrite these nested subprograms so that they no longer have any such
   --  uplevel references, so by the time they reach the back end, they all are
   --  case 1 (no uplevel references) and thus easily handled.

   --  To deal with explicit uplevel references (case 2 above), we proceed with
   --  the following steps:

   --    All entities marked as being uplevel referenced are marked as aliased
   --    since they will be accessed indirectly via an activation record as
   --    described below.

   --    An activation record is created containing system address values
   --    for each uplevel referenced entity in a given scope. In the example
   --    given before, we would have:

   --      type AREC1T is record
   --         b  : Address;
   --         x  : Address;
   --         rv : Address;
   --      end record;

   --      type AREC1PT is access all AREC1T;

   --      AREC1  : aliased AREC1T;
   --      AREC1P : constant AREC1PT := AREC1'Access;

   --   The fields of AREC1 are set at the point the corresponding entity
   --   is declared (immediately for parameters).

   --   Note: the 1 in all these names is a unique index number. Different
   --   scopes requiring different ARECnT declarations will have different
   --   values of n to ensure uniqueness.

   --   Note: normally the field names in the activation record match the
   --   name of the entity. An exception is when the entity is declared in
   --   a declare block, in which case we append the entity number, to avoid
   --   clashes between the same name declared in different declare blocks.

   --   For all subprograms nested immediately within the corresponding scope,
   --   a parameter AREC1F is passed, and all calls to these routines have
   --   AREC1P added as an additional formal.

   --   Now within the nested procedures, any reference to an uplevel entity
   --   xxx is replaced by typ'Deref(AREC1.xxx) where typ is the type of the
   --   reference.

   --   Note: the reason that we use Address as the component type in the
   --   declaration of AREC1T is that we may create this type before we see
   --   the declaration of this type.

   --   The following shows example 2 above after this translation:

   --       procedure case2x (b : aliased Integer) is
   --          type AREC1T is record
   --             b  : Address;
   --             x  : Address;
   --             rv : Address;
   --          end record;
   --
   --          type AREC1PT is access all AREC1T;
   --
   --          AREC1 : aliased AREC1T;
   --          AREC1P : constant AREC1PT := AREC1'Access;
   --
   --          AREC1.b := b'Address;
   --
   --          procedure inner (bb : integer; AREC1F : AREC1PT);
   --
   --          procedure inner2 (AREC1F : AREC1PT) is
   --          begin
   --            inner(5, AREC1F);
   --          end;
   --
   --          x  : aliased integer := 77;
   --          AREC1.x := X'Address;
   --
   --          y  : constant Integer := 15 * 16;
   --
   --          rv : aliased Integer;
   --          AREC1.rv := rv'Address;
   --
   --          procedure inner (bb : integer; AREC1F : AREC1PT) is
   --          begin
   --             Integer'Deref(AREC1F.x) :=
   --               Integer'Deref(AREC1F.rv) + y + b + Integer'Deref(AREC1F.b);
   --          end;
   --
   --       begin
   --          inner2 (AREC1P);
   --       end case2x;

   --  And now the inner procedures INNER2 and INNER have no uplevel references
   --  so they have been reduced to case 1, which is the case easily handled by
   --  the back end. Note that the generated code is not strictly legal Ada
   --  because of the assignments to AREC1 in the declarative sequence, but the
   --  GNAT tree always allows such mixing of declarations and statements, so
   --  the back end must be prepared to handle this in any case.

   --  Case 3 where we have uplevel references to types is a bit more complex.
   --  That would especially be the case if we did a full transformation that
   --  completely eliminated such uplevel references as we did for case 2. But
   --  instead of trying to do that, we rewrite the subprogram so that the code
   --  generator can easily detect and deal with these uplevel type references.

   --  First we distinguish two cases

   --    Static types are one of the two following cases:

   --      Discrete types whose bounds are known at compile time. This is not
   --      quite the same as what is tested by Is_OK_Static_Subtype, in that
   --      it allows compile time known values that are not static expressions.

   --      Composite types, whose components are (recursively) static types.

   --    Dynamic types are one of the two following cases:

   --      Discrete types with at least one bound not known at compile time.

   --      Composite types with at least one component that is (recursively)
   --      a dynamic type.

   --    Uplevel references to static types are not a problem, the front end
   --    or the code generator fetches the bounds as required, and since they
   --    are compile time known values, this value can just be extracted and
   --    no actual uplevel reference is required.

   --    Uplevel references to dynamic types are a potential problem, since
   --    such references may involve an implicit access to a dynamic bound,
   --    and this reference is an implicit uplevel access.

   --    To fully unnest such references would be messy, since we would have
   --    to create local copies of the dynamic types involved, so that the
   --    front end or code generator could generate an explicit uplevel
   --    reference to the bound involved. Rather than do that, we set things
   --    up so that this situation can be easily detected and dealt with when
   --    there is an implicit reference to the bounds.

   --    What we do is to always generate a local constant for any dynamic
   --    bound in a dynamic subtype xx with name xx_FIRST or xx_LAST. The one
   --    case where we can skip this is where the bound is already a constant.
   --    E.g. in the third example above, subtype dynam is expanded as

   --      dynam_LAST : constant Integer := y + 3;
   --      subtype dynam is integer range x .. dynam_LAST;

   --    Now if type dynam is uplevel referenced (as it is in this case), then
   --    the bounds x and dynam_LAST are marked as uplevel references
   --    so that appropriate entries are made in the activation record. Any
   --    explicit reference to such a bound in the front end generated code
   --    will be handled by the normal uplevel reference mechanism which we
   --    described above for case 2. For implicit references by a back end
   --    that needs to unnest things, any such implicit reference to one of
   --    these bounds can be replaced by an appropriate reference to the entry
   --    in the activation record for xx_FIRST or xx_LAST. Thus the back end
   --    can eliminate the problematical uplevel reference without the need to
   --    do the heavy tree modification to do that at the code expansion level.

   --  Looking at case 3 again, here is the normal -gnatG expanded code

     --  function case3 (x : integer; y : integer) return boolean is
     --     dynam_LAST : constant integer := y {+} 3;
     --     subtype dynam is integer range x .. dynam_LAST;
     --     subtype static is integer range 42 .. 73;
     --
     --     [constraint_error when
     --       not (y in x .. dynam_LAST)
     --       "range check failed"]
     --
     --     xx : dynam := y;
     --
     --     type darr is array (x .. dynam_LAST) of integer;
     --     type darec is record
     --        a : darr;
     --        b : integer;
     --     end record;
     --     [type TdarrB is array (x .. dynam_LAST range <>) of integer]
     --     freeze TdarrB []
     --     darecv : darec;
     --
     --     function inner (b : integer) return boolean is
     --     begin
     --        return b in x .. dynam_LAST and then darecv.b in 42 .. 73;
     --     end inner;
     --  begin
     --     return inner (42) and then inner (xx {*} 3 {-} y {*} 2);
     --  end case3;

   --  Note: the actual expanded code has fully qualified names so for
   --  example function inner is actually function case3__inner. For now
   --  we ignore that detail to clarify the examples.

   --  Here we see that some of the bounds references are expanded by the
   --  front end, so that we get explicit references to y or dynam_Last. These
   --  cases are handled by the normal uplevel reference mechanism described
   --  above for case 2. This is the case for the constraint check for the
   --  initialization of xx, and the range check in function inner.

   --  But the reference darecv.b in the return statement of function
   --  inner has an implicit reference to the bounds of dynam, since to
   --  compute the location of b in the record, we need the length of a.

   --  Here is the full translation of the third example:

   --       function case3x (x, y : integer) return boolean is
   --          type AREC1T is record
   --             x          : Address;
   --             dynam_LAST : Address;
   --          end record;
   --
   --          type AREC1PT is access all AREC1T;
   --
   --          AREC1 : aliased AREC1T;
   --          AREC1P : constant AREC1PT := AREC1'Access;
   --
   --          AREC1.x := x'Address;
   --
   --          dynam_LAST : constant integer := y {+} 3;
   --          AREC1.dynam_LAST := dynam_LAST'Address;
   --          subtype dynam is integer range x .. dynam_LAST;
   --          xx : dynam := y;
   --
   --          [constraint_error when
   --            not (y in x .. dynam_LAST)
   --            "range check failed"]
   --
   --          subtype static is integer range 42 .. 73;
   --
   --          type darr is array (x .. dynam_LAST) of Integer;
   --          type darec is record
   --             A : darr;
   --             B : integer;
   --          end record;
   --          darecv : darec;
   --
   --          function inner (b : integer; AREC1F : AREC1PT) return boolean is
   --          begin
   --             return b in x .. Integer'Deref(AREC1F.dynam_LAST)
   --               and then darecv.b in 42 .. 73;
   --          end inner;
   --
   --       begin
   --         return inner (42, AREC1P) and then inner (xx * 3, AREC1P);
   --       end case3x;

   --  And now the back end when it processes darecv.b will access the bounds
   --  of darecv.a by referencing the d and dynam_LAST fields of AREC1P.

   -----------------------------
   -- Multiple Nesting Levels --
   -----------------------------

   --  In our examples so far, we have only nested to a single level, but the
   --  scheme generalizes to multiple levels of nesting and in this section we
   --  discuss how this generalization works.

   --  Consider this example with two nesting levels

   --  To deal with elimination of uplevel references, we follow the same basic
   --  approach described above for case 2, except that we need an activation
   --  record at each nested level. Basically the rule is that any procedure
   --  that has nested procedures needs an activation record. When we do this,
   --  the inner activation records have a pointer (uplink) to the immediately
   --  enclosing activation record, the normal arrangement of static links. The
   --  following shows the full translation of this fourth case.

   --     function case4x (x : integer) return integer is
   --        type AREC1T is record
   --           v1 : Address;
   --        end record;
   --
   --        type AREC1PT is access all AREC1T;
   --
   --        AREC1 : aliased AREC1T;
   --        AREC1P : constant AREC1PT := AREC1'Access;
   --
   --        v1 : integer := x;
   --        AREC1.v1 := v1'Address;
   --
   --        function inner1 (y : integer; AREC1F : AREC1PT) return integer is
   --           type AREC2T is record
   --              AREC1U : AREC1PT;
   --              v2     : Address;
   --           end record;
   --
   --           type AREC2PT is access all AREC2T;
   --
   --           AREC2 : aliased AREC2T;
   --           AREC2P : constant AREC2PT := AREC2'Access;
   --
   --           AREC2.AREC1U := AREC1F;
   --
   --           v2 : integer := Integer'Deref (AREC1F.v1) {+} 1;
   --           AREC2.v2 := v2'Address;
   --
   --           function inner2
   --              (z : integer; AREC2F : AREC2PT) return integer
   --           is
   --           begin
   --              return integer(z {+}
   --                             Integer'Deref (AREC2F.AREC1U.v1) {+}
   --                             Integer'Deref (AREC2F.v2).all);
   --           end inner2;
   --        begin
   --           return integer(y {+}
   --                            inner2 (Integer'Deref (AREC1F.v1), AREC2P));
   --        end inner1;
   --     begin
   --        return inner1 (x, AREC1P);
   --     end case4x;

   --  As can be seen in this example, the index numbers following AREC in the
   --  generated names avoid confusion between AREC names at different levels.

   -------------------------
   -- Name Disambiguation --
   -------------------------

   --  As described above, the translation scheme would raise issues when the
   --  code generator did the actual unnesting if identically named nested
   --  subprograms exist. Similarly overloading would cause a naming issue.

   --  In fact, the expanded code includes qualified names which eliminate this
   --  problem. We omitted the qualification from the expanded examples above
   --  for simplicity. But to see this in action, consider this example:

   --    function Mnames return Boolean is
   --       procedure Inner is
   --          procedure Inner is
   --          begin
   --             null;
   --          end;
   --       begin
   --          Inner;
   --       end;
   --       function F (A : Boolean) return Boolean is
   --       begin
   --          return not A;
   --       end;
   --       function F (A : Integer) return Boolean is
   --       begin
   --          return A > 42;
   --       end;
   --    begin
   --       Inner;
   --       return F (42) or F (True);
   --    end;

   --  The expanded code actually looks like:

   --    function mnames return boolean is
   --       procedure mnames__inner is
   --          procedure mnames__inner__inner is
   --          begin
   --             null;
   --             return;
   --          end mnames__inner__inner;
   --       begin
   --          mnames__inner__inner;
   --          return;
   --       end mnames__inner;
   --       function mnames__f (a : boolean) return boolean is
   --       begin
   --          return not a;
   --       end mnames__f;
   --       function mnames__f__2 (a : integer) return boolean is
   --       begin
   --          return a > 42;
   --       end mnames__f__2;
   --    begin
   --       mnames__inner;
   --       return mnames__f__2 (42) or mnames__f (true);
   --    end mnames;

   --  As can be seen from studying this example, the qualification deals both
   --  with the issue of clashing names (mnames__inner, mnames__inner__inner),
   --  and with overloading (mnames__f, mnames__f__2).

   --  In addition, the declarations of ARECnT and ARECnPT get moved to the
   --  outer level when we actually generate C code, so we suffix these names
   --  with the corresponding entity name to make sure they are unique.

   ---------------------------
   -- Terminology for Calls --
   ---------------------------

   --  The level of a subprogram in the nest being analyzed is defined to be
   --  the level of nesting, so the outer level subprogram (the one passed to
   --  Unnest_Subprogram) is 1, subprograms immediately nested within this
   --  outer level subprogram have a level of 2, etc.

   --  Calls within the nest being analyzed are of three types:

   --    Downward call: this is a call from a subprogram to a subprogram that
   --    is immediately nested with in the caller, and thus has a level that
   --    is one greater than the caller. It is a fundamental property of the
   --    nesting structure and visibility that it is not possible to make a
   --    call from level N to level M, where M is greater than N + 1.

   --    Parallel call: this is a call from a nested subprogram to another
   --    nested subprogram that is at the same level.

   --    Upward call: this is a call from a subprogram to a subprogram that
   --    encloses the caller. The level of the callee is less than the level
   --    of the caller, and there is no limit on the difference, e.g. for an
   --    uplevel call, a subprogram at level 5 can call one at level 2 or even
   --    the outer level subprogram at level 1.

   -------------------------------------
   -- Handling of unconstrained types --
   -------------------------------------

   --  Objects whose nominal subtype is an unconstrained array type present
   --  additional complications for translation into LLVM. The address
   --  attribute of such objects points to the first component of the
   --  array, and the bounds are found elsewhere, typically ahead of the
   --  components. In many cases the bounds of an object are stored ahead
   --  of the components and can be retrieved from it. However, if the
   --  object is an expression (e.g. a slice) the bounds are not adjacent
   --  and thus must be conveyed explicitly by means of a so-called
   --  fat pointer. This leads to the following enhancements to the
   --  handling of uplevel references described so far. This applies only
   --  to uplevel references to unconstrained formals of enclosing
   --  subprograms:
   --
   --  a) Uplevel references are detected as before during the tree traversal
   --  in Visit_Node. For reference to uplevel formals, we include those with
   --  an unconstrained array type (e.g. String) even if such a type has
   --  static bounds.
   --
   --  b) references to unconstrained formals are recognized in the Subp
   --  table by means of the predicate Needs_Fat_Pointer.
   --
   --  c) When constructing the required activation record we also construct
   --  a named access type whose designated type is the unconstrained array
   --  type. The activation record of a subprogram that contains such an
   --  uplevel reference includes a component of this access type. The
   --  declaration for that access type is introduced and analyzed before
   --  that of the activation record, so it appears in the subprogram that
   --  has that formal.
   --
   --  d) The uplevel reference is rewritten as an explicit dereference (.all)
   --  of the corresponding pointer component.
   --
   -----------
   -- Subps --
   -----------

   --  Table to record subprograms within the nest being currently analyzed.
   --  Entries in this table are made for each subprogram expanded, and do not
   --  get cleared as we complete the expansion, since we want the table info
   --  around in Cprint for the actual unnesting operation. Subps_First in this
   --  unit records the starting entry in the table for the entries for Subp
   --  and this is also recorded in the Subps_Index field of the outer level
   --  subprogram in the nest. The last subps index for the nest can be found
   --  in the Subp_Entry Last field of this first entry.

   subtype SI_Type is Nat;
   --  Index type for the table

   Subps_First : SI_Type;
   --  Record starting index for entries in the current nest (this is the table
   --  index of the entry for Subp itself, and is recorded in the Subps_Index
   --  field of the entity for this subprogram).

   type Subp_Entry is record
      Ent : Entity_Id;
      --  Entity of the subprogram

      Bod : Node_Id;
      --  Subprogram_Body node for this subprogram

      Lev : Nat;
      --  Subprogram level (1 = outer subprogram (Subp argument), 2 = nested
      --  immediately within this outer subprogram etc.)

      Reachable : Boolean;
      --  This flag is set True if there is a call path from the outer level
      --  subprogram to this subprogram. If Reachable is False, it means that
      --  the subprogram is declared but not actually referenced. We remove
      --  such subprograms from the tree, which simplifies our task, because
      --  we don't have to worry about e.g. uplevel references from such an
      --  unreferenced subpogram, which might require (useless) activation
      --  records to be created. This is computed by setting the outer level
      --  subprogram (Subp itself) as reachable, and then doing a transitive
      --  closure following all calls.

      Uplevel_Ref : Nat;
      --  The outermost level which defines entities which this subprogram
      --  references either directly or indirectly via a call. This cannot
      --  be greater than Lev. If it is equal to Lev, then it means that the
      --  subprogram does not make any uplevel references and that thus it
      --  does not need an activation record pointer passed. If it is less than
      --  Lev, then an activation record pointer is needed, since there is at
      --  least one uplevel reference. This is computed by initially setting
      --  Uplevel_Ref to Lev for all subprograms. Then on the initial tree
      --  traversal, decreasing Uplevel_Ref for an explicit uplevel reference,
      --  and finally by doing a transitive closure that follows calls (if A
      --  calls B and B has an uplevel reference to level X, then A references
      --  level X indirectly).

      Declares_AREC : Boolean;
      --  This is set True for a subprogram which include the declarations
      --  for a local activation record to be passed on downward calls. It
      --  is set True for the target level of an uplevel reference, and for
      --  all intervening nested subprograms. For example, if a subprogram X
      --  at level 5 makes an uplevel reference to an entity declared in a
      --  level 2 subprogram, then the subprograms at levels 4,3,2 enclosing
      --  the level 5 subprogram will have this flag set True.

      Uents : Elist_Id;
      --  This is a list of entities declared in this subprogram which are
      --  uplevel referenced. It contains both objects (which will be put in
      --  the corresponding AREC activation record), and types. The types are
      --  not put in the AREC activation record, but referenced bounds (i.e.
      --  generated _FIRST and _LAST entites, and formal parameters) will be
      --  in the list in their own right.

      Last : SI_Type;
      --  This field is set only in the entry for the outer level subprogram
      --  in a nest, and records the last index in the Subp table for all the
      --  entries for subprograms in this nest.

      ARECnF : Entity_Id;
      --  This entity is defined for all subprograms which need an extra formal
      --  that contains a pointer to the activation record needed for uplevel
      --  references. ARECnF must be defined for any subprogram which has a
      --  direct or indirect uplevel reference (i.e. Reference_Level < Lev).

      ARECn   : Entity_Id;
      ARECnT  : Entity_Id;
      ARECnPT : Entity_Id;
      ARECnP  : Entity_Id;
      --  These AREC entities are defined only for subprograms for which we
      --  generate an activation record declaration, i.e. for subprograms for
      --  which the Declares_AREC flag is set True.

      ARECnU : Entity_Id;
      --  This AREC entity is the uplink component. It is other than Empty only
      --  for nested subprograms that declare an activation record as indicated
      --  by Declares_AREC being True, and which have uplevel references (Lev
      --  greater than Uplevel_Ref). It is the additional component in the
      --  activation record that references the ARECnF pointer (which points
      --  the activation record one level higher, thus forming the chain).

   end record;

   package Subps is new Table.Table (
     Table_Component_Type => Subp_Entry,
     Table_Index_Type     => SI_Type,
     Table_Low_Bound      => 1,
     Table_Initial        => 1000,
     Table_Increment      => 200,
     Table_Name           => "Unnest_Subps");
   --  Records the subprograms in the nest whose outer subprogram is Subp

   -----------------
   -- Subprograms --
   -----------------

   function Get_Level (Subp : Entity_Id; Sub : Entity_Id) return Nat;
   --  Sub is either Subp itself, or a subprogram nested within Subp. This
   --  function returns the level of nesting (Subp = 1, subprograms that
   --  are immediately nested within Subp = 2, etc.).

   function In_Synchronized_Unit (Subp : Entity_Id) return Boolean;
   --  Predicate to identify subprograms declared in task and protected types.
   --  These subprograms are called from outside the compilation and therefore
   --  must be considered reachable (and cannot be eliminated) because we must
   --  generate code for them.

   function Subp_Index (Sub : Entity_Id) return SI_Type;
   --  Given the entity for a subprogram, return corresponding Subp's index

   procedure Unnest_Subprograms (N : Node_Id);
   --  Called to unnest subprograms. If we are in unnest subprogram mode, this
   --  is the call that traverses the tree N and locates all the library-level
   --  subprograms with nested subprograms to process them.

end Exp_Unst;
