OSDN Git Service

optimize
[pf3gnuchains/gcc-fork.git] / gcc / ada / exp_ch7.ads
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                              E X P _ C H 7                               --
6 --                                                                          --
7 --                                 S p e c                                  --
8 --                                                                          --
9 --          Copyright (C) 1992-2004 Free Software Foundation, Inc.          --
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- --
13 -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
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 --
18 -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
19 -- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
20 -- MA 02111-1307, USA.                                                      --
21 --                                                                          --
22 -- GNAT was originally developed  by the GNAT team at  New York University. --
23 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
24 --                                                                          --
25 ------------------------------------------------------------------------------
26
27 with Types; use Types;
28
29 package Exp_Ch7 is
30
31    procedure Expand_N_Package_Body        (N : Node_Id);
32    procedure Expand_N_Package_Declaration (N : Node_Id);
33
34    -----------------------------
35    -- Finalization Management --
36    -----------------------------
37
38    function In_Finalization_Root (E : Entity_Id) return Boolean;
39    --  True if current scope is in package System.Finalization_Root. Used
40    --  to avoid certain expansions that would involve circularity in the
41    --  Rtsfind mechanism.
42
43    procedure Build_Final_List (N : Node_Id; Typ : Entity_Id);
44    --  Build finalization list for anonymous access types, and for access
45    --  types that are frozen before their designated types are known to
46    --  be controlled.
47
48    procedure Build_Controlling_Procs (Typ : Entity_Id);
49    --  Typ is a record, and array type having controlled components.
50    --  Create the procedures Deep_Initialize, Deep_Adjust and Deep_Finalize
51    --  that take care of finalization management at run-time.
52
53    procedure Build_Late_Proc (Typ : Entity_Id; Nam : Name_Id);
54    --  Build one controlling procedure when a late body overrides one of
55    --  the controlling operations.
56
57    function Controller_Component (Typ : Entity_Id) return Entity_Id;
58    --  Returns the entity of the component whose name is 'Name_uController'
59
60    function Controlled_Type (T : Entity_Id) return Boolean;
61    --  True if T potentially needs finalization actions
62
63    function Find_Final_List
64      (E   : Entity_Id;
65       Ref : Node_Id := Empty) return Node_Id;
66    --  E is an entity representing a controlled object, a controlled type
67    --  or a scope. If Ref is not empty, it is a reference to a controlled
68    --  record, the closest Final list is in the controller component of
69    --  the record containing Ref otherwise this function returns a
70    --  reference to the final list attached to the closest dynamic scope
71    --  (that can be E itself) creating this final list if necessary.
72
73    function Has_New_Controlled_Component (E : Entity_Id) return Boolean;
74    --  E is a type entity. Give the same resul as Has_Controlled_Component
75    --  except for tagged extensions where the result is True only if the
76    --  latest extension contains a controlled component.
77
78    function Make_Attach_Call
79      (Obj_Ref     : Node_Id;
80       Flist_Ref   : Node_Id;
81       With_Attach : Node_Id) return Node_Id;
82    --  Attach the referenced object to the referenced Final Chain
83    --  'Flist_Ref' With_Attach is an expression of type Short_Short_Integer
84    --  which can be either '0' to signify no attachment, '1' for
85    --  attachement to a simply linked list or '2' for attachement to a
86    --  doubly linked list.
87
88    function Make_Init_Call
89      (Ref         : Node_Id;
90       Typ         : Entity_Id;
91       Flist_Ref   : Node_Id;
92       With_Attach : Node_Id) return List_Id;
93    --  Ref is an expression (with no-side effect and is not required to
94    --  have been previously analyzed) that references the object to be
95    --  initialized. Typ is the expected type of Ref, which is a controlled
96    --  type (Is_Controlled) or a type with controlled components
97    --  (Has_Controlled). With_Attach is an integer expression representing
98    --  the level of attachment, see Attach_To_Final_Lists' NB_Link param
99    --  documentation in s-finimp.ads.
100    --
101    --  This function will generate the appropriate calls to make
102    --  sure that the objects referenced by Ref are initialized. The
103    --  generate code is quite different depending on the fact the type
104    --  IS_Controlled or HAS_Controlled but this is not the problem of the
105    --  caller, the details are in the body.
106
107    function Make_Adjust_Call
108      (Ref         : Node_Id;
109       Typ         : Entity_Id;
110       Flist_Ref   : Node_Id;
111       With_Attach : Node_Id) return List_Id;
112    --  Ref is an expression (with no-side effect and is not required to
113    --  have been previously analyzed) that references the object to be
114    --  adjusted. Typ is the expected type of Ref, which is a controlled
115    --  type (Is_Controlled) or a type with controlled components
116    --  (Has_Controlled).  With_Attach is an integer expression representing
117    --  the level of attachment, see Attach_To_Final_Lists' NB_Link param
118    --  documentation in s-finimp.ads.
119    --
120    --  This function will generate the appropriate calls to make
121    --  sure that the objects referenced by Ref are adjusted. The generated
122    --  code is quite different depending on the fact the type IS_Controlled
123    --  or HAS_Controlled but this is not the problem of the caller, the
124    --  details are in the body. The objects must be attached when the adjust
125    --  takes place after an initialization expression but not when it takes
126    --  place after a regular assignment.
127
128    function Make_Final_Call
129      (Ref         : Node_Id;
130       Typ         : Entity_Id;
131       With_Detach : Node_Id) return List_Id;
132    --  Ref is an expression (with no-side effect and is not required
133    --  to have been previously analyzed) that references the object to
134    --  be Finalized. Typ is the expected type of Ref, which is a
135    --  controlled type (Is_Controlled) or a type with controlled
136    --  components (Has_Controlled). With_Attach is an integer
137    --  expression representing the level of attachment, see
138    --  Attach_To_Final_Lists' NB_Link param documentation in
139    --  s-finimp.ads.
140    --
141    --  This function will generate the appropriate calls to make
142    --  sure that the objects referenced by Ref are finalized. The generated
143    --  code is quite different depending on the fact the type IS_Controlled
144    --  or HAS_Controlled but this is not the problem of the caller, the
145    --  details are in the body. The objects must be detached when finalizing
146    --  an unchecked deallocated object but not when finalizing the target of
147    --  an assignment, it is not necessary either on scope exit.
148
149    procedure Expand_Ctrl_Function_Call (N : Node_Id);
150    --  Expand a call to a function returning a controlled value. That is to
151    --  say attach the result of the call to the current finalization list,
152    --  which is the one of the transient scope created for such constructs.
153
154    --------------------------------------------
155    -- Task and Protected Object finalization --
156    --------------------------------------------
157
158    function Cleanup_Array
159      (N   : Node_Id;
160       Obj : Node_Id;
161       Typ : Entity_Id) return List_Id;
162    --  Generate loops to finalize any tasks or simple protected objects
163    --  that are subcomponents of an array.
164
165    function Cleanup_Protected_Object
166      (N   : Node_Id;
167       Ref : Node_Id) return Node_Id;
168    --  Generate code to finalize a protected object without entries.
169
170    function Cleanup_Record
171      (N   : Node_Id;
172       Obj : Node_Id;
173       Typ : Entity_Id) return List_Id;
174    --  For each subcomponent of a record that contains tasks or simple
175    --  protected objects, generate the appropriate finalization call.
176
177    function Cleanup_Task
178      (N   : Node_Id;
179       Ref : Node_Id) return Node_Id;
180    --  Generate code to finalize a task.
181
182    function Has_Simple_Protected_Object (T : Entity_Id) return Boolean;
183    --  Check whether composite type contains a simple protected component.
184
185    function Is_Simple_Protected_Type (T : Entity_Id) return Boolean;
186    --  Check whether argument is a protected type without entries.
187    --  Protected types with entries are controlled, and their cleanup
188    --  is handled by the standard finalization machinery. For simple
189    --  protected types we generate inline code to release their locks.
190
191    --------------------------------
192    -- Transient Scope Management --
193    --------------------------------
194
195    procedure Expand_Cleanup_Actions (N : Node_Id);
196    --  Expand the necessary stuff into a scope to enable finalization of local
197    --  objects and deallocation of transient data when exiting the scope. N is
198    --  a "scope node" that is to say one of the following: N_Block_Statement,
199    --  N_Subprogram_Body, N_Task_Body, N_Entry_Body.
200
201    procedure Establish_Transient_Scope (N : Node_Id; Sec_Stack : Boolean);
202    --  Push a new transient scope on the scope stack. N is the node responsible
203    --  for the need of a transient scope. If Sec_Stack is True then the
204    --  secondary stack is brought in, otherwise it isn't.
205
206    function Node_To_Be_Wrapped return Node_Id;
207    --  return the node to be wrapped if the current scope is transient.
208
209    procedure Store_Before_Actions_In_Scope (L : List_Id);
210    --  Append the list L of actions to the end of the before-actions store
211    --  in the top of the scope stack
212
213    procedure Store_After_Actions_In_Scope (L : List_Id);
214    --  Append the list L of actions to the beginning of the after-actions
215    --  store in the top of the scope stack
216
217    procedure Wrap_Transient_Declaration (N : Node_Id);
218    --  N is an object declaration. Expand the finalization calls after the
219    --  declaration and make the outer scope beeing the transient one.
220
221    procedure Wrap_Transient_Expression (N : Node_Id);
222    --  N is a sub-expression. Expand a transient block around an expression
223
224    procedure Wrap_Transient_Statement (N : Node_Id);
225    --  N is a statement. Expand a transient block around an instruction
226
227 end Exp_Ch7;