OSDN Git Service

PR target/50678
[pf3gnuchains/gcc-fork.git] / gcc / ada / exp_dist.adb
index 04982a3..82d5898 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2009, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2010, 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- --
@@ -41,6 +41,7 @@ with Sem_Aux;  use Sem_Aux;
 with Sem_Cat;  use Sem_Cat;
 with Sem_Ch3;  use Sem_Ch3;
 with Sem_Ch8;  use Sem_Ch8;
+with Sem_Ch12; use Sem_Ch12;
 with Sem_Dist; use Sem_Dist;
 with Sem_Eval; use Sem_Eval;
 with Sem_Util; use Sem_Util;
@@ -64,10 +65,10 @@ package body Exp_Dist is
 
    --  is built. This type has two properties:
 
-   --    1) Since it has the same structure than RACW_Stub_Type, it can
+   --    1) Since it has the same structure as RACW_Stub_Type, it can
    --       be converted to and from this type to make it suitable for
    --       System.Partition_Interface.Get_Unique_Remote_Pointer in order
-   --       to avoid memory leaks when the same remote object arrive on the
+   --       to avoid memory leaks when the same remote object arrives on the
    --       same partition through several paths;
 
    --    2) It also has the same dispatching table as the designated type D,
@@ -99,7 +100,7 @@ package body Exp_Dist is
 
    function Hash (F : Name_Id) return Hash_Index;
    --  The generation of subprogram identifiers requires an overload counter
-   --  to be associated with each remote subprogram names. These counters are
+   --  to be associated with each remote subprogram name. These counters are
    --  maintained in a hash table on name ids.
 
    type Subprogram_Identifiers is record
@@ -170,10 +171,9 @@ package body Exp_Dist is
    function Build_Remote_Subprogram_Proxy_Type
      (Loc            : Source_Ptr;
       ACR_Expression : Node_Id) return Node_Id;
-   --  Build and return a tagged record type definition for an RCI
-   --  subprogram proxy type.
-   --  ACR_Expression is use as the initialization value for
-   --  the All_Calls_Remote component.
+   --  Build and return a tagged record type definition for an RCI subprogram
+   --  proxy type. ACR_Expression is used as the initialization value for the
+   --  All_Calls_Remote component.
 
    function Build_Get_Unique_RP_Call
      (Loc       : Source_Ptr;
@@ -200,13 +200,13 @@ package body Exp_Dist is
       New_Name                 : Name_Id   := No_Name) return Node_Id;
    --  Build the calling stub for a given subprogram with the subprogram ID
    --  being Subp_Id. If Stub_Type is given, then the "addr" field of
-   --  parameters of this type will be marshalled instead of the object
-   --  itself. It will then be converted into Stub_Type before performing
-   --  the real call. If Dynamically_Asynchronous is True, then it will be
-   --  computed at run time whether the call is asynchronous or not.
-   --  Otherwise, the value of the formal Asynchronous will be used.
-   --  If Locator is not Empty, it will be used instead of RCI_Cache. If
-   --  New_Name is given, then it will be used instead of the original name.
+   --  parameters of this type will be marshalled instead of the object itself.
+   --  It will then be converted into Stub_Type before performing the real
+   --  call. If Dynamically_Asynchronous is True, then it will be computed at
+   --  run time whether the call is asynchronous or not. Otherwise, the value
+   --  of the formal Asynchronous will be used. If Locator is not Empty, it
+   --  will be used instead of RCI_Cache. If New_Name is given, then it will
+   --  be used instead of the original name.
 
    function Build_RPC_Receiver_Specification
      (RPC_Receiver      : Entity_Id;
@@ -226,14 +226,12 @@ package body Exp_Dist is
    --  In either case, this means stubs cannot contain a default-initialized
    --  object declaration of such type.
 
-   procedure Add_Calling_Stubs_To_Declarations
-     (Pkg_Spec : Node_Id;
-      Decls    : List_Id);
+   procedure Add_Calling_Stubs_To_Declarations (Pkg_Spec : Node_Id);
    --  Add calling stubs to the declarative part
 
    function Could_Be_Asynchronous (Spec : Node_Id) return Boolean;
    --  Return True if nothing prevents the program whose specification is
-   --  given to be asynchronous (i.e. no out parameter).
+   --  given to be asynchronous (i.e. no [IN] OUT parameters).
 
    function Pack_Entity_Into_Stream_Access
      (Loc    : Source_Ptr;
@@ -916,27 +914,146 @@ package body Exp_Dist is
    --  since this require separate mechanisms ('Input is a function while
    --  'Read is a procedure).
 
+   generic
+      with procedure Process_Subprogram_Declaration (Decl : Node_Id);
+      --  Generate calling or receiving stub for this subprogram declaration
+
+   procedure Build_Package_Stubs (Pkg_Spec : Node_Id);
+   --  Recursively visit the given RCI Package_Specification, calling
+   --  Process_Subprogram_Declaration for each remote subprogram.
+
+   -------------------------
+   -- Build_Package_Stubs --
+   -------------------------
+
+   procedure Build_Package_Stubs (Pkg_Spec : Node_Id) is
+      Decls : constant List_Id := Visible_Declarations (Pkg_Spec);
+      Decl  : Node_Id;
+
+      procedure Visit_Nested_Pkg (Nested_Pkg_Decl : Node_Id);
+      --  Recurse for the given nested package declaration
+
+      -----------------------
+      -- Visit_Nested_Spec --
+      -----------------------
+
+      procedure Visit_Nested_Pkg (Nested_Pkg_Decl : Node_Id) is
+         Nested_Pkg_Spec : constant Node_Id := Specification (Nested_Pkg_Decl);
+      begin
+         Push_Scope (Scope_Of_Spec (Nested_Pkg_Spec));
+         Build_Package_Stubs (Nested_Pkg_Spec);
+         Pop_Scope;
+      end Visit_Nested_Pkg;
+
+   --  Start of processing for Build_Package_Stubs
+
+   begin
+      Decl := First (Decls);
+      while Present (Decl) loop
+         case Nkind (Decl) is
+            when N_Subprogram_Declaration =>
+
+               --  Note: we test Comes_From_Source on Spec, not Decl, because
+               --  in the case of a subprogram instance, only the specification
+               --  (not the declaration) is marked as coming from source.
+
+               if Comes_From_Source (Specification (Decl)) then
+                  Process_Subprogram_Declaration (Decl);
+               end if;
+
+            when N_Package_Declaration =>
+
+               --  Case of a nested package or package instantiation coming
+               --  from source. Note that the anonymous wrapper package for
+               --  subprogram instances is not flagged Is_Generic_Instance at
+               --  this point, so there is a distinct circuit to handle them
+               --  (see case N_Subprogram_Instantiation below).
+
+               declare
+                  Pkg_Ent : constant Entity_Id :=
+                              Defining_Unit_Name (Specification (Decl));
+               begin
+                  if Comes_From_Source (Decl)
+                    or else
+                      (Is_Generic_Instance (Pkg_Ent)
+                         and then Comes_From_Source
+                                    (Get_Package_Instantiation_Node (Pkg_Ent)))
+                  then
+                     Visit_Nested_Pkg (Decl);
+                  end if;
+               end;
+
+            when N_Subprogram_Instantiation =>
+
+               --  The subprogram declaration for an instance of a generic
+               --  subprogram is wrapped in a package that does not come from
+               --  source, so we need to explicitly traverse it here.
+
+               if Comes_From_Source (Decl) then
+                  Visit_Nested_Pkg (Instance_Spec (Decl));
+               end if;
+
+            when others =>
+               null;
+         end case;
+         Next (Decl);
+      end loop;
+   end Build_Package_Stubs;
+
    ---------------------------------------
    -- Add_Calling_Stubs_To_Declarations --
    ---------------------------------------
 
-   procedure Add_Calling_Stubs_To_Declarations
-     (Pkg_Spec : Node_Id;
-      Decls    : List_Id)
-   is
+   procedure Add_Calling_Stubs_To_Declarations (Pkg_Spec : Node_Id) is
+      Loc   : constant Source_Ptr := Sloc (Pkg_Spec);
+
       Current_Subprogram_Number : Int := First_RCI_Subprogram_Id;
       --  Subprogram id 0 is reserved for calls received from
       --  remote access-to-subprogram dereferences.
 
-      Current_Declaration : Node_Id;
-      Loc                 : constant Source_Ptr := Sloc (Pkg_Spec);
-      RCI_Instantiation   : Node_Id;
-      Subp_Stubs          : Node_Id;
-      Subp_Str            : String_Id;
+      RCI_Instantiation : Node_Id;
+
+      procedure Visit_Subprogram (Decl : Node_Id);
+      --  Generate calling stub for one remote subprogram
+
+      ----------------------
+      -- Visit_Subprogram --
+      ----------------------
+
+      procedure Visit_Subprogram (Decl : Node_Id) is
+         Loc        : constant Source_Ptr := Sloc (Decl);
+         Spec       : constant Node_Id := Specification (Decl);
+         Subp_Stubs : Node_Id;
+
+         Subp_Str : String_Id;
+         pragma Warnings (Off, Subp_Str);
+
+      begin
+         Assign_Subprogram_Identifier
+           (Defining_Unit_Name (Spec), Current_Subprogram_Number, Subp_Str);
+
+         Subp_Stubs :=
+           Build_Subprogram_Calling_Stubs
+             (Vis_Decl     => Decl,
+              Subp_Id      =>
+                Build_Subprogram_Id (Loc, Defining_Unit_Name (Spec)),
+              Asynchronous =>
+                Nkind (Spec) = N_Procedure_Specification
+                  and then Is_Asynchronous (Defining_Unit_Name (Spec)));
+
+         Append_To (List_Containing (Decl), Subp_Stubs);
+         Analyze (Subp_Stubs);
+
+         Current_Subprogram_Number := Current_Subprogram_Number + 1;
+      end Visit_Subprogram;
 
-      pragma Warnings (Off, Subp_Str);
+      procedure Visit_Spec is new Build_Package_Stubs (Visit_Subprogram);
+
+   --  Start of processing for Add_Calling_Stubs_To_Declarations
 
    begin
+      Push_Scope (Scope_Of_Spec (Pkg_Spec));
+
       --  The first thing added is an instantiation of the generic package
       --  System.Partition_Interface.RCI_Locator with the name of this remote
       --  package. This will act as an interface with the name server to
@@ -946,49 +1063,21 @@ package body Exp_Dist is
       RCI_Instantiation := RCI_Package_Locator (Loc, Pkg_Spec);
       RCI_Cache         := Defining_Unit_Name (RCI_Instantiation);
 
-      Append_To (Decls, RCI_Instantiation);
+      Append_To (Visible_Declarations (Pkg_Spec), RCI_Instantiation);
       Analyze (RCI_Instantiation);
 
       --  For each subprogram declaration visible in the spec, we do build a
       --  body. We also increment a counter to assign a different Subprogram_Id
-      --  to each subprograms. The receiving stubs processing do use the same
+      --  to each subprogram. The receiving stubs processing uses the same
       --  mechanism and will thus assign the same Id and do the correct
       --  dispatching.
 
       Overload_Counter_Table.Reset;
       PolyORB_Support.Reserve_NamingContext_Methods;
 
-      Current_Declaration := First (Visible_Declarations (Pkg_Spec));
-      while Present (Current_Declaration) loop
-         if Nkind (Current_Declaration) = N_Subprogram_Declaration
-           and then Comes_From_Source (Current_Declaration)
-         then
-            Assign_Subprogram_Identifier
-              (Defining_Unit_Name (Specification (Current_Declaration)),
-               Current_Subprogram_Number,
-               Subp_Str);
-
-            Subp_Stubs :=
-              Build_Subprogram_Calling_Stubs (
-                Vis_Decl     => Current_Declaration,
-                Subp_Id      =>
-                  Build_Subprogram_Id (Loc,
-                    Defining_Unit_Name (Specification (Current_Declaration))),
-                Asynchronous =>
-                  Nkind (Specification (Current_Declaration)) =
-                    N_Procedure_Specification
-                  and then
-                    Is_Asynchronous (Defining_Unit_Name (Specification
-                      (Current_Declaration))));
-
-            Append_To (Decls, Subp_Stubs);
-            Analyze (Subp_Stubs);
-
-            Current_Subprogram_Number := Current_Subprogram_Number + 1;
-         end if;
+      Visit_Spec (Pkg_Spec);
 
-         Next (Current_Declaration);
-      end loop;
+      Pop_Scope;
    end Add_Calling_Stubs_To_Declarations;
 
    -----------------------------
@@ -1294,9 +1383,7 @@ package body Exp_Dist is
       end if;
 
       if not Is_RAS then
-         RPC_Receiver :=
-           Make_Defining_Identifier (Loc,
-             Chars => New_Internal_Name ('P'));
+         RPC_Receiver := Make_Temporary (Loc, 'P');
 
          Specific_Build_RPC_Receiver_Body
            (RPC_Receiver => RPC_Receiver,
@@ -1317,13 +1404,17 @@ package body Exp_Dist is
       end if;
 
       --  Build callers, receivers for every primitive operations and a RPC
-      --  receiver for this type.
+      --  receiver for this type. Note that we use Direct_Primitive_Operations,
+      --  not Primitive_Operations, because we really want just the primitives
+      --  of the tagged type itself, and in the case of a tagged synchronized
+      --  type we do not want to get the primitives of the corresponding
+      --  record type).
 
-      if Present (Primitive_Operations (Designated_Type)) then
+      if Present (Direct_Primitive_Operations (Designated_Type)) then
          Overload_Counter_Table.Reset;
 
          Current_Primitive_Elmt :=
-           First_Elmt (Primitive_Operations (Designated_Type));
+           First_Elmt (Direct_Primitive_Operations (Designated_Type));
          while Current_Primitive_Elmt /= No_Elmt loop
             Current_Primitive := Node (Current_Primitive_Elmt);
 
@@ -1339,8 +1430,9 @@ package body Exp_Dist is
                  Is_TSS (Current_Primitive, TSS_Stream_Input)  or else
                  Is_TSS (Current_Primitive, TSS_Stream_Output) or else
                  Is_TSS (Current_Primitive, TSS_Stream_Read)   or else
-                 Is_TSS (Current_Primitive, TSS_Stream_Write)  or else
-                 Is_Predefined_Interface_Primitive (Current_Primitive))
+                 Is_TSS (Current_Primitive, TSS_Stream_Write)
+                   or else
+                     Is_Predefined_Interface_Primitive (Current_Primitive))
               and then not Is_Hidden (Current_Primitive)
             then
                --  The first thing to do is build an up-to-date copy of the
@@ -1349,13 +1441,7 @@ package body Exp_Dist is
                --  primitive may have been inherited, go back the alias chain
                --  until the real primitive has been found.
 
-               Current_Primitive_Alias := Current_Primitive;
-               while Present (Alias (Current_Primitive_Alias)) loop
-                  pragma Assert
-                    (Current_Primitive_Alias
-                      /= Alias (Current_Primitive_Alias));
-                  Current_Primitive_Alias := Alias (Current_Primitive_Alias);
-               end loop;
+               Current_Primitive_Alias := Ultimate_Alias (Current_Primitive);
 
                --  Copy the spec from the original declaration for the purpose
                --  of declaring an overriding subprogram: we need to replace
@@ -1422,8 +1508,8 @@ package body Exp_Dist is
                        RACW_Type                => Stub_Elements.RACW_Type,
                        Parent_Primitive         => Current_Primitive);
 
