------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                             S E M _ D I S T                              --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--          Copyright (C) 1992-2008, 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.      --
--                                                                          --
------------------------------------------------------------------------------

--  Semantic processing for distribution annex facilities

with Snames; use Snames;
with Types;  use Types;

package Sem_Dist is

   function Get_PCS_Name return PCS_Names;
   --  Return the name of a literal of type DSA_Implementation_Name in package
   --  System.Partition_Interface indicating what PCS is currently in use.

   function Get_PCS_Version return Int;
   --  Return the version number of the PCS API implemented by the PCS.
   --  The consistency of this version with the one expected by Exp_Dist
   --  (Exp_Dist.PCS_Version_Number) in Rtsfind.RTE.Check_RPC.
   --  If no PCS version information is available, 0 is returned.

   procedure Add_Stub_Constructs (N : Node_Id);
   --  Create the stubs constructs for a remote call interface package
   --  specification or body or for a shared passive specification. For caller
   --  stubs, expansion takes place directly in the specification and no
   --  additional compilation unit is created.

   function Build_RAS_Primitive_Specification
     (Subp_Spec          : Node_Id;
      Remote_Object_Type : Node_Id) return Node_Id;
   --  Build a subprogram specification for the primitive operation of the
   --  Remote_Object_Type used to implement a remote access-to-subprogram
   --  type whose parameter profile is given by specification Subp_Spec.

   function Is_All_Remote_Call (N : Node_Id) return Boolean;
   --  Check whether a function or procedure call should be expanded into
   --  a remote call, because the entity is declared in a package decl that
   --  is not currently in scope, and the proper pragmas apply.

   procedure Process_Partition_Id (N : Node_Id);
   --  Replace attribute reference with call to runtime function. The result
   --  is converted to the context type, because the attribute yields a
   --  universal integer value.

   procedure Process_Remote_AST_Attribute (N : Node_Id; New_Type : Entity_Id);
   --  Given N, an access attribute reference node whose prefix is a
   --  remote subprogram, rewrite N with a call to a conversion function
   --  whose return type is New_Type.

   procedure Process_Remote_AST_Declaration (N : Node_Id);
   --  Given N, an access to subprogram type declaration node in RCI or remote
   --  types unit, build a new record (fat pointer) type declaration using the
   --  old Defining_Identifier of N and a link to the old declaration node N
   --  whose Defining_Identifier is changed. We also construct declarations of
   --  two subprograms in the unit specification which handle remote access to
   --  subprogram type (fat pointer) dereference and the unit receiver that
   --  handles remote calls (from remote access to subprogram type values.)

   function Remote_AST_E_Dereference (P : Node_Id) return Boolean;
   --  If the prefix of an explicit dereference is a record type that
   --  represent the fat pointer for an Remote access to subprogram, in the
   --  context of a call, rewrite the enclosing call node into remote call,
   --  the first actual of which is the fat pointer. Return true if the
   --  context is correct and the transformation took place.

   function Remote_AST_I_Dereference (P : Node_Id) return Boolean;
   --  If P is a record type that represents the fat pointer for a remote
   --  access to subprogram, and P is the prefix of a call, insert an explicit
   --  dereference and perform the transformation described for the previous
   --  function.

   function Remote_AST_Null_Value
     (N   : Node_Id;
      Typ : Entity_Id) return Boolean;
   --  If N is a null value and Typ a remote access to subprogram type, this
   --  function will check if null needs to be replaced with an aggregate and
   --  will return True in this case. Otherwise, it will return False.

   function Package_Specification_Of_Scope (E : Entity_Id) return Node_Id;
   --  Return the N_Package_Specification corresponding to a scope E

   function Is_RACW_Stub_Type_Operation (Op : Entity_Id) return Boolean;
   --  True when Op is a primitive operation of an RACW stub type

end Sem_Dist;
