annotate gcc/ada/exp_sel.adb @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- E X P _ S E L --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
kono
parents:
diff changeset
9 -- Copyright (C) 1992-2015, Free Software Foundation, Inc. --
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
kono
parents:
diff changeset
17 -- for more details. You should have received a copy of the GNU General --
kono
parents:
diff changeset
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
kono
parents:
diff changeset
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
kono
parents:
diff changeset
20 -- --
kono
parents:
diff changeset
21 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
23 -- --
kono
parents:
diff changeset
24 ------------------------------------------------------------------------------
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 with Einfo; use Einfo;
kono
parents:
diff changeset
27 with Nlists; use Nlists;
kono
parents:
diff changeset
28 with Nmake; use Nmake;
kono
parents:
diff changeset
29 with Opt; use Opt;
kono
parents:
diff changeset
30 with Rtsfind; use Rtsfind;
kono
parents:
diff changeset
31 with Sinfo; use Sinfo;
kono
parents:
diff changeset
32 with Snames; use Snames;
kono
parents:
diff changeset
33 with Stand; use Stand;
kono
parents:
diff changeset
34 with Tbuild; use Tbuild;
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 package body Exp_Sel is
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 -----------------------
kono
parents:
diff changeset
39 -- Build_Abort_Block --
kono
parents:
diff changeset
40 -----------------------
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 function Build_Abort_Block
kono
parents:
diff changeset
43 (Loc : Source_Ptr;
kono
parents:
diff changeset
44 Abr_Blk_Ent : Entity_Id;
kono
parents:
diff changeset
45 Cln_Blk_Ent : Entity_Id;
kono
parents:
diff changeset
46 Blk : Node_Id) return Node_Id
kono
parents:
diff changeset
47 is
kono
parents:
diff changeset
48 begin
kono
parents:
diff changeset
49 return
kono
parents:
diff changeset
50 Make_Block_Statement (Loc,
kono
parents:
diff changeset
51 Identifier => New_Occurrence_Of (Abr_Blk_Ent, Loc),
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 Declarations => No_List,
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 Handled_Statement_Sequence =>
kono
parents:
diff changeset
56 Make_Handled_Sequence_Of_Statements (Loc,
kono
parents:
diff changeset
57 Statements =>
kono
parents:
diff changeset
58 New_List (
kono
parents:
diff changeset
59 Make_Implicit_Label_Declaration (Loc,
kono
parents:
diff changeset
60 Defining_Identifier => Cln_Blk_Ent,
kono
parents:
diff changeset
61 Label_Construct => Blk),
kono
parents:
diff changeset
62 Blk),
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 Exception_Handlers =>
kono
parents:
diff changeset
65 New_List (Build_Abort_Block_Handler (Loc))));
kono
parents:
diff changeset
66 end Build_Abort_Block;
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 -------------------------------
kono
parents:
diff changeset
69 -- Build_Abort_Block_Handler --
kono
parents:
diff changeset
70 -------------------------------
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 function Build_Abort_Block_Handler (Loc : Source_Ptr) return Node_Id is
kono
parents:
diff changeset
73 Stmt : Node_Id;
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 begin
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 -- With ZCX exceptions, aborts are not defered in handlers. With SJLJ,
kono
parents:
diff changeset
78 -- they are deferred at the beginning of Abort_Signal handlers.
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 if ZCX_Exceptions then
kono
parents:
diff changeset
81 Stmt := Make_Null_Statement (Loc);
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 else
kono
parents:
diff changeset
84 Stmt :=
kono
parents:
diff changeset
85 Make_Procedure_Call_Statement (Loc,
kono
parents:
diff changeset
86 Name => New_Occurrence_Of (RTE (RE_Abort_Undefer), Loc),
kono
parents:
diff changeset
87 Parameter_Associations => No_List);
kono
parents:
diff changeset
88 end if;
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 return Make_Implicit_Exception_Handler (Loc,
kono
parents:
diff changeset
91 Exception_Choices =>
kono
parents:
diff changeset
92 New_List (New_Occurrence_Of (Stand.Abort_Signal, Loc)),
kono
parents:
diff changeset
93 Statements => New_List (Stmt));
kono
parents:
diff changeset
94 end Build_Abort_Block_Handler;
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 -------------
kono
parents:
diff changeset
97 -- Build_B --
kono
parents:
diff changeset
98 -------------
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 function Build_B
kono
parents:
diff changeset
101 (Loc : Source_Ptr;
kono
parents:
diff changeset
102 Decls : List_Id) return Entity_Id
kono
parents:
diff changeset
103 is
kono
parents:
diff changeset
104 B : constant Entity_Id := Make_Temporary (Loc, 'B');
kono
parents:
diff changeset
105 begin
kono
parents:
diff changeset
106 Append_To (Decls,
kono
parents:
diff changeset
107 Make_Object_Declaration (Loc,
kono
parents:
diff changeset
108 Defining_Identifier => B,
kono
parents:
diff changeset
109 Object_Definition => New_Occurrence_Of (Standard_Boolean, Loc),
kono
parents:
diff changeset
110 Expression => New_Occurrence_Of (Standard_False, Loc)));
kono
parents:
diff changeset
111 return B;
kono
parents:
diff changeset
112 end Build_B;
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 -------------
kono
parents:
diff changeset
115 -- Build_C --
kono
parents:
diff changeset
116 -------------
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 function Build_C
kono
parents:
diff changeset
119 (Loc : Source_Ptr;
kono
parents:
diff changeset
120 Decls : List_Id) return Entity_Id
kono
parents:
diff changeset
121 is
kono
parents:
diff changeset
122 C : constant Entity_Id := Make_Temporary (Loc, 'C');
kono
parents:
diff changeset
123 begin
kono
parents:
diff changeset
124 Append_To (Decls,
kono
parents:
diff changeset
125 Make_Object_Declaration (Loc,
kono
parents:
diff changeset
126 Defining_Identifier => C,
kono
parents:
diff changeset
127 Object_Definition =>
kono
parents:
diff changeset
128 New_Occurrence_Of (RTE (RE_Prim_Op_Kind), Loc)));
kono
parents:
diff changeset
129 return C;
kono
parents:
diff changeset
130 end Build_C;
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 -------------------------
kono
parents:
diff changeset
133 -- Build_Cleanup_Block --
kono
parents:
diff changeset
134 -------------------------
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 function Build_Cleanup_Block
kono
parents:
diff changeset
137 (Loc : Source_Ptr;
kono
parents:
diff changeset
138 Blk_Ent : Entity_Id;
kono
parents:
diff changeset
139 Stmts : List_Id;
kono
parents:
diff changeset
140 Clean_Ent : Entity_Id) return Node_Id
kono
parents:
diff changeset
141 is
kono
parents:
diff changeset
142 Cleanup_Block : constant Node_Id :=
kono
parents:
diff changeset
143 Make_Block_Statement (Loc,
kono
parents:
diff changeset
144 Identifier =>
kono
parents:
diff changeset
145 New_Occurrence_Of (Blk_Ent, Loc),
kono
parents:
diff changeset
146 Declarations => No_List,
kono
parents:
diff changeset
147 Handled_Statement_Sequence =>
kono
parents:
diff changeset
148 Make_Handled_Sequence_Of_Statements (Loc,
kono
parents:
diff changeset
149 Statements => Stmts),
kono
parents:
diff changeset
150 Is_Asynchronous_Call_Block => True);
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 begin
kono
parents:
diff changeset
153 Set_Entry_Cancel_Parameter (Blk_Ent, Clean_Ent);
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 return Cleanup_Block;
kono
parents:
diff changeset
156 end Build_Cleanup_Block;
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 -------------
kono
parents:
diff changeset
159 -- Build_K --
kono
parents:
diff changeset
160 -------------
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 function Build_K
kono
parents:
diff changeset
163 (Loc : Source_Ptr;
kono
parents:
diff changeset
164 Decls : List_Id;
kono
parents:
diff changeset
165 Obj : Entity_Id) return Entity_Id
kono
parents:
diff changeset
166 is
kono
parents:
diff changeset
167 K : constant Entity_Id := Make_Temporary (Loc, 'K');
kono
parents:
diff changeset
168 Tag_Node : Node_Id;
kono
parents:
diff changeset
169
kono
parents:
diff changeset
170 begin
kono
parents:
diff changeset
171 if Tagged_Type_Expansion then
kono
parents:
diff changeset
172 Tag_Node := Unchecked_Convert_To (RTE (RE_Tag), Obj);
kono
parents:
diff changeset
173 else
kono
parents:
diff changeset
174 Tag_Node :=
kono
parents:
diff changeset
175 Make_Attribute_Reference (Loc,
kono
parents:
diff changeset
176 Prefix => Obj,
kono
parents:
diff changeset
177 Attribute_Name => Name_Tag);
kono
parents:
diff changeset
178 end if;
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 Append_To (Decls,
kono
parents:
diff changeset
181 Make_Object_Declaration (Loc,
kono
parents:
diff changeset
182 Defining_Identifier => K,
kono
parents:
diff changeset
183 Object_Definition =>
kono
parents:
diff changeset
184 New_Occurrence_Of (RTE (RE_Tagged_Kind), Loc),
kono
parents:
diff changeset
185 Expression =>
kono
parents:
diff changeset
186 Make_Function_Call (Loc,
kono
parents:
diff changeset
187 Name => New_Occurrence_Of (RTE (RE_Get_Tagged_Kind), Loc),
kono
parents:
diff changeset
188 Parameter_Associations => New_List (Tag_Node))));
kono
parents:
diff changeset
189 return K;
kono
parents:
diff changeset
190 end Build_K;
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 -------------
kono
parents:
diff changeset
193 -- Build_S --
kono
parents:
diff changeset
194 -------------
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 function Build_S
kono
parents:
diff changeset
197 (Loc : Source_Ptr;
kono
parents:
diff changeset
198 Decls : List_Id) return Entity_Id
kono
parents:
diff changeset
199 is
kono
parents:
diff changeset
200 S : constant Entity_Id := Make_Temporary (Loc, 'S');
kono
parents:
diff changeset
201 begin
kono
parents:
diff changeset
202 Append_To (Decls,
kono
parents:
diff changeset
203 Make_Object_Declaration (Loc,
kono
parents:
diff changeset
204 Defining_Identifier => S,
kono
parents:
diff changeset
205 Object_Definition => New_Occurrence_Of (Standard_Integer, Loc)));
kono
parents:
diff changeset
206 return S;
kono
parents:
diff changeset
207 end Build_S;
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 ------------------------
kono
parents:
diff changeset
210 -- Build_S_Assignment --
kono
parents:
diff changeset
211 ------------------------
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 function Build_S_Assignment
kono
parents:
diff changeset
214 (Loc : Source_Ptr;
kono
parents:
diff changeset
215 S : Entity_Id;
kono
parents:
diff changeset
216 Obj : Entity_Id;
kono
parents:
diff changeset
217 Call_Ent : Entity_Id) return Node_Id
kono
parents:
diff changeset
218 is
kono
parents:
diff changeset
219 Typ : constant Entity_Id := Etype (Obj);
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 begin
kono
parents:
diff changeset
222 if Tagged_Type_Expansion then
kono
parents:
diff changeset
223 return
kono
parents:
diff changeset
224 Make_Assignment_Statement (Loc,
kono
parents:
diff changeset
225 Name => New_Occurrence_Of (S, Loc),
kono
parents:
diff changeset
226 Expression =>
kono
parents:
diff changeset
227 Make_Function_Call (Loc,
kono
parents:
diff changeset
228 Name => New_Occurrence_Of (RTE (RE_Get_Offset_Index), Loc),
kono
parents:
diff changeset
229 Parameter_Associations => New_List (
kono
parents:
diff changeset
230 Unchecked_Convert_To (RTE (RE_Tag), Obj),
kono
parents:
diff changeset
231 Make_Integer_Literal (Loc, DT_Position (Call_Ent)))));
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 -- VM targets
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 else
kono
parents:
diff changeset
236 return
kono
parents:
diff changeset
237 Make_Assignment_Statement (Loc,
kono
parents:
diff changeset
238 Name => New_Occurrence_Of (S, Loc),
kono
parents:
diff changeset
239 Expression =>
kono
parents:
diff changeset
240 Make_Function_Call (Loc,
kono
parents:
diff changeset
241 Name => New_Occurrence_Of (RTE (RE_Get_Offset_Index), Loc),
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 Parameter_Associations => New_List (
kono
parents:
diff changeset
244
kono
parents:
diff changeset
245 -- Obj_Typ
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 Make_Attribute_Reference (Loc,
kono
parents:
diff changeset
248 Prefix => Obj,
kono
parents:
diff changeset
249 Attribute_Name => Name_Tag),
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 -- Iface_Typ
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 Make_Attribute_Reference (Loc,
kono
parents:
diff changeset
254 Prefix => New_Occurrence_Of (Typ, Loc),
kono
parents:
diff changeset
255 Attribute_Name => Name_Tag),
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 -- Position
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 Make_Integer_Literal (Loc, DT_Position (Call_Ent)))));
kono
parents:
diff changeset
260 end if;
kono
parents:
diff changeset
261 end Build_S_Assignment;
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 end Exp_Sel;