-                  Current_Receiver := Defining_Unit_Name (
-                    Specification (Current_Receiver_Body));
+                  Current_Receiver :=
+                    Defining_Unit_Name (Specification (Current_Receiver_Body));
 
                   Append_To (Body_Decls, Current_Receiver_Body);
 
@@ -1530,9 +1616,7 @@ package body Exp_Dist is
       Param_Assoc : constant List_Id := New_List;
       Stmts       : constant List_Id := New_List;
 
-      RAS_Parameter : constant Entity_Id :=
-                        Make_Defining_Identifier (Loc,
-                          Chars => New_Internal_Name ('P'));
+      RAS_Parameter : constant Entity_Id := Make_Temporary (Loc, 'P');
 
       Is_Function : constant Boolean :=
                       Nkind (Type_Def) = N_Access_Function_Definition;
@@ -1898,8 +1982,7 @@ package body Exp_Dist is
       end if;
 
       Existing := False;
-      Stub_Type :=
-        Make_Defining_Identifier (Loc, Chars => New_Internal_Name ('S'));
+      Stub_Type := Make_Temporary (Loc, 'S');
       Set_Ekind (Stub_Type, E_Record_Type);
       Set_Is_RACW_Stub_Type (Stub_Type);
       Stub_Type_Access :=
@@ -2059,8 +2142,8 @@ package body Exp_Dist is
 
             declare
                Constant_Object : constant Entity_Id :=
-                                   Make_Defining_Identifier (Loc,
-                                     New_Internal_Name ('P'));
+                                   Make_Temporary (Loc, 'P');
+
             begin
                Set_Defining_Identifier
                  (Last (Decls), Constant_Object);
@@ -2430,9 +2513,10 @@ package body Exp_Dist is
    --  Start of processing for Build_Subprogram_Calling_Stubs
 
    begin
-      Subp_Spec := Copy_Specification (Loc,
-        Spec     => Specification (Vis_Decl),
-        New_Name => New_Name);
+      Subp_Spec :=
+        Copy_Specification (Loc,
+          Spec     => Specification (Vis_Decl),
+          New_Name => New_Name);
 
       if Locator = Empty then
          RCI_Locator := RCI_Cache;
@@ -2823,12 +2907,8 @@ package body Exp_Dist is
 
    procedure Expand_Calling_Stubs_Bodies (Unit_Node : Node_Id) is
       Spec  : constant Node_Id := Specification (Unit_Node);
-      Decls : constant List_Id := Visible_Declarations (Spec);
    begin
-      Push_Scope (Scope_Of_Spec (Spec));
-      Add_Calling_Stubs_To_Declarations
-        (Specification (Unit_Node), Decls);
-      Pop_Scope;
+      Add_Calling_Stubs_To_Declarations (Spec);
    end Expand_Calling_Stubs_Bodies;
 
    -----------------------------------
@@ -3020,9 +3100,7 @@ package body Exp_Dist is
          Remote_Statements : List_Id;
          --  Various parts of the procedure
 
-         Pnam              : constant Entity_Id :=
-                               Make_Defining_Identifier
-                                 (Loc, New_Internal_Name ('R'));
+         Pnam              : constant Entity_Id := Make_Temporary (Loc, 'R');
          Asynchronous_Flag : constant Entity_Id :=
                                Asynchronous_Flags_Table.Get (RACW_Type);
          pragma Assert (Present (Asynchronous_Flag));
@@ -3064,16 +3142,11 @@ package body Exp_Dist is
 
          --  Prepare local identifiers
 
-         Source_Partition :=
-           Make_Defining_Identifier (Loc, New_Internal_Name ('P'));
-         Source_Receiver  :=
-           Make_Defining_Identifier (Loc, New_Internal_Name ('S'));
-         Source_Address   :=
-           Make_Defining_Identifier (Loc, New_Internal_Name ('P'));
-         Local_Stub       :=
-           Make_Defining_Identifier (Loc, New_Internal_Name ('L'));
-         Stubbed_Result   :=
-           Make_Defining_Identifier (Loc, New_Internal_Name ('S'));
+         Source_Partition := Make_Temporary (Loc, 'P');
+         Source_Receiver  := Make_Temporary (Loc, 'S');
+         Source_Address   := Make_Temporary (Loc, 'P');
+         Local_Stub       := Make_Temporary (Loc, 'L');
+         Stubbed_Result   := Make_Temporary (Loc, 'S');
 
          --  Generate object declarations
 
@@ -3275,8 +3348,7 @@ package body Exp_Dist is
          Remote_Statements : List_Id;
          Null_Statements   : List_Id;
 
-         Pnam : constant Entity_Id :=
-                  Make_Defining_Identifier (Loc, New_Internal_Name ('R'));
+         Pnam : constant Entity_Id := Make_Temporary (Loc, 'R');
 
       begin
          Build_Stream_Procedure
@@ -3456,25 +3528,16 @@ package body Exp_Dist is
          Proc_Decls      : List_Id;
          Proc_Statements : List_Id;
 
