]>
Commit | Line | Data |
---|---|---|
70482933 RK |
1 | ------------------------------------------------------------------------------ |
2 | -- -- | |
3 | -- GNAT COMPILER COMPONENTS -- | |
4 | -- -- | |
5 | -- E X P _ D I S T -- | |
6 | -- -- | |
7 | -- S p e c -- | |
8 | -- -- | |
1d005acc | 9 | -- Copyright (C) 1992-2019, Free Software Foundation, Inc. -- |
70482933 RK |
10 | -- -- |
11 | -- GNAT is free software; you can redistribute it and/or modify it under -- | |
12 | -- terms of the GNU General Public License as published by the Free Soft- -- | |
b5c84c3c | 13 | -- ware Foundation; either version 3, or (at your option) any later ver- -- |
70482933 RK |
14 | -- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- |
15 | -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- | |
16 | -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- | |
17 | -- for more details. You should have received a copy of the GNU General -- | |
b5c84c3c RD |
18 | -- Public License distributed with GNAT; see file COPYING3. If not, go to -- |
19 | -- http://www.gnu.org/licenses for a complete copy of the license. -- | |
70482933 RK |
20 | -- -- |
21 | -- GNAT was originally developed by the GNAT team at New York University. -- | |
71ff80dc | 22 | -- Extensive contributions were provided by Ada Core Technologies Inc. -- |
70482933 RK |
23 | -- -- |
24 | ------------------------------------------------------------------------------ | |
25 | ||
26 | -- This package contains utility routines used for the generation of the | |
27 | -- stubs relevant to the distribution annex. | |
28 | ||
d693e39d TQ |
29 | with Namet; use Namet; |
30 | with Snames; use Snames; | |
31 | with Types; use Types; | |
70482933 RK |
32 | |
33 | package Exp_Dist is | |
34 | ||
d693e39d TQ |
35 | PCS_Version_Number : constant array (PCS_Names) of Int := |
36 | (Name_No_DSA => 1, | |
37 | Name_GARLIC_DSA => 1, | |
5b75bf57 | 38 | Name_PolyORB_DSA => 6); |
e29bd38f TQ |
39 | -- PCS interface version. This is used to check for consistency between the |
40 | -- compiler used to generate distribution stubs and the PCS implementation. | |
41 | -- It must be incremented whenever a change is made to the generated code | |
42 | -- for distribution stubs that would result in the compiler being | |
43 | -- incompatible with an older version of the PCS, or vice versa. | |
44 | ||
0ae9f22f | 45 | procedure Add_RAST_Features (Vis_Decl : Node_Id); |
70482933 RK |
46 | -- Build and add bodies for dereference and 'Access subprograms for a |
47 | -- remote access to subprogram type. Vis_Decl is the declaration node for | |
48 | -- the RAS type. | |
49 | ||
0ae9f22f | 50 | procedure Add_RACW_Features (RACW_Type : Entity_Id); |
70482933 RK |
51 | -- Add RACW features. If the RACW and the designated type are not in the |
52 | -- same scope, then Add_RACW_Primitive_Declarations_And_Bodies is called | |
53 | -- automatically since we do know the primitive list already. | |
54 | ||
55 | procedure Add_RACW_Primitive_Declarations_And_Bodies | |
0ae9f22f RD |
56 | (Designated_Type : Entity_Id; |
57 | Insertion_Node : Node_Id; | |
8aa23fe3 | 58 | Body_Decls : List_Id); |
70482933 | 59 | -- Add primitive for the stub type, and the RPC receiver. The declarations |
7f0b5314 | 60 | -- are inserted after Insertion_Node, while the bodies are appended at the |
1d1bd8ad | 61 | -- end of Body_Decls. |
70482933 RK |
62 | |
63 | procedure Remote_Types_Tagged_Full_View_Encountered | |
0ae9f22f | 64 | (Full_View : Entity_Id); |
70482933 RK |
65 | -- When a full view with a private view is encountered in a Remote_Types |
66 | -- package and corresponds to a tagged type, then this procedure is called | |
67 | -- to generate the needed RACW features if it is needed. | |
68 | ||
0ae9f22f | 69 | procedure RACW_Type_Is_Asynchronous (RACW_Type : Entity_Id); |
70482933 RK |
70 | -- This subprogram must be called when it is detected that the RACW type |
71 | -- is asynchronous. | |
72 | ||
0ae9f22f | 73 | procedure Expand_Calling_Stubs_Bodies (Unit_Node : Node_Id); |
70482933 RK |
74 | -- Call the expansion phase for the calling stubs. The code will be added |
75 | -- at the end of the compilation unit, which is a package spec. | |
76 | ||
0ae9f22f | 77 | procedure Expand_Receiving_Stubs_Bodies (Unit_Node : Node_Id); |
1d1bd8ad | 78 | -- Call the expansion phase for the receiving stubs. The code will be added |
70482933 RK |
79 | -- at the end of the compilation unit, which may be either a package spec |
80 | -- or a package body. | |
81 | ||
0ae9f22f | 82 | procedure Expand_All_Calls_Remote_Subprogram_Call (N : Node_Id); |
70482933 | 83 | -- Rewrite a call to a subprogram located in a Remote_Call_Interface |
1d1bd8ad | 84 | -- package to which the pragma All_Calls_Remote applies so that it |
70482933 RK |
85 | -- goes through the PCS. N is either an N_Procedure_Call_Statement |
86 | -- or an N_Function_Call node. | |
87 | ||
88 | procedure Build_Passive_Partition_Stub (U : Node_Id); | |
89 | -- Build stub for a shared passive package. U is the analyzed | |
90 | -- compilation unit for a package declaration. | |
91 | ||
7324bf49 AC |
92 | function Build_Subprogram_Id |
93 | (Loc : Source_Ptr; | |
94 | E : Entity_Id) return Node_Id; | |
95 | -- Build a literal representing the remote subprogram identifier of E | |
96 | ||
c885d7a1 | 97 | function Copy_Specification |
7b27e183 AC |
98 | (Loc : Source_Ptr; |
99 | Spec : Node_Id; | |
100 | Ctrl_Type : Entity_Id := Empty; | |
101 | New_Name : Name_Id := No_Name) return Node_Id; | |
8aa23fe3 TQ |
102 | -- Build a subprogram specification from another one, or from an |
103 | -- access-to-subprogram definition. If Ctrl_Type is not Empty, and any | |
104 | -- controlling formal of an anonymous access type is found, then it is | |
105 | -- replaced by an access to Ctrl_Type. If New_Name is given, then it will | |
106 | -- be used as the name for the newly created spec. | |
7b27e183 AC |
107 | -- |
108 | -- Possibly factor this wrt Exp_Ch9.Build_Private_Protected_Declaration??? | |
c885d7a1 | 109 | |
92869a7b TQ |
110 | function Corresponding_Stub_Type (RACW_Type : Entity_Id) return Entity_Id; |
111 | -- Return the stub type associated with the given RACW type | |
112 | ||
8aa23fe3 | 113 | function Underlying_RACW_Type (RAS_Typ : Entity_Id) return Entity_Id; |
c885d7a1 AC |
114 | -- Given a remote access-to-subprogram type or its equivalent |
115 | -- record type, return the RACW type generated to implement it. | |
116 | ||
8aa23fe3 TQ |
117 | procedure Append_RACW_Bodies (Decls : List_Id; Spec_Id : Entity_Id); |
118 | -- Append the unanalyzed subprogram bodies generated to support RACWs | |
119 | -- declared in the given package spec (RACW stream subprograms, calling | |
120 | -- stubs primitive operations) to the given list (which is expected to be | |
121 | -- the declarations list for the corresponding package body, if there is | |
122 | -- one). In the case where a body is present, the subprogram bodies must | |
123 | -- not be generated in the package spec because this would cause an | |
124 | -- incorrect attempt to freeze Taft amendment types declared in the spec. | |
125 | ||
c3d593c9 TQ |
126 | function Make_Transportable_Check |
127 | (Loc : Source_Ptr; | |
128 | Expr : Node_Id) return Node_Id; | |
129 | -- Generate a check that the given expression (an actual in a remote | |
130 | -- subprogram call, or the return value of a function in the context of | |
131 | -- a remote call) satisfies the requirements for being transportable | |
132 | -- across partitions, raising Program_Error if it does not. | |
133 | ||
54838d1f AC |
134 | ---------------------------------------------------------------- |
135 | -- Functions for expansion of PolyORB/DSA specific attributes -- | |
136 | ---------------------------------------------------------------- | |
137 | ||
138 | function Build_From_Any_Call | |
139 | (Typ : Entity_Id; | |
140 | N : Node_Id; | |
141 | Decls : List_Id) return Node_Id; | |
142 | -- Build call to From_Any attribute function of type Typ with expression | |
143 | -- N as actual parameter. Decls is the declarations list for an appropriate | |
144 | -- enclosing scope of the point where the call will be inserted; if the | |
145 | -- From_Any attribute for Typ needs to be generated at this point, its | |
146 | -- declaration is appended to Decls. | |
147 | ||
148 | function Build_To_Any_Call | |
8b64ed4c TQ |
149 | (Loc : Source_Ptr; |
150 | N : Node_Id; | |
151 | Decls : List_Id; | |
152 | Constrained : Boolean := False) return Node_Id; | |
54838d1f | 153 | -- Build call to To_Any attribute function with expression as actual |
30ebb114 AC |
154 | -- parameter. Loc is the reference location for generated nodes, Decls is |
155 | -- the declarations list for an appropriate enclosing scope of the point | |
156 | -- where the call will be inserted; if the To_Any attribute for Typ needs | |
157 | -- to be generated at this point, its declaration is appended to Decls. | |
8b64ed4c TQ |
158 | -- For limited types, if Constrained is True then use 'Write else use |
159 | -- 'Output. | |
54838d1f AC |
160 | |
161 | function Build_TypeCode_Call | |
162 | (Loc : Source_Ptr; | |
163 | Typ : Entity_Id; | |
164 | Decls : List_Id) return Node_Id; | |
165 | -- Build call to TypeCode attribute function for Typ. Decls is the | |
166 | -- declarations list for an appropriate enclosing scope of the point | |
167 | -- where the call will be inserted; if the To_Any attribute for Typ | |
168 | -- needs to be generated at this point, its declaration is appended | |
169 | -- to Decls. | |
170 | ||
70482933 | 171 | end Exp_Dist; |