------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                             E X P _ S M E M                              --
--                                                                          --
--                                 B o d y                                  --
--                                                                          --
--          Copyright (C) 1998-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 Atree;          use Atree;
with Einfo;          use Einfo;
with Einfo.Entities; use Einfo.Entities;
with Einfo.Utils;    use Einfo.Utils;
with Elists;         use Elists;
with Exp_Ch7;        use Exp_Ch7;
with Exp_Ch9;        use Exp_Ch9;
with Exp_Tss;        use Exp_Tss;
with Exp_Util;       use Exp_Util;
with Nmake;          use Nmake;
with Namet;          use Namet;
with Nlists;         use Nlists;
with Rtsfind;        use Rtsfind;
with Sem;            use Sem;
with Sem_Aux;        use Sem_Aux;
with Sem_Util;       use Sem_Util;
with Sinfo;          use Sinfo;
with Sinfo.Nodes;    use Sinfo.Nodes;
with Sinfo.Utils;    use Sinfo.Utils;
with Snames;         use Snames;
with Stand;          use Stand;
with Stringt;        use Stringt;
with Tbuild;         use Tbuild;

package body Exp_Smem is

   Insert_Node : Node_Id;
   --  Node after which a write call is to be inserted

   -----------------------
   -- Local Subprograms --
   -----------------------

   procedure Add_Read (N : Node_Id; Call : Node_Id := Empty);
   --  Insert a Shared_Var_ROpen call for variable before node N, unless
   --  Call is a call to an init-proc, in which case the call is inserted
   --  after Call.

   procedure Add_Write_After (N : Node_Id);
   --  Insert a Shared_Var_WOpen call for variable after the node Insert_Node,
   --  as recorded by On_Lhs_Of_Assignment (where it points to the assignment
   --  statement) or Is_Out_Actual (where it points to the subprogram call).
   --  When Insert_Node is a function call, establish a transient scope around
   --  the expression, and insert the write as an after-action of the transient
   --  scope.

   procedure Build_Full_Name (E : Entity_Id; N : out String_Id);
   --  Build the fully qualified string name of a shared variable

   function On_Lhs_Of_Assignment (N : Node_Id) return Boolean;
   --  Determines if N is on the left hand of the assignment. This means that
   --  either it is a simple variable, or it is a record or array variable with
   --  a corresponding selected or indexed component on the left side of an
   --  assignment. If the result is True, then Insert_Node is set to point
   --  to the assignment

   function Is_Out_Actual (N : Node_Id) return Boolean;
   --  In a similar manner, this function determines if N appears as an OUT
   --  or IN OUT parameter to a procedure call. If the result is True, then
   --  Insert_Node is set to point to the call.

   function Build_Shared_Var_Proc_Call
     (Loc : Source_Ptr;
      E   : Node_Id;
      N   : Name_Id) return Node_Id;
   --  Build a call to support procedure N for shared object E (provided by the
   --  instance of System.Shared_Storage.Shared_Var_Procs associated to E).

   --------------------------------
   -- Build_Shared_Var_Proc_Call --
   --------------------------------

   function Build_Shared_Var_Proc_Call
     (Loc : Source_Ptr;
      E   : Entity_Id;
      N   : Name_Id) return Node_Id
   is
   begin
      return Make_Procedure_Call_Statement (Loc,
        Name => Make_Selected_Component (Loc,
          Prefix        =>
            New_Occurrence_Of (Shared_Var_Procs_Instance (E), Loc),
          Selector_Name => Make_Identifier (Loc, N)));
   end Build_Shared_Var_Proc_Call;

   --------------
   -- Add_Read --
   --------------

   procedure Add_Read (N : Node_Id; Call : Node_Id := Empty) is
      Loc : constant Source_Ptr := Sloc (N);
      Ent : constant Node_Id    := Entity (N);
      SVC : Node_Id;

   begin
      if Present (Shared_Var_Procs_Instance (Ent)) then
         SVC := Build_Shared_Var_Proc_Call (Loc, Ent, Name_Read);

         if Present (Call) and then Is_Init_Proc (Name (Call)) then
            Insert_After_And_Analyze (Call, SVC);
         else
            Insert_Action (N, SVC);
         end if;
      end if;
   end Add_Read;

   -------------------------------
   -- Add_Shared_Var_Lock_Procs --
   -------------------------------

   procedure Add_Shared_Var_Lock_Procs (N : Node_Id) is
      Loc : constant Source_Ptr := Sloc (N);
      Obj : constant Entity_Id  := Entity (Expression (First_Actual (N)));
      Vnm : String_Id;
      Vid : Entity_Id;
      Vde : Node_Id;
      Aft : constant List_Id := New_List;

      In_Transient : constant Boolean := Scope_Is_Transient;

      function Build_Shared_Var_Lock_Call (RE : RE_Id) return Node_Id;
      --  Return a procedure call statement for lock proc RTE

      --------------------------------
      -- Build_Shared_Var_Lock_Call --
      --------------------------------

      function Build_Shared_Var_Lock_Call (RE : RE_Id) return Node_Id is
      begin
         return
           Make_Procedure_Call_Statement (Loc,
             Name                   =>
               New_Occurrence_Of (RTE (RE), Loc),
             Parameter_Associations =>
               New_List (New_Occurrence_Of (Vid, Loc)));
      end Build_Shared_Var_Lock_Call;

   --  Start of processing for Add_Shared_Var_Lock_Procs

   begin
      --  Discussion of transient scopes: we need to have a transient scope
      --  to hold the required lock/unlock actions. Either the current scope
      --  is transient, in which case we reuse it, or we establish a new
      --  transient scope. If this is a function call with unconstrained
      --  return type, we can't introduce a transient scope here (because
      --  Wrap_Transient_Expression would need to declare a temporary with
      --  the unconstrained type outside of the transient block), but in that
      --  case we know that we have already established one at an outer level
      --  for secondary stack management purposes.

      --  If the lock/read/write/unlock actions for this object have already
      --  been emitted in the current scope, no need to perform them anew.

      if In_Transient
        and then Contains (Scope_Stack.Table (Scope_Stack.Last)
                             .Locked_Shared_Objects,
                           Obj)
      then
         return;
      end if;

      Build_Full_Name (Obj, Vnm);

      --  Declare a constant string to hold the name of the shared object.
      --  Note that this must occur outside of the transient scope, as the
      --  scope's finalizer needs to have access to this object. Also, it
      --  appears that GIGI does not support elaborating string literal
      --  subtypes in transient scopes.

      Vid := Make_Temporary (Loc, 'N', Obj);
      Vde :=
        Make_Object_Declaration (Loc,
          Defining_Identifier => Vid,
          Constant_Present    => True,
          Object_Definition   => New_Occurrence_Of (Standard_String, Loc),
          Expression          => Make_String_Literal (Loc, Vnm));

      --  Already in a transient scope. Make sure that we insert Vde outside
      --  that scope.

      if In_Transient then
         Insert_Before_And_Analyze (Node_To_Be_Wrapped, Vde);

      --  Not in a transient scope yet: insert Vde as an action on N prior to
      --  establishing one.

      else
         Insert_Action (N, Vde);
         Establish_Transient_Scope (N, Manage_Sec_Stack => False);
      end if;

      --  Mark object as locked in the current (transient) scope

      Append_New_Elmt
        (Obj,
         To => Scope_Stack.Table (Scope_Stack.Last).Locked_Shared_Objects);

      --  First insert the Lock call before

      Insert_Action (N, Build_Shared_Var_Lock_Call (RE_Shared_Var_Lock));

      --  Now, right after the Lock, insert a call to read the object

      Insert_Action (N, Build_Shared_Var_Proc_Call (Loc, Obj, Name_Read));

      --  For a procedure call only, insert the call to write the object prior
      --  to unlocking.

      if Nkind (N) = N_Procedure_Call_Statement then
         Append_To (Aft, Build_Shared_Var_Proc_Call (Loc, Obj, Name_Write));
      end if;

      --  Finally insert the Unlock call

      Append_To (Aft, Build_Shared_Var_Lock_Call (RE_Shared_Var_Unlock));

      --  Store cleanup actions in transient scope

      Store_Cleanup_Actions_In_Scope (Aft);

      --  If we have established a transient scope here, wrap it now

      if not In_Transient then
         if Nkind (N) = N_Procedure_Call_Statement then
            Wrap_Transient_Statement (N);
         else
            Wrap_Transient_Expression (N);
         end if;
      end if;
   end Add_Shared_Var_Lock_Procs;

   ---------------------
   -- Add_Write_After --
   ---------------------

   procedure Add_Write_After (N : Node_Id) is
      Ent : constant Entity_Id  := Entity (N);
      Loc : constant Source_Ptr := Sloc (N);
      Par : constant Node_Id    := Insert_Node;

   begin
      if Present (Shared_Var_Procs_Instance (Ent)) then
         if Nkind (Insert_Node) = N_Function_Call then
            Establish_Transient_Scope (Insert_Node, Manage_Sec_Stack => False);

            Store_After_Actions_In_Scope (New_List (
              Build_Shared_Var_Proc_Call (Loc, Ent, Name_Write)));
         else
            Insert_After_And_Analyze (Par,
              Build_Shared_Var_Proc_Call (Loc, Ent, Name_Write));
         end if;
      end if;
   end Add_Write_After;

   ---------------------
   -- Build_Full_Name --
   ---------------------

   procedure Build_Full_Name (E : Entity_Id; N : out String_Id) is

      procedure Build_Name (E : Entity_Id);
      --  This is a recursive routine used to construct the fully qualified
      --  string name of the package corresponding to the shared variable.

      ----------------
      -- Build_Name --
      ----------------

      procedure Build_Name (E : Entity_Id) is
      begin
         if Scope (E) /= Standard_Standard then
            Build_Name (Scope (E));
            Store_String_Char ('.');
         end if;

         Get_Decoded_Name_String (Chars (E));
         Store_String_Chars (Name_Buffer (1 .. Name_Len));
      end Build_Name;

   --  Start of processing for Build_Full_Name

   begin
      Start_String;
      Build_Name (E);
      N := End_String;
   end Build_Full_Name;

   ------------------------------------
   -- Expand_Shared_Passive_Variable --
   ------------------------------------

   procedure Expand_Shared_Passive_Variable (N : Node_Id) is
      Typ : constant Entity_Id := Etype (N);

   begin
      --  Nothing to do for protected or limited objects

      if Is_Limited_Type (Typ) or else Is_Concurrent_Type (Typ) then
         return;

      --  If we are on the left hand side of an assignment, then we add the
      --  write call after the assignment.

      elsif On_Lhs_Of_Assignment (N) then
         Add_Write_After (N);

      --  If we are a parameter for an out or in out formal, then in general
      --  we do:

      --    read
      --    call
      --    write

      --  but in the special case of a call to an init proc, we need to first
      --  call the init proc (to set discriminants), then read (to possibly
      --  set other components), then write (to record the updated components
      --  to the backing store):

      --    init-proc-call
      --    read
      --    write

      elsif Is_Out_Actual (N) then

         --  Note: For an init proc call, Add_Read inserts just after the
         --  call node, and we want to have first the read, then the write,
         --  so we need to first Add_Write_After, then Add_Read.

         Add_Write_After (N);
         Add_Read (N, Call => Insert_Node);

      --  All other cases are simple reads

      else
         Add_Read (N);
      end if;
   end Expand_Shared_Passive_Variable;

   -------------------
   -- Is_Out_Actual --
   -------------------

   function Is_Out_Actual (N : Node_Id) return Boolean is
      Formal : Entity_Id;
      Call   : Node_Id;

   begin
      Find_Actual (N, Formal, Call);

      if No (Formal) then
         return False;

      else
         if Ekind (Formal) in E_Out_Parameter | E_In_Out_Parameter then
            Insert_Node := Call;
            return True;
         else
            return False;
         end if;
      end if;
   end Is_Out_Actual;

   ---------------------------
   -- Make_Shared_Var_Procs --
   ---------------------------

   function Make_Shared_Var_Procs (N : Node_Id) return Node_Id is
      Loc     : constant Source_Ptr := Sloc (N);
      Ent     : constant Entity_Id  := Defining_Identifier (N);
      Typ     : constant Entity_Id  := Etype (Ent);
      Vnm     : String_Id;
      Obj     : Node_Id;
      Obj_Typ : Entity_Id;

      After : constant Node_Id := Next (N);
      --  Node located right after N originally (after insertion of the SV
      --  procs this node is right after the last inserted node).

      SVP_Instance : constant Entity_Id := Make_Defining_Identifier (Loc,
                       Chars => New_External_Name (Chars (Ent), 'G'));
      --  Instance of Shared_Storage.Shared_Var_Procs associated with Ent

      Instantiation : Node_Id;
      --  Package instantiation node for SVP_Instance

   --  Start of processing for Make_Shared_Var_Procs

   begin
      Build_Full_Name (Ent, Vnm);

      --  We turn off Shared_Passive during construction and analysis of the
      --  generic package instantiation, to avoid improper attempts to process
      --  the variable references within these instantiation.

      Set_Is_Shared_Passive (Ent, False);

      --  Construct generic package instantiation

      --  package varG is new Shared_Var_Procs (typ, var, "pkg.var");

      Obj     := New_Occurrence_Of (Ent, Loc);
      Obj_Typ := Typ;
      if Is_Concurrent_Type (Typ) then
         Obj     := Convert_Concurrent (N => Obj, Typ => Typ);
         Obj_Typ := Corresponding_Record_Type (Typ);
      end if;

      Instantiation :=
        Make_Package_Instantiation (Loc,
          Defining_Unit_Name   => SVP_Instance,
          Name                 =>
            New_Occurrence_Of (RTE (RE_Shared_Var_Procs), Loc),
          Generic_Associations => New_List (
            Make_Generic_Association (Loc,
              Explicit_Generic_Actual_Parameter =>
                New_Occurrence_Of (Obj_Typ, Loc)),
            Make_Generic_Association (Loc,
              Explicit_Generic_Actual_Parameter => Obj),
            Make_Generic_Association (Loc,
              Explicit_Generic_Actual_Parameter =>
                Make_String_Literal (Loc, Vnm))));

      Insert_After_And_Analyze (N, Instantiation);

      Set_Is_Shared_Passive (Ent, True);
      Set_Shared_Var_Procs_Instance
        (Ent, Defining_Entity (Instance_Spec (Instantiation)));

      --  Return last node before After

      declare
         Nod : Node_Id := Next (N);

      begin
         while Next (Nod) /= After loop
            Next (Nod);
         end loop;

         return Nod;
      end;
   end Make_Shared_Var_Procs;

   --------------------------
   -- On_Lhs_Of_Assignment --
   --------------------------

   function On_Lhs_Of_Assignment (N : Node_Id) return Boolean is
      P : constant Node_Id := Parent (N);

   begin
      if Nkind (P) = N_Assignment_Statement then
         if N = Name (P) then
            Insert_Node := P;
            return True;
         else
            return False;
         end if;

      elsif Nkind (P) in N_Indexed_Component | N_Selected_Component
        and then N = Prefix (P)
      then
         return On_Lhs_Of_Assignment (P);

      else
         return False;
      end if;
   end On_Lhs_Of_Assignment;

end Exp_Smem;