-         Origin : constant Entity_Id :=
-                    Make_Defining_Identifier (Loc,
-                      Chars => New_Internal_Name ('P'));
+         Origin : constant Entity_Id := Make_Temporary (Loc, 'P');
 
          --  Additional local variables for the local case
 
-         Proxy_Addr : constant Entity_Id :=
-                        Make_Defining_Identifier (Loc,
-                          Chars => New_Internal_Name ('P'));
+         Proxy_Addr : constant Entity_Id := Make_Temporary (Loc, 'P');
 
          --  Additional local variables for the remote case
 
-         Local_Stub : constant Entity_Id :=
-                        Make_Defining_Identifier (Loc,
-                          Chars => New_Internal_Name ('L'));
-
-         Stub_Ptr : constant Entity_Id :=
-                      Make_Defining_Identifier (Loc,
-                        Chars => New_Internal_Name ('S'));
+         Local_Stub : constant Entity_Id := Make_Temporary (Loc, 'L');
+         Stub_Ptr   : constant Entity_Id := Make_Temporary (Loc, 'S');
 
          function Set_Field
            (Field_Name : Name_Id;
@@ -3700,32 +3763,26 @@ package body Exp_Dist is
          Request_Parameter : Node_Id;
 
          Pkg_RPC_Receiver            : constant Entity_Id :=
-                                         Make_Defining_Identifier (Loc,
-                                           New_Internal_Name ('H'));
+                                         Make_Temporary (Loc, 'H');
          Pkg_RPC_Receiver_Statements : List_Id;
          Pkg_RPC_Receiver_Cases      : constant List_Id := New_List;
          Pkg_RPC_Receiver_Body       : Node_Id;
          --  A Pkg_RPC_Receiver is built to decode the request
 
-         Lookup_RAS_Info : constant Entity_Id :=
-                             Make_Defining_Identifier (Loc,
-                               Chars => New_Internal_Name ('R'));
-         --  A remote subprogram is created to allow peers to look up
-         --  RAS information using subprogram ids.
+         Lookup_RAS      : Node_Id;
+         Lookup_RAS_Info : constant Entity_Id := Make_Temporary (Loc, 'R');
+         --  A remote subprogram is created to allow peers to look up RAS
+         --  information using subprogram ids.
 
          Subp_Id    : Entity_Id;
          Subp_Index : Entity_Id;
          --  Subprogram_Id as read from the incoming stream
 
-         Current_Declaration       : Node_Id;
-         Current_Subprogram_Number : Int := First_RCI_Subprogram_Id;
-         Current_Stubs             : Node_Id;
-
-         Subp_Info_Array : constant Entity_Id :=
-                             Make_Defining_Identifier (Loc,
-                               Chars => New_Internal_Name ('I'));
+         Current_Subp_Number : Int := First_RCI_Subprogram_Id;
+         Current_Stubs       : Node_Id;
 
-         Subp_Info_List : constant List_Id := New_List;
+         Subp_Info_Array : constant Entity_Id := Make_Temporary (Loc, 'I');
+         Subp_Info_List  : constant List_Id := New_List;
 
          Register_Pkg_Actuals : constant List_Id := New_List;
 
@@ -3740,6 +3797,9 @@ package body Exp_Dist is
          --  associating Subprogram_Number with the subprogram declared
          --  by Declaration, for which we have receiving stubs in Stubs.
 
+         procedure Visit_Subprogram (Decl : Node_Id);
+         --  Generate receiving stub for one remote subprogram
+
          ---------------------
          -- Append_Stubs_To --
          ---------------------
@@ -3763,6 +3823,76 @@ package body Exp_Dist is
                         New_Occurrence_Of (Request_Parameter, Loc))))));
          end Append_Stubs_To;
 
+         ----------------------
+         -- Visit_Subprogram --
+         ----------------------
+
+         procedure Visit_Subprogram (Decl : Node_Id) is
+            Loc      : constant Source_Ptr := Sloc (Decl);
+            Spec     : constant Node_Id    := Specification (Decl);
+            Subp_Def : constant Entity_Id  := Defining_Unit_Name (Spec);
+
+            Subp_Val : String_Id;
+            pragma Warnings (Off, Subp_Val);
+
+         begin
+            --  Build receiving stub
+
+            Current_Stubs :=
+              Build_Subprogram_Receiving_Stubs
+                (Vis_Decl     => Decl,
+                 Asynchronous =>
+                   Nkind (Spec) = N_Procedure_Specification
+                     and then Is_Asynchronous (Subp_Def));
+
+            Append_To (Decls, Current_Stubs);
+            Analyze (Current_Stubs);
+
+            --  Build RAS proxy
+
+            Add_RAS_Proxy_And_Analyze (Decls,
+              Vis_Decl           => Decl,
+              All_Calls_Remote_E => All_Calls_Remote_E,
+              Proxy_Object_Addr  => Proxy_Object_Addr);
+
+            --  Compute distribution identifier
+
+            Assign_Subprogram_Identifier
+              (Subp_Def, Current_Subp_Number,  Subp_Val);
+
+            pragma Assert (Current_Subp_Number = Get_Subprogram_Id (Subp_Def));
+
+            --  Add subprogram descriptor (RCI_Subp_Info) to the subprograms
+            --  table for this receiver. This aggregate must be kept consistent
+            --  with the declaration of RCI_Subp_Info in
+            --  System.Partition_Interface.
+
+            Append_To (Subp_Info_List,
+              Make_Component_Association (Loc,
+                Choices    => New_List (
+                  Make_Integer_Literal (Loc, Current_Subp_Number)),
+
+                Expression =>
+                  Make_Aggregate (Loc,
+                    Component_Associations => New_List (
+
+                      --  Addr =>
+
+                      Make_Component_Association (Loc,
+                        Choices    =>
+                          New_List (Make_Identifier (Loc, Name_Addr)),
+                        Expression =>
+                          New_Occurrence_Of (Proxy_Object_Addr, Loc))))));
+
+            Append_Stubs_To (Pkg_RPC_Receiver_Cases,
+                             Stubs             => Current_Stubs,
+                             Subprogram_Number => Current_Subp_Number);
+
+            Current_Subp_Number := Current_Subp_Number + 1;
+         end Visit_Subprogram;
+
+         procedure Visit_Spec is new Build_Package_Stubs (Visit_Subprogram);
+
       --  Start of processing for Add_Receiving_Stubs_To_Declarations
 
       begin
@@ -3822,12 +3952,11 @@ package body Exp_Dist is
                                  Prefix        => Request_Parameter,
                                  Selector_Name => Name_Params))))),
 
-                     Selector_Name =>
-                       Make_Identifier (Loc, Name_Subp_Id))))));
+                     Selector_Name => Make_Identifier (Loc, Name_Subp_Id))))));
 
          --  Build a subprogram for RAS information lookups
 
-         Current_Declaration :=
+         Lookup_RAS :=
            Make_Subprogram_Declaration (Loc,
              Specification =>
                Make_Function_Specification (Loc,
@@ -3843,19 +3972,17 @@ package body Exp_Dist is
                        New_Occurrence_Of (RTE (RE_Subprogram_Id), Loc))),
                  Result_Definition =>
                    New_Occurrence_Of (RTE (RE_Unsigned_64), Loc)));
-
-         Append_To (Decls, Current_Declaration);
-         Analyze (Current_Declaration);
+         Append_To (Decls, Lookup_RAS);
+         Analyze (Lookup_RAS);
 
          Current_Stubs := Build_Subprogram_Receiving_Stubs
-           (Vis_Decl     => Current_Declaration,
+           (Vis_Decl     => Lookup_RAS,
             Asynchronous => False);
          Append_To (Decls, Current_Stubs);
          Analyze (Current_Stubs);
 
          Append_Stubs_To (Pkg_RPC_Receiver_Cases,
-           Stubs       =>
-             Current_Stubs,
+           Stubs             => Current_Stubs,
            Subprogram_Number => 1);
 
          --  For each subprogram, the receiving stub will be built and a
@@ -3868,85 +3995,7 @@ package body Exp_Dist is
 
          Overload_Counter_Table.Reset;
 
-         Current_Declaration := First (Visible_Declarations (Pkg_Spec));
-         while Present (Current_Declaration) loop
-            if Nkind (Current_Declaration) = N_Subprogram_Declaration
-              and then Comes_From_Source (Current_Declaration)
-            then
-               declare
-                  Loc : constant Source_Ptr := Sloc (Current_Declaration);
-                  --  While specifically processing Current_Declaration, use
-                  --  its Sloc as the location of all generated nodes.
-
-                  Subp_Def : constant Entity_Id :=
-                               Defining_Unit_Name
-                                 (Specification (Current_Declaration));
-
-                  Subp_Val : String_Id;
-                  pragma Warnings (Off, Subp_Val);
-
-               begin
-                  --  Build receiving stub
-
-                  Current_Stubs :=
-                    Build_Subprogram_Receiving_Stubs
-                      (Vis_Decl     => Current_Declaration,
-                       Asynchronous =>
-                         Nkind (Specification (Current_Declaration)) =
-                             N_Procedure_Specification
-                           and then Is_Asynchronous (Subp_Def));
-
-                  Append_To (Decls, Current_Stubs);
-                  Analyze (Current_Stubs);
-
-                  --  Build RAS proxy
-
-                  Add_RAS_Proxy_And_Analyze (Decls,
-                    Vis_Decl           => Current_Declaration,
-                    All_Calls_Remote_E => All_Calls_Remote_E,
-                    Proxy_Object_Addr  => Proxy_Object_Addr);
-
-                  --  Compute distribution identifier
-
-                  Assign_Subprogram_Identifier
-                    (Subp_Def,
-                     Current_Subprogram_Number,
-                     Subp_Val);
-
-                  pragma Assert
-                    (Current_Subprogram_Number = Get_Subprogram_Id (Subp_Def));
-
-                  --  Add subprogram descriptor (RCI_Subp_Info) to the
-                  --  subprograms table for this receiver. The aggregate
-                  --  below must be kept consistent with the declaration
-                  --  of type RCI_Subp_Info in System.Partition_Interface.
-
-                  Append_To (Subp_Info_List,
-                    Make_Component_Association (Loc,
-                      Choices => New_List (
-                        Make_Integer_Literal (Loc,
-                          Current_Subprogram_Number)),
-
-                      Expression =>
-                        Make_Aggregate (Loc,
-                          Component_Associations => New_List (
-                            Make_Component_Association (Loc,
-                              Choices => New_List (
-                                Make_Identifier (Loc, Name_Addr)),
-                              Expression =>
-                                New_Occurrence_Of (
-                                  Proxy_Object_Addr, Loc))))));
-
-                  Append_Stubs_To (Pkg_RPC_Receiver_Cases,
-                    Stubs             => Current_Stubs,
-                    Subprogram_Number => Current_Subprogram_Number);
-               end;
-
-               Current_Subprogram_Number := Current_Subprogram_Number + 1;
-            end if;
-
-            Next (Current_Declaration);
-         end loop;
+         Visit_Spec (Pkg_Spec);
 
          --  If we receive an invalid Subprogram_Id, it is best to do nothing
          --  rather than raising an exception since we do not want someone
@@ -4166,8 +4215,7 @@ package body Exp_Dist is
          --  well as the declaration of Result. For a function call, 'Input is
          --  always used to read the result even if it is constrained.
 
-         Stream_Parameter :=
-           Make_Defining_Identifier (Loc, New_Internal_Name ('S'));
+         Stream_Parameter := Make_Temporary (Loc, 'S');
 
          Append_To (Decls,
            Make_Object_Declaration (Loc,
@@ -4183,8 +4231,7 @@ package body Exp_Dist is
                        New_List (Make_Integer_Literal (Loc, 0))))));
 
          if not Is_Known_Asynchronous then
