annotate gcc/ada/tbuild.adb @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
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 -- T B U I L D --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
9 -- Copyright (C) 1992-2019, Free Software Foundation, Inc. --
111
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 Atree; use Atree;
kono
parents:
diff changeset
27 with Aspects; use Aspects;
kono
parents:
diff changeset
28 with Csets; use Csets;
kono
parents:
diff changeset
29 with Einfo; use Einfo;
kono
parents:
diff changeset
30 with Elists; use Elists;
kono
parents:
diff changeset
31 with Lib; use Lib;
kono
parents:
diff changeset
32 with Nlists; use Nlists;
kono
parents:
diff changeset
33 with Nmake; use Nmake;
kono
parents:
diff changeset
34 with Opt; use Opt;
kono
parents:
diff changeset
35 with Restrict; use Restrict;
kono
parents:
diff changeset
36 with Rident; use Rident;
kono
parents:
diff changeset
37 with Sem_Aux; use Sem_Aux;
kono
parents:
diff changeset
38 with Snames; use Snames;
kono
parents:
diff changeset
39 with Stand; use Stand;
kono
parents:
diff changeset
40 with Stringt; use Stringt;
kono
parents:
diff changeset
41 with Urealp; use Urealp;
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 package body Tbuild is
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 -----------------------
kono
parents:
diff changeset
46 -- Local Subprograms --
kono
parents:
diff changeset
47 -----------------------
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 procedure Add_Unique_Serial_Number;
kono
parents:
diff changeset
50 -- Add a unique serialization to the string in the Name_Buffer. This
kono
parents:
diff changeset
51 -- consists of a unit specific serial number, and b/s for body/spec.
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 ------------------------------
kono
parents:
diff changeset
54 -- Add_Unique_Serial_Number --
kono
parents:
diff changeset
55 ------------------------------
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 Config_Serial_Number : Nat := 0;
kono
parents:
diff changeset
58 -- Counter for use in config pragmas, see comment below
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 procedure Add_Unique_Serial_Number is
kono
parents:
diff changeset
61 begin
kono
parents:
diff changeset
62 -- If we are analyzing configuration pragmas, Cunit (Main_Unit) will
kono
parents:
diff changeset
63 -- not be set yet. This happens for example when analyzing static
kono
parents:
diff changeset
64 -- string expressions in configuration pragmas. For this case, we
kono
parents:
diff changeset
65 -- just maintain a local counter, defined above and we do not need
kono
parents:
diff changeset
66 -- to add a b or s indication in this case.
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 if No (Cunit (Current_Sem_Unit)) then
kono
parents:
diff changeset
69 Config_Serial_Number := Config_Serial_Number + 1;
kono
parents:
diff changeset
70 Add_Nat_To_Name_Buffer (Config_Serial_Number);
kono
parents:
diff changeset
71 return;
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 -- Normal case, within a unit
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 else
kono
parents:
diff changeset
76 declare
kono
parents:
diff changeset
77 Unit_Node : constant Node_Id := Unit (Cunit (Current_Sem_Unit));
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 begin
kono
parents:
diff changeset
80 Add_Nat_To_Name_Buffer (Increment_Serial_Number);
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 -- Add either b or s, depending on whether current unit is a spec
kono
parents:
diff changeset
83 -- or a body. This is needed because we may generate the same name
kono
parents:
diff changeset
84 -- in a spec and a body otherwise.
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 Name_Len := Name_Len + 1;
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 if Nkind (Unit_Node) = N_Package_Declaration
kono
parents:
diff changeset
89 or else Nkind (Unit_Node) = N_Subprogram_Declaration
kono
parents:
diff changeset
90 or else Nkind (Unit_Node) in N_Generic_Declaration
kono
parents:
diff changeset
91 then
kono
parents:
diff changeset
92 Name_Buffer (Name_Len) := 's';
kono
parents:
diff changeset
93 else
kono
parents:
diff changeset
94 Name_Buffer (Name_Len) := 'b';
kono
parents:
diff changeset
95 end if;
kono
parents:
diff changeset
96 end;
kono
parents:
diff changeset
97 end if;
kono
parents:
diff changeset
98 end Add_Unique_Serial_Number;
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 ----------------
kono
parents:
diff changeset
101 -- Checks_Off --
kono
parents:
diff changeset
102 ----------------
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 function Checks_Off (N : Node_Id) return Node_Id is
kono
parents:
diff changeset
105 begin
kono
parents:
diff changeset
106 return
kono
parents:
diff changeset
107 Make_Unchecked_Expression (Sloc (N),
kono
parents:
diff changeset
108 Expression => N);
kono
parents:
diff changeset
109 end Checks_Off;
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 ----------------
kono
parents:
diff changeset
112 -- Convert_To --
kono
parents:
diff changeset
113 ----------------
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 function Convert_To (Typ : Entity_Id; Expr : Node_Id) return Node_Id is
kono
parents:
diff changeset
116 Result : Node_Id;
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 begin
kono
parents:
diff changeset
119 if Present (Etype (Expr))
kono
parents:
diff changeset
120 and then (Etype (Expr)) = Typ
kono
parents:
diff changeset
121 then
kono
parents:
diff changeset
122 return Relocate_Node (Expr);
kono
parents:
diff changeset
123 else
kono
parents:
diff changeset
124 Result :=
kono
parents:
diff changeset
125 Make_Type_Conversion (Sloc (Expr),
kono
parents:
diff changeset
126 Subtype_Mark => New_Occurrence_Of (Typ, Sloc (Expr)),
kono
parents:
diff changeset
127 Expression => Relocate_Node (Expr));
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 Set_Etype (Result, Typ);
kono
parents:
diff changeset
130 return Result;
kono
parents:
diff changeset
131 end if;
kono
parents:
diff changeset
132 end Convert_To;
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 ----------------------------
kono
parents:
diff changeset
135 -- Convert_To_And_Rewrite --
kono
parents:
diff changeset
136 ----------------------------
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 procedure Convert_To_And_Rewrite (Typ : Entity_Id; Expr : Node_Id) is
kono
parents:
diff changeset
139 begin
kono
parents:
diff changeset
140 Rewrite (Expr, Convert_To (Typ, Expr));
kono
parents:
diff changeset
141 end Convert_To_And_Rewrite;
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 ------------------
kono
parents:
diff changeset
144 -- Discard_List --
kono
parents:
diff changeset
145 ------------------
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 procedure Discard_List (L : List_Id) is
kono
parents:
diff changeset
148 pragma Warnings (Off, L);
kono
parents:
diff changeset
149 begin
kono
parents:
diff changeset
150 null;
kono
parents:
diff changeset
151 end Discard_List;
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 ------------------
kono
parents:
diff changeset
154 -- Discard_Node --
kono
parents:
diff changeset
155 ------------------
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 procedure Discard_Node (N : Node_Or_Entity_Id) is
kono
parents:
diff changeset
158 pragma Warnings (Off, N);
kono
parents:
diff changeset
159 begin
kono
parents:
diff changeset
160 null;
kono
parents:
diff changeset
161 end Discard_Node;
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 -------------------------------------------
kono
parents:
diff changeset
164 -- Make_Byte_Aligned_Attribute_Reference --
kono
parents:
diff changeset
165 -------------------------------------------
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 function Make_Byte_Aligned_Attribute_Reference
kono
parents:
diff changeset
168 (Sloc : Source_Ptr;
kono
parents:
diff changeset
169 Prefix : Node_Id;
kono
parents:
diff changeset
170 Attribute_Name : Name_Id)
kono
parents:
diff changeset
171 return Node_Id
kono
parents:
diff changeset
172 is
kono
parents:
diff changeset
173 N : constant Node_Id :=
kono
parents:
diff changeset
174 Make_Attribute_Reference (Sloc,
kono
parents:
diff changeset
175 Prefix => Prefix,
kono
parents:
diff changeset
176 Attribute_Name => Attribute_Name);
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 begin
kono
parents:
diff changeset
179 pragma Assert (Nam_In (Attribute_Name, Name_Address,
kono
parents:
diff changeset
180 Name_Unrestricted_Access));
kono
parents:
diff changeset
181 Set_Must_Be_Byte_Aligned (N, True);
kono
parents:
diff changeset
182 return N;
kono
parents:
diff changeset
183 end Make_Byte_Aligned_Attribute_Reference;
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 --------------------
kono
parents:
diff changeset
186 -- Make_DT_Access --
kono
parents:
diff changeset
187 --------------------
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 function Make_DT_Access
kono
parents:
diff changeset
190 (Loc : Source_Ptr;
kono
parents:
diff changeset
191 Rec : Node_Id;
kono
parents:
diff changeset
192 Typ : Entity_Id) return Node_Id
kono
parents:
diff changeset
193 is
kono
parents:
diff changeset
194 Full_Type : Entity_Id := Typ;
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 begin
kono
parents:
diff changeset
197 if Is_Private_Type (Typ) then
kono
parents:
diff changeset
198 Full_Type := Underlying_Type (Typ);
kono
parents:
diff changeset
199 end if;
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 return
kono
parents:
diff changeset
202 Unchecked_Convert_To (
kono
parents:
diff changeset
203 New_Occurrence_Of
kono
parents:
diff changeset
204 (Etype (Node (First_Elmt (Access_Disp_Table (Full_Type)))), Loc),
kono
parents:
diff changeset
205 Make_Selected_Component (Loc,
kono
parents:
diff changeset
206 Prefix => New_Copy (Rec),
kono
parents:
diff changeset
207 Selector_Name =>
kono
parents:
diff changeset
208 New_Occurrence_Of (First_Tag_Component (Full_Type), Loc)));
kono
parents:
diff changeset
209 end Make_DT_Access;
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 ------------------------
kono
parents:
diff changeset
212 -- Make_Float_Literal --
kono
parents:
diff changeset
213 ------------------------
kono
parents:
diff changeset
214
kono
parents:
diff changeset
215 function Make_Float_Literal
kono
parents:
diff changeset
216 (Loc : Source_Ptr;
kono
parents:
diff changeset
217 Radix : Uint;
kono
parents:
diff changeset
218 Significand : Uint;
kono
parents:
diff changeset
219 Exponent : Uint) return Node_Id
kono
parents:
diff changeset
220 is
kono
parents:
diff changeset
221 begin
kono
parents:
diff changeset
222 if Radix = 2 and then abs Significand /= 1 then
kono
parents:
diff changeset
223 return
kono
parents:
diff changeset
224 Make_Float_Literal
kono
parents:
diff changeset
225 (Loc, Uint_16,
kono
parents:
diff changeset
226 Significand * Radix**(Exponent mod 4),
kono
parents:
diff changeset
227 Exponent / 4);
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 else
kono
parents:
diff changeset
230 declare
kono
parents:
diff changeset
231 N : constant Node_Id := New_Node (N_Real_Literal, Loc);
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 begin
kono
parents:
diff changeset
234 Set_Realval (N,
kono
parents:
diff changeset
235 UR_From_Components
kono
parents:
diff changeset
236 (Num => abs Significand,
kono
parents:
diff changeset
237 Den => -Exponent,
kono
parents:
diff changeset
238 Rbase => UI_To_Int (Radix),
kono
parents:
diff changeset
239 Negative => Significand < 0));
kono
parents:
diff changeset
240 return N;
kono
parents:
diff changeset
241 end;
kono
parents:
diff changeset
242 end if;
kono
parents:
diff changeset
243 end Make_Float_Literal;
kono
parents:
diff changeset
244
kono
parents:
diff changeset
245 -------------
kono
parents:
diff changeset
246 -- Make_Id --
kono
parents:
diff changeset
247 -------------
kono
parents:
diff changeset
248
kono
parents:
diff changeset
249 function Make_Id (Str : Text_Buffer) return Node_Id is
kono
parents:
diff changeset
250 begin
kono
parents:
diff changeset
251 Name_Len := 0;
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 for J in Str'Range loop
kono
parents:
diff changeset
254 Name_Len := Name_Len + 1;
kono
parents:
diff changeset
255 Name_Buffer (Name_Len) := Fold_Lower (Str (J));
kono
parents:
diff changeset
256 end loop;
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 return
kono
parents:
diff changeset
259 Make_Identifier (System_Location,
kono
parents:
diff changeset
260 Chars => Name_Find);
kono
parents:
diff changeset
261 end Make_Id;
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 -------------------------------------
kono
parents:
diff changeset
264 -- Make_Implicit_Exception_Handler --
kono
parents:
diff changeset
265 -------------------------------------
kono
parents:
diff changeset
266
kono
parents:
diff changeset
267 function Make_Implicit_Exception_Handler
kono
parents:
diff changeset
268 (Sloc : Source_Ptr;
kono
parents:
diff changeset
269 Choice_Parameter : Node_Id := Empty;
kono
parents:
diff changeset
270 Exception_Choices : List_Id;
kono
parents:
diff changeset
271 Statements : List_Id) return Node_Id
kono
parents:
diff changeset
272 is
kono
parents:
diff changeset
273 Handler : Node_Id;
kono
parents:
diff changeset
274 Loc : Source_Ptr;
kono
parents:
diff changeset
275
kono
parents:
diff changeset
276 begin
kono
parents:
diff changeset
277 -- Set the source location only when debugging the expanded code
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 -- When debugging the source code directly, we do not want the compiler
kono
parents:
diff changeset
280 -- to associate this implicit exception handler with any specific source
kono
parents:
diff changeset
281 -- line, because it can potentially confuse the debugger. The most
kono
parents:
diff changeset
282 -- damaging situation would arise when the debugger tries to insert a
kono
parents:
diff changeset
283 -- breakpoint at a certain line. If the code of the associated implicit
kono
parents:
diff changeset
284 -- exception handler is generated before the code of that line, then the
kono
parents:
diff changeset
285 -- debugger will end up inserting the breakpoint inside the exception
kono
parents:
diff changeset
286 -- handler, rather than the code the user intended to break on. As a
kono
parents:
diff changeset
287 -- result, it is likely that the program will not hit the breakpoint
kono
parents:
diff changeset
288 -- as expected.
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 if Debug_Generated_Code then
kono
parents:
diff changeset
291 Loc := Sloc;
kono
parents:
diff changeset
292 else
kono
parents:
diff changeset
293 Loc := No_Location;
kono
parents:
diff changeset
294 end if;
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 Handler :=
kono
parents:
diff changeset
297 Make_Exception_Handler
kono
parents:
diff changeset
298 (Loc, Choice_Parameter, Exception_Choices, Statements);
kono
parents:
diff changeset
299 Set_Local_Raise_Statements (Handler, No_Elist);
kono
parents:
diff changeset
300 return Handler;
kono
parents:
diff changeset
301 end Make_Implicit_Exception_Handler;
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 --------------------------------
kono
parents:
diff changeset
304 -- Make_Implicit_If_Statement --
kono
parents:
diff changeset
305 --------------------------------
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 function Make_Implicit_If_Statement
kono
parents:
diff changeset
308 (Node : Node_Id;
kono
parents:
diff changeset
309 Condition : Node_Id;
kono
parents:
diff changeset
310 Then_Statements : List_Id;
kono
parents:
diff changeset
311 Elsif_Parts : List_Id := No_List;
kono
parents:
diff changeset
312 Else_Statements : List_Id := No_List) return Node_Id
kono
parents:
diff changeset
313 is
kono
parents:
diff changeset
314 begin
kono
parents:
diff changeset
315 Check_Restriction (No_Implicit_Conditionals, Node);
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 return Make_If_Statement (Sloc (Node),
kono
parents:
diff changeset
318 Condition,
kono
parents:
diff changeset
319 Then_Statements,
kono
parents:
diff changeset
320 Elsif_Parts,
kono
parents:
diff changeset
321 Else_Statements);
kono
parents:
diff changeset
322 end Make_Implicit_If_Statement;
kono
parents:
diff changeset
323
kono
parents:
diff changeset
324 -------------------------------------
kono
parents:
diff changeset
325 -- Make_Implicit_Label_Declaration --
kono
parents:
diff changeset
326 -------------------------------------
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 function Make_Implicit_Label_Declaration
kono
parents:
diff changeset
329 (Loc : Source_Ptr;
kono
parents:
diff changeset
330 Defining_Identifier : Node_Id;
kono
parents:
diff changeset
331 Label_Construct : Node_Id) return Node_Id
kono
parents:
diff changeset
332 is
kono
parents:
diff changeset
333 N : constant Node_Id :=
kono
parents:
diff changeset
334 Make_Implicit_Label_Declaration (Loc, Defining_Identifier);
kono
parents:
diff changeset
335 begin
kono
parents:
diff changeset
336 Set_Label_Construct (N, Label_Construct);
kono
parents:
diff changeset
337 return N;
kono
parents:
diff changeset
338 end Make_Implicit_Label_Declaration;
kono
parents:
diff changeset
339
kono
parents:
diff changeset
340 ----------------------------------
kono
parents:
diff changeset
341 -- Make_Implicit_Loop_Statement --
kono
parents:
diff changeset
342 ----------------------------------
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 function Make_Implicit_Loop_Statement
kono
parents:
diff changeset
345 (Node : Node_Id;
kono
parents:
diff changeset
346 Statements : List_Id;
kono
parents:
diff changeset
347 Identifier : Node_Id := Empty;
kono
parents:
diff changeset
348 Iteration_Scheme : Node_Id := Empty;
kono
parents:
diff changeset
349 Has_Created_Identifier : Boolean := False;
kono
parents:
diff changeset
350 End_Label : Node_Id := Empty) return Node_Id
kono
parents:
diff changeset
351 is
kono
parents:
diff changeset
352 begin
kono
parents:
diff changeset
353 Check_Restriction (No_Implicit_Loops, Node);
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 if Present (Iteration_Scheme)
kono
parents:
diff changeset
356 and then Present (Condition (Iteration_Scheme))
kono
parents:
diff changeset
357 then
kono
parents:
diff changeset
358 Check_Restriction (No_Implicit_Conditionals, Node);
kono
parents:
diff changeset
359 end if;
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 return Make_Loop_Statement (Sloc (Node),
kono
parents:
diff changeset
362 Identifier => Identifier,
kono
parents:
diff changeset
363 Iteration_Scheme => Iteration_Scheme,
kono
parents:
diff changeset
364 Statements => Statements,
kono
parents:
diff changeset
365 Has_Created_Identifier => Has_Created_Identifier,
kono
parents:
diff changeset
366 End_Label => End_Label);
kono
parents:
diff changeset
367 end Make_Implicit_Loop_Statement;
kono
parents:
diff changeset
368
kono
parents:
diff changeset
369 --------------------------
kono
parents:
diff changeset
370 -- Make_Integer_Literal --
kono
parents:
diff changeset
371 ---------------------------
kono
parents:
diff changeset
372
kono
parents:
diff changeset
373 function Make_Integer_Literal
kono
parents:
diff changeset
374 (Loc : Source_Ptr;
kono
parents:
diff changeset
375 Intval : Int) return Node_Id
kono
parents:
diff changeset
376 is
kono
parents:
diff changeset
377 begin
kono
parents:
diff changeset
378 return Make_Integer_Literal (Loc, UI_From_Int (Intval));
kono
parents:
diff changeset
379 end Make_Integer_Literal;
kono
parents:
diff changeset
380
kono
parents:
diff changeset
381 --------------------------------
kono
parents:
diff changeset
382 -- Make_Linker_Section_Pragma --
kono
parents:
diff changeset
383 --------------------------------
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 function Make_Linker_Section_Pragma
kono
parents:
diff changeset
386 (Ent : Entity_Id;
kono
parents:
diff changeset
387 Loc : Source_Ptr;
kono
parents:
diff changeset
388 Sec : String) return Node_Id
kono
parents:
diff changeset
389 is
kono
parents:
diff changeset
390 LS : Node_Id;
kono
parents:
diff changeset
391
kono
parents:
diff changeset
392 begin
kono
parents:
diff changeset
393 LS :=
kono
parents:
diff changeset
394 Make_Pragma
kono
parents:
diff changeset
395 (Loc,
kono
parents:
diff changeset
396 Name_Linker_Section,
kono
parents:
diff changeset
397 New_List
kono
parents:
diff changeset
398 (Make_Pragma_Argument_Association
kono
parents:
diff changeset
399 (Sloc => Loc,
kono
parents:
diff changeset
400 Expression => New_Occurrence_Of (Ent, Loc)),
kono
parents:
diff changeset
401 Make_Pragma_Argument_Association
kono
parents:
diff changeset
402 (Sloc => Loc,
kono
parents:
diff changeset
403 Expression =>
kono
parents:
diff changeset
404 Make_String_Literal
kono
parents:
diff changeset
405 (Sloc => Loc,
kono
parents:
diff changeset
406 Strval => Sec))));
kono
parents:
diff changeset
407
kono
parents:
diff changeset
408 Set_Has_Gigi_Rep_Item (Ent);
kono
parents:
diff changeset
409 return LS;
kono
parents:
diff changeset
410 end Make_Linker_Section_Pragma;
kono
parents:
diff changeset
411
kono
parents:
diff changeset
412 -----------------
kono
parents:
diff changeset
413 -- Make_Pragma --
kono
parents:
diff changeset
414 -----------------
kono
parents:
diff changeset
415
kono
parents:
diff changeset
416 function Make_Pragma
kono
parents:
diff changeset
417 (Sloc : Source_Ptr;
kono
parents:
diff changeset
418 Chars : Name_Id;
kono
parents:
diff changeset
419 Pragma_Argument_Associations : List_Id := No_List) return Node_Id
kono
parents:
diff changeset
420 is
kono
parents:
diff changeset
421 begin
kono
parents:
diff changeset
422 return
kono
parents:
diff changeset
423 Make_Pragma (Sloc,
kono
parents:
diff changeset
424 Pragma_Argument_Associations => Pragma_Argument_Associations,
kono
parents:
diff changeset
425 Pragma_Identifier => Make_Identifier (Sloc, Chars));
kono
parents:
diff changeset
426 end Make_Pragma;
kono
parents:
diff changeset
427
kono
parents:
diff changeset
428 ---------------------------------
kono
parents:
diff changeset
429 -- Make_Raise_Constraint_Error --
kono
parents:
diff changeset
430 ---------------------------------
kono
parents:
diff changeset
431
kono
parents:
diff changeset
432 function Make_Raise_Constraint_Error
kono
parents:
diff changeset
433 (Sloc : Source_Ptr;
kono
parents:
diff changeset
434 Condition : Node_Id := Empty;
kono
parents:
diff changeset
435 Reason : RT_Exception_Code) return Node_Id
kono
parents:
diff changeset
436 is
kono
parents:
diff changeset
437 begin
kono
parents:
diff changeset
438 pragma Assert (Rkind (Reason) = CE_Reason);
kono
parents:
diff changeset
439 return
kono
parents:
diff changeset
440 Make_Raise_Constraint_Error (Sloc,
kono
parents:
diff changeset
441 Condition => Condition,
kono
parents:
diff changeset
442 Reason => UI_From_Int (RT_Exception_Code'Pos (Reason)));
kono
parents:
diff changeset
443 end Make_Raise_Constraint_Error;
kono
parents:
diff changeset
444
kono
parents:
diff changeset
445 ------------------------------
kono
parents:
diff changeset
446 -- Make_Raise_Program_Error --
kono
parents:
diff changeset
447 ------------------------------
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 function Make_Raise_Program_Error
kono
parents:
diff changeset
450 (Sloc : Source_Ptr;
kono
parents:
diff changeset
451 Condition : Node_Id := Empty;
kono
parents:
diff changeset
452 Reason : RT_Exception_Code) return Node_Id
kono
parents:
diff changeset
453 is
kono
parents:
diff changeset
454 begin
kono
parents:
diff changeset
455 pragma Assert (Rkind (Reason) = PE_Reason);
kono
parents:
diff changeset
456 return
kono
parents:
diff changeset
457 Make_Raise_Program_Error (Sloc,
kono
parents:
diff changeset
458 Condition => Condition,
kono
parents:
diff changeset
459 Reason => UI_From_Int (RT_Exception_Code'Pos (Reason)));
kono
parents:
diff changeset
460 end Make_Raise_Program_Error;
kono
parents:
diff changeset
461
kono
parents:
diff changeset
462 ------------------------------
kono
parents:
diff changeset
463 -- Make_Raise_Storage_Error --
kono
parents:
diff changeset
464 ------------------------------
kono
parents:
diff changeset
465
kono
parents:
diff changeset
466 function Make_Raise_Storage_Error
kono
parents:
diff changeset
467 (Sloc : Source_Ptr;
kono
parents:
diff changeset
468 Condition : Node_Id := Empty;
kono
parents:
diff changeset
469 Reason : RT_Exception_Code) return Node_Id
kono
parents:
diff changeset
470 is
kono
parents:
diff changeset
471 begin
kono
parents:
diff changeset
472 pragma Assert (Rkind (Reason) = SE_Reason);
kono
parents:
diff changeset
473 return
kono
parents:
diff changeset
474 Make_Raise_Storage_Error (Sloc,
kono
parents:
diff changeset
475 Condition => Condition,
kono
parents:
diff changeset
476 Reason => UI_From_Int (RT_Exception_Code'Pos (Reason)));
kono
parents:
diff changeset
477 end Make_Raise_Storage_Error;
kono
parents:
diff changeset
478
kono
parents:
diff changeset
479 -------------
kono
parents:
diff changeset
480 -- Make_SC --
kono
parents:
diff changeset
481 -------------
kono
parents:
diff changeset
482
kono
parents:
diff changeset
483 function Make_SC (Pre, Sel : Node_Id) return Node_Id is
kono
parents:
diff changeset
484 begin
kono
parents:
diff changeset
485 return
kono
parents:
diff changeset
486 Make_Selected_Component (System_Location,
kono
parents:
diff changeset
487 Prefix => Pre,
kono
parents:
diff changeset
488 Selector_Name => Sel);
kono
parents:
diff changeset
489 end Make_SC;
kono
parents:
diff changeset
490
kono
parents:
diff changeset
491 -------------------------
kono
parents:
diff changeset
492 -- Make_String_Literal --
kono
parents:
diff changeset
493 -------------------------
kono
parents:
diff changeset
494
kono
parents:
diff changeset
495 function Make_String_Literal
kono
parents:
diff changeset
496 (Sloc : Source_Ptr;
kono
parents:
diff changeset
497 Strval : String) return Node_Id
kono
parents:
diff changeset
498 is
kono
parents:
diff changeset
499 begin
kono
parents:
diff changeset
500 Start_String;
kono
parents:
diff changeset
501 Store_String_Chars (Strval);
kono
parents:
diff changeset
502 return Make_String_Literal (Sloc, Strval => End_String);
kono
parents:
diff changeset
503 end Make_String_Literal;
kono
parents:
diff changeset
504
kono
parents:
diff changeset
505 --------------------
kono
parents:
diff changeset
506 -- Make_Temporary --
kono
parents:
diff changeset
507 --------------------
kono
parents:
diff changeset
508
kono
parents:
diff changeset
509 function Make_Temporary
kono
parents:
diff changeset
510 (Loc : Source_Ptr;
kono
parents:
diff changeset
511 Id : Character;
kono
parents:
diff changeset
512 Related_Node : Node_Id := Empty) return Entity_Id
kono
parents:
diff changeset
513 is
kono
parents:
diff changeset
514 Temp : constant Entity_Id :=
kono
parents:
diff changeset
515 Make_Defining_Identifier (Loc, Chars => New_Internal_Name (Id));
kono
parents:
diff changeset
516 begin
kono
parents:
diff changeset
517 Set_Related_Expression (Temp, Related_Node);
kono
parents:
diff changeset
518 return Temp;
kono
parents:
diff changeset
519 end Make_Temporary;
kono
parents:
diff changeset
520
kono
parents:
diff changeset
521 ---------------------------
kono
parents:
diff changeset
522 -- Make_Unsuppress_Block --
kono
parents:
diff changeset
523 ---------------------------
kono
parents:
diff changeset
524
kono
parents:
diff changeset
525 -- Generates the following expansion:
kono
parents:
diff changeset
526
kono
parents:
diff changeset
527 -- declare
kono
parents:
diff changeset
528 -- pragma Suppress (<check>);
kono
parents:
diff changeset
529 -- begin
kono
parents:
diff changeset
530 -- <stmts>
kono
parents:
diff changeset
531 -- end;
kono
parents:
diff changeset
532
kono
parents:
diff changeset
533 function Make_Unsuppress_Block
kono
parents:
diff changeset
534 (Loc : Source_Ptr;
kono
parents:
diff changeset
535 Check : Name_Id;
kono
parents:
diff changeset
536 Stmts : List_Id) return Node_Id
kono
parents:
diff changeset
537 is
kono
parents:
diff changeset
538 begin
kono
parents:
diff changeset
539 return
kono
parents:
diff changeset
540 Make_Block_Statement (Loc,
kono
parents:
diff changeset
541 Declarations => New_List (
kono
parents:
diff changeset
542 Make_Pragma (Loc,
kono
parents:
diff changeset
543 Chars => Name_Suppress,
kono
parents:
diff changeset
544 Pragma_Argument_Associations => New_List (
kono
parents:
diff changeset
545 Make_Pragma_Argument_Association (Loc,
kono
parents:
diff changeset
546 Expression => Make_Identifier (Loc, Check))))),
kono
parents:
diff changeset
547
kono
parents:
diff changeset
548 Handled_Statement_Sequence =>
kono
parents:
diff changeset
549 Make_Handled_Sequence_Of_Statements (Loc,
kono
parents:
diff changeset
550 Statements => Stmts));
kono
parents:
diff changeset
551 end Make_Unsuppress_Block;
kono
parents:
diff changeset
552
kono
parents:
diff changeset
553 --------------------------
kono
parents:
diff changeset
554 -- New_Constraint_Error --
kono
parents:
diff changeset
555 --------------------------
kono
parents:
diff changeset
556
kono
parents:
diff changeset
557 function New_Constraint_Error (Loc : Source_Ptr) return Node_Id is
kono
parents:
diff changeset
558 Ident_Node : Node_Id;
kono
parents:
diff changeset
559 Raise_Node : Node_Id;
kono
parents:
diff changeset
560
kono
parents:
diff changeset
561 begin
kono
parents:
diff changeset
562 Ident_Node := New_Node (N_Identifier, Loc);
kono
parents:
diff changeset
563 Set_Chars (Ident_Node, Chars (Standard_Entity (S_Constraint_Error)));
kono
parents:
diff changeset
564 Set_Entity (Ident_Node, Standard_Entity (S_Constraint_Error));
kono
parents:
diff changeset
565 Raise_Node := New_Node (N_Raise_Statement, Loc);
kono
parents:
diff changeset
566 Set_Name (Raise_Node, Ident_Node);
kono
parents:
diff changeset
567 return Raise_Node;
kono
parents:
diff changeset
568 end New_Constraint_Error;
kono
parents:
diff changeset
569
kono
parents:
diff changeset
570 -----------------------
kono
parents:
diff changeset
571 -- New_External_Name --
kono
parents:
diff changeset
572 -----------------------
kono
parents:
diff changeset
573
kono
parents:
diff changeset
574 function New_External_Name
kono
parents:
diff changeset
575 (Related_Id : Name_Id;
kono
parents:
diff changeset
576 Suffix : Character := ' ';
kono
parents:
diff changeset
577 Suffix_Index : Int := 0;
kono
parents:
diff changeset
578 Prefix : Character := ' ') return Name_Id
kono
parents:
diff changeset
579 is
kono
parents:
diff changeset
580 begin
kono
parents:
diff changeset
581 Get_Name_String (Related_Id);
kono
parents:
diff changeset
582
kono
parents:
diff changeset
583 if Prefix /= ' ' then
kono
parents:
diff changeset
584 pragma Assert (Is_OK_Internal_Letter (Prefix) or else Prefix = '_');
kono
parents:
diff changeset
585
kono
parents:
diff changeset
586 for J in reverse 1 .. Name_Len loop
kono
parents:
diff changeset
587 Name_Buffer (J + 1) := Name_Buffer (J);
kono
parents:
diff changeset
588 end loop;
kono
parents:
diff changeset
589
kono
parents:
diff changeset
590 Name_Len := Name_Len + 1;
kono
parents:
diff changeset
591 Name_Buffer (1) := Prefix;
kono
parents:
diff changeset
592 end if;
kono
parents:
diff changeset
593
kono
parents:
diff changeset
594 if Suffix /= ' ' then
kono
parents:
diff changeset
595 pragma Assert (Is_OK_Internal_Letter (Suffix));
kono
parents:
diff changeset
596 Add_Char_To_Name_Buffer (Suffix);
kono
parents:
diff changeset
597 end if;
kono
parents:
diff changeset
598
kono
parents:
diff changeset
599 if Suffix_Index /= 0 then
kono
parents:
diff changeset
600 if Suffix_Index < 0 then
kono
parents:
diff changeset
601 Add_Unique_Serial_Number;
kono
parents:
diff changeset
602 else
kono
parents:
diff changeset
603 Add_Nat_To_Name_Buffer (Suffix_Index);
kono
parents:
diff changeset
604 end if;
kono
parents:
diff changeset
605 end if;
kono
parents:
diff changeset
606
kono
parents:
diff changeset
607 return Name_Find;
kono
parents:
diff changeset
608 end New_External_Name;
kono
parents:
diff changeset
609
kono
parents:
diff changeset
610 function New_External_Name
kono
parents:
diff changeset
611 (Related_Id : Name_Id;
kono
parents:
diff changeset
612 Suffix : String;
kono
parents:
diff changeset
613 Suffix_Index : Int := 0;
kono
parents:
diff changeset
614 Prefix : Character := ' ') return Name_Id
kono
parents:
diff changeset
615 is
kono
parents:
diff changeset
616 begin
kono
parents:
diff changeset
617 Get_Name_String (Related_Id);
kono
parents:
diff changeset
618
kono
parents:
diff changeset
619 if Prefix /= ' ' then
kono
parents:
diff changeset
620 pragma Assert (Is_OK_Internal_Letter (Prefix));
kono
parents:
diff changeset
621
kono
parents:
diff changeset
622 for J in reverse 1 .. Name_Len loop
kono
parents:
diff changeset
623 Name_Buffer (J + 1) := Name_Buffer (J);
kono
parents:
diff changeset
624 end loop;
kono
parents:
diff changeset
625
kono
parents:
diff changeset
626 Name_Len := Name_Len + 1;
kono
parents:
diff changeset
627 Name_Buffer (1) := Prefix;
kono
parents:
diff changeset
628 end if;
kono
parents:
diff changeset
629
kono
parents:
diff changeset
630 if Suffix /= "" then
kono
parents:
diff changeset
631 Name_Buffer (Name_Len + 1 .. Name_Len + Suffix'Length) := Suffix;
kono
parents:
diff changeset
632 Name_Len := Name_Len + Suffix'Length;
kono
parents:
diff changeset
633 end if;
kono
parents:
diff changeset
634
kono
parents:
diff changeset
635 if Suffix_Index /= 0 then
kono
parents:
diff changeset
636 if Suffix_Index < 0 then
kono
parents:
diff changeset
637 Add_Unique_Serial_Number;
kono
parents:
diff changeset
638 else
kono
parents:
diff changeset
639 Add_Nat_To_Name_Buffer (Suffix_Index);
kono
parents:
diff changeset
640 end if;
kono
parents:
diff changeset
641 end if;
kono
parents:
diff changeset
642
kono
parents:
diff changeset
643 return Name_Find;
kono
parents:
diff changeset
644 end New_External_Name;
kono
parents:
diff changeset
645
kono
parents:
diff changeset
646 function New_External_Name
kono
parents:
diff changeset
647 (Suffix : Character;
kono
parents:
diff changeset
648 Suffix_Index : Nat) return Name_Id
kono
parents:
diff changeset
649 is
kono
parents:
diff changeset
650 begin
kono
parents:
diff changeset
651 Name_Buffer (1) := Suffix;
kono
parents:
diff changeset
652 Name_Len := 1;
kono
parents:
diff changeset
653 Add_Nat_To_Name_Buffer (Suffix_Index);
kono
parents:
diff changeset
654 return Name_Find;
kono
parents:
diff changeset
655 end New_External_Name;
kono
parents:
diff changeset
656
kono
parents:
diff changeset
657 -----------------------
kono
parents:
diff changeset
658 -- New_Internal_Name --
kono
parents:
diff changeset
659 -----------------------
kono
parents:
diff changeset
660
kono
parents:
diff changeset
661 function New_Internal_Name (Id_Char : Character) return Name_Id is
kono
parents:
diff changeset
662 begin
kono
parents:
diff changeset
663 pragma Assert (Is_OK_Internal_Letter (Id_Char));
kono
parents:
diff changeset
664 Name_Buffer (1) := Id_Char;
kono
parents:
diff changeset
665 Name_Len := 1;
kono
parents:
diff changeset
666 Add_Unique_Serial_Number;
kono
parents:
diff changeset
667 return Name_Enter;
kono
parents:
diff changeset
668 end New_Internal_Name;
kono
parents:
diff changeset
669
kono
parents:
diff changeset
670 -----------------------
kono
parents:
diff changeset
671 -- New_Occurrence_Of --
kono
parents:
diff changeset
672 -----------------------
kono
parents:
diff changeset
673
kono
parents:
diff changeset
674 function New_Occurrence_Of
kono
parents:
diff changeset
675 (Def_Id : Entity_Id;
kono
parents:
diff changeset
676 Loc : Source_Ptr) return Node_Id
kono
parents:
diff changeset
677 is
kono
parents:
diff changeset
678 pragma Assert (Present (Def_Id) and then Nkind (Def_Id) in N_Entity);
kono
parents:
diff changeset
679 Occurrence : Node_Id;
kono
parents:
diff changeset
680
kono
parents:
diff changeset
681 begin
kono
parents:
diff changeset
682 Occurrence := New_Node (N_Identifier, Loc);
kono
parents:
diff changeset
683 Set_Chars (Occurrence, Chars (Def_Id));
kono
parents:
diff changeset
684 Set_Entity (Occurrence, Def_Id);
kono
parents:
diff changeset
685
kono
parents:
diff changeset
686 if Is_Type (Def_Id) then
kono
parents:
diff changeset
687 Set_Etype (Occurrence, Def_Id);
kono
parents:
diff changeset
688 else
kono
parents:
diff changeset
689 Set_Etype (Occurrence, Etype (Def_Id));
kono
parents:
diff changeset
690 end if;
kono
parents:
diff changeset
691
kono
parents:
diff changeset
692 if Ekind (Def_Id) = E_Enumeration_Literal then
kono
parents:
diff changeset
693 Set_Is_Static_Expression (Occurrence, True);
kono
parents:
diff changeset
694 end if;
kono
parents:
diff changeset
695
kono
parents:
diff changeset
696 return Occurrence;
kono
parents:
diff changeset
697 end New_Occurrence_Of;
kono
parents:
diff changeset
698
kono
parents:
diff changeset
699 -----------------
kono
parents:
diff changeset
700 -- New_Op_Node --
kono
parents:
diff changeset
701 -----------------
kono
parents:
diff changeset
702
kono
parents:
diff changeset
703 function New_Op_Node
kono
parents:
diff changeset
704 (New_Node_Kind : Node_Kind;
kono
parents:
diff changeset
705 New_Sloc : Source_Ptr) return Node_Id
kono
parents:
diff changeset
706 is
kono
parents:
diff changeset
707 type Name_Of_Type is array (N_Op) of Name_Id;
kono
parents:
diff changeset
708 Name_Of : constant Name_Of_Type := Name_Of_Type'(
kono
parents:
diff changeset
709 N_Op_And => Name_Op_And,
kono
parents:
diff changeset
710 N_Op_Or => Name_Op_Or,
kono
parents:
diff changeset
711 N_Op_Xor => Name_Op_Xor,
kono
parents:
diff changeset
712 N_Op_Eq => Name_Op_Eq,
kono
parents:
diff changeset
713 N_Op_Ne => Name_Op_Ne,
kono
parents:
diff changeset
714 N_Op_Lt => Name_Op_Lt,
kono
parents:
diff changeset
715 N_Op_Le => Name_Op_Le,
kono
parents:
diff changeset
716 N_Op_Gt => Name_Op_Gt,
kono
parents:
diff changeset
717 N_Op_Ge => Name_Op_Ge,
kono
parents:
diff changeset
718 N_Op_Add => Name_Op_Add,
kono
parents:
diff changeset
719 N_Op_Subtract => Name_Op_Subtract,
kono
parents:
diff changeset
720 N_Op_Concat => Name_Op_Concat,
kono
parents:
diff changeset
721 N_Op_Multiply => Name_Op_Multiply,
kono
parents:
diff changeset
722 N_Op_Divide => Name_Op_Divide,
kono
parents:
diff changeset
723 N_Op_Mod => Name_Op_Mod,
kono
parents:
diff changeset
724 N_Op_Rem => Name_Op_Rem,
kono
parents:
diff changeset
725 N_Op_Expon => Name_Op_Expon,
kono
parents:
diff changeset
726 N_Op_Plus => Name_Op_Add,
kono
parents:
diff changeset
727 N_Op_Minus => Name_Op_Subtract,
kono
parents:
diff changeset
728 N_Op_Abs => Name_Op_Abs,
kono
parents:
diff changeset
729 N_Op_Not => Name_Op_Not,
kono
parents:
diff changeset
730
kono
parents:
diff changeset
731 -- We don't really need these shift operators, since they never
kono
parents:
diff changeset
732 -- appear as operators in the source, but the path of least
kono
parents:
diff changeset
733 -- resistance is to put them in (the aggregate must be complete).
kono
parents:
diff changeset
734
kono
parents:
diff changeset
735 N_Op_Rotate_Left => Name_Rotate_Left,
kono
parents:
diff changeset
736 N_Op_Rotate_Right => Name_Rotate_Right,
kono
parents:
diff changeset
737 N_Op_Shift_Left => Name_Shift_Left,
kono
parents:
diff changeset
738 N_Op_Shift_Right => Name_Shift_Right,
kono
parents:
diff changeset
739 N_Op_Shift_Right_Arithmetic => Name_Shift_Right_Arithmetic);
kono
parents:
diff changeset
740
kono
parents:
diff changeset
741 Nod : constant Node_Id := New_Node (New_Node_Kind, New_Sloc);
kono
parents:
diff changeset
742
kono
parents:
diff changeset
743 begin
kono
parents:
diff changeset
744 if New_Node_Kind in Name_Of'Range then
kono
parents:
diff changeset
745 Set_Chars (Nod, Name_Of (New_Node_Kind));
kono
parents:
diff changeset
746 end if;
kono
parents:
diff changeset
747
kono
parents:
diff changeset
748 return Nod;
kono
parents:
diff changeset
749 end New_Op_Node;
kono
parents:
diff changeset
750
kono
parents:
diff changeset
751 -----------------------
kono
parents:
diff changeset
752 -- New_Suffixed_Name --
kono
parents:
diff changeset
753 -----------------------
kono
parents:
diff changeset
754
kono
parents:
diff changeset
755 function New_Suffixed_Name
kono
parents:
diff changeset
756 (Related_Id : Name_Id;
kono
parents:
diff changeset
757 Suffix : String) return Name_Id
kono
parents:
diff changeset
758 is
kono
parents:
diff changeset
759 begin
kono
parents:
diff changeset
760 Get_Name_String (Related_Id);
kono
parents:
diff changeset
761 Add_Char_To_Name_Buffer ('_');
kono
parents:
diff changeset
762 Add_Str_To_Name_Buffer (Suffix);
kono
parents:
diff changeset
763 return Name_Find;
kono
parents:
diff changeset
764 end New_Suffixed_Name;
kono
parents:
diff changeset
765
kono
parents:
diff changeset
766 -------------------
kono
parents:
diff changeset
767 -- OK_Convert_To --
kono
parents:
diff changeset
768 -------------------
kono
parents:
diff changeset
769
kono
parents:
diff changeset
770 function OK_Convert_To (Typ : Entity_Id; Expr : Node_Id) return Node_Id is
kono
parents:
diff changeset
771 Result : Node_Id;
kono
parents:
diff changeset
772 begin
kono
parents:
diff changeset
773 Result :=
kono
parents:
diff changeset
774 Make_Type_Conversion (Sloc (Expr),
kono
parents:
diff changeset
775 Subtype_Mark => New_Occurrence_Of (Typ, Sloc (Expr)),
kono
parents:
diff changeset
776 Expression => Relocate_Node (Expr));
kono
parents:
diff changeset
777 Set_Conversion_OK (Result, True);
kono
parents:
diff changeset
778 Set_Etype (Result, Typ);
kono
parents:
diff changeset
779 return Result;
kono
parents:
diff changeset
780 end OK_Convert_To;
kono
parents:
diff changeset
781
kono
parents:
diff changeset
782 -------------
kono
parents:
diff changeset
783 -- Set_NOD --
kono
parents:
diff changeset
784 -------------
kono
parents:
diff changeset
785
kono
parents:
diff changeset
786 procedure Set_NOD (Unit : Node_Id) is
kono
parents:
diff changeset
787 begin
kono
parents:
diff changeset
788 Set_Restriction_No_Dependence (Unit, Warn => False);
kono
parents:
diff changeset
789 end Set_NOD;
kono
parents:
diff changeset
790
kono
parents:
diff changeset
791 -------------
kono
parents:
diff changeset
792 -- Set_NSA --
kono
parents:
diff changeset
793 -------------
kono
parents:
diff changeset
794
kono
parents:
diff changeset
795 procedure Set_NSA (Asp : Name_Id; OK : out Boolean) is
kono
parents:
diff changeset
796 Asp_Id : constant Aspect_Id := Get_Aspect_Id (Asp);
kono
parents:
diff changeset
797 begin
kono
parents:
diff changeset
798 if Asp_Id = No_Aspect then
kono
parents:
diff changeset
799 OK := False;
kono
parents:
diff changeset
800 else
kono
parents:
diff changeset
801 OK := True;
kono
parents:
diff changeset
802 Set_Restriction_No_Specification_Of_Aspect (Asp_Id);
kono
parents:
diff changeset
803 end if;
kono
parents:
diff changeset
804 end Set_NSA;
kono
parents:
diff changeset
805
kono
parents:
diff changeset
806 -------------
kono
parents:
diff changeset
807 -- Set_NUA --
kono
parents:
diff changeset
808 -------------
kono
parents:
diff changeset
809
kono
parents:
diff changeset
810 procedure Set_NUA (Attr : Name_Id; OK : out Boolean) is
kono
parents:
diff changeset
811 begin
kono
parents:
diff changeset
812 if Is_Attribute_Name (Attr) then
kono
parents:
diff changeset
813 OK := True;
kono
parents:
diff changeset
814 Set_Restriction_No_Use_Of_Attribute (Get_Attribute_Id (Attr));
kono
parents:
diff changeset
815 else
kono
parents:
diff changeset
816 OK := False;
kono
parents:
diff changeset
817 end if;
kono
parents:
diff changeset
818 end Set_NUA;
kono
parents:
diff changeset
819
kono
parents:
diff changeset
820 -------------
kono
parents:
diff changeset
821 -- Set_NUP --
kono
parents:
diff changeset
822 -------------
kono
parents:
diff changeset
823
kono
parents:
diff changeset
824 procedure Set_NUP (Prag : Name_Id; OK : out Boolean) is
kono
parents:
diff changeset
825 begin
kono
parents:
diff changeset
826 if Is_Pragma_Name (Prag) then
kono
parents:
diff changeset
827 OK := True;
kono
parents:
diff changeset
828 Set_Restriction_No_Use_Of_Pragma (Get_Pragma_Id (Prag));
kono
parents:
diff changeset
829 else
kono
parents:
diff changeset
830 OK := False;
kono
parents:
diff changeset
831 end if;
kono
parents:
diff changeset
832 end Set_NUP;
kono
parents:
diff changeset
833
kono
parents:
diff changeset
834 --------------------------
kono
parents:
diff changeset
835 -- Unchecked_Convert_To --
kono
parents:
diff changeset
836 --------------------------
kono
parents:
diff changeset
837
kono
parents:
diff changeset
838 function Unchecked_Convert_To
kono
parents:
diff changeset
839 (Typ : Entity_Id;
kono
parents:
diff changeset
840 Expr : Node_Id) return Node_Id
kono
parents:
diff changeset
841 is
kono
parents:
diff changeset
842 Loc : constant Source_Ptr := Sloc (Expr);
kono
parents:
diff changeset
843 Result : Node_Id;
kono
parents:
diff changeset
844 Expr_Parent : Node_Id;
kono
parents:
diff changeset
845
kono
parents:
diff changeset
846 begin
kono
parents:
diff changeset
847 -- If the expression is already of the correct type, then nothing
kono
parents:
diff changeset
848 -- to do, except for relocating the node in case this is required.
kono
parents:
diff changeset
849
kono
parents:
diff changeset
850 if Present (Etype (Expr))
kono
parents:
diff changeset
851 and then (Base_Type (Etype (Expr)) = Typ
kono
parents:
diff changeset
852 or else Etype (Expr) = Typ)
kono
parents:
diff changeset
853 then
kono
parents:
diff changeset
854 return Relocate_Node (Expr);
kono
parents:
diff changeset
855
kono
parents:
diff changeset
856 -- Cases where the inner expression is itself an unchecked conversion
kono
parents:
diff changeset
857 -- to the same type, and we can thus eliminate the outer conversion.
kono
parents:
diff changeset
858
kono
parents:
diff changeset
859 elsif Nkind (Expr) = N_Unchecked_Type_Conversion
kono
parents:
diff changeset
860 and then Entity (Subtype_Mark (Expr)) = Typ
kono
parents:
diff changeset
861 then
kono
parents:
diff changeset
862 Result := Relocate_Node (Expr);
kono
parents:
diff changeset
863
kono
parents:
diff changeset
864 elsif Nkind (Expr) = N_Null
kono
parents:
diff changeset
865 and then Is_Access_Type (Typ)
kono
parents:
diff changeset
866 then
kono
parents:
diff changeset
867 -- No need for a conversion
kono
parents:
diff changeset
868
kono
parents:
diff changeset
869 Result := Relocate_Node (Expr);
kono
parents:
diff changeset
870
kono
parents:
diff changeset
871 -- All other cases
kono
parents:
diff changeset
872
kono
parents:
diff changeset
873 else
kono
parents:
diff changeset
874 -- Capture the parent of the expression before relocating it and
kono
parents:
diff changeset
875 -- creating the conversion, so the conversion's parent can be set
kono
parents:
diff changeset
876 -- to the original parent below.
kono
parents:
diff changeset
877
kono
parents:
diff changeset
878 Expr_Parent := Parent (Expr);
kono
parents:
diff changeset
879
kono
parents:
diff changeset
880 Result :=
kono
parents:
diff changeset
881 Make_Unchecked_Type_Conversion (Loc,
kono
parents:
diff changeset
882 Subtype_Mark => New_Occurrence_Of (Typ, Loc),
kono
parents:
diff changeset
883 Expression => Relocate_Node (Expr));
kono
parents:
diff changeset
884
kono
parents:
diff changeset
885 Set_Parent (Result, Expr_Parent);
kono
parents:
diff changeset
886 end if;
kono
parents:
diff changeset
887
kono
parents:
diff changeset
888 Set_Etype (Result, Typ);
kono
parents:
diff changeset
889 return Result;
kono
parents:
diff changeset
890 end Unchecked_Convert_To;
kono
parents:
diff changeset
891
kono
parents:
diff changeset
892 end Tbuild;