annotate gcc/ada/lib.adb @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
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 -- L I B --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 -- Copyright (C) 1992-2018, 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. --
kono
parents:
diff changeset
17 -- --
kono
parents:
diff changeset
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
kono
parents:
diff changeset
19 -- additional permissions described in the GCC Runtime Library Exception, --
kono
parents:
diff changeset
20 -- version 3.1, as published by the Free Software Foundation. --
kono
parents:
diff changeset
21 -- --
kono
parents:
diff changeset
22 -- You should have received a copy of the GNU General Public License and --
kono
parents:
diff changeset
23 -- a copy of the GCC Runtime Library Exception along with this program; --
kono
parents:
diff changeset
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
kono
parents:
diff changeset
25 -- <http://www.gnu.org/licenses/>. --
kono
parents:
diff changeset
26 -- --
kono
parents:
diff changeset
27 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
29 -- --
kono
parents:
diff changeset
30 ------------------------------------------------------------------------------
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 pragma Style_Checks (All_Checks);
kono
parents:
diff changeset
33 -- Subprogram ordering not enforced in this unit
kono
parents:
diff changeset
34 -- (because of some logical groupings).
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 with Atree; use Atree;
kono
parents:
diff changeset
37 with Csets; use Csets;
kono
parents:
diff changeset
38 with Einfo; use Einfo;
kono
parents:
diff changeset
39 with Nlists; use Nlists;
kono
parents:
diff changeset
40 with Opt; use Opt;
kono
parents:
diff changeset
41 with Output; use Output;
kono
parents:
diff changeset
42 with Sinfo; use Sinfo;
kono
parents:
diff changeset
43 with Sinput; use Sinput;
kono
parents:
diff changeset
44 with Stand; use Stand;
kono
parents:
diff changeset
45 with Stringt; use Stringt;
kono
parents:
diff changeset
46 with Tree_IO; use Tree_IO;
kono
parents:
diff changeset
47 with Uname; use Uname;
kono
parents:
diff changeset
48 with Widechar; use Widechar;
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 package body Lib is
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 Switch_Storing_Enabled : Boolean := True;
kono
parents:
diff changeset
53 -- Controlled by Enable_Switch_Storing/Disable_Switch_Storing
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 -----------------------
kono
parents:
diff changeset
56 -- Local Subprograms --
kono
parents:
diff changeset
57 -----------------------
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 type SEU_Result is (
kono
parents:
diff changeset
60 Yes_Before, -- S1 is in same extended unit as S2 and appears before it
kono
parents:
diff changeset
61 Yes_Same, -- S1 is in same extended unit as S2, Slocs are the same
kono
parents:
diff changeset
62 Yes_After, -- S1 is in same extended unit as S2, and appears after it
kono
parents:
diff changeset
63 No); -- S2 is not in same extended unit as S2
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 function Check_Same_Extended_Unit
kono
parents:
diff changeset
66 (S1 : Source_Ptr;
kono
parents:
diff changeset
67 S2 : Source_Ptr) return SEU_Result;
kono
parents:
diff changeset
68 -- Used by In_Same_Extended_Unit and Earlier_In_Extended_Unit. Returns
kono
parents:
diff changeset
69 -- value as described above.
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 function Get_Code_Or_Source_Unit
kono
parents:
diff changeset
72 (S : Source_Ptr;
kono
parents:
diff changeset
73 Unwind_Instances : Boolean;
kono
parents:
diff changeset
74 Unwind_Subunits : Boolean) return Unit_Number_Type;
kono
parents:
diff changeset
75 -- Common processing for routines Get_Code_Unit, Get_Source_Unit, and
kono
parents:
diff changeset
76 -- Get_Top_Level_Code_Unit. Unwind_Instances is True when the unit for the
kono
parents:
diff changeset
77 -- top-level instantiation should be returned instead of the unit for the
kono
parents:
diff changeset
78 -- template, in the case of an instantiation. Unwind_Subunits is True when
kono
parents:
diff changeset
79 -- the corresponding top-level unit should be returned instead of a
kono
parents:
diff changeset
80 -- subunit, in the case of a subunit.
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 --------------------------------------------
kono
parents:
diff changeset
83 -- Access Functions for Unit Table Fields --
kono
parents:
diff changeset
84 --------------------------------------------
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 function Cunit (U : Unit_Number_Type) return Node_Id is
kono
parents:
diff changeset
87 begin
kono
parents:
diff changeset
88 return Units.Table (U).Cunit;
kono
parents:
diff changeset
89 end Cunit;
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 function Cunit_Entity (U : Unit_Number_Type) return Entity_Id is
kono
parents:
diff changeset
92 begin
kono
parents:
diff changeset
93 return Units.Table (U).Cunit_Entity;
kono
parents:
diff changeset
94 end Cunit_Entity;
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 function Dependency_Num (U : Unit_Number_Type) return Nat is
kono
parents:
diff changeset
97 begin
kono
parents:
diff changeset
98 return Units.Table (U).Dependency_Num;
kono
parents:
diff changeset
99 end Dependency_Num;
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 function Dynamic_Elab (U : Unit_Number_Type) return Boolean is
kono
parents:
diff changeset
102 begin
kono
parents:
diff changeset
103 return Units.Table (U).Dynamic_Elab;
kono
parents:
diff changeset
104 end Dynamic_Elab;
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 function Error_Location (U : Unit_Number_Type) return Source_Ptr is
kono
parents:
diff changeset
107 begin
kono
parents:
diff changeset
108 return Units.Table (U).Error_Location;
kono
parents:
diff changeset
109 end Error_Location;
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 function Expected_Unit (U : Unit_Number_Type) return Unit_Name_Type is
kono
parents:
diff changeset
112 begin
kono
parents:
diff changeset
113 return Units.Table (U).Expected_Unit;
kono
parents:
diff changeset
114 end Expected_Unit;
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 function Fatal_Error (U : Unit_Number_Type) return Fatal_Type is
kono
parents:
diff changeset
117 begin
kono
parents:
diff changeset
118 return Units.Table (U).Fatal_Error;
kono
parents:
diff changeset
119 end Fatal_Error;
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 function Generate_Code (U : Unit_Number_Type) return Boolean is
kono
parents:
diff changeset
122 begin
kono
parents:
diff changeset
123 return Units.Table (U).Generate_Code;
kono
parents:
diff changeset
124 end Generate_Code;
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 function Has_RACW (U : Unit_Number_Type) return Boolean is
kono
parents:
diff changeset
127 begin
kono
parents:
diff changeset
128 return Units.Table (U).Has_RACW;
kono
parents:
diff changeset
129 end Has_RACW;
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 function Is_Predefined_Renaming (U : Unit_Number_Type) return Boolean is
kono
parents:
diff changeset
132 begin
kono
parents:
diff changeset
133 return Units.Table (U).Is_Predefined_Renaming;
kono
parents:
diff changeset
134 end Is_Predefined_Renaming;
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 function Is_Internal_Unit (U : Unit_Number_Type) return Boolean is
kono
parents:
diff changeset
137 begin
kono
parents:
diff changeset
138 return Units.Table (U).Is_Internal_Unit;
kono
parents:
diff changeset
139 end Is_Internal_Unit;
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 function Is_Predefined_Unit (U : Unit_Number_Type) return Boolean is
kono
parents:
diff changeset
142 begin
kono
parents:
diff changeset
143 return Units.Table (U).Is_Predefined_Unit;
kono
parents:
diff changeset
144 end Is_Predefined_Unit;
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 function Ident_String (U : Unit_Number_Type) return Node_Id is
kono
parents:
diff changeset
147 begin
kono
parents:
diff changeset
148 return Units.Table (U).Ident_String;
kono
parents:
diff changeset
149 end Ident_String;
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 function Loading (U : Unit_Number_Type) return Boolean is
kono
parents:
diff changeset
152 begin
kono
parents:
diff changeset
153 return Units.Table (U).Loading;
kono
parents:
diff changeset
154 end Loading;
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 function Main_CPU (U : Unit_Number_Type) return Int is
kono
parents:
diff changeset
157 begin
kono
parents:
diff changeset
158 return Units.Table (U).Main_CPU;
kono
parents:
diff changeset
159 end Main_CPU;
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 function Main_Priority (U : Unit_Number_Type) return Int is
kono
parents:
diff changeset
162 begin
kono
parents:
diff changeset
163 return Units.Table (U).Main_Priority;
kono
parents:
diff changeset
164 end Main_Priority;
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 function Munit_Index (U : Unit_Number_Type) return Nat is
kono
parents:
diff changeset
167 begin
kono
parents:
diff changeset
168 return Units.Table (U).Munit_Index;
kono
parents:
diff changeset
169 end Munit_Index;
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 function No_Elab_Code_All (U : Unit_Number_Type) return Boolean is
kono
parents:
diff changeset
172 begin
kono
parents:
diff changeset
173 return Units.Table (U).No_Elab_Code_All;
kono
parents:
diff changeset
174 end No_Elab_Code_All;
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 function OA_Setting (U : Unit_Number_Type) return Character is
kono
parents:
diff changeset
177 begin
kono
parents:
diff changeset
178 return Units.Table (U).OA_Setting;
kono
parents:
diff changeset
179 end OA_Setting;
kono
parents:
diff changeset
180
kono
parents:
diff changeset
181 function Primary_Stack_Count (U : Unit_Number_Type) return Int is
kono
parents:
diff changeset
182 begin
kono
parents:
diff changeset
183 return Units.Table (U).Primary_Stack_Count;
kono
parents:
diff changeset
184 end Primary_Stack_Count;
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 function Sec_Stack_Count (U : Unit_Number_Type) return Int is
kono
parents:
diff changeset
187 begin
kono
parents:
diff changeset
188 return Units.Table (U).Sec_Stack_Count;
kono
parents:
diff changeset
189 end Sec_Stack_Count;
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 function Source_Index (U : Unit_Number_Type) return Source_File_Index is
kono
parents:
diff changeset
192 begin
kono
parents:
diff changeset
193 return Units.Table (U).Source_Index;
kono
parents:
diff changeset
194 end Source_Index;
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 function Unit_File_Name (U : Unit_Number_Type) return File_Name_Type is
kono
parents:
diff changeset
197 begin
kono
parents:
diff changeset
198 return Units.Table (U).Unit_File_Name;
kono
parents:
diff changeset
199 end Unit_File_Name;
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 function Unit_Name (U : Unit_Number_Type) return Unit_Name_Type is
kono
parents:
diff changeset
202 begin
kono
parents:
diff changeset
203 return Units.Table (U).Unit_Name;
kono
parents:
diff changeset
204 end Unit_Name;
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 ------------------------------------------
kono
parents:
diff changeset
207 -- Subprograms to Set Unit Table Fields --
kono
parents:
diff changeset
208 ------------------------------------------
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 procedure Set_Cunit (U : Unit_Number_Type; N : Node_Id) is
kono
parents:
diff changeset
211 begin
kono
parents:
diff changeset
212 Units.Table (U).Cunit := N;
kono
parents:
diff changeset
213 end Set_Cunit;
kono
parents:
diff changeset
214
kono
parents:
diff changeset
215 procedure Set_Cunit_Entity (U : Unit_Number_Type; E : Entity_Id) is
kono
parents:
diff changeset
216 begin
kono
parents:
diff changeset
217 Units.Table (U).Cunit_Entity := E;
kono
parents:
diff changeset
218 Set_Is_Compilation_Unit (E);
kono
parents:
diff changeset
219 end Set_Cunit_Entity;
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 procedure Set_Dynamic_Elab (U : Unit_Number_Type; B : Boolean := True) is
kono
parents:
diff changeset
222 begin
kono
parents:
diff changeset
223 Units.Table (U).Dynamic_Elab := B;
kono
parents:
diff changeset
224 end Set_Dynamic_Elab;
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 procedure Set_Error_Location (U : Unit_Number_Type; W : Source_Ptr) is
kono
parents:
diff changeset
227 begin
kono
parents:
diff changeset
228 Units.Table (U).Error_Location := W;
kono
parents:
diff changeset
229 end Set_Error_Location;
kono
parents:
diff changeset
230
kono
parents:
diff changeset
231 procedure Set_Fatal_Error (U : Unit_Number_Type; V : Fatal_Type) is
kono
parents:
diff changeset
232 begin
kono
parents:
diff changeset
233 Units.Table (U).Fatal_Error := V;
kono
parents:
diff changeset
234 end Set_Fatal_Error;
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 procedure Set_Generate_Code (U : Unit_Number_Type; B : Boolean := True) is
kono
parents:
diff changeset
237 begin
kono
parents:
diff changeset
238 Units.Table (U).Generate_Code := B;
kono
parents:
diff changeset
239 end Set_Generate_Code;
kono
parents:
diff changeset
240
kono
parents:
diff changeset
241 procedure Set_Has_RACW (U : Unit_Number_Type; B : Boolean := True) is
kono
parents:
diff changeset
242 begin
kono
parents:
diff changeset
243 Units.Table (U).Has_RACW := B;
kono
parents:
diff changeset
244 end Set_Has_RACW;
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 procedure Set_Ident_String (U : Unit_Number_Type; N : Node_Id) is
kono
parents:
diff changeset
247 begin
kono
parents:
diff changeset
248 Units.Table (U).Ident_String := N;
kono
parents:
diff changeset
249 end Set_Ident_String;
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 procedure Set_Loading (U : Unit_Number_Type; B : Boolean := True) is
kono
parents:
diff changeset
252 begin
kono
parents:
diff changeset
253 Units.Table (U).Loading := B;
kono
parents:
diff changeset
254 end Set_Loading;
kono
parents:
diff changeset
255
kono
parents:
diff changeset
256 procedure Set_Main_CPU (U : Unit_Number_Type; P : Int) is
kono
parents:
diff changeset
257 begin
kono
parents:
diff changeset
258 Units.Table (U).Main_CPU := P;
kono
parents:
diff changeset
259 end Set_Main_CPU;
kono
parents:
diff changeset
260
kono
parents:
diff changeset
261 procedure Set_Main_Priority (U : Unit_Number_Type; P : Int) is
kono
parents:
diff changeset
262 begin
kono
parents:
diff changeset
263 Units.Table (U).Main_Priority := P;
kono
parents:
diff changeset
264 end Set_Main_Priority;
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 procedure Set_No_Elab_Code_All
kono
parents:
diff changeset
267 (U : Unit_Number_Type;
kono
parents:
diff changeset
268 B : Boolean := True)
kono
parents:
diff changeset
269 is
kono
parents:
diff changeset
270 begin
kono
parents:
diff changeset
271 Units.Table (U).No_Elab_Code_All := B;
kono
parents:
diff changeset
272 end Set_No_Elab_Code_All;
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 procedure Set_OA_Setting (U : Unit_Number_Type; C : Character) is
kono
parents:
diff changeset
275 begin
kono
parents:
diff changeset
276 Units.Table (U).OA_Setting := C;
kono
parents:
diff changeset
277 end Set_OA_Setting;
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 procedure Set_Unit_Name (U : Unit_Number_Type; N : Unit_Name_Type) is
kono
parents:
diff changeset
280 begin
kono
parents:
diff changeset
281 Units.Table (U).Unit_Name := N;
kono
parents:
diff changeset
282 end Set_Unit_Name;
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 ------------------------------
kono
parents:
diff changeset
285 -- Check_Same_Extended_Unit --
kono
parents:
diff changeset
286 ------------------------------
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 function Check_Same_Extended_Unit
kono
parents:
diff changeset
289 (S1 : Source_Ptr;
kono
parents:
diff changeset
290 S2 : Source_Ptr) return SEU_Result
kono
parents:
diff changeset
291 is
kono
parents:
diff changeset
292 Max_Iterations : constant Nat := Maximum_Instantiations * 2;
kono
parents:
diff changeset
293 -- Limit to prevent a potential infinite loop
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 Counter : Nat := 0;
kono
parents:
diff changeset
296 Depth1 : Nat;
kono
parents:
diff changeset
297 Depth2 : Nat;
kono
parents:
diff changeset
298 Inst1 : Source_Ptr;
kono
parents:
diff changeset
299 Inst2 : Source_Ptr;
kono
parents:
diff changeset
300 Sind1 : Source_File_Index;
kono
parents:
diff changeset
301 Sind2 : Source_File_Index;
kono
parents:
diff changeset
302 Sloc1 : Source_Ptr;
kono
parents:
diff changeset
303 Sloc2 : Source_Ptr;
kono
parents:
diff changeset
304 Unit1 : Node_Id;
kono
parents:
diff changeset
305 Unit2 : Node_Id;
kono
parents:
diff changeset
306 Unum1 : Unit_Number_Type;
kono
parents:
diff changeset
307 Unum2 : Unit_Number_Type;
kono
parents:
diff changeset
308
kono
parents:
diff changeset
309 begin
kono
parents:
diff changeset
310 if S1 = No_Location or else S2 = No_Location then
kono
parents:
diff changeset
311 return No;
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 elsif S1 = Standard_Location then
kono
parents:
diff changeset
314 if S2 = Standard_Location then
kono
parents:
diff changeset
315 return Yes_Same;
kono
parents:
diff changeset
316 else
kono
parents:
diff changeset
317 return No;
kono
parents:
diff changeset
318 end if;
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 elsif S2 = Standard_Location then
kono
parents:
diff changeset
321 return No;
kono
parents:
diff changeset
322 end if;
kono
parents:
diff changeset
323
kono
parents:
diff changeset
324 Sloc1 := S1;
kono
parents:
diff changeset
325 Sloc2 := S2;
kono
parents:
diff changeset
326
kono
parents:
diff changeset
327 Unum1 := Get_Source_Unit (Sloc1);
kono
parents:
diff changeset
328 Unum2 := Get_Source_Unit (Sloc2);
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 loop
kono
parents:
diff changeset
331 -- Step 1: Check whether the two locations are in the same source
kono
parents:
diff changeset
332 -- file.
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 Sind1 := Get_Source_File_Index (Sloc1);
kono
parents:
diff changeset
335 Sind2 := Get_Source_File_Index (Sloc2);
kono
parents:
diff changeset
336
kono
parents:
diff changeset
337 if Sind1 = Sind2 then
kono
parents:
diff changeset
338 if Sloc1 < Sloc2 then
kono
parents:
diff changeset
339 return Yes_Before;
kono
parents:
diff changeset
340 elsif Sloc1 > Sloc2 then
kono
parents:
diff changeset
341 return Yes_After;
kono
parents:
diff changeset
342 else
kono
parents:
diff changeset
343 return Yes_Same;
kono
parents:
diff changeset
344 end if;
kono
parents:
diff changeset
345 end if;
kono
parents:
diff changeset
346
kono
parents:
diff changeset
347 -- Step 2: Check subunits. If a subunit is instantiated, follow the
kono
parents:
diff changeset
348 -- instantiation chain rather than the stub chain.
kono
parents:
diff changeset
349
kono
parents:
diff changeset
350 Unit1 := Unit (Cunit (Unum1));
kono
parents:
diff changeset
351 Unit2 := Unit (Cunit (Unum2));
kono
parents:
diff changeset
352 Inst1 := Instantiation (Sind1);
kono
parents:
diff changeset
353 Inst2 := Instantiation (Sind2);
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 if Nkind (Unit1) = N_Subunit
kono
parents:
diff changeset
356 and then Present (Corresponding_Stub (Unit1))
kono
parents:
diff changeset
357 and then Inst1 = No_Location
kono
parents:
diff changeset
358 then
kono
parents:
diff changeset
359 if Nkind (Unit2) = N_Subunit
kono
parents:
diff changeset
360 and then Present (Corresponding_Stub (Unit2))
kono
parents:
diff changeset
361 and then Inst2 = No_Location
kono
parents:
diff changeset
362 then
kono
parents:
diff changeset
363 -- Both locations refer to subunits which may have a common
kono
parents:
diff changeset
364 -- ancestor. If they do, the deeper subunit must have a longer
kono
parents:
diff changeset
365 -- unit name. Replace the deeper one with its corresponding
kono
parents:
diff changeset
366 -- stub in order to find the nearest ancestor.
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 if Length_Of_Name (Unit_Name (Unum1)) <
kono
parents:
diff changeset
369 Length_Of_Name (Unit_Name (Unum2))
kono
parents:
diff changeset
370 then
kono
parents:
diff changeset
371 Sloc2 := Sloc (Corresponding_Stub (Unit2));
kono
parents:
diff changeset
372 Unum2 := Get_Source_Unit (Sloc2);
kono
parents:
diff changeset
373 goto Continue;
kono
parents:
diff changeset
374
kono
parents:
diff changeset
375 else
kono
parents:
diff changeset
376 Sloc1 := Sloc (Corresponding_Stub (Unit1));
kono
parents:
diff changeset
377 Unum1 := Get_Source_Unit (Sloc1);
kono
parents:
diff changeset
378 goto Continue;
kono
parents:
diff changeset
379 end if;
kono
parents:
diff changeset
380
kono
parents:
diff changeset
381 -- Sloc1 in subunit, Sloc2 not
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 else
kono
parents:
diff changeset
384 Sloc1 := Sloc (Corresponding_Stub (Unit1));
kono
parents:
diff changeset
385 Unum1 := Get_Source_Unit (Sloc1);
kono
parents:
diff changeset
386 goto Continue;
kono
parents:
diff changeset
387 end if;
kono
parents:
diff changeset
388
kono
parents:
diff changeset
389 -- Sloc2 in subunit, Sloc1 not
kono
parents:
diff changeset
390
kono
parents:
diff changeset
391 elsif Nkind (Unit2) = N_Subunit
kono
parents:
diff changeset
392 and then Present (Corresponding_Stub (Unit2))
kono
parents:
diff changeset
393 and then Inst2 = No_Location
kono
parents:
diff changeset
394 then
kono
parents:
diff changeset
395 Sloc2 := Sloc (Corresponding_Stub (Unit2));
kono
parents:
diff changeset
396 Unum2 := Get_Source_Unit (Sloc2);
kono
parents:
diff changeset
397 goto Continue;
kono
parents:
diff changeset
398 end if;
kono
parents:
diff changeset
399
kono
parents:
diff changeset
400 -- Step 3: Check instances. The two locations may yield a common
kono
parents:
diff changeset
401 -- ancestor.
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 if Inst1 /= No_Location then
kono
parents:
diff changeset
404 if Inst2 /= No_Location then
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406 -- Both locations denote instantiations
kono
parents:
diff changeset
407
kono
parents:
diff changeset
408 Depth1 := Instantiation_Depth (Sloc1);
kono
parents:
diff changeset
409 Depth2 := Instantiation_Depth (Sloc2);
kono
parents:
diff changeset
410
kono
parents:
diff changeset
411 if Depth1 < Depth2 then
kono
parents:
diff changeset
412 Sloc2 := Inst2;
kono
parents:
diff changeset
413 Unum2 := Get_Source_Unit (Sloc2);
kono
parents:
diff changeset
414 goto Continue;
kono
parents:
diff changeset
415
kono
parents:
diff changeset
416 elsif Depth1 > Depth2 then
kono
parents:
diff changeset
417 Sloc1 := Inst1;
kono
parents:
diff changeset
418 Unum1 := Get_Source_Unit (Sloc1);
kono
parents:
diff changeset
419 goto Continue;
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 else
kono
parents:
diff changeset
422 Sloc1 := Inst1;
kono
parents:
diff changeset
423 Sloc2 := Inst2;
kono
parents:
diff changeset
424 Unum1 := Get_Source_Unit (Sloc1);
kono
parents:
diff changeset
425 Unum2 := Get_Source_Unit (Sloc2);
kono
parents:
diff changeset
426 goto Continue;
kono
parents:
diff changeset
427 end if;
kono
parents:
diff changeset
428
kono
parents:
diff changeset
429 -- Sloc1 is an instantiation
kono
parents:
diff changeset
430
kono
parents:
diff changeset
431 else
kono
parents:
diff changeset
432 Sloc1 := Inst1;
kono
parents:
diff changeset
433 Unum1 := Get_Source_Unit (Sloc1);
kono
parents:
diff changeset
434 goto Continue;
kono
parents:
diff changeset
435 end if;
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 -- Sloc2 is an instantiation
kono
parents:
diff changeset
438
kono
parents:
diff changeset
439 elsif Inst2 /= No_Location then
kono
parents:
diff changeset
440 Sloc2 := Inst2;
kono
parents:
diff changeset
441 Unum2 := Get_Source_Unit (Sloc2);
kono
parents:
diff changeset
442 goto Continue;
kono
parents:
diff changeset
443 end if;
kono
parents:
diff changeset
444
kono
parents:
diff changeset
445 -- Step 4: One location in the spec, the other in the corresponding
kono
parents:
diff changeset
446 -- body of the same unit. The location in the spec is considered
kono
parents:
diff changeset
447 -- earlier.
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 if Nkind (Unit1) = N_Subprogram_Body
kono
parents:
diff changeset
450 or else
kono
parents:
diff changeset
451 Nkind (Unit1) = N_Package_Body
kono
parents:
diff changeset
452 then
kono
parents:
diff changeset
453 if Library_Unit (Cunit (Unum1)) = Cunit (Unum2) then
kono
parents:
diff changeset
454 return Yes_After;
kono
parents:
diff changeset
455 end if;
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 elsif Nkind (Unit2) = N_Subprogram_Body
kono
parents:
diff changeset
458 or else
kono
parents:
diff changeset
459 Nkind (Unit2) = N_Package_Body
kono
parents:
diff changeset
460 then
kono
parents:
diff changeset
461 if Library_Unit (Cunit (Unum2)) = Cunit (Unum1) then
kono
parents:
diff changeset
462 return Yes_Before;
kono
parents:
diff changeset
463 end if;
kono
parents:
diff changeset
464 end if;
kono
parents:
diff changeset
465
kono
parents:
diff changeset
466 -- At this point it is certain that the two locations denote two
kono
parents:
diff changeset
467 -- entirely separate units.
kono
parents:
diff changeset
468
kono
parents:
diff changeset
469 return No;
kono
parents:
diff changeset
470
kono
parents:
diff changeset
471 <<Continue>>
kono
parents:
diff changeset
472 Counter := Counter + 1;
kono
parents:
diff changeset
473
kono
parents:
diff changeset
474 -- Prevent looping forever
kono
parents:
diff changeset
475
kono
parents:
diff changeset
476 if Counter > Max_Iterations then
kono
parents:
diff changeset
477
kono
parents:
diff changeset
478 -- ??? Not quite right, but return a value to be able to generate
kono
parents:
diff changeset
479 -- SCIL files and hope for the best.
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 if CodePeer_Mode then
kono
parents:
diff changeset
482 return No;
kono
parents:
diff changeset
483 else
kono
parents:
diff changeset
484 raise Program_Error;
kono
parents:
diff changeset
485 end if;
kono
parents:
diff changeset
486 end if;
kono
parents:
diff changeset
487 end loop;
kono
parents:
diff changeset
488 end Check_Same_Extended_Unit;
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 -------------------------------
kono
parents:
diff changeset
491 -- Compilation_Switches_Last --
kono
parents:
diff changeset
492 -------------------------------
kono
parents:
diff changeset
493
kono
parents:
diff changeset
494 function Compilation_Switches_Last return Nat is
kono
parents:
diff changeset
495 begin
kono
parents:
diff changeset
496 return Compilation_Switches.Last;
kono
parents:
diff changeset
497 end Compilation_Switches_Last;
kono
parents:
diff changeset
498
kono
parents:
diff changeset
499 ---------------------------
kono
parents:
diff changeset
500 -- Enable_Switch_Storing --
kono
parents:
diff changeset
501 ---------------------------
kono
parents:
diff changeset
502
kono
parents:
diff changeset
503 procedure Enable_Switch_Storing is
kono
parents:
diff changeset
504 begin
kono
parents:
diff changeset
505 Switch_Storing_Enabled := True;
kono
parents:
diff changeset
506 end Enable_Switch_Storing;
kono
parents:
diff changeset
507
kono
parents:
diff changeset
508 ----------------------------
kono
parents:
diff changeset
509 -- Disable_Switch_Storing --
kono
parents:
diff changeset
510 ----------------------------
kono
parents:
diff changeset
511
kono
parents:
diff changeset
512 procedure Disable_Switch_Storing is
kono
parents:
diff changeset
513 begin
kono
parents:
diff changeset
514 Switch_Storing_Enabled := False;
kono
parents:
diff changeset
515 end Disable_Switch_Storing;
kono
parents:
diff changeset
516
kono
parents:
diff changeset
517 ------------------------------
kono
parents:
diff changeset
518 -- Earlier_In_Extended_Unit --
kono
parents:
diff changeset
519 ------------------------------
kono
parents:
diff changeset
520
kono
parents:
diff changeset
521 function Earlier_In_Extended_Unit
kono
parents:
diff changeset
522 (S1 : Source_Ptr;
kono
parents:
diff changeset
523 S2 : Source_Ptr) return Boolean
kono
parents:
diff changeset
524 is
kono
parents:
diff changeset
525 begin
kono
parents:
diff changeset
526 return Check_Same_Extended_Unit (S1, S2) = Yes_Before;
kono
parents:
diff changeset
527 end Earlier_In_Extended_Unit;
kono
parents:
diff changeset
528
kono
parents:
diff changeset
529 function Earlier_In_Extended_Unit
kono
parents:
diff changeset
530 (N1 : Node_Or_Entity_Id;
kono
parents:
diff changeset
531 N2 : Node_Or_Entity_Id) return Boolean
kono
parents:
diff changeset
532 is
kono
parents:
diff changeset
533 begin
kono
parents:
diff changeset
534 return Earlier_In_Extended_Unit (Sloc (N1), Sloc (N2));
kono
parents:
diff changeset
535 end Earlier_In_Extended_Unit;
kono
parents:
diff changeset
536
kono
parents:
diff changeset
537 -----------------------
kono
parents:
diff changeset
538 -- Exact_Source_Name --
kono
parents:
diff changeset
539 -----------------------
kono
parents:
diff changeset
540
kono
parents:
diff changeset
541 function Exact_Source_Name (Loc : Source_Ptr) return String is
kono
parents:
diff changeset
542 U : constant Unit_Number_Type := Get_Source_Unit (Loc);
kono
parents:
diff changeset
543 Buf : constant Source_Buffer_Ptr := Source_Text (Source_Index (U));
kono
parents:
diff changeset
544 Orig : constant Source_Ptr := Original_Location (Loc);
kono
parents:
diff changeset
545 P : Source_Ptr;
kono
parents:
diff changeset
546
kono
parents:
diff changeset
547 WC : Char_Code;
kono
parents:
diff changeset
548 Err : Boolean;
kono
parents:
diff changeset
549 pragma Warnings (Off, WC);
kono
parents:
diff changeset
550 pragma Warnings (Off, Err);
kono
parents:
diff changeset
551
kono
parents:
diff changeset
552 begin
kono
parents:
diff changeset
553 -- Entity is character literal
kono
parents:
diff changeset
554
kono
parents:
diff changeset
555 if Buf (Orig) = ''' then
kono
parents:
diff changeset
556 return String (Buf (Orig .. Orig + 2));
kono
parents:
diff changeset
557
kono
parents:
diff changeset
558 -- Entity is operator symbol
kono
parents:
diff changeset
559
kono
parents:
diff changeset
560 elsif Buf (Orig) = '"' or else Buf (Orig) = '%' then
kono
parents:
diff changeset
561 P := Orig;
kono
parents:
diff changeset
562
kono
parents:
diff changeset
563 loop
kono
parents:
diff changeset
564 P := P + 1;
kono
parents:
diff changeset
565 exit when Buf (P) = Buf (Orig);
kono
parents:
diff changeset
566 end loop;
kono
parents:
diff changeset
567
kono
parents:
diff changeset
568 return String (Buf (Orig .. P));
kono
parents:
diff changeset
569
kono
parents:
diff changeset
570 -- Entity is identifier
kono
parents:
diff changeset
571
kono
parents:
diff changeset
572 else
kono
parents:
diff changeset
573 P := Orig;
kono
parents:
diff changeset
574
kono
parents:
diff changeset
575 loop
kono
parents:
diff changeset
576 if Is_Start_Of_Wide_Char (Buf, P) then
kono
parents:
diff changeset
577 Scan_Wide (Buf, P, WC, Err);
kono
parents:
diff changeset
578 elsif not Identifier_Char (Buf (P)) then
kono
parents:
diff changeset
579 exit;
kono
parents:
diff changeset
580 else
kono
parents:
diff changeset
581 P := P + 1;
kono
parents:
diff changeset
582 end if;
kono
parents:
diff changeset
583 end loop;
kono
parents:
diff changeset
584
kono
parents:
diff changeset
585 -- Write out the identifier by copying the exact source characters
kono
parents:
diff changeset
586 -- used in its declaration. Note that this means wide characters will
kono
parents:
diff changeset
587 -- be in their original encoded form.
kono
parents:
diff changeset
588
kono
parents:
diff changeset
589 return String (Buf (Orig .. P - 1));
kono
parents:
diff changeset
590 end if;
kono
parents:
diff changeset
591 end Exact_Source_Name;
kono
parents:
diff changeset
592
kono
parents:
diff changeset
593 ----------------------------
kono
parents:
diff changeset
594 -- Entity_Is_In_Main_Unit --
kono
parents:
diff changeset
595 ----------------------------
kono
parents:
diff changeset
596
kono
parents:
diff changeset
597 function Entity_Is_In_Main_Unit (E : Entity_Id) return Boolean is
kono
parents:
diff changeset
598 S : Entity_Id;
kono
parents:
diff changeset
599
kono
parents:
diff changeset
600 begin
kono
parents:
diff changeset
601 S := Scope (E);
kono
parents:
diff changeset
602
kono
parents:
diff changeset
603 while S /= Standard_Standard loop
kono
parents:
diff changeset
604 if S = Main_Unit_Entity then
kono
parents:
diff changeset
605 return True;
kono
parents:
diff changeset
606 elsif Ekind (S) = E_Package and then Is_Child_Unit (S) then
kono
parents:
diff changeset
607 return False;
kono
parents:
diff changeset
608 else
kono
parents:
diff changeset
609 S := Scope (S);
kono
parents:
diff changeset
610 end if;
kono
parents:
diff changeset
611 end loop;
kono
parents:
diff changeset
612
kono
parents:
diff changeset
613 return False;
kono
parents:
diff changeset
614 end Entity_Is_In_Main_Unit;
kono
parents:
diff changeset
615
kono
parents:
diff changeset
616 --------------------------
kono
parents:
diff changeset
617 -- Generic_May_Lack_ALI --
kono
parents:
diff changeset
618 --------------------------
kono
parents:
diff changeset
619
kono
parents:
diff changeset
620 function Generic_May_Lack_ALI (Unum : Unit_Number_Type) return Boolean is
kono
parents:
diff changeset
621 begin
kono
parents:
diff changeset
622 -- We allow internal generic units to be used without having a
kono
parents:
diff changeset
623 -- corresponding ALI files to help bootstrapping with older compilers
kono
parents:
diff changeset
624 -- that did not support generating ALIs for such generics. It is safe
kono
parents:
diff changeset
625 -- to do so because the only thing the generated code would contain
kono
parents:
diff changeset
626 -- is the elaboration boolean, and we are careful to elaborate all
kono
parents:
diff changeset
627 -- predefined units first anyway.
kono
parents:
diff changeset
628
kono
parents:
diff changeset
629 return Is_Internal_Unit (Unum);
kono
parents:
diff changeset
630 end Generic_May_Lack_ALI;
kono
parents:
diff changeset
631
kono
parents:
diff changeset
632 -----------------------------
kono
parents:
diff changeset
633 -- Get_Code_Or_Source_Unit --
kono
parents:
diff changeset
634 -----------------------------
kono
parents:
diff changeset
635
kono
parents:
diff changeset
636 function Get_Code_Or_Source_Unit
kono
parents:
diff changeset
637 (S : Source_Ptr;
kono
parents:
diff changeset
638 Unwind_Instances : Boolean;
kono
parents:
diff changeset
639 Unwind_Subunits : Boolean) return Unit_Number_Type
kono
parents:
diff changeset
640 is
kono
parents:
diff changeset
641 begin
kono
parents:
diff changeset
642 -- Search table unless we have No_Location, which can happen if the
kono
parents:
diff changeset
643 -- relevant location has not been set yet. Happens for example when
kono
parents:
diff changeset
644 -- we obtain Sloc (Cunit (Main_Unit)) before it is set.
kono
parents:
diff changeset
645
kono
parents:
diff changeset
646 if S /= No_Location then
kono
parents:
diff changeset
647 declare
kono
parents:
diff changeset
648 Source_File : Source_File_Index;
kono
parents:
diff changeset
649 Source_Unit : Unit_Number_Type;
kono
parents:
diff changeset
650 Unit_Node : Node_Id;
kono
parents:
diff changeset
651
kono
parents:
diff changeset
652 begin
kono
parents:
diff changeset
653 Source_File := Get_Source_File_Index (S);
kono
parents:
diff changeset
654
kono
parents:
diff changeset
655 if Unwind_Instances then
kono
parents:
diff changeset
656 while Template (Source_File) > No_Source_File loop
kono
parents:
diff changeset
657 Source_File := Template (Source_File);
kono
parents:
diff changeset
658 end loop;
kono
parents:
diff changeset
659 end if;
kono
parents:
diff changeset
660
kono
parents:
diff changeset
661 Source_Unit := Unit (Source_File);
kono
parents:
diff changeset
662
kono
parents:
diff changeset
663 if Unwind_Subunits then
kono
parents:
diff changeset
664 Unit_Node := Unit (Cunit (Source_Unit));
kono
parents:
diff changeset
665
kono
parents:
diff changeset
666 while Nkind (Unit_Node) = N_Subunit
kono
parents:
diff changeset
667 and then Present (Corresponding_Stub (Unit_Node))
kono
parents:
diff changeset
668 loop
kono
parents:
diff changeset
669 Source_Unit :=
kono
parents:
diff changeset
670 Get_Code_Or_Source_Unit
kono
parents:
diff changeset
671 (Sloc (Corresponding_Stub (Unit_Node)),
kono
parents:
diff changeset
672 Unwind_Instances => Unwind_Instances,
kono
parents:
diff changeset
673 Unwind_Subunits => Unwind_Subunits);
kono
parents:
diff changeset
674 Unit_Node := Unit (Cunit (Source_Unit));
kono
parents:
diff changeset
675 end loop;
kono
parents:
diff changeset
676 end if;
kono
parents:
diff changeset
677
kono
parents:
diff changeset
678 if Source_Unit /= No_Unit then
kono
parents:
diff changeset
679 return Source_Unit;
kono
parents:
diff changeset
680 end if;
kono
parents:
diff changeset
681 end;
kono
parents:
diff changeset
682 end if;
kono
parents:
diff changeset
683
kono
parents:
diff changeset
684 -- If S was No_Location, or was not in the table, we must be in the main
kono
parents:
diff changeset
685 -- source unit (and the value has not been placed in the table yet),
kono
parents:
diff changeset
686 -- or in one of the configuration pragma files.
kono
parents:
diff changeset
687
kono
parents:
diff changeset
688 return Main_Unit;
kono
parents:
diff changeset
689 end Get_Code_Or_Source_Unit;
kono
parents:
diff changeset
690
kono
parents:
diff changeset
691 -------------------
kono
parents:
diff changeset
692 -- Get_Code_Unit --
kono
parents:
diff changeset
693 -------------------
kono
parents:
diff changeset
694
kono
parents:
diff changeset
695 function Get_Code_Unit (S : Source_Ptr) return Unit_Number_Type is
kono
parents:
diff changeset
696 begin
kono
parents:
diff changeset
697 return
kono
parents:
diff changeset
698 Get_Code_Or_Source_Unit
kono
parents:
diff changeset
699 (Top_Level_Location (S),
kono
parents:
diff changeset
700 Unwind_Instances => False,
kono
parents:
diff changeset
701 Unwind_Subunits => False);
kono
parents:
diff changeset
702 end Get_Code_Unit;
kono
parents:
diff changeset
703
kono
parents:
diff changeset
704 function Get_Code_Unit (N : Node_Or_Entity_Id) return Unit_Number_Type is
kono
parents:
diff changeset
705 begin
kono
parents:
diff changeset
706 return Get_Code_Unit (Sloc (N));
kono
parents:
diff changeset
707 end Get_Code_Unit;
kono
parents:
diff changeset
708
kono
parents:
diff changeset
709 ----------------------------
kono
parents:
diff changeset
710 -- Get_Compilation_Switch --
kono
parents:
diff changeset
711 ----------------------------
kono
parents:
diff changeset
712
kono
parents:
diff changeset
713 function Get_Compilation_Switch (N : Pos) return String_Ptr is
kono
parents:
diff changeset
714 begin
kono
parents:
diff changeset
715 if N <= Compilation_Switches.Last then
kono
parents:
diff changeset
716 return Compilation_Switches.Table (N);
kono
parents:
diff changeset
717 else
kono
parents:
diff changeset
718 return null;
kono
parents:
diff changeset
719 end if;
kono
parents:
diff changeset
720 end Get_Compilation_Switch;
kono
parents:
diff changeset
721
kono
parents:
diff changeset
722 ----------------------------------
kono
parents:
diff changeset
723 -- Get_Cunit_Entity_Unit_Number --
kono
parents:
diff changeset
724 ----------------------------------
kono
parents:
diff changeset
725
kono
parents:
diff changeset
726 function Get_Cunit_Entity_Unit_Number
kono
parents:
diff changeset
727 (E : Entity_Id) return Unit_Number_Type
kono
parents:
diff changeset
728 is
kono
parents:
diff changeset
729 begin
kono
parents:
diff changeset
730 for U in Units.First .. Units.Last loop
kono
parents:
diff changeset
731 if Cunit_Entity (U) = E then
kono
parents:
diff changeset
732 return U;
kono
parents:
diff changeset
733 end if;
kono
parents:
diff changeset
734 end loop;
kono
parents:
diff changeset
735
kono
parents:
diff changeset
736 -- If not in the table, must be the main source unit, and we just
kono
parents:
diff changeset
737 -- have not got it put into the table yet.
kono
parents:
diff changeset
738
kono
parents:
diff changeset
739 return Main_Unit;
kono
parents:
diff changeset
740 end Get_Cunit_Entity_Unit_Number;
kono
parents:
diff changeset
741
kono
parents:
diff changeset
742 ---------------------------
kono
parents:
diff changeset
743 -- Get_Cunit_Unit_Number --
kono
parents:
diff changeset
744 ---------------------------
kono
parents:
diff changeset
745
kono
parents:
diff changeset
746 function Get_Cunit_Unit_Number (N : Node_Id) return Unit_Number_Type is
kono
parents:
diff changeset
747 begin
kono
parents:
diff changeset
748 for U in Units.First .. Units.Last loop
kono
parents:
diff changeset
749 if Cunit (U) = N then
kono
parents:
diff changeset
750 return U;
kono
parents:
diff changeset
751 end if;
kono
parents:
diff changeset
752 end loop;
kono
parents:
diff changeset
753
kono
parents:
diff changeset
754 -- If not in the table, must be a spec created for a main unit that is a
kono
parents:
diff changeset
755 -- child subprogram body which we have not inserted into the table yet.
kono
parents:
diff changeset
756
kono
parents:
diff changeset
757 if N = Library_Unit (Cunit (Main_Unit)) then
kono
parents:
diff changeset
758 return Main_Unit;
kono
parents:
diff changeset
759
kono
parents:
diff changeset
760 -- If it is anything else, something is seriously wrong, and we really
kono
parents:
diff changeset
761 -- don't want to proceed, even if assertions are off, so we explicitly
kono
parents:
diff changeset
762 -- raise an exception in this case to terminate compilation.
kono
parents:
diff changeset
763
kono
parents:
diff changeset
764 else
kono
parents:
diff changeset
765 raise Program_Error;
kono
parents:
diff changeset
766 end if;
kono
parents:
diff changeset
767 end Get_Cunit_Unit_Number;
kono
parents:
diff changeset
768
kono
parents:
diff changeset
769 ---------------------
kono
parents:
diff changeset
770 -- Get_Source_Unit --
kono
parents:
diff changeset
771 ---------------------
kono
parents:
diff changeset
772
kono
parents:
diff changeset
773 function Get_Source_Unit (S : Source_Ptr) return Unit_Number_Type is
kono
parents:
diff changeset
774 begin
kono
parents:
diff changeset
775 return
kono
parents:
diff changeset
776 Get_Code_Or_Source_Unit
kono
parents:
diff changeset
777 (S => S,
kono
parents:
diff changeset
778 Unwind_Instances => True,
kono
parents:
diff changeset
779 Unwind_Subunits => False);
kono
parents:
diff changeset
780 end Get_Source_Unit;
kono
parents:
diff changeset
781
kono
parents:
diff changeset
782 function Get_Source_Unit (N : Node_Or_Entity_Id) return Unit_Number_Type is
kono
parents:
diff changeset
783 begin
kono
parents:
diff changeset
784 return Get_Source_Unit (Sloc (N));
kono
parents:
diff changeset
785 end Get_Source_Unit;
kono
parents:
diff changeset
786
kono
parents:
diff changeset
787 -----------------------------
kono
parents:
diff changeset
788 -- Get_Top_Level_Code_Unit --
kono
parents:
diff changeset
789 -----------------------------
kono
parents:
diff changeset
790
kono
parents:
diff changeset
791 function Get_Top_Level_Code_Unit (S : Source_Ptr) return Unit_Number_Type is
kono
parents:
diff changeset
792 begin
kono
parents:
diff changeset
793 return
kono
parents:
diff changeset
794 Get_Code_Or_Source_Unit
kono
parents:
diff changeset
795 (Top_Level_Location (S),
kono
parents:
diff changeset
796 Unwind_Instances => False,
kono
parents:
diff changeset
797 Unwind_Subunits => True);
kono
parents:
diff changeset
798 end Get_Top_Level_Code_Unit;
kono
parents:
diff changeset
799
kono
parents:
diff changeset
800 function Get_Top_Level_Code_Unit
kono
parents:
diff changeset
801 (N : Node_Or_Entity_Id) return Unit_Number_Type is
kono
parents:
diff changeset
802 begin
kono
parents:
diff changeset
803 return Get_Top_Level_Code_Unit (Sloc (N));
kono
parents:
diff changeset
804 end Get_Top_Level_Code_Unit;
kono
parents:
diff changeset
805
kono
parents:
diff changeset
806 --------------------------------
kono
parents:
diff changeset
807 -- In_Extended_Main_Code_Unit --
kono
parents:
diff changeset
808 --------------------------------
kono
parents:
diff changeset
809
kono
parents:
diff changeset
810 function In_Extended_Main_Code_Unit
kono
parents:
diff changeset
811 (N : Node_Or_Entity_Id) return Boolean
kono
parents:
diff changeset
812 is
kono
parents:
diff changeset
813 begin
kono
parents:
diff changeset
814 if Sloc (N) = Standard_Location then
kono
parents:
diff changeset
815 return False;
kono
parents:
diff changeset
816
kono
parents:
diff changeset
817 elsif Sloc (N) = No_Location then
kono
parents:
diff changeset
818 return False;
kono
parents:
diff changeset
819
kono
parents:
diff changeset
820 -- Special case Itypes to test the Sloc of the associated node. The
kono
parents:
diff changeset
821 -- reason we do this is for possible calls from gigi after -gnatD
kono
parents:
diff changeset
822 -- processing is complete in sprint. This processing updates the
kono
parents:
diff changeset
823 -- sloc fields of all nodes in the tree, but itypes are not in the
kono
parents:
diff changeset
824 -- tree so their slocs do not get updated.
kono
parents:
diff changeset
825
kono
parents:
diff changeset
826 elsif Nkind (N) = N_Defining_Identifier
kono
parents:
diff changeset
827 and then Is_Itype (N)
kono
parents:
diff changeset
828 then
kono
parents:
diff changeset
829 return In_Extended_Main_Code_Unit (Associated_Node_For_Itype (N));
kono
parents:
diff changeset
830
kono
parents:
diff changeset
831 -- Otherwise see if we are in the main unit
kono
parents:
diff changeset
832
kono
parents:
diff changeset
833 elsif Get_Code_Unit (Sloc (N)) = Get_Code_Unit (Cunit (Main_Unit)) then
kono
parents:
diff changeset
834 return True;
kono
parents:
diff changeset
835
kono
parents:
diff changeset
836 -- Node may be in spec (or subunit etc) of main unit
kono
parents:
diff changeset
837
kono
parents:
diff changeset
838 else
kono
parents:
diff changeset
839 return In_Same_Extended_Unit (N, Cunit (Main_Unit));
kono
parents:
diff changeset
840 end if;
kono
parents:
diff changeset
841 end In_Extended_Main_Code_Unit;
kono
parents:
diff changeset
842
kono
parents:
diff changeset
843 function In_Extended_Main_Code_Unit (Loc : Source_Ptr) return Boolean is
kono
parents:
diff changeset
844 begin
kono
parents:
diff changeset
845 if Loc = Standard_Location then
kono
parents:
diff changeset
846 return False;
kono
parents:
diff changeset
847
kono
parents:
diff changeset
848 elsif Loc = No_Location then
kono
parents:
diff changeset
849 return False;
kono
parents:
diff changeset
850
kono
parents:
diff changeset
851 -- Otherwise see if we are in the main unit
kono
parents:
diff changeset
852
kono
parents:
diff changeset
853 elsif Get_Code_Unit (Loc) = Get_Code_Unit (Cunit (Main_Unit)) then
kono
parents:
diff changeset
854 return True;
kono
parents:
diff changeset
855
kono
parents:
diff changeset
856 -- Location may be in spec (or subunit etc) of main unit
kono
parents:
diff changeset
857
kono
parents:
diff changeset
858 else
kono
parents:
diff changeset
859 return In_Same_Extended_Unit (Loc, Sloc (Cunit (Main_Unit)));
kono
parents:
diff changeset
860 end if;
kono
parents:
diff changeset
861 end In_Extended_Main_Code_Unit;
kono
parents:
diff changeset
862
kono
parents:
diff changeset
863 ----------------------------------
kono
parents:
diff changeset
864 -- In_Extended_Main_Source_Unit --
kono
parents:
diff changeset
865 ----------------------------------
kono
parents:
diff changeset
866
kono
parents:
diff changeset
867 function In_Extended_Main_Source_Unit
kono
parents:
diff changeset
868 (N : Node_Or_Entity_Id) return Boolean
kono
parents:
diff changeset
869 is
kono
parents:
diff changeset
870 Nloc : constant Source_Ptr := Sloc (N);
kono
parents:
diff changeset
871 Mloc : constant Source_Ptr := Sloc (Cunit (Main_Unit));
kono
parents:
diff changeset
872
kono
parents:
diff changeset
873 begin
kono
parents:
diff changeset
874 -- If parsing, then use the global flag to indicate result
kono
parents:
diff changeset
875
kono
parents:
diff changeset
876 if Compiler_State = Parsing then
kono
parents:
diff changeset
877 return Parsing_Main_Extended_Source;
kono
parents:
diff changeset
878
kono
parents:
diff changeset
879 -- Special value cases
kono
parents:
diff changeset
880
kono
parents:
diff changeset
881 elsif Nloc = Standard_Location then
kono
parents:
diff changeset
882 return False;
kono
parents:
diff changeset
883
kono
parents:
diff changeset
884 elsif Nloc = No_Location then
kono
parents:
diff changeset
885 return False;
kono
parents:
diff changeset
886
kono
parents:
diff changeset
887 -- Special case Itypes to test the Sloc of the associated node. The
kono
parents:
diff changeset
888 -- reason we do this is for possible calls from gigi after -gnatD
kono
parents:
diff changeset
889 -- processing is complete in sprint. This processing updates the
kono
parents:
diff changeset
890 -- sloc fields of all nodes in the tree, but itypes are not in the
kono
parents:
diff changeset
891 -- tree so their slocs do not get updated.
kono
parents:
diff changeset
892
kono
parents:
diff changeset
893 elsif Nkind (N) = N_Defining_Identifier
kono
parents:
diff changeset
894 and then Is_Itype (N)
kono
parents:
diff changeset
895 then
kono
parents:
diff changeset
896 return In_Extended_Main_Source_Unit (Associated_Node_For_Itype (N));
kono
parents:
diff changeset
897
kono
parents:
diff changeset
898 -- Otherwise compare original locations to see if in same unit
kono
parents:
diff changeset
899
kono
parents:
diff changeset
900 else
kono
parents:
diff changeset
901 return
kono
parents:
diff changeset
902 In_Same_Extended_Unit
kono
parents:
diff changeset
903 (Original_Location (Nloc), Original_Location (Mloc));
kono
parents:
diff changeset
904 end if;
kono
parents:
diff changeset
905 end In_Extended_Main_Source_Unit;
kono
parents:
diff changeset
906
kono
parents:
diff changeset
907 function In_Extended_Main_Source_Unit
kono
parents:
diff changeset
908 (Loc : Source_Ptr) return Boolean
kono
parents:
diff changeset
909 is
kono
parents:
diff changeset
910 Mloc : constant Source_Ptr := Sloc (Cunit (Main_Unit));
kono
parents:
diff changeset
911
kono
parents:
diff changeset
912 begin
kono
parents:
diff changeset
913 -- If parsing, then use the global flag to indicate result
kono
parents:
diff changeset
914
kono
parents:
diff changeset
915 if Compiler_State = Parsing then
kono
parents:
diff changeset
916 return Parsing_Main_Extended_Source;
kono
parents:
diff changeset
917
kono
parents:
diff changeset
918 -- Special value cases
kono
parents:
diff changeset
919
kono
parents:
diff changeset
920 elsif Loc = Standard_Location then
kono
parents:
diff changeset
921 return False;
kono
parents:
diff changeset
922
kono
parents:
diff changeset
923 elsif Loc = No_Location then
kono
parents:
diff changeset
924 return False;
kono
parents:
diff changeset
925
kono
parents:
diff changeset
926 -- Otherwise compare original locations to see if in same unit
kono
parents:
diff changeset
927
kono
parents:
diff changeset
928 else
kono
parents:
diff changeset
929 return
kono
parents:
diff changeset
930 In_Same_Extended_Unit
kono
parents:
diff changeset
931 (Original_Location (Loc), Original_Location (Mloc));
kono
parents:
diff changeset
932 end if;
kono
parents:
diff changeset
933 end In_Extended_Main_Source_Unit;
kono
parents:
diff changeset
934
kono
parents:
diff changeset
935 ----------------------
kono
parents:
diff changeset
936 -- In_Internal_Unit --
kono
parents:
diff changeset
937 ----------------------
kono
parents:
diff changeset
938
kono
parents:
diff changeset
939 function In_Internal_Unit (N : Node_Or_Entity_Id) return Boolean is
kono
parents:
diff changeset
940 begin
kono
parents:
diff changeset
941 return In_Internal_Unit (Sloc (N));
kono
parents:
diff changeset
942 end In_Internal_Unit;
kono
parents:
diff changeset
943
kono
parents:
diff changeset
944 function In_Internal_Unit (S : Source_Ptr) return Boolean is
kono
parents:
diff changeset
945 Unit : constant Unit_Number_Type := Get_Source_Unit (S);
kono
parents:
diff changeset
946 begin
kono
parents:
diff changeset
947 return Is_Internal_Unit (Unit);
kono
parents:
diff changeset
948 end In_Internal_Unit;
kono
parents:
diff changeset
949
kono
parents:
diff changeset
950 ----------------------------
kono
parents:
diff changeset
951 -- In_Predefined_Renaming --
kono
parents:
diff changeset
952 ----------------------------
kono
parents:
diff changeset
953
kono
parents:
diff changeset
954 function In_Predefined_Renaming (N : Node_Or_Entity_Id) return Boolean is
kono
parents:
diff changeset
955 begin
kono
parents:
diff changeset
956 return In_Predefined_Renaming (Sloc (N));
kono
parents:
diff changeset
957 end In_Predefined_Renaming;
kono
parents:
diff changeset
958
kono
parents:
diff changeset
959 function In_Predefined_Renaming (S : Source_Ptr) return Boolean is
kono
parents:
diff changeset
960 Unit : constant Unit_Number_Type := Get_Source_Unit (S);
kono
parents:
diff changeset
961 begin
kono
parents:
diff changeset
962 return Is_Predefined_Renaming (Unit);
kono
parents:
diff changeset
963 end In_Predefined_Renaming;
kono
parents:
diff changeset
964
kono
parents:
diff changeset
965 ------------------------
kono
parents:
diff changeset
966 -- In_Predefined_Unit --
kono
parents:
diff changeset
967 ------------------------
kono
parents:
diff changeset
968
kono
parents:
diff changeset
969 function In_Predefined_Unit (N : Node_Or_Entity_Id) return Boolean is
kono
parents:
diff changeset
970 begin
kono
parents:
diff changeset
971 return In_Predefined_Unit (Sloc (N));
kono
parents:
diff changeset
972 end In_Predefined_Unit;
kono
parents:
diff changeset
973
kono
parents:
diff changeset
974 function In_Predefined_Unit (S : Source_Ptr) return Boolean is
kono
parents:
diff changeset
975 Unit : constant Unit_Number_Type := Get_Source_Unit (S);
kono
parents:
diff changeset
976 begin
kono
parents:
diff changeset
977 return Is_Predefined_Unit (Unit);
kono
parents:
diff changeset
978 end In_Predefined_Unit;
kono
parents:
diff changeset
979
kono
parents:
diff changeset
980 -----------------------
kono
parents:
diff changeset
981 -- In_Same_Code_Unit --
kono
parents:
diff changeset
982 -----------------------
kono
parents:
diff changeset
983
kono
parents:
diff changeset
984 function In_Same_Code_Unit (N1, N2 : Node_Or_Entity_Id) return Boolean is
kono
parents:
diff changeset
985 S1 : constant Source_Ptr := Sloc (N1);
kono
parents:
diff changeset
986 S2 : constant Source_Ptr := Sloc (N2);
kono
parents:
diff changeset
987
kono
parents:
diff changeset
988 begin
kono
parents:
diff changeset
989 if S1 = No_Location or else S2 = No_Location then
kono
parents:
diff changeset
990 return False;
kono
parents:
diff changeset
991
kono
parents:
diff changeset
992 elsif S1 = Standard_Location then
kono
parents:
diff changeset
993 return S2 = Standard_Location;
kono
parents:
diff changeset
994
kono
parents:
diff changeset
995 elsif S2 = Standard_Location then
kono
parents:
diff changeset
996 return False;
kono
parents:
diff changeset
997 end if;
kono
parents:
diff changeset
998
kono
parents:
diff changeset
999 return Get_Code_Unit (N1) = Get_Code_Unit (N2);
kono
parents:
diff changeset
1000 end In_Same_Code_Unit;
kono
parents:
diff changeset
1001
kono
parents:
diff changeset
1002 ---------------------------
kono
parents:
diff changeset
1003 -- In_Same_Extended_Unit --
kono
parents:
diff changeset
1004 ---------------------------
kono
parents:
diff changeset
1005
kono
parents:
diff changeset
1006 function In_Same_Extended_Unit
kono
parents:
diff changeset
1007 (N1, N2 : Node_Or_Entity_Id) return Boolean
kono
parents:
diff changeset
1008 is
kono
parents:
diff changeset
1009 begin
kono
parents:
diff changeset
1010 return Check_Same_Extended_Unit (Sloc (N1), Sloc (N2)) /= No;
kono
parents:
diff changeset
1011 end In_Same_Extended_Unit;
kono
parents:
diff changeset
1012
kono
parents:
diff changeset
1013 function In_Same_Extended_Unit (S1, S2 : Source_Ptr) return Boolean is
kono
parents:
diff changeset
1014 begin
kono
parents:
diff changeset
1015 return Check_Same_Extended_Unit (S1, S2) /= No;
kono
parents:
diff changeset
1016 end In_Same_Extended_Unit;
kono
parents:
diff changeset
1017
kono
parents:
diff changeset
1018 -------------------------
kono
parents:
diff changeset
1019 -- In_Same_Source_Unit --
kono
parents:
diff changeset
1020 -------------------------
kono
parents:
diff changeset
1021
kono
parents:
diff changeset
1022 function In_Same_Source_Unit (N1, N2 : Node_Or_Entity_Id) return Boolean is
kono
parents:
diff changeset
1023 S1 : constant Source_Ptr := Sloc (N1);
kono
parents:
diff changeset
1024 S2 : constant Source_Ptr := Sloc (N2);
kono
parents:
diff changeset
1025
kono
parents:
diff changeset
1026 begin
kono
parents:
diff changeset
1027 if S1 = No_Location or else S2 = No_Location then
kono
parents:
diff changeset
1028 return False;
kono
parents:
diff changeset
1029
kono
parents:
diff changeset
1030 elsif S1 = Standard_Location then
kono
parents:
diff changeset
1031 return S2 = Standard_Location;
kono
parents:
diff changeset
1032
kono
parents:
diff changeset
1033 elsif S2 = Standard_Location then
kono
parents:
diff changeset
1034 return False;
kono
parents:
diff changeset
1035 end if;
kono
parents:
diff changeset
1036
kono
parents:
diff changeset
1037 return Get_Source_Unit (N1) = Get_Source_Unit (N2);
kono
parents:
diff changeset
1038 end In_Same_Source_Unit;
kono
parents:
diff changeset
1039
kono
parents:
diff changeset
1040 -----------------------------------
kono
parents:
diff changeset
1041 -- Increment_Primary_Stack_Count --
kono
parents:
diff changeset
1042 -----------------------------------
kono
parents:
diff changeset
1043
kono
parents:
diff changeset
1044 procedure Increment_Primary_Stack_Count (Increment : Int) is
kono
parents:
diff changeset
1045 PSC : Int renames Units.Table (Current_Sem_Unit).Primary_Stack_Count;
kono
parents:
diff changeset
1046 begin
kono
parents:
diff changeset
1047 PSC := PSC + Increment;
kono
parents:
diff changeset
1048 end Increment_Primary_Stack_Count;
kono
parents:
diff changeset
1049
kono
parents:
diff changeset
1050 -------------------------------
kono
parents:
diff changeset
1051 -- Increment_Sec_Stack_Count --
kono
parents:
diff changeset
1052 -------------------------------
kono
parents:
diff changeset
1053
kono
parents:
diff changeset
1054 procedure Increment_Sec_Stack_Count (Increment : Int) is
kono
parents:
diff changeset
1055 SSC : Int renames Units.Table (Current_Sem_Unit).Sec_Stack_Count;
kono
parents:
diff changeset
1056 begin
kono
parents:
diff changeset
1057 SSC := SSC + Increment;
kono
parents:
diff changeset
1058 end Increment_Sec_Stack_Count;
kono
parents:
diff changeset
1059
kono
parents:
diff changeset
1060 -----------------------------
kono
parents:
diff changeset
1061 -- Increment_Serial_Number --
kono
parents:
diff changeset
1062 -----------------------------
kono
parents:
diff changeset
1063
kono
parents:
diff changeset
1064 function Increment_Serial_Number return Nat is
kono
parents:
diff changeset
1065 TSN : Int renames Units.Table (Current_Sem_Unit).Serial_Number;
kono
parents:
diff changeset
1066 begin
kono
parents:
diff changeset
1067 TSN := TSN + 1;
kono
parents:
diff changeset
1068 return TSN;
kono
parents:
diff changeset
1069 end Increment_Serial_Number;
kono
parents:
diff changeset
1070
kono
parents:
diff changeset
1071 ----------------
kono
parents:
diff changeset
1072 -- Initialize --
kono
parents:
diff changeset
1073 ----------------
kono
parents:
diff changeset
1074
kono
parents:
diff changeset
1075 procedure Initialize is
kono
parents:
diff changeset
1076 begin
kono
parents:
diff changeset
1077 Linker_Option_Lines.Init;
kono
parents:
diff changeset
1078 Notes.Init;
kono
parents:
diff changeset
1079 Load_Stack.Init;
kono
parents:
diff changeset
1080 Units.Init;
kono
parents:
diff changeset
1081 Compilation_Switches.Init;
kono
parents:
diff changeset
1082 end Initialize;
kono
parents:
diff changeset
1083
kono
parents:
diff changeset
1084 ---------------
kono
parents:
diff changeset
1085 -- Is_Loaded --
kono
parents:
diff changeset
1086 ---------------
kono
parents:
diff changeset
1087
kono
parents:
diff changeset
1088 function Is_Loaded (Uname : Unit_Name_Type) return Boolean is
kono
parents:
diff changeset
1089 begin
kono
parents:
diff changeset
1090 for Unum in Units.First .. Units.Last loop
kono
parents:
diff changeset
1091 if Uname = Unit_Name (Unum) then
kono
parents:
diff changeset
1092 return True;
kono
parents:
diff changeset
1093 end if;
kono
parents:
diff changeset
1094 end loop;
kono
parents:
diff changeset
1095
kono
parents:
diff changeset
1096 return False;
kono
parents:
diff changeset
1097 end Is_Loaded;
kono
parents:
diff changeset
1098
kono
parents:
diff changeset
1099 ---------------
kono
parents:
diff changeset
1100 -- Last_Unit --
kono
parents:
diff changeset
1101 ---------------
kono
parents:
diff changeset
1102
kono
parents:
diff changeset
1103 function Last_Unit return Unit_Number_Type is
kono
parents:
diff changeset
1104 begin
kono
parents:
diff changeset
1105 return Units.Last;
kono
parents:
diff changeset
1106 end Last_Unit;
kono
parents:
diff changeset
1107
kono
parents:
diff changeset
1108 ----------
kono
parents:
diff changeset
1109 -- List --
kono
parents:
diff changeset
1110 ----------
kono
parents:
diff changeset
1111
kono
parents:
diff changeset
1112 procedure List (File_Names_Only : Boolean := False) is separate;
kono
parents:
diff changeset
1113
kono
parents:
diff changeset
1114 ----------
kono
parents:
diff changeset
1115 -- Lock --
kono
parents:
diff changeset
1116 ----------
kono
parents:
diff changeset
1117
kono
parents:
diff changeset
1118 procedure Lock is
kono
parents:
diff changeset
1119 begin
kono
parents:
diff changeset
1120 Linker_Option_Lines.Release;
kono
parents:
diff changeset
1121 Linker_Option_Lines.Locked := True;
kono
parents:
diff changeset
1122 Load_Stack.Release;
kono
parents:
diff changeset
1123 Load_Stack.Locked := True;
kono
parents:
diff changeset
1124 Units.Release;
kono
parents:
diff changeset
1125 Units.Locked := True;
kono
parents:
diff changeset
1126 end Lock;
kono
parents:
diff changeset
1127
kono
parents:
diff changeset
1128 ---------------
kono
parents:
diff changeset
1129 -- Num_Units --
kono
parents:
diff changeset
1130 ---------------
kono
parents:
diff changeset
1131
kono
parents:
diff changeset
1132 function Num_Units return Nat is
kono
parents:
diff changeset
1133 begin
kono
parents:
diff changeset
1134 return Int (Units.Last) - Int (Main_Unit) + 1;
kono
parents:
diff changeset
1135 end Num_Units;
kono
parents:
diff changeset
1136
kono
parents:
diff changeset
1137 -----------------
kono
parents:
diff changeset
1138 -- Remove_Unit --
kono
parents:
diff changeset
1139 -----------------
kono
parents:
diff changeset
1140
kono
parents:
diff changeset
1141 procedure Remove_Unit (U : Unit_Number_Type) is
kono
parents:
diff changeset
1142 begin
kono
parents:
diff changeset
1143 if U = Units.Last then
kono
parents:
diff changeset
1144 Units.Decrement_Last;
kono
parents:
diff changeset
1145 end if;
kono
parents:
diff changeset
1146 end Remove_Unit;
kono
parents:
diff changeset
1147
kono
parents:
diff changeset
1148 ----------------------------------
kono
parents:
diff changeset
1149 -- Replace_Linker_Option_String --
kono
parents:
diff changeset
1150 ----------------------------------
kono
parents:
diff changeset
1151
kono
parents:
diff changeset
1152 procedure Replace_Linker_Option_String
kono
parents:
diff changeset
1153 (S : String_Id; Match_String : String)
kono
parents:
diff changeset
1154 is
kono
parents:
diff changeset
1155 begin
kono
parents:
diff changeset
1156 if Match_String'Length > 0 then
kono
parents:
diff changeset
1157 for J in 1 .. Linker_Option_Lines.Last loop
kono
parents:
diff changeset
1158 String_To_Name_Buffer (Linker_Option_Lines.Table (J).Option);
kono
parents:
diff changeset
1159
kono
parents:
diff changeset
1160 if Match_String = Name_Buffer (1 .. Match_String'Length) then
kono
parents:
diff changeset
1161 Linker_Option_Lines.Table (J).Option := S;
kono
parents:
diff changeset
1162 return;
kono
parents:
diff changeset
1163 end if;
kono
parents:
diff changeset
1164 end loop;
kono
parents:
diff changeset
1165 end if;
kono
parents:
diff changeset
1166
kono
parents:
diff changeset
1167 Store_Linker_Option_String (S);
kono
parents:
diff changeset
1168 end Replace_Linker_Option_String;
kono
parents:
diff changeset
1169
kono
parents:
diff changeset
1170 ----------
kono
parents:
diff changeset
1171 -- Sort --
kono
parents:
diff changeset
1172 ----------
kono
parents:
diff changeset
1173
kono
parents:
diff changeset
1174 procedure Sort (Tbl : in out Unit_Ref_Table) is separate;
kono
parents:
diff changeset
1175
kono
parents:
diff changeset
1176 ------------------------------
kono
parents:
diff changeset
1177 -- Store_Compilation_Switch --
kono
parents:
diff changeset
1178 ------------------------------
kono
parents:
diff changeset
1179
kono
parents:
diff changeset
1180 procedure Store_Compilation_Switch (Switch : String) is
kono
parents:
diff changeset
1181 begin
kono
parents:
diff changeset
1182 if Switch_Storing_Enabled then
kono
parents:
diff changeset
1183 Compilation_Switches.Increment_Last;
kono
parents:
diff changeset
1184 Compilation_Switches.Table (Compilation_Switches.Last) :=
kono
parents:
diff changeset
1185 new String'(Switch);
kono
parents:
diff changeset
1186
kono
parents:
diff changeset
1187 -- Fix up --RTS flag which has been transformed by the gcc driver
kono
parents:
diff changeset
1188 -- into -fRTS
kono
parents:
diff changeset
1189
kono
parents:
diff changeset
1190 if Switch'Last >= Switch'First + 4
kono
parents:
diff changeset
1191 and then Switch (Switch'First .. Switch'First + 4) = "-fRTS"
kono
parents:
diff changeset
1192 then
kono
parents:
diff changeset
1193 Compilation_Switches.Table
kono
parents:
diff changeset
1194 (Compilation_Switches.Last) (Switch'First + 1) := '-';
kono
parents:
diff changeset
1195 end if;
kono
parents:
diff changeset
1196 end if;
kono
parents:
diff changeset
1197 end Store_Compilation_Switch;
kono
parents:
diff changeset
1198
kono
parents:
diff changeset
1199 --------------------------------
kono
parents:
diff changeset
1200 -- Store_Linker_Option_String --
kono
parents:
diff changeset
1201 --------------------------------
kono
parents:
diff changeset
1202
kono
parents:
diff changeset
1203 procedure Store_Linker_Option_String (S : String_Id) is
kono
parents:
diff changeset
1204 begin
kono
parents:
diff changeset
1205 Linker_Option_Lines.Append ((Option => S, Unit => Current_Sem_Unit));
kono
parents:
diff changeset
1206 end Store_Linker_Option_String;
kono
parents:
diff changeset
1207
kono
parents:
diff changeset
1208 ----------------
kono
parents:
diff changeset
1209 -- Store_Note --
kono
parents:
diff changeset
1210 ----------------
kono
parents:
diff changeset
1211
kono
parents:
diff changeset
1212 procedure Store_Note (N : Node_Id) is
kono
parents:
diff changeset
1213 Sfile : constant Source_File_Index := Get_Source_File_Index (Sloc (N));
kono
parents:
diff changeset
1214
kono
parents:
diff changeset
1215 begin
kono
parents:
diff changeset
1216 -- Notes for a generic are emitted when processing the template, never
kono
parents:
diff changeset
1217 -- in instances.
kono
parents:
diff changeset
1218
kono
parents:
diff changeset
1219 if In_Extended_Main_Code_Unit (N)
kono
parents:
diff changeset
1220 and then Instance (Sfile) = No_Instance_Id
kono
parents:
diff changeset
1221 then
kono
parents:
diff changeset
1222 Notes.Append (N);
kono
parents:
diff changeset
1223 end if;
kono
parents:
diff changeset
1224 end Store_Note;
kono
parents:
diff changeset
1225
kono
parents:
diff changeset
1226 -------------------------------
kono
parents:
diff changeset
1227 -- Synchronize_Serial_Number --
kono
parents:
diff changeset
1228 -------------------------------
kono
parents:
diff changeset
1229
kono
parents:
diff changeset
1230 procedure Synchronize_Serial_Number is
kono
parents:
diff changeset
1231 TSN : Int renames Units.Table (Current_Sem_Unit).Serial_Number;
kono
parents:
diff changeset
1232 begin
kono
parents:
diff changeset
1233 TSN := TSN + 1;
kono
parents:
diff changeset
1234 end Synchronize_Serial_Number;
kono
parents:
diff changeset
1235
kono
parents:
diff changeset
1236 ---------------
kono
parents:
diff changeset
1237 -- Tree_Read --
kono
parents:
diff changeset
1238 ---------------
kono
parents:
diff changeset
1239
kono
parents:
diff changeset
1240 procedure Tree_Read is
kono
parents:
diff changeset
1241 N : Nat;
kono
parents:
diff changeset
1242 S : String_Ptr;
kono
parents:
diff changeset
1243
kono
parents:
diff changeset
1244 begin
kono
parents:
diff changeset
1245 Units.Tree_Read;
kono
parents:
diff changeset
1246
kono
parents:
diff changeset
1247 -- Read Compilation_Switches table. First release the memory occupied
kono
parents:
diff changeset
1248 -- by the previously loaded switches.
kono
parents:
diff changeset
1249
kono
parents:
diff changeset
1250 for J in Compilation_Switches.First .. Compilation_Switches.Last loop
kono
parents:
diff changeset
1251 Free (Compilation_Switches.Table (J));
kono
parents:
diff changeset
1252 end loop;
kono
parents:
diff changeset
1253
kono
parents:
diff changeset
1254 Tree_Read_Int (N);
kono
parents:
diff changeset
1255 Compilation_Switches.Set_Last (N);
kono
parents:
diff changeset
1256
kono
parents:
diff changeset
1257 for J in 1 .. N loop
kono
parents:
diff changeset
1258 Tree_Read_Str (S);
kono
parents:
diff changeset
1259 Compilation_Switches.Table (J) := S;
kono
parents:
diff changeset
1260 end loop;
kono
parents:
diff changeset
1261 end Tree_Read;
kono
parents:
diff changeset
1262
kono
parents:
diff changeset
1263 ----------------
kono
parents:
diff changeset
1264 -- Tree_Write --
kono
parents:
diff changeset
1265 ----------------
kono
parents:
diff changeset
1266
kono
parents:
diff changeset
1267 procedure Tree_Write is
kono
parents:
diff changeset
1268 begin
kono
parents:
diff changeset
1269 Units.Tree_Write;
kono
parents:
diff changeset
1270
kono
parents:
diff changeset
1271 -- Write Compilation_Switches table
kono
parents:
diff changeset
1272
kono
parents:
diff changeset
1273 Tree_Write_Int (Compilation_Switches.Last);
kono
parents:
diff changeset
1274
kono
parents:
diff changeset
1275 for J in 1 .. Compilation_Switches.Last loop
kono
parents:
diff changeset
1276 Tree_Write_Str (Compilation_Switches.Table (J));
kono
parents:
diff changeset
1277 end loop;
kono
parents:
diff changeset
1278 end Tree_Write;
kono
parents:
diff changeset
1279
kono
parents:
diff changeset
1280 ------------
kono
parents:
diff changeset
1281 -- Unlock --
kono
parents:
diff changeset
1282 ------------
kono
parents:
diff changeset
1283
kono
parents:
diff changeset
1284 procedure Unlock is
kono
parents:
diff changeset
1285 begin
kono
parents:
diff changeset
1286 Linker_Option_Lines.Locked := False;
kono
parents:
diff changeset
1287 Load_Stack.Locked := False;
kono
parents:
diff changeset
1288 Units.Locked := False;
kono
parents:
diff changeset
1289 end Unlock;
kono
parents:
diff changeset
1290
kono
parents:
diff changeset
1291 -----------------
kono
parents:
diff changeset
1292 -- Version_Get --
kono
parents:
diff changeset
1293 -----------------
kono
parents:
diff changeset
1294
kono
parents:
diff changeset
1295 function Version_Get (U : Unit_Number_Type) return Word_Hex_String is
kono
parents:
diff changeset
1296 begin
kono
parents:
diff changeset
1297 return Get_Hex_String (Units.Table (U).Version);
kono
parents:
diff changeset
1298 end Version_Get;
kono
parents:
diff changeset
1299
kono
parents:
diff changeset
1300 ------------------------
kono
parents:
diff changeset
1301 -- Version_Referenced --
kono
parents:
diff changeset
1302 ------------------------
kono
parents:
diff changeset
1303
kono
parents:
diff changeset
1304 procedure Version_Referenced (S : String_Id) is
kono
parents:
diff changeset
1305 begin
kono
parents:
diff changeset
1306 Version_Ref.Append (S);
kono
parents:
diff changeset
1307 end Version_Referenced;
kono
parents:
diff changeset
1308
kono
parents:
diff changeset
1309 ---------------------
kono
parents:
diff changeset
1310 -- Write_Unit_Info --
kono
parents:
diff changeset
1311 ---------------------
kono
parents:
diff changeset
1312
kono
parents:
diff changeset
1313 procedure Write_Unit_Info
kono
parents:
diff changeset
1314 (Unit_Num : Unit_Number_Type;
kono
parents:
diff changeset
1315 Item : Node_Id;
kono
parents:
diff changeset
1316 Prefix : String := "";
kono
parents:
diff changeset
1317 Withs : Boolean := False)
kono
parents:
diff changeset
1318 is
kono
parents:
diff changeset
1319 begin
kono
parents:
diff changeset
1320 Write_Str (Prefix);
kono
parents:
diff changeset
1321 Write_Unit_Name (Unit_Name (Unit_Num));
kono
parents:
diff changeset
1322 Write_Str (", unit ");
kono
parents:
diff changeset
1323 Write_Int (Int (Unit_Num));
kono
parents:
diff changeset
1324 Write_Str (", ");
kono
parents:
diff changeset
1325 Write_Int (Int (Item));
kono
parents:
diff changeset
1326 Write_Str ("=");
kono
parents:
diff changeset
1327 Write_Str (Node_Kind'Image (Nkind (Item)));
kono
parents:
diff changeset
1328
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1329 if Is_Rewrite_Substitution (Item) then
111
kono
parents:
diff changeset
1330 Write_Str (", orig = ");
kono
parents:
diff changeset
1331 Write_Int (Int (Original_Node (Item)));
kono
parents:
diff changeset
1332 Write_Str ("=");
kono
parents:
diff changeset
1333 Write_Str (Node_Kind'Image (Nkind (Original_Node (Item))));
kono
parents:
diff changeset
1334 end if;
kono
parents:
diff changeset
1335
kono
parents:
diff changeset
1336 Write_Eol;
kono
parents:
diff changeset
1337
kono
parents:
diff changeset
1338 -- Skip the rest if we're not supposed to print the withs
kono
parents:
diff changeset
1339
kono
parents:
diff changeset
1340 if not Withs then
kono
parents:
diff changeset
1341 return;
kono
parents:
diff changeset
1342 end if;
kono
parents:
diff changeset
1343
kono
parents:
diff changeset
1344 declare
kono
parents:
diff changeset
1345 Context_Item : Node_Id;
kono
parents:
diff changeset
1346
kono
parents:
diff changeset
1347 begin
kono
parents:
diff changeset
1348 Context_Item := First (Context_Items (Cunit (Unit_Num)));
kono
parents:
diff changeset
1349 while Present (Context_Item)
kono
parents:
diff changeset
1350 and then (Nkind (Context_Item) /= N_With_Clause
kono
parents:
diff changeset
1351 or else Limited_Present (Context_Item))
kono
parents:
diff changeset
1352 loop
kono
parents:
diff changeset
1353 Context_Item := Next (Context_Item);
kono
parents:
diff changeset
1354 end loop;
kono
parents:
diff changeset
1355
kono
parents:
diff changeset
1356 if Present (Context_Item) then
kono
parents:
diff changeset
1357 Indent;
kono
parents:
diff changeset
1358 Write_Line ("withs:");
kono
parents:
diff changeset
1359 Indent;
kono
parents:
diff changeset
1360
kono
parents:
diff changeset
1361 while Present (Context_Item) loop
kono
parents:
diff changeset
1362 if Nkind (Context_Item) = N_With_Clause
kono
parents:
diff changeset
1363 and then not Limited_Present (Context_Item)
kono
parents:
diff changeset
1364 then
kono
parents:
diff changeset
1365 pragma Assert (Present (Library_Unit (Context_Item)));
kono
parents:
diff changeset
1366 Write_Unit_Name
kono
parents:
diff changeset
1367 (Unit_Name
kono
parents:
diff changeset
1368 (Get_Cunit_Unit_Number (Library_Unit (Context_Item))));
kono
parents:
diff changeset
1369
kono
parents:
diff changeset
1370 if Implicit_With (Context_Item) then
kono
parents:
diff changeset
1371 Write_Str (" -- implicit");
kono
parents:
diff changeset
1372 end if;
kono
parents:
diff changeset
1373
kono
parents:
diff changeset
1374 Write_Eol;
kono
parents:
diff changeset
1375 end if;
kono
parents:
diff changeset
1376
kono
parents:
diff changeset
1377 Context_Item := Next (Context_Item);
kono
parents:
diff changeset
1378 end loop;
kono
parents:
diff changeset
1379
kono
parents:
diff changeset
1380 Outdent;
kono
parents:
diff changeset
1381 Write_Line ("end withs");
kono
parents:
diff changeset
1382 Outdent;
kono
parents:
diff changeset
1383 end if;
kono
parents:
diff changeset
1384 end;
kono
parents:
diff changeset
1385 end Write_Unit_Info;
kono
parents:
diff changeset
1386
kono
parents:
diff changeset
1387 end Lib;