-            Result_Parameter :=
-              Make_Defining_Identifier (Loc, New_Internal_Name ('R'));
+            Result_Parameter := Make_Temporary (Loc, 'R');
 
             Append_To (Decls,
               Make_Object_Declaration (Loc,
@@ -4199,8 +4246,7 @@ package body Exp_Dist is
                         Constraints =>
                           New_List (Make_Integer_Literal (Loc, 0))))));
 
-            Exception_Return_Parameter :=
-              Make_Defining_Identifier (Loc, New_Internal_Name ('E'));
+            Exception_Return_Parameter := Make_Temporary (Loc, 'E');
 
             Append_To (Decls,
               Make_Object_Declaration (Loc,
@@ -4319,8 +4365,7 @@ package body Exp_Dist is
                   --  type and push it in the stream after the regular
                   --  parameters.
 
-                  Extra_Parameter := Make_Defining_Identifier
-                                       (Loc, New_Internal_Name ('P'));
+                  Extra_Parameter := Make_Temporary (Loc, 'P');
 
                   Append_To (Decls,
                      Make_Object_Declaration (Loc,
@@ -4557,7 +4602,7 @@ package body Exp_Dist is
              (RPC_Receiver      => RPC_Receiver,
               Request_Parameter => Request);
 
-         Subp_Id    := Make_Defining_Identifier (Loc, New_Internal_Name ('P'));
+         Subp_Id    := Make_Temporary (Loc, 'P');
          Subp_Index := Subp_Id;
 
          --  Subp_Id may not be a constant, because in the case of the RPC
@@ -4601,9 +4646,10 @@ package body Exp_Dist is
          Controlling_Parameter : Entity_Id) return RPC_Target
       is
          Target_Info : RPC_Target (PCS_Kind => Name_GARLIC_DSA);
+
       begin
-         Target_Info.Partition :=
-           Make_Defining_Identifier (Loc, New_Internal_Name ('P'));
+         Target_Info.Partition := Make_Temporary (Loc, 'P');
+
          if Present (Controlling_Parameter) then
             Append_To (Decls,
               Make_Object_Declaration (Loc,
@@ -4708,10 +4754,9 @@ package body Exp_Dist is
             begin
                RPC_Receiver_Decl :=
                  Make_Subprogram_Declaration (Loc,
-                   Build_RPC_Receiver_Specification (
-                     RPC_Receiver      => Make_Defining_Identifier (Loc,
-                                            New_Internal_Name ('R')),
-                     Request_Parameter => RPC_Receiver_Request));
+                   Build_RPC_Receiver_Specification
+                     (RPC_Receiver      => Make_Temporary (Loc, 'R'),
+                      Request_Parameter => RPC_Receiver_Request));
             end;
          end if;
       end Build_Stub_Type;
@@ -4730,9 +4775,7 @@ package body Exp_Dist is
       is
          Loc : constant Source_Ptr := Sloc (Vis_Decl);
 
-         Request_Parameter : constant Entity_Id :=
-                               Make_Defining_Identifier (Loc,
-                                 New_Internal_Name ('R'));
+         Request_Parameter : constant Entity_Id := Make_Temporary (Loc, 'R');
          --  Formal parameter for receiving stubs: a descriptor for an incoming
          --  request.
 
@@ -4785,8 +4828,7 @@ package body Exp_Dist is
          end if;
 
          if Dynamically_Asynchronous then
-            Dynamic_Async :=
-              Make_Defining_Identifier (Loc, New_Internal_Name ('S'));
+            Dynamic_Async := Make_Temporary (Loc, 'S');
          else
             Dynamic_Async := Empty;
          end if;
@@ -4831,9 +4873,7 @@ package body Exp_Dist is
                Need_Extra_Constrained : Boolean;
                --  True when an Extra_Constrained actual is required
 
-               Object : constant Entity_Id :=
-                          Make_Defining_Identifier (Loc,
-                            New_Internal_Name ('P'));
+               Object : constant Entity_Id := Make_Temporary (Loc, 'P');
 
                Expr : Node_Id := Empty;
 
@@ -5052,9 +5092,8 @@ package body Exp_Dist is
             declare
                Etyp   : constant Entity_Id :=
                           Etype (Result_Definition (Specification (Vis_Decl)));
-               Result : constant Node_Id   :=
-                          Make_Defining_Identifier (Loc,
-                             New_Internal_Name ('R'));
+               Result : constant Node_Id   := Make_Temporary (Loc, 'R');
+
             begin
                Inner_Decls := New_List (
                  Make_Object_Declaration (Loc,
@@ -5140,8 +5179,7 @@ package body Exp_Dist is
             --  exception occurrence is copied into the output stream and
             --  no other output parameter is written.
 
-            Excep_Choice :=
-              Make_Defining_Identifier (Loc, New_Internal_Name ('E'));
+            Excep_Choice := Make_Temporary (Loc, 'E');
 
             Excep_Code := New_List (
               Make_Attribute_Reference (Loc,
@@ -5172,8 +5210,7 @@ package body Exp_Dist is
 
          Subp_Spec :=
            Make_Procedure_Specification (Loc,
-             Defining_Unit_Name       =>
-               Make_Defining_Identifier (Loc, New_Internal_Name ('F')),
+             Defining_Unit_Name       => Make_Temporary (Loc, 'F'),
 
              Parameter_Specifications => New_List (
                Make_Parameter_Specification (Loc,
@@ -5309,10 +5346,10 @@ package body Exp_Dist is
    begin
       return
         Make_Subprogram_Body (Loc,
-          Specification              => Make_Function_Specification (Loc,
-            Defining_Unit_Name =>
-              Make_Defining_Identifier (Loc, New_Internal_Name ('S')),
-            Result_Definition  => New_Occurrence_Of (Var_Type, Loc)),
+          Specification              =>
+            Make_Function_Specification (Loc,
+              Defining_Unit_Name => Make_Temporary (Loc, 'S'),
+              Result_Definition  => New_Occurrence_Of (Var_Type, Loc)),
           Declarations               => No_List,
           Handled_Statement_Sequence =>
             Make_Handled_Sequence_Of_Statements (Loc, New_List (
@@ -5395,8 +5432,7 @@ package body Exp_Dist is
    --------------------
 
    function Make_Tag_Check (Loc : Source_Ptr; N : Node_Id) return Node_Id is
-      Occ : constant Entity_Id :=
-              Make_Defining_Identifier (Loc, New_Internal_Name ('E'));
+      Occ : constant Entity_Id := Make_Temporary (Loc, 'E');
 
    begin
       return Make_Block_Statement (Loc,
@@ -5588,7 +5624,7 @@ package body Exp_Dist is
                --  Name
 
                 Make_String_Literal (Loc,
-                  Full_Qualified_Name (Desig)),
+                  Fully_Qualified_Name_String (Desig)),
 
                --  Handler
 
@@ -5763,8 +5799,7 @@ package body Exp_Dist is
                         Make_Defining_Identifier (Loc, Name_R);
          --  Various parts of the procedure
 
-         Pnam : constant Entity_Id := Make_Defining_Identifier (Loc,
-                                        New_Internal_Name ('R'));
+         Pnam : constant Entity_Id := Make_Temporary (Loc, 'R');
 
          Is_RAS : constant Boolean := not Comes_From_Source (RACW_Type);
 
@@ -5883,10 +5918,8 @@ package body Exp_Dist is
          RACW_Parameter : constant Entity_Id :=
                             Make_Defining_Identifier (Loc, Name_R);
 
-         Reference : constant Entity_Id :=
-                       Make_Defining_Identifier (Loc, New_Internal_Name ('R'));
-         Any       : constant Entity_Id :=
-                       Make_Defining_Identifier (Loc, New_Internal_Name ('A'));
+         Reference : constant Entity_Id := Make_Temporary (Loc, 'R');
+         Any       : constant Entity_Id := Make_Temporary (Loc, 'A');
 
       begin
          Func_Spec :=
@@ -5937,7 +5970,7 @@ package body Exp_Dist is
                    Unchecked_Convert_To (RTE (RE_Address),
                      New_Occurrence_Of (RACW_Parameter, Loc)),
                    Make_String_Literal (Loc,
-                     Strval => Full_Qualified_Name
+                     Strval => Fully_Qualified_Name_String
                                  (Etype (Designated_Type (RACW_Type)))),
                    Build_Stub_Tag (Loc, RACW_Type),
                    New_Occurrence_Of (Boolean_Literals (Is_RAS), Loc),
@@ -6075,8 +6108,7 @@ package body Exp_Dist is
          Attr_Decl : Node_Id;
 
          Statements : constant List_Id := New_List;
-         Pnam : constant Entity_Id :=
-                  Make_Defining_Identifier (Loc, New_Internal_Name ('R'));
+         Pnam : constant Entity_Id := Make_Temporary (Loc, 'R');
 
          function Stream_Parameter return Node_Id;
          function Object return Node_Id;
@@ -6134,7 +6166,7 @@ package body Exp_Dist is
                  Parameter_Associations => New_List (
                    Unchecked_Convert_To (RTE (RE_Address), Object),
                   Make_String_Literal (Loc,
-                    Strval => Full_Qualified_Name
+                    Strval => Fully_Qualified_Name_String
                                 (Etype (Designated_Type (RACW_Type)))),
                   Build_Stub_Tag (Loc, RACW_Type),
                   New_Occurrence_Of (Boolean_Literals (Is_RAS), Loc),
@@ -6234,16 +6266,10 @@ package body Exp_Dist is
            Make_Defining_Identifier (Loc, Name_A);
          --  For the call to Get_Local_Address
 
+         Local_Stub : constant Entity_Id := Make_Temporary (Loc, 'L');
+         Stub_Ptr   : constant Entity_Id := Make_Temporary (Loc, 'S');
          --  Additional local variables for the remote case
 
-         Local_Stub : constant Entity_Id :=
-                        Make_Defining_Identifier (Loc,
-                          Chars => New_Internal_Name ('L'));
-
-         Stub_Ptr : constant Entity_Id :=
-                      Make_Defining_Identifier (Loc,
-                        Chars => New_Internal_Name ('S'));
-
          function Set_Field
            (Field_Name : Name_Id;
             Value      : Node_Id) return Node_Id;
@@ -6513,8 +6539,7 @@ package body Exp_Dist is
                Make_Aggregate (Loc,
                  Component_Associations => New_List (
                    Make_Component_Association (Loc,
-                     Choices => New_List (
-                       Make_Identifier (Loc, Name_Ras)),
+                     Choices => New_List (Make_Identifier (Loc, Name_Ras)),
                      Expression =>
                        PolyORB_Support.Helpers.Build_From_Any_Call (
                          Underlying_RACW_Type (RAS_Type),
@@ -6555,12 +6580,8 @@ package body Exp_Dist is
 
          Func_Spec : Node_Id;
 
-         Any            : constant Entity_Id :=
-                            Make_Defining_Identifier (Loc,
-                              Chars => New_Internal_Name ('A'));
-         RAS_Parameter  : constant Entity_Id :=
-                            Make_Defining_Identifier (Loc,
-                              Chars => New_Internal_Name ('R'));
+         Any            : constant Entity_Id := Make_Temporary (Loc, 'A');
+         RAS_Parameter  : constant Entity_Id := Make_Temporary (Loc, 'R');
          RACW_Parameter : constant Node_Id :=
                             Make_Selected_Component (Loc,
                               Prefix        => RAS_Parameter,
@@ -6676,8 +6697,7 @@ package body Exp_Dist is
          Loc : constant Source_Ptr := Sloc (Pkg_Spec);
 
          Pkg_RPC_Receiver            : constant Entity_Id :=
-                                         Make_Defining_Identifier (Loc,
-                                           New_Internal_Name ('H'));
+                                         Make_Temporary (Loc, 'H');
          Pkg_RPC_Receiver_Object     : Node_Id;
          Pkg_RPC_Receiver_Body       : Node_Id;
          Pkg_RPC_Receiver_Decls      : List_Id;
@@ -6698,28 +6718,19 @@ package body Exp_Dist is
          --  from the request structure, or the local subprogram address (in
          --  case of a RAS).
 
-         Is_Local : constant Entity_Id :=
-                      Make_Defining_Identifier (Loc,
-                        Chars => New_Internal_Name ('L'));
+         Is_Local : constant Entity_Id := Make_Temporary (Loc, 'L');
 
-         Local_Address : constant Entity_Id :=
-                           Make_Defining_Identifier (Loc,
-                             Chars => New_Internal_Name ('A'));
+         Local_Address : constant Entity_Id := Make_Temporary (Loc, 'A');
          --  Address of a local subprogram designated by a reference
          --  corresponding to a RAS.
 
          Dispatch_On_Address : constant List_Id := New_List;
          Dispatch_On_Name    : constant List_Id := New_List;
 
-         Current_Declaration       : Node_Id;
-         Current_Stubs             : Node_Id;
-         Current_Subprogram_Number : Int := First_RCI_Subprogram_Id;
+         Current_Subp_Number : Int := First_RCI_Subprogram_Id;
 
-         Subp_Info_Array : constant Entity_Id :=
-                             Make_Defining_Identifier (Loc,
-                               Chars => New_Internal_Name ('I'));
-
-         Subp_Info_List : constant List_Id := New_List;
+         Subp_Info_Array : constant Entity_Id := Make_Temporary (Loc, 'I');
+         Subp_Info_List  : constant List_Id := New_List;
 
          Register_Pkg_Actuals : constant List_Id := New_List;
 
@@ -6740,6 +6751,9 @@ package body Exp_Dist is
          --  object, used in the context of calls through remote
          --  access-to-subprogram types.
 
+         procedure Visit_Subprogram (Decl : Node_Id);
+         --  Generate receiving stub for one remote subprogram
+
          ---------------------
          -- Append_Stubs_To --
          ---------------------
@@ -6803,6 +6817,109 @@ package body Exp_Dist is
                     Make_Integer_Literal (Loc, Subp_Number)))));
          end Append_Stubs_To;
 
+         ----------------------
+         -- Visit_Subprogram --
+         ----------------------
+
+         procedure Visit_Subprogram (Decl : Node_Id) is
+            Loc      : constant Source_Ptr := Sloc (Decl);
+            Spec     : constant Node_Id    := Specification (Decl);
+            Subp_Def : constant Entity_Id  := Defining_Unit_Name (Spec);
+
+            Subp_Val : String_Id;
+
+            Subp_Dist_Name : constant Entity_Id :=
+                               Make_Defining_Identifier (Loc,
+                                 Chars =>
+                                   New_External_Name
+                                     (Related_Id   => Chars (Subp_Def),
+                                      Suffix       => 'D',
+                                      Suffix_Index => -1));
+
+            Current_Stubs  : Node_Id;
+            Proxy_Obj_Addr : Entity_Id;
+
+         begin
+            --  Build receiving stub
+
+            Current_Stubs :=
+              Build_Subprogram_Receiving_Stubs
+                (Vis_Decl     => Decl,
+                 Asynchronous => Nkind (Spec) = N_Procedure_Specification
+                                   and then Is_Asynchronous (Subp_Def));
+
+            Append_To (Decls, Current_Stubs);
+            Analyze (Current_Stubs);
+
+            --  Build RAS proxy
+
+            Add_RAS_Proxy_And_Analyze (Decls,
+              Vis_Decl           => Decl,
+              All_Calls_Remote_E => All_Calls_Remote_E,
+              Proxy_Object_Addr  => Proxy_Obj_Addr);
+
+            --  Compute distribution identifier
+
+            Assign_Subprogram_Identifier
+              (Subp_Def, Current_Subp_Number, Subp_Val);
+
+            pragma Assert
+              (Current_Subp_Number = Get_Subprogram_Id (Subp_Def));
+
+            Append_To (Decls,
+              Make_Object_Declaration (Loc,
+                Defining_Identifier => Subp_Dist_Name,
+                Constant_Present    => True,
+                Object_Definition   =>
+                  New_Occurrence_Of (Standard_String, Loc),
+                Expression          =>
+                  Make_String_Literal (Loc, Subp_Val)));
+            Analyze (Last (Decls));
+
+            --  Add subprogram descriptor (RCI_Subp_Info) to the subprograms
+            --  table for this receiver. The aggregate below must be kept
+            --  consistent with the declaration of RCI_Subp_Info in
+            --  System.Partition_Interface.
+
+            Append_To (Subp_Info_List,
+              Make_Component_Association (Loc,
+                Choices    =>
+                  New_List (Make_Integer_Literal (Loc, Current_Subp_Number)),
+
+                Expression =>
+                  Make_Aggregate (Loc,
+                    Expressions => New_List (
+
+                      --  Name =>
+
+                      Make_Attribute_Reference (Loc,
+                        Prefix         =>
+                          New_Occurrence_Of (Subp_Dist_Name, Loc),
+                        Attribute_Name => Name_Address),
+
+                      --  Name_Length =>
+
+                      Make_Attribute_Reference (Loc,
+                        Prefix         =>
+                          New_Occurrence_Of (Subp_Dist_Name, Loc),
+                        Attribute_Name => Name_Length),
+
+                      --  Addr =>
+
+                      New_Occurrence_Of (Proxy_Obj_Addr, Loc)))));
+
+            Append_Stubs_To (Pkg_RPC_Receiver_Cases,
+              Declaration     => Decl,
+              Stubs           => Current_Stubs,
+              Subp_Number     => Current_Subp_Number,
+              Subp_Dist_Name  => Subp_Dist_Name,
+              Subp_Proxy_Addr => Proxy_Obj_Addr);
+
+            Current_Subp_Number := Current_Subp_Number + 1;
+         end Visit_Subprogram;
+
+         procedure Visit_Spec is new Build_Package_Stubs (Visit_Subprogram);
+
       --  Start of processing for Add_Receiving_Stubs_To_Declarations
 
       begin
@@ -6863,111 +6980,7 @@ package body Exp_Dist is
          Overload_Counter_Table.Reset;
          Reserve_NamingContext_Methods;
 
-         Current_Declaration := First (Visible_Declarations (Pkg_Spec));
-         while Present (Current_Declaration) loop
-            if Nkind (Current_Declaration) = N_Subprogram_Declaration
-              and then Comes_From_Source (Current_Declaration)
-            then
-               declare
-                  Loc : constant Source_Ptr := Sloc (Current_Declaration);
-                  --  While specifically processing Current_Declaration, use
-                  --  its Sloc as the location of all generated nodes.
-
-                  Subp_Def : constant Entity_Id :=
-                               Defining_Unit_Name
-                                 (Specification (Current_Declaration));
-
-                  Subp_Val : String_Id;
-
-                  Subp_Dist_Name : constant Entity_Id :=
-                                     Make_Defining_Identifier (Loc,
-                                       Chars =>
-                                         New_External_Name
-                                           (Related_Id   => Chars (Subp_Def),
-                                            Suffix       => 'D',
-                                            Suffix_Index => -1));
-
-                  Proxy_Object_Addr : Entity_Id;
-
-               begin
-                  --  Build receiving stub
-
-                  Current_Stubs :=
-                    Build_Subprogram_Receiving_Stubs
-                      (Vis_Decl     => Current_Declaration,
-                       Asynchronous =>
-                         Nkind (Specification (Current_Declaration)) =
-                             N_Procedure_Specification
-                           and then Is_Asynchronous (Subp_Def));
-
-                  Append_To (Decls, Current_Stubs);
-                  Analyze (Current_Stubs);
-
-                  --  Build RAS proxy
-
-                  Add_RAS_Proxy_And_Analyze (Decls,
-                    Vis_Decl           => Current_Declaration,
-                    All_Calls_Remote_E => All_Calls_Remote_E,
-                    Proxy_Object_Addr  => Proxy_Object_Addr);
-
-                  --  Compute distribution identifier
-
-                  Assign_Subprogram_Identifier
-                    (Subp_Def,
-                     Current_Subprogram_Number,
-                     Subp_Val);
-
-                  pragma Assert
-                    (Current_Subprogram_Number = Get_Subprogram_Id (Subp_Def));
-
-                  Append_To (Decls,
-                    Make_Object_Declaration (Loc,
-                      Defining_Identifier => Subp_Dist_Name,
-                      Constant_Present    => True,
-                      Object_Definition   =>
-                        New_Occurrence_Of (Standard_String, Loc),
-                      Expression          =>
-                        Make_String_Literal (Loc, Subp_Val)));
-                  Analyze (Last (Decls));
-
-                  --  Add subprogram descriptor (RCI_Subp_Info) to the
-                  --  subprograms table for this receiver. The aggregate
-                  --  below must be kept consistent with the declaration
-                  --  of type RCI_Subp_Info in System.Partition_Interface.
-
-                  Append_To (Subp_Info_List,
-                    Make_Component_Association (Loc,
-                      Choices => New_List (
-                        Make_Integer_Literal (Loc, Current_Subprogram_Number)),
-
-                      Expression =>
-                        Make_Aggregate (Loc,
-                          Expressions => New_List (
-                            Make_Attribute_Reference (Loc,
-                              Prefix =>
-                                New_Occurrence_Of (Subp_Dist_Name, Loc),
-                              Attribute_Name => Name_Address),
-
-                            Make_Attribute_Reference (Loc,
-                              Prefix         =>
-                                New_Occurrence_Of (Subp_Dist_Name, Loc),
-                              Attribute_Name => Name_Length),
-
-                            New_Occurrence_Of (Proxy_Object_Addr, Loc)))));
-
-                  Append_Stubs_To (Pkg_RPC_Receiver_Cases,
-                    Declaration     => Current_Declaration,
-                    Stubs           => Current_Stubs,
-                    Subp_Number     => Current_Subprogram_Number,
-                    Subp_Dist_Name  => Subp_Dist_Name,
-                    Subp_Proxy_Addr => Proxy_Object_Addr);
-               end;
-
-               Current_Subprogram_Number := Current_Subprogram_Number + 1;
-            end if;
-
-            Next (Current_Declaration);
-         end loop;
+         Visit_Spec (Pkg_Spec);
 
          Append_To (Decls,
            Make_Object_Declaration (Loc,
@@ -7074,8 +7087,7 @@ package body Exp_Dist is
 
          Pkg_RPC_Receiver_Object :=
            Make_Object_Declaration (Loc,
-             Defining_Identifier =>
-               Make_Defining_Identifier (Loc, New_Internal_Name ('R')),
+             Defining_Identifier => Make_Temporary (Loc, 'R'),
              Aliased_Present     => True,
              Object_Definition   => New_Occurrence_Of (RTE (RE_Servant), Loc));
          Append_To (Decls, Pkg_RPC_Receiver_Object);
@@ -7164,8 +7176,7 @@ package body Exp_Dist is
       is
          Loc : constant Source_Ptr := Sloc (Nod);
 
-         Request : constant Entity_Id :=
-                     Make_Defining_Identifier (Loc, New_Internal_Name ('R'));
+         Request : constant Entity_Id := Make_Temporary (Loc, 'R');
          --  The request object constructed by these stubs
          --  Could we use Name_R instead??? (see GLADE client stubs)
 
@@ -7173,7 +7184,7 @@ package body Exp_Dist is
            (RE      : RE_Id;
             Actuals : List_Id := New_List) return Node_Id;
          --  Generate a procedure call statement calling RE with the given
-         --  actuals. Request is appended to the list.
+         --  actuals. Request'Access is appended to the list.
 
          ---------------------------
          -- Make_Request_RTE_Call --
@@ -7184,7 +7195,10 @@ package body Exp_Dist is
             Actuals : List_Id := New_List) return Node_Id
          is
          begin
-            Append_To (Actuals, New_Occurrence_Of (Request, Loc));
+            Append_To (Actuals,
+              Make_Attribute_Reference (Loc,
+                Prefix         => New_Occurrence_Of (Request, Loc),
+                Attribute_Name => Name_Access));
             return Make_Procedure_Call_Statement (Loc,
                      Name                   =>
                        New_Occurrence_Of (RTE (RE), Loc),
@@ -7244,13 +7258,11 @@ package body Exp_Dist is
          Append_To (Decls,
            Make_Object_Declaration (Loc,
              Defining_Identifier => Request,
-             Aliased_Present     => False,
+             Aliased_Present     => True,
              Object_Definition   =>
-                 New_Occurrence_Of (RTE (RE_Request_Access), Loc)));
+               New_Occurrence_Of (RTE (RE_Request), Loc)));
 
-         Result :=
-           Make_Defining_Identifier (Loc,
-             Chars => New_Internal_Name ('R'));
+         Result := Make_Temporary (Loc, 'R');
 
          if Is_Function then
             Result_TC :=
@@ -7286,8 +7298,7 @@ package body Exp_Dist is
                      Expression => Make_Integer_Literal (Loc, 0))))));
 
          if not Is_Known_Asynchronous then
-            Exception_Return_Parameter :=
-              Make_Defining_Identifier (Loc, New_Internal_Name ('E'));
+            Exception_Return_Parameter := Make_Temporary (Loc, 'E');
 
             Append_To (Decls,
               Make_Object_Declaration (Loc,
@@ -7301,8 +7312,7 @@ package body Exp_Dist is
 
          --  Initialize and fill in arguments list
 
-         Arguments :=
-           Make_Defining_Identifier (Loc, New_Internal_Name ('A'));
+         Arguments := Make_Temporary (Loc, 'A');
          Declare_Create_NVList (Loc, Arguments, Decls, Statements);
 
          Current_Parameter := First (Ordered_Parameters_List);
@@ -7337,9 +7347,7 @@ package body Exp_Dist is
                                   Is_Constrained (Etyp)
                                     or else Is_Elementary_Type (Etyp);
 
-                  Any : constant Entity_Id :=
-                          Make_Defining_Identifier (Loc,
-                            New_Internal_Name ('A'));
+                  Any : constant Entity_Id := Make_Temporary (Loc, 'A');
 
                   Actual_Parameter : Node_Id :=
                                        New_Occurrence_Of (
@@ -7448,8 +7456,7 @@ package body Exp_Dist is
 
                declare
                   Extra_Any_Parameter : constant Entity_Id :=
-                                          Make_Defining_Identifier
-                                            (Loc, New_Internal_Name ('P'));
+                                          Make_Temporary (Loc, 'P');
 
                   Parameter_Exp : constant Node_Id :=
                      Make_Attribute_Reference (Loc,
@@ -7487,13 +7494,16 @@ package body Exp_Dist is
          Append_List_To (Statements, Extra_Formal_Statements);
 
          Append_To (Statements,
-           Make_Request_RTE_Call (RE_Request_Create, New_List (
-                                    Target_Object,
-                                    Subprogram_Id,
-                                    New_Occurrence_Of (Arguments, Loc),
-                                    New_Occurrence_Of (Result, Loc),
-                                    New_Occurrence_Of
-                                      (RTE (RE_Nil_Exc_List), Loc))));
+           Make_Procedure_Call_Statement (Loc,
+             Name =>
+               New_Occurrence_Of (RTE (RE_Request_Setup), Loc),
+             Parameter_Associations => New_List (
+               New_Occurrence_Of (Request, Loc),
+               Target_Object,
+               Subprogram_Id,
+               New_Occurrence_Of (Arguments, Loc),
+               New_Occurrence_Of (Result, Loc),
+               New_Occurrence_Of (RTE (RE_Nil_Exc_List), Loc))));
 
          pragma Assert
            (not (Is_Known_Non_Asynchronous and Is_Known_Asynchronous));
@@ -7524,8 +7534,7 @@ package body Exp_Dist is
          --  Asynchronous case
 
          if not Is_Known_Non_Asynchronous then
-            Asynchronous_Statements :=
-              New_List (Make_Request_RTE_Call (RE_Request_Destroy));
+            Asynchronous_Statements := New_List (Make_Null_Statement (Loc));
          end if;
 
          --  Non-asynchronous case
@@ -7542,10 +7551,6 @@ package body Exp_Dist is
                   New_Occurrence_Of (Request, Loc))));
 
             if Is_Function then
-
-               Append_To (Non_Asynchronous_Statements,
-                 Make_Request_RTE_Call (RE_Request_Destroy));
-
                --  If this is a function call, read the value and return it
 
                Append_To (Non_Asynchronous_Statements,
@@ -7563,9 +7568,6 @@ package body Exp_Dist is
                --  Case of a procedure: deal with IN OUT and OUT formals
 
                Append_List_To (Non_Asynchronous_Statements, After_Statements);
-
-               Append_To (Non_Asynchronous_Statements,
-                 Make_Request_RTE_Call (RE_Request_Destroy));
             end if;
          end if;
 
@@ -7596,9 +7598,8 @@ package body Exp_Dist is
          Controlling_Parameter : Entity_Id) return RPC_Target
       is
          Target_Info : RPC_Target (PCS_Kind => Name_PolyORB_DSA);
-         Target_Reference : constant Entity_Id :=
-                              Make_Defining_Identifier (Loc,
-                                New_Internal_Name ('T'));
+         Target_Reference : constant Entity_Id := Make_Temporary (Loc, 'T');
+
       begin
          if Present (Controlling_Parameter) then
             Append_To (Decls,
@@ -7625,7 +7626,8 @@ package body Exp_Dist is
          else
             Target_Info.Object :=
               Make_Selected_Component (Loc,
-                Prefix        => Make_Identifier (Loc, Chars (RCI_Locator)),
+                Prefix        =>
+                  Make_Identifier (Loc, Chars (RCI_Locator)),
                 Selector_Name =>
                   Make_Identifier (Loc, Name_Get_RCI_Package_Ref));
          end if;
@@ -7667,8 +7669,7 @@ package body Exp_Dist is
 
          RPC_Receiver_Decl :=
            Make_Object_Declaration (Loc,
-             Defining_Identifier => Make_Defining_Identifier (Loc,
-                                      New_Internal_Name ('R')),
+             Defining_Identifier => Make_Temporary (Loc, 'R'),
              Aliased_Present     => True,
              Object_Definition   =>
                New_Occurrence_Of (RTE (RE_Servant), Loc));
@@ -7748,9 +7749,7 @@ package body Exp_Dist is
       is
          Loc : constant Source_Ptr := Sloc (Vis_Decl);
 
-         Request_Parameter : constant Entity_Id :=
-                               Make_Defining_Identifier (Loc,
-                                 New_Internal_Name ('R'));
+         Request_Parameter : constant Entity_Id := Make_Temporary (Loc, 'R');
          --  Formal parameter for receiving stubs: a descriptor for an incoming
          --  request.
 
@@ -7794,9 +7793,7 @@ package body Exp_Dist is
                                      Build_Ordered_Parameters_List
                                        (Specification (Vis_Decl));
 
-         Arguments : constant Entity_Id :=
-                       Make_Defining_Identifier (Loc,
-                         New_Internal_Name ('A'));
+         Arguments : constant Entity_Id := Make_Temporary (Loc, 'A');
          --  Name of the named values list used to retrieve parameters
 
          Subp_Spec : Node_Id;
@@ -7826,11 +7823,9 @@ package body Exp_Dist is
             declare
                Etyp        : Entity_Id;
                Constrained : Boolean;
-               Any         : Entity_Id := Empty;
-               Object      : constant Entity_Id :=
-                               Make_Defining_Identifier (Loc,
-                                 Chars => New_Internal_Name ('P'));
-               Expr        : Node_Id   := Empty;
+               Any         : Entity_Id          := Empty;
+               Object      : constant Entity_Id := Make_Temporary (Loc, 'P');
+               Expr        : Node_Id            := Empty;
 
                Is_Controlling_Formal : constant Boolean :=
                                          Is_RACW_Controlling_Formal
@@ -7866,9 +7861,7 @@ package body Exp_Dist is
                  Is_Constrained (Etyp) or else Is_Elementary_Type (Etyp);
 
                if not Is_First_Controlling_Formal then
-                  Any :=
-                    Make_Defining_Identifier (Loc,
-                      Chars => New_Internal_Name ('A'));
+                  Any := Make_Temporary (Loc, 'A');
 
                   Append_To (Outer_Decls,
                     Make_Object_Declaration (Loc,
@@ -7892,13 +7885,10 @@ package body Exp_Dist is
 
                if Is_First_Controlling_Formal then
                   declare
-                     Addr : constant Entity_Id :=
-                              Make_Defining_Identifier (Loc,
-                                Chars => New_Internal_Name ('A'));
+                     Addr : constant Entity_Id := Make_Temporary (Loc, 'A');
 
                      Is_Local : constant Entity_Id :=
-                                  Make_Defining_Identifier (Loc,
-                                    Chars => New_Internal_Name ('L'));
+                                  Make_Temporary (Loc, 'L');
 
                   begin
                      --  Special case: obtain the first controlling formal
@@ -7923,7 +7913,7 @@ package body Exp_Dist is
                            New_Occurrence_Of (RTE (RE_Get_Local_Address), Loc),
                          Parameter_Associations => New_List (
                            Make_Selected_Component (Loc,
-                             Prefix =>
+                             Prefix        =>
                                New_Occurrence_Of (
                                  Request_Parameter, Loc),
                              Selector_Name =>
@@ -8068,8 +8058,7 @@ package body Exp_Dist is
                                              (Current_Parameter));
 
                      Extra_Any : constant Entity_Id :=
-                                   Make_Defining_Identifier (Loc,
-                                     Chars => New_Internal_Name ('A'));
+                                   Make_Temporary (Loc, 'A');
 
                      Formal_Entity : constant Entity_Id :=
                                        Make_Defining_Identifier (Loc,
@@ -8140,9 +8129,7 @@ package body Exp_Dist is
             declare
                Etyp   : constant Entity_Id :=
                           Etype (Result_Definition (Specification (Vis_Decl)));
-               Result : constant Node_Id   :=
-                          Make_Defining_Identifier (Loc,
-                            Chars => New_Internal_Name ('R'));
+               Result : constant Node_Id   := Make_Temporary (Loc, 'R');
 
             begin
                Inner_Decls := New_List (
@@ -8210,8 +8197,7 @@ package body Exp_Dist is
 
          Subp_Spec :=
            Make_Procedure_Specification (Loc,
-             Defining_Unit_Name       =>
-               Make_Defining_Identifier (Loc, New_Internal_Name ('F')),
+             Defining_Unit_Name       => Make_Temporary (Loc, 'F'),
 
              Parameter_Specifications => New_List (
                Make_Parameter_Specification (Loc,
@@ -8298,7 +8284,7 @@ package body Exp_Dist is
             Arry : Entity_Id;
             --  For 'Range and Etype
 
-            Indices : List_Id;
+            Indexes : List_Id;
             --  For the construction of the innermost element expression
 
             with procedure Add_Process_Element
@@ -8314,7 +8300,7 @@ package body Exp_Dist is
             Depth   : Pos       := 1);
          --  Build nested loop statements that iterate over the elements of an
          --  array Arry. The statement(s) built by Add_Process_Element are
-         --  executed for each element; Indices is the list of indices to be
+         --  executed for each element; Indexes is the list of indexes to be
          --  used in the construction of the indexed component that denotes the
          --  current element. Subprogram is the entity for the subprogram for
          --  which this iterator is generated. The generated statements are
@@ -8397,9 +8383,7 @@ package body Exp_Dist is
             N      : Node_Id;
             Target : Entity_Id)
          is
-            Strm : constant Entity_Id :=
-                     Make_Defining_Identifier (Loc,
-                       Chars => New_Internal_Name ('S'));
+            Strm : constant Entity_Id := Make_Temporary (Loc, 'S');
             Expr : Node_Id;
 
             Read_Call_List : List_Id;
@@ -8457,9 +8441,7 @@ package body Exp_Dist is
 
                else
                   declare
-                     Temp : constant Entity_Id :=
-                              Make_Defining_Identifier
-                                (Loc, New_Internal_Name ('R'));
+                     Temp : constant Entity_Id := Make_Temporary (Loc, 'R');
 
                   begin
                      Read_Call_List := New_List;
@@ -8525,6 +8507,15 @@ package body Exp_Dist is
 
             Fnam := Find_Inherited_TSS (U_Type, TSS_From_Any);
 
+            --  For the subtype representing a generic actual type, go to the
+            --  actual type.
+
+            if Is_Generic_Actual_Type (U_Type) then
+               U_Type := Underlying_Type (Base_Type (U_Type));
+            end if;
+
+            --  For a standard subtype, go to the base type
+
             if Sloc (U_Type) <= Standard_Location then
                U_Type := Base_Type (U_Type);
             end if;
@@ -8614,13 +8605,6 @@ package body Exp_Dist is
                   Decl : Entity_Id;
 
                begin
-                  --  For the subtype representing a generic actual type, go
-                  --  to the base type.
-
-                  if Is_Generic_Actual_Type (U_Type) then
-                     U_Type := Base_Type (U_Type);
-                  end if;
-
                   Build_From_Any_Function (Loc, U_Type, Decl, Fnam);
                   Append_To (Decls, Decl);
                end;
@@ -8660,9 +8644,7 @@ package body Exp_Dist is
             Decls : constant List_Id := New_List;
             Stms  : constant List_Id := New_List;
 
-            Any_Parameter : constant Entity_Id :=
-                              Make_Defining_Identifier (Loc,
-                                New_Internal_Name ('A'));
+            Any_Parameter : constant Entity_Id := Make_Temporary (Loc, 'A');
 
             Use_Opaque_Representation : Boolean;
 
@@ -8745,9 +8727,7 @@ package body Exp_Dist is
 
                      --  The returned object
 
-                     Res : constant Entity_Id :=
-                             Make_Defining_Identifier (Loc,
-                               New_Internal_Name ('R'));
+                     Res : constant Entity_Id := Make_Temporary (Loc, 'R');
 
                      Res_Definition : Node_Id := New_Occurrence_Of (Typ, Loc);
 
@@ -8814,8 +8794,7 @@ package body Exp_Dist is
                               Choice_List : List_Id;
 
                               Struct_Any : constant Entity_Id :=
-                                             Make_Defining_Identifier (Loc,
-                                               New_Internal_Name ('S'));
+                                             Make_Temporary (Loc, 'S');
 
                            begin
                               Append_To (Decls,
@@ -8872,7 +8851,7 @@ package body Exp_Dist is
                                  --  Struct_Counter should be reset before
                                  --  handling a variant part. Indeed only one
                                  --  of the case statement alternatives will be
-                                 --  executed at run-time, so the counter must
+                                 --  executed at run time, so the counter must
                                  --  start at 0 for every case statement.
 
                                  Struct_Counter := 0;
@@ -9090,7 +9069,7 @@ package body Exp_Dist is
                     new Append_Array_Traversal (
                       Subprogram => Fnam,
                       Arry       => Res,
-                      Indices    => New_List,
+                      Indexes    => New_List,
                       Add_Process_Element => FA_Ary_Add_Process_Element);
 
                   Res_Subtype_Indication : Node_Id :=
@@ -9156,24 +9135,24 @@ package body Exp_Dist is
                                      Left_Opnd =>
                                        Make_Op_Add (Loc,
                                          Left_Opnd =>
-                                           OK_Convert_To (
-                                             Standard_Long_Integer,
-                                             Make_Identifier (Loc, Lnam)),
+                                           OK_Convert_To
+                                             (Standard_Long_Integer,
+                                              Make_Identifier (Loc, Lnam)),
 
                                          Right_Opnd =>
-                                           OK_Convert_To (
-                                             Standard_Long_Integer,
-                                             Make_Function_Call (Loc,
-                                               Name =>
-                                                 New_Occurrence_Of (RTE (
-                                                 RE_Get_Nested_Sequence_Length
-                                                 ), Loc),
-                                               Parameter_Associations =>
-                                                 New_List (
-                                                   New_Occurrence_Of (
-                                                     Any_Parameter, Loc),
-                                                   Make_Integer_Literal (Loc,
-                                                     Intval => J))))),
+                                           OK_Convert_To
+                                             (Standard_Long_Integer,
+                                              Make_Function_Call (Loc,
+                                                Name =>
+                                                  New_Occurrence_Of (RTE (
+                                                  RE_Get_Nested_Sequence_Length
+                                                  ), Loc),
+                                                Parameter_Associations =>
+                                                  New_List (
+                                                    New_Occurrence_Of (
+                                                      Any_Parameter, Loc),
+                                                    Make_Integer_Literal (Loc,
+                                                      Intval => J))))),
 
                                      Right_Opnd =>
                                        Make_Integer_Literal (Loc, 1))))));
@@ -9343,12 +9322,14 @@ package body Exp_Dist is
 
             Fnam := Find_Inherited_TSS (U_Type, TSS_To_Any);
 
-            --  Check first for Boolean and Character. These are enumeration
-            --  types, but we treat them specially, since they may require
-            --  special handling in the transfer protocol. However, this
-            --  special handling only applies if they have standard
-            --  representation, otherwise they are treated like any other
-            --  enumeration type.
+            --  For the subtype representing a generic actual type, go to the
+            --  actual type.
+
+            if Is_Generic_Actual_Type (U_Type) then
+               U_Type := Underlying_Type (Base_Type (U_Type));
+            end if;
+
+            --  For a standard subtype, go to the base type
 
             if Sloc (U_Type) <= Standard_Location then
                U_Type := Base_Type (U_Type);
@@ -9357,6 +9338,13 @@ package body Exp_Dist is
             if Present (Fnam) then
                null;
 
+            --  Check first for Boolean and Character. These are enumeration
+            --  types, but we treat them specially, since they may require
+            --  special handling in the transfer protocol. However, this
+            --  special handling only applies if they have standard
+            --  representation, otherwise they are treated like any other
+            --  enumeration type.
+
             elsif U_Type = Standard_Boolean then
                Lib_RE := RE_TA_B;
 
@@ -9455,7 +9443,7 @@ package body Exp_Dist is
             --  that the expected type of its parameter is U_Type.
 
             if Ekind (Fnam) = E_Function
-                 and then Present (First_Formal (Fnam))
+              and then Present (First_Formal (Fnam))
             then
                C_Type := Etype (First_Formal (Fnam));
             else
@@ -9483,14 +9471,11 @@ package body Exp_Dist is
             Decls : constant List_Id := New_List;
             Stms  : constant List_Id := New_List;
 
-            Expr_Parameter : constant Entity_Id :=
-                               Make_Defining_Identifier (Loc, Name_E);
-
-            Any : constant Entity_Id :=
-                    Make_Defining_Identifier (Loc, Name_A);
+            Expr_Parameter : Entity_Id;
+            Any            : Entity_Id;
+            Result_TC      : Node_Id;
 
             Any_Decl  : Node_Id;
-            Result_TC : Node_Id := Build_TypeCode_Call (Loc, Typ, Decls);
 
             Use_Opaque_Representation : Boolean;
             --  When True, use stream attributes and represent type as an
@@ -9504,13 +9489,17 @@ package body Exp_Dist is
 
             if Is_Itype (Typ) and then Typ /= Base_Type (Typ) then
                Build_To_Any_Function
-                  (Loc  => Loc,
+                 (Loc  => Loc,
                   Typ  => Etype (Typ),
                   Decl => Decl,
                   Fnam => Fnam);
                return;
             end if;
 
+            Expr_Parameter := Make_Defining_Identifier (Loc, Name_E);
+            Any            := Make_Defining_Identifier (Loc, Name_A);
+            Result_TC      := Build_TypeCode_Call (Loc, Typ, Decls);
+
             Fnam := Make_Helper_Function_Name (Loc, Typ, Name_To_Any);
 
             Spec :=
@@ -9642,12 +9631,10 @@ package body Exp_Dist is
                               Choice_List : List_Id;
 
                               Union_Any : constant Entity_Id :=
-                                            Make_Defining_Identifier (Loc,
-                                              New_Internal_Name ('V'));
+                                            Make_Temporary (Loc, 'V');
 
                               Struct_Any : constant Entity_Id :=
-                                             Make_Defining_Identifier (Loc,
-                                                New_Internal_Name ('S'));
+                                             Make_Temporary (Loc, 'S');
 
                               function Make_Discriminant_Reference
                                 return Node_Id;
@@ -9760,7 +9747,7 @@ package body Exp_Dist is
                                  --  Struct_Counter should be reset before
                                  --  handling a variant part. Indeed only one
                                  --  of the case statement alternatives will be
-                                 --  executed at run-time, so the counter must
+                                 --  executed at run time, so the counter must
                                  --  start at 0 for every case statement.
 
                                  Struct_Counter := 0;
@@ -9866,8 +9853,7 @@ package body Exp_Dist is
 
                         declare
                            Dummy_Any : constant Entity_Id :=
-                                         Make_Defining_Identifier (Loc,
-                                           Chars => New_Internal_Name ('A'));
+                                         Make_Temporary (Loc, 'A');
 
                         begin
                            Append_To (Decls,
@@ -9959,7 +9945,7 @@ package body Exp_Dist is
                     new Append_Array_Traversal (
                       Subprogram => Fnam,
                       Arry       => Expr_Parameter,
-                      Indices    => New_List,
+                      Indexes    => New_List,
                       Add_Process_Element => TA_Ary_Add_Process_Element);
 
                   Index : Node_Id;
@@ -10017,9 +10003,7 @@ package body Exp_Dist is
 
             if Use_Opaque_Representation then
                declare
-                  Strm : constant Entity_Id :=
-                           Make_Defining_Identifier (Loc,
-                             Chars => New_Internal_Name ('S'));
+                  Strm : constant Entity_Id := Make_Temporary (Loc, 'S');
                   --  Stream used to store data representation produced by
                   --  stream attribute.
 
@@ -10125,15 +10109,20 @@ package body Exp_Dist is
                Fnam := Find_Inherited_TSS (U_Type, TSS_TypeCode);
             end if;
 
-            if No (Fnam) then
-               if Sloc (U_Type) <= Standard_Location then
+            --  For the subtype representing a generic actual type, go to the
+            --  actual type.
 
-                  --  Do not try to build alias typecodes for subtypes from
-                  --  Standard.
+            if Is_Generic_Actual_Type (U_Type) then
+               U_Type := Underlying_Type (Base_Type (U_Type));
+            end if;
 
-                  U_Type := Base_Type (U_Type);
-               end if;
+            --  For a standard subtype, go to the base type
+
+            if Sloc (U_Type) <= Standard_Location then
+               U_Type := Base_Type (U_Type);
+            end if;
 
+            if No (Fnam) then
                if U_Type = Standard_Boolean then
                   Lib_RE := RE_TC_B;
 
@@ -10640,9 +10629,9 @@ package body Exp_Dist is
             if Is_Itype (Typ) and then Typ /= Base_Type (Typ) then
                Build_TypeCode_Function
                   (Loc  => Loc,
-                  Typ  => Etype (Typ),
-                  Decl => Decl,
-                  Fnam => Fnam);
+                   Typ  => Etype (Typ),
+                   Decl => Decl,
+                   Fnam => Fnam);
                return;
             end if;
 
@@ -10938,7 +10927,7 @@ package body Exp_Dist is
                   Element_Expr : constant Node_Id :=
                                    Make_Indexed_Component (Loc,
                                      New_Occurrence_Of (Arry, Loc),
-                                     Indices);
+                                     Indexes);
                begin
                   Set_Etype (Element_Expr, Component_Type (Typ));
                   Add_Process_Element (Stmts,
@@ -10950,7 +10939,7 @@ package body Exp_Dist is
                return;
             end if;
 
-            Append_To (Indices,
+            Append_To (Indexes,
               Make_Identifier (Loc, New_External_Name ('L', Depth)));
 
             if not Constrained or else Depth > 1 then
@@ -11127,26 +11116,29 @@ package body Exp_Dist is
          begin
             declare
                Serial : Nat := 0;
-               --  For tagged types, we use a canonical name so that it matches
-               --  the primitive spec. For all other cases, we use a serialized
-               --  name so that multiple generations of the same procedure do
-               --  not clash.
+               --  For tagged types that aren't frozen yet, generate the helper
+               --  under its canonical name so that it matches the primitive
+               --  spec. For all other cases, we use a serialized name so that
+               --  multiple generations of the same procedure do not clash.
 
             begin
-               if not Is_Tagged_Type (Typ) then
+               if Is_Tagged_Type (Typ) and then not Is_Frozen (Typ) then
+                  null;
+               else
                   Serial := Increment_Serial_Number;
                end if;
 
-               --  Use prefixed underscore to avoid potential clash with used
+               --  Use prefixed underscore to avoid potential clash with user
                --  identifier (we use attribute names for Nam).
 
                return
                  Make_Defining_Identifier (Loc,
                    Chars =>
                      New_External_Name
-                       (Related_Id => Nam,
-                        Suffix => ' ', Suffix_Index => Serial,
-                        Prefix => '_'));
+                       (Related_Id   => Nam,
+                        Suffix       => ' ',
+                        Suffix_Index => Serial,
+                        Prefix       => '_'));
             end;
          end Make_Helper_Function_Name;
       end Helpers;
@@ -11193,9 +11185,7 @@ package body Exp_Dist is
       Pkg_Name := String_From_Name_Buffer;
       Inst :=
         Make_Package_Instantiation (Loc,
-          Defining_Unit_Name   =>
-            Make_Defining_Identifier (Loc,
-              Chars => New_Internal_Name ('R')),
+          Defining_Unit_Name   => Make_Temporary (Loc, 'R'),
 
           Name                 =>
             New_Occurrence_Of (RTE (RE_RCI_Locator), Loc),