1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 1992-2013, Free Software Foundation, Inc. --
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 3, 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 COPYING3. If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
21 -- GNAT was originally developed by the GNAT team at New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
24 ------------------------------------------------------------------------------
26 with Einfo
; use Einfo
;
27 with Nlists
; use Nlists
;
28 with Nmake
; use Nmake
;
30 with Rtsfind
; use Rtsfind
;
31 with Sinfo
; use Sinfo
;
32 with Snames
; use Snames
;
33 with Stand
; use Stand
;
34 with Tbuild
; use Tbuild
;
36 package body Exp_Sel
is
38 -----------------------
39 -- Build_Abort_Block --
40 -----------------------
42 function Build_Abort_Block
44 Abr_Blk_Ent
: Entity_Id
;
45 Cln_Blk_Ent
: Entity_Id
;
46 Blk
: Node_Id
) return Node_Id
50 Make_Block_Statement
(Loc
,
51 Identifier
=> New_Occurrence_Of
(Abr_Blk_Ent
, Loc
),
53 Declarations
=> No_List
,
55 Handled_Statement_Sequence
=>
56 Make_Handled_Sequence_Of_Statements
(Loc
,
59 Make_Implicit_Label_Declaration
(Loc
,
60 Defining_Identifier
=> Cln_Blk_Ent
,
61 Label_Construct
=> Blk
),
65 New_List
(Build_Abort_Block_Handler
(Loc
))));
66 end Build_Abort_Block
;
68 -------------------------------
69 -- Build_Abort_Block_Handler --
70 -------------------------------
72 function Build_Abort_Block_Handler
(Loc
: Source_Ptr
) return Node_Id
is
76 if Exception_Mechanism
= Back_End_Exceptions
then
78 -- With ZCX, aborts are not defered in handlers
80 Stmt
:= Make_Null_Statement
(Loc
);
82 -- With FE SJLJ, aborts are defered at the beginning of Abort_Signal
86 Make_Procedure_Call_Statement
(Loc
,
87 Name
=> New_Occurrence_Of
(RTE
(RE_Abort_Undefer
), Loc
),
88 Parameter_Associations
=> No_List
);
91 return Make_Implicit_Exception_Handler
(Loc
,
93 New_List
(New_Occurrence_Of
(Stand
.Abort_Signal
, Loc
)),
94 Statements
=> New_List
(Stmt
));
95 end Build_Abort_Block_Handler
;
103 Decls
: List_Id
) return Entity_Id
105 B
: constant Entity_Id
:= Make_Temporary
(Loc
, 'B');
108 Make_Object_Declaration
(Loc
,
109 Defining_Identifier
=> B
,
110 Object_Definition
=> New_Occurrence_Of
(Standard_Boolean
, Loc
),
111 Expression
=> New_Occurrence_Of
(Standard_False
, Loc
)));
121 Decls
: List_Id
) return Entity_Id
123 C
: constant Entity_Id
:= Make_Temporary
(Loc
, 'C');
126 Make_Object_Declaration
(Loc
,
127 Defining_Identifier
=> C
,
129 New_Occurrence_Of
(RTE
(RE_Prim_Op_Kind
), Loc
)));
133 -------------------------
134 -- Build_Cleanup_Block --
135 -------------------------
137 function Build_Cleanup_Block
141 Clean_Ent
: Entity_Id
) return Node_Id
143 Cleanup_Block
: constant Node_Id
:=
144 Make_Block_Statement
(Loc
,
146 New_Occurrence_Of
(Blk_Ent
, Loc
),
147 Declarations
=> No_List
,
148 Handled_Statement_Sequence
=>
149 Make_Handled_Sequence_Of_Statements
(Loc
,
150 Statements
=> Stmts
),
151 Is_Asynchronous_Call_Block
=> True);
154 Set_Entry_Cancel_Parameter
(Blk_Ent
, Clean_Ent
);
156 return Cleanup_Block
;
157 end Build_Cleanup_Block
;
166 Obj
: Entity_Id
) return Entity_Id
168 K
: constant Entity_Id
:= Make_Temporary
(Loc
, 'K');
172 if Tagged_Type_Expansion
then
173 Tag_Node
:= Unchecked_Convert_To
(RTE
(RE_Tag
), Obj
);
176 Make_Attribute_Reference
(Loc
,
178 Attribute_Name
=> Name_Tag
);
182 Make_Object_Declaration
(Loc
,
183 Defining_Identifier
=> K
,
185 New_Occurrence_Of
(RTE
(RE_Tagged_Kind
), Loc
),
187 Make_Function_Call
(Loc
,
188 Name
=> New_Occurrence_Of
(RTE
(RE_Get_Tagged_Kind
), Loc
),
189 Parameter_Associations
=> New_List
(Tag_Node
))));
199 Decls
: List_Id
) return Entity_Id
201 S
: constant Entity_Id
:= Make_Temporary
(Loc
, 'S');
204 Make_Object_Declaration
(Loc
,
205 Defining_Identifier
=> S
,
206 Object_Definition
=> New_Occurrence_Of
(Standard_Integer
, Loc
)));
210 ------------------------
211 -- Build_S_Assignment --
212 ------------------------
214 function Build_S_Assignment
218 Call_Ent
: Entity_Id
) return Node_Id
220 Typ
: constant Entity_Id
:= Etype
(Obj
);
223 if Tagged_Type_Expansion
then
225 Make_Assignment_Statement
(Loc
,
226 Name
=> New_Occurrence_Of
(S
, Loc
),
228 Make_Function_Call
(Loc
,
229 Name
=> New_Occurrence_Of
(RTE
(RE_Get_Offset_Index
), Loc
),
230 Parameter_Associations
=> New_List
(
231 Unchecked_Convert_To
(RTE
(RE_Tag
), Obj
),
232 Make_Integer_Literal
(Loc
, DT_Position
(Call_Ent
)))));
238 Make_Assignment_Statement
(Loc
,
239 Name
=> New_Occurrence_Of
(S
, Loc
),
241 Make_Function_Call
(Loc
,
242 Name
=> New_Occurrence_Of
(RTE
(RE_Get_Offset_Index
), Loc
),
244 Parameter_Associations
=> New_List
(
248 Make_Attribute_Reference
(Loc
,
250 Attribute_Name
=> Name_Tag
),
254 Make_Attribute_Reference
(Loc
,
255 Prefix
=> New_Occurrence_Of
(Typ
, Loc
),
256 Attribute_Name
=> Name_Tag
),
260 Make_Integer_Literal
(Loc
, DT_Position
(Call_Ent
)))));
262 end Build_S_Assignment
;