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 / sem_dist.ads < prev    next >
Text File  |  1996-09-28  |  14KB  |  269 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                             S E M _ D I S T                              --
  6. --                                                                          --
  7. --                                 S p e c                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.34 $                             --
  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. --  This package contains utility routines used for validation of the
  26. --  use of the categorization pragmas relevant to the distribution annexe.
  27.  
  28. with Types; use Types;
  29.  
  30. package Sem_Dist is
  31.  
  32.    procedure Append_System_RPC (N : Node_Id);
  33.    --  Given N, a N_Compilation_Unit node whose unit is package spec, if
  34.    --  unit is RCI or remote types then append System.RPC to Context_Items.
  35.    --  System.RPC is used in remote access to subprogram type declaration
  36.    --  processing, check Process_Remote_AST_Declaration for details.
  37.  
  38.    procedure Append_System_RPC_PI (N : Node_Id; L : Node_Id);
  39.    --  Given N, a N_Compilation_Unit node thatis withing a unit whose
  40.    --  N_Compilation_Unit node is L, where L is an RCI or remote types
  41.    --  unit, append System.RPC.Partition_Interface to its context items.
  42.    --  System.RPC.Partition_Interface is used in processing remote access
  43.    --  to subprogram type (in the call to Get_Local_Partition_Id.)
  44.  
  45.    procedure CW_Remote_Extension_Add_Receiver (N : Node_Id);
  46.    --  In case N, the (library) package body node or its corresponding spec
  47.    --  has classwide type remote extensions (check comments in following
  48.    --  function Is_Class_Wide_Type_Remote_Extension for definition) then
  49.    --  generates receiver subprogram for this type (extension). Receiver
  50.    --  is used to handle incoming remote dispatching calls.
  51.  
  52.    function Enclosing_Lib_Unit_Entity return Entity_Id;
  53.    --  Returns the entity of enclosing N_Compilation_Unit Node which is the
  54.    --  root of the current scope (which must not be Standard_Standard, and
  55.    --  the caller is responsible for ensuring this condition).
  56.  
  57.    function Enclosing_Lib_Unit_Node (N : Node_Id) return Node_Id;
  58.    --  Returns the enclosing N_Compilation_Unit Node that is the root
  59.    --  of a subtree containing N.
  60.  
  61.    procedure Generate_Stubs_Files (N : Node_Id);
  62.    --  Create the stubs files for a remote call interface package specification
  63.    --  or body. If the corresponding unit is a package declaration requiring
  64.    --  a body, then only the client stubs package body and the server stubs
  65.    --  package specification are generated. If it is a package body or a
  66.    --  package declaration which  does not require a body, the server stubs
  67.    --  package body is also generated.
  68.  
  69.    function Inside_Preelaborated_Unit return Boolean;
  70.    --  Determines if the current scope is within a preelaborated compilation
  71.    --  unit, that is one to which one of the pragmas Preelaborate, Pure,
  72.    --  Shared_Passive, Remote_Types, or inside a unit other than a package
  73.    --  body with pragma Remote_Call_Interface.
  74.  
  75.    function Inside_Pure_Unit return Boolean;
  76.    --  Determines if the current scope is within pure compilation unit,
  77.    --  that is, one to which the pragmas Pure is applied.
  78.  
  79.    function Inside_Remote_Call_Interface_Unit return Boolean;
  80.    --  Determines if the current scope is within a Remote Call Interface
  81.    --  compilation unit.
  82.  
  83.    function Inside_Remote_Types_Unit return Boolean;
  84.    --  Determines if the current scope is within a Remote Types compilation
  85.    --  unit.
  86.  
  87.    function Inside_Shared_Passive_Unit return Boolean;
  88.    --  Determines if the current scope is within a Shared Passive compilation
  89.    --  unit.
  90.  
  91.    function Inside_Subprogram_Task_Protected_Unit return Boolean;
  92.    --  Determines if the current scope is within a subprogram, task
  93.    --  or protected unit. Used to validate if the library unit is Pure
  94.    --  (RM 10.2.1(16)).
  95.  
  96.    function Inside_Subprogram_Unit return Boolean;
  97.    --  Determines if the current scope is within a subprogram compilation
  98.    --  unit (inside a subprogram declaration, subprogram body, or generic
  99.    --  subprogram declaration). The test is for appearing anywhere within
  100.    --  such a construct (that is it does not need to be directly within).
  101.  
  102.    function Is_Class_Wide_Type_Remote_Extension (N : Node_Id) return Boolean;
  103.    --  Return True if N is an extension of a root abstract-tagged-limited-
  104.    --  private-type and the root abstract-type is the designated type of
  105.    --  an RCI remote access-to-limited-class-wide-type.
  106.  
  107.    function Is_Remote_Access_To_Class_Wide_Type (E : Entity_Id) return Boolean;
  108.    --  Return True if E is a remote access-to-class-wide-limited_private type
  109.  
  110.    function Is_Remote_Access_To_Subprogram_Type
  111.      (E    : Entity_Id)
  112.       return Boolean;
  113.    --  Return True if E is a remote access to subprogram type.
  114.  
  115.    procedure Process_Remote_AST_Attribute (N : Node_Id; UN : Node_Id);
  116.    --  Given N, an access attribute reference node whose prefix is a
  117.    --  subprogram, in case prefix is a remote subprogram then rewrite
  118.    --  N with a N_Aggregate node whose Etype is a fat pointer type.
  119.    --  UN is the unanalyzed copy of N, used in rewriting.
  120.  
  121.    procedure Process_Remote_AST_Declaration (N : Node_Id);
  122.    --  Given N, an access to subprogram type declaration node in RCI or
  123.    --  remote types unit, build a new record (fat pointer) type declaration
  124.    --  using the old Defining_Identifier of N and a link to the old
  125.    --  declaration node N whose Defining_Identifier is changed.
  126.    --  We also construct declarations of two subprograms in the unit
  127.    --  specification which handle remote access to subprogram type
  128.    --  (fat pointer) dereference and the unit receiver that handles
  129.    --  remote calls (from remote access to subprogram type values.)
  130.  
  131.    function Remote_AST_E_Dereference
  132.      (P    : Node_Id;
  133.       UAN  : Node_Id)
  134.       return Boolean;
  135.    --  Given P, the analyzed prefix of an explicit dereference node, check
  136.    --  if it is of a remote internal fat pointer type (which has been
  137.    --  transformed from a remote access to subprogram type). If so, then
  138.    --  transform the the analyzed prefix node P into an Expanded_Name
  139.    --  which is the subprogram that handles dereference for the remote access
  140.    --  to subprogram type which is the Etype of the analyzed prefix P.
  141.    --  Also rewrite the argument list in the original explicit dereference
  142.    --  by prepending Expressions (Parent (P)) with UAN, the unanalyzed fat
  143.    --  pointer. Returns True if the transformation is carried out, else False.
  144.  
  145.    function Remote_AST_I_Dereference
  146.      (P    : Node_Id;
  147.       UAN  : Node_Id)
  148.       return Boolean;
  149.    --  Given P, the analyzed prefix of an indexed component node, check
  150.    --  if it is of a remote internal fat pointer type (which has been
  151.    --  transformed from a remote access to subprogram type). If so,
  152.    --  transform the the unanalyzed indexed component node UAN into a
  153.    --  new (implicit subprogram call) indexed component node which includes
  154.    --  the fat pointer as an argument. Returns True if this transformation
  155.    --  is carried out, else False.
  156.  
  157.    procedure Process_Remote_Access_Subprogram_Type (N : Node_Id);
  158.    --  Given N, a package declaration node, if it is an RCI unit with
  159.    --  declaration of remote access to subprogram type then define its
  160.    --  Read, Write and enumerate the list of remote subprograms.
  161.    --
  162.    --  The mechanism of such types works well in the case of dereferencing
  163.    --  a pointer (an access value) of such type initialized by 'Access
  164.    --  locally. For pointers passed across partition boundaries, this
  165.    --  procedure will construct the mechanism (Read, Write and enumeration
  166.    --  of remote subprograms) to complete the full functionality.
  167.    --
  168.    --  Write will translate an access value to an index (of integer type)
  169.    --  which represents the corresponding enumeration of the designated
  170.    --  remote subprogram.
  171.    --
  172.    --  Read will do the reverse translation, from index to a local pointer.
  173.    --  When dereferenced, since all pointers point to either subprograms in
  174.    --  receiver partition or subprograms in caller partitions (stub
  175.    --  subprogram), the expected result is correct.
  176.  
  177.    function Should_Declare_Partition_ID (L : List_Id) return Boolean;
  178.    --  Given a non-empty list L of the Visible_Declarations of the package
  179.    --  specification of a libbrary, unit, determines whether the package is
  180.    --  System.RPC or is categorized as pure. This is used to limit the
  181.    --  library package units that declare Predefined_Partition_Id to those
  182.    --  that really need to.
  183.  
  184.    procedure Set_Categorization_From_Following_Pragmas (N : Node_Id);
  185.    --  Since validation of categorization dependency is done during analyze
  186.    --  so categorization flags from following pragmas should be set before
  187.    --  validation begin. N is the N_Compilation_Unit node.
  188.  
  189.    procedure Validate_Access_Type_Declaration (T : Entity_Id; N : Node_Id);
  190.    --  Validate all constraints against declaration of access types in
  191.    --  categorized library units. Usually this is a violation in Pure unit,
  192.    --  Shared_Passive unit. N is the declaration node.
  193.  
  194.    procedure Validate_Categorization_Dependency (N : Node_Id; E : Entity_Id);
  195.    --  There are restrictions on lib unit that semantically depends on other
  196.    --  units (RM E.2(5), 10.2.1(11). This procedure checks the restrictions
  197.    --  on categorizations. N is the current unit node, and E is the current
  198.    --  library unit entity.
  199.  
  200.    procedure Validate_Non_Static_Call (N : Node_Id);
  201.    --  Non-static calls are not allowed during the elaboration of a
  202.    --  preelaborated unit. A call from inside a subprogram is however
  203.    --  always fine (RM 10.2.1(7)). This procedure validates this rule.
  204.    --  N is the call node.
  205.  
  206.    procedure Validate_Null_Statement_Sequence (N : Node_Id);
  207.    --  Given N, a package body node, check that the handled statement sequence
  208.    --  contains no statements other than null_statement. This from
  209.    --  RM 10.2.1(6).
  210.  
  211.    procedure Validate_Object_Declaration
  212.      (N   : Node_Id;
  213.       Id  : Entity_Id;
  214.       E   : Node_Id;
  215.       Odf : Node_Id;
  216.       T   : Entity_Id);
  217.    --  Validate all the constraints in a preelaborable lib unit against
  218.    --  an object declaration, including the creation of task object, etc.
  219.  
  220.    procedure Validate_RCI_Access_Object_Type_Declaration (T : Entity_Id);
  221.    --  Check validity of declaration if RCI unit. It should not contain
  222.    --  the declaration of an access-to-object type unless it is a
  223.    --  general access type that designates a class-wide limited
  224.    --  private type. There are also constraints about the primitive
  225.    --  subprograms of the class-wide type. RM E.2.3(14).
  226.  
  227.    procedure Validate_RCI_Limited_Type_Declaration (N : Node_Id);
  228.    --  Make sure that the visible part of an RCI unit does not contain
  229.    --  declaration of limited type (RM E.2.3(10)).
  230.  
  231.    procedure Validate_RCI_Nested_Generic_Declaration (N : Node_Id);
  232.    --  Make sure that the visible part of an RCI unit does not contain nested
  233.    --  generic declarations (RM E.2.3(11)). N is the compilation unit node.
  234.  
  235.    procedure Validate_RCI_Subprogram_Declaration (N : Node_Id);
  236.    --  Check for RCI unit subprogram declarations with respect to
  237.    --  in-lined subprogram and subprogram with access parameter or
  238.    --  limited type parameter without Read and Write.
  239.  
  240.    procedure Validate_Remote_Access_To_Class_Wide_Type (N : Node_Id);
  241.    --  Checks that Storage_Pool and Storage_Size attribute references are
  242.    --  not applied to remote access-to-class-wide types. And the expected
  243.    --  type for an allocator shall not be a remote access-to-class-wide
  244.    --  type. And a remote access-to-class-wide type shall not be an actual
  245.    --  parameter for a generic formal access type. RM E.2.3(22).
  246.  
  247.    procedure Validate_Remote_Type_Type_Conversion (N : Node_Id);
  248.    --  Check for remote-type type conversion constraints. First, a value of
  249.    --  a remote access-to-subprogram type can be converted only to another
  250.    --  type conformant remote access-to-subprogram type. Secondly, a value
  251.    --  of a remote access-to-class-wide type can be converted only to another
  252.    --  remote access-to-class-wide type (RM E.2.3(17,20)).
  253.  
  254.    procedure Validate_SP_Access_Object_Type_Decl (T : Entity_Id);
  255.    --  Check validity of declaration if shared passive unit. It should not
  256.    --  contain the declaration of an access-to-object type whose designated
  257.    --  type is a class-wide type ,task type or protected type. E.2.1(7).
  258.    --  T is the entity of the declared type.
  259.  
  260.    procedure Validate_Static_Object_Name (N : Node_Id);
  261.    --  In the elaboration code of a preelaborated library unit, check
  262.    --  that we do not have the evaluation of a primary that is a name of
  263.    --  an object, unless the name is a static expression (RM 10.2.1(8)).
  264.    --  Non-static constant and variable are the targets, generic parameters
  265.    --  are not included because the generic declaration and body are
  266.    --  preelaborable.
  267.  
  268. end Sem_Dist;
  269.