annotate gcc/ada/lib.adb @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
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 -- L I B --
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. --
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
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
280 Old_N : constant Unit_Name_Type := Units.Table (U).Unit_Name;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
281
111
kono
parents:
diff changeset
282 begin
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
283 -- First unregister the old name, if any
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
284
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
285 if Old_N /= No_Unit_Name and then Unit_Names.Get (Old_N) = U then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
286 Unit_Names.Set (Old_N, No_Unit);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
287 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
288
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
289 -- Then set the new name
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
290
111
kono
parents:
diff changeset
291 Units.Table (U).Unit_Name := N;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
292
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
293 -- Finally register the new name
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
294
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
295 if Unit_Names.Get (N) = No_Unit then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
296 Unit_Names.Set (N, U);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
297 end if;
111
kono
parents:
diff changeset
298 end Set_Unit_Name;
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 ------------------------------
kono
parents:
diff changeset
301 -- Check_Same_Extended_Unit --
kono
parents:
diff changeset
302 ------------------------------
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 function Check_Same_Extended_Unit
kono
parents:
diff changeset
305 (S1 : Source_Ptr;
kono
parents:
diff changeset
306 S2 : Source_Ptr) return SEU_Result
kono
parents:
diff changeset
307 is
kono
parents:
diff changeset
308 Max_Iterations : constant Nat := Maximum_Instantiations * 2;
kono
parents:
diff changeset
309 -- Limit to prevent a potential infinite loop
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 Counter : Nat := 0;
kono
parents:
diff changeset
312 Depth1 : Nat;
kono
parents:
diff changeset
313 Depth2 : Nat;
kono
parents:
diff changeset
314 Inst1 : Source_Ptr;
kono
parents:
diff changeset
315 Inst2 : Source_Ptr;
kono
parents:
diff changeset
316 Sind1 : Source_File_Index;
kono
parents:
diff changeset
317 Sind2 : Source_File_Index;
kono
parents:
diff changeset
318 Sloc1 : Source_Ptr;
kono
parents:
diff changeset
319 Sloc2 : Source_Ptr;
kono
parents:
diff changeset
320 Unit1 : Node_Id;
kono
parents:
diff changeset
321 Unit2 : Node_Id;
kono
parents:
diff changeset
322 Unum1 : Unit_Number_Type;
kono
parents:
diff changeset
323 Unum2 : Unit_Number_Type;
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 begin
kono
parents:
diff changeset
326 if S1 = No_Location or else S2 = No_Location then
kono
parents:
diff changeset
327 return No;
kono
parents:
diff changeset
328
kono
parents:
diff changeset
329 elsif S1 = Standard_Location then
kono
parents:
diff changeset
330 if S2 = Standard_Location then
kono
parents:
diff changeset
331 return Yes_Same;
kono
parents:
diff changeset
332 else
kono
parents:
diff changeset
333 return No;
kono
parents:
diff changeset
334 end if;
kono
parents:
diff changeset
335
kono
parents:
diff changeset
336 elsif S2 = Standard_Location then
kono
parents:
diff changeset
337 return No;
kono
parents:
diff changeset
338 end if;
kono
parents:
diff changeset
339
kono
parents:
diff changeset
340 Sloc1 := S1;
kono
parents:
diff changeset
341 Sloc2 := S2;
kono
parents:
diff changeset
342
kono
parents:
diff changeset
343 Unum1 := Get_Source_Unit (Sloc1);
kono
parents:
diff changeset
344 Unum2 := Get_Source_Unit (Sloc2);
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 loop
kono
parents:
diff changeset
347 -- Step 1: Check whether the two locations are in the same source
kono
parents:
diff changeset
348 -- file.
kono
parents:
diff changeset
349
kono
parents:
diff changeset
350 Sind1 := Get_Source_File_Index (Sloc1);
kono
parents:
diff changeset
351 Sind2 := Get_Source_File_Index (Sloc2);
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 if Sind1 = Sind2 then
kono
parents:
diff changeset
354 if Sloc1 < Sloc2 then
kono
parents:
diff changeset
355 return Yes_Before;
kono
parents:
diff changeset
356 elsif Sloc1 > Sloc2 then
kono
parents:
diff changeset
357 return Yes_After;
kono
parents:
diff changeset
358 else
kono
parents:
diff changeset
359 return Yes_Same;
kono
parents:
diff changeset
360 end if;
kono
parents:
diff changeset
361 end if;
kono
parents:
diff changeset
362
kono
parents:
diff changeset
363 -- Step 2: Check subunits. If a subunit is instantiated, follow the
kono
parents:
diff changeset
364 -- instantiation chain rather than the stub chain.
kono
parents:
diff changeset
365
kono
parents:
diff changeset
366 Unit1 := Unit (Cunit (Unum1));
kono
parents:
diff changeset
367 Unit2 := Unit (Cunit (Unum2));
kono
parents:
diff changeset
368 Inst1 := Instantiation (Sind1);
kono
parents:
diff changeset
369 Inst2 := Instantiation (Sind2);
kono
parents:
diff changeset
370
kono
parents:
diff changeset
371 if Nkind (Unit1) = N_Subunit
kono
parents:
diff changeset
372 and then Present (Corresponding_Stub (Unit1))
kono
parents:
diff changeset
373 and then Inst1 = No_Location
kono
parents:
diff changeset
374 then
kono
parents:
diff changeset
375 if Nkind (Unit2) = N_Subunit
kono
parents:
diff changeset
376 and then Present (Corresponding_Stub (Unit2))
kono
parents:
diff changeset
377 and then Inst2 = No_Location
kono
parents:
diff changeset
378 then
kono
parents:
diff changeset
379 -- Both locations refer to subunits which may have a common
kono
parents:
diff changeset
380 -- ancestor. If they do, the deeper subunit must have a longer
kono
parents:
diff changeset
381 -- unit name. Replace the deeper one with its corresponding
kono
parents:
diff changeset
382 -- stub in order to find the nearest ancestor.
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 if Length_Of_Name (Unit_Name (Unum1)) <
kono
parents:
diff changeset
385 Length_Of_Name (Unit_Name (Unum2))
kono
parents:
diff changeset
386 then
kono
parents:
diff changeset
387 Sloc2 := Sloc (Corresponding_Stub (Unit2));
kono
parents:
diff changeset
388 Unum2 := Get_Source_Unit (Sloc2);
kono
parents:
diff changeset
389 goto Continue;
kono
parents:
diff changeset
390
kono
parents:
diff changeset
391 else
kono
parents:
diff changeset
392 Sloc1 := Sloc (Corresponding_Stub (Unit1));
kono
parents:
diff changeset
393 Unum1 := Get_Source_Unit (Sloc1);
kono
parents:
diff changeset
394 goto Continue;
kono
parents:
diff changeset
395 end if;
kono
parents:
diff changeset
396
kono
parents:
diff changeset
397 -- Sloc1 in subunit, Sloc2 not
kono
parents:
diff changeset
398
kono
parents:
diff changeset
399 else
kono
parents:
diff changeset
400 Sloc1 := Sloc (Corresponding_Stub (Unit1));
kono
parents:
diff changeset
401 Unum1 := Get_Source_Unit (Sloc1);
kono
parents:
diff changeset
402 goto Continue;
kono
parents:
diff changeset
403 end if;
kono
parents:
diff changeset
404
kono
parents:
diff changeset
405 -- Sloc2 in subunit, Sloc1 not
kono
parents:
diff changeset
406
kono
parents:
diff changeset
407 elsif Nkind (Unit2) = N_Subunit
kono
parents:
diff changeset
408 and then Present (Corresponding_Stub (Unit2))
kono
parents:
diff changeset
409 and then Inst2 = No_Location
kono
parents:
diff changeset
410 then
kono
parents:
diff changeset
411 Sloc2 := Sloc (Corresponding_Stub (Unit2));
kono
parents:
diff changeset
412 Unum2 := Get_Source_Unit (Sloc2);
kono
parents:
diff changeset
413 goto Continue;
kono
parents:
diff changeset
414 end if;
kono
parents:
diff changeset
415
kono
parents:
diff changeset
416 -- Step 3: Check instances. The two locations may yield a common
kono
parents:
diff changeset
417 -- ancestor.
kono
parents:
diff changeset
418
kono
parents:
diff changeset
419 if Inst1 /= No_Location then
kono
parents:
diff changeset
420 if Inst2 /= No_Location then
kono
parents:
diff changeset
421
kono
parents:
diff changeset
422 -- Both locations denote instantiations
kono
parents:
diff changeset
423
kono
parents:
diff changeset
424 Depth1 := Instantiation_Depth (Sloc1);
kono
parents:
diff changeset
425 Depth2 := Instantiation_Depth (Sloc2);
kono
parents:
diff changeset
426
kono
parents:
diff changeset
427 if Depth1 < Depth2 then
kono
parents:
diff changeset
428 Sloc2 := Inst2;
kono
parents:
diff changeset
429 Unum2 := Get_Source_Unit (Sloc2);
kono
parents:
diff changeset
430 goto Continue;
kono
parents:
diff changeset
431
kono
parents:
diff changeset
432 elsif Depth1 > Depth2 then
kono
parents:
diff changeset
433 Sloc1 := Inst1;
kono
parents:
diff changeset
434 Unum1 := Get_Source_Unit (Sloc1);
kono
parents:
diff changeset
435 goto Continue;
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 else
kono
parents:
diff changeset
438 Sloc1 := Inst1;
kono
parents:
diff changeset
439 Sloc2 := Inst2;
kono
parents:
diff changeset
440 Unum1 := Get_Source_Unit (Sloc1);
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 -- Sloc1 is an instantiation
kono
parents:
diff changeset
446
kono
parents:
diff changeset
447 else
kono
parents:
diff changeset
448 Sloc1 := Inst1;
kono
parents:
diff changeset
449 Unum1 := Get_Source_Unit (Sloc1);
kono
parents:
diff changeset
450 goto Continue;
kono
parents:
diff changeset
451 end if;
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 -- Sloc2 is an instantiation
kono
parents:
diff changeset
454
kono
parents:
diff changeset
455 elsif Inst2 /= No_Location then
kono
parents:
diff changeset
456 Sloc2 := Inst2;
kono
parents:
diff changeset
457 Unum2 := Get_Source_Unit (Sloc2);
kono
parents:
diff changeset
458 goto Continue;
kono
parents:
diff changeset
459 end if;
kono
parents:
diff changeset
460
kono
parents:
diff changeset
461 -- Step 4: One location in the spec, the other in the corresponding
kono
parents:
diff changeset
462 -- body of the same unit. The location in the spec is considered
kono
parents:
diff changeset
463 -- earlier.
kono
parents:
diff changeset
464
kono
parents:
diff changeset
465 if Nkind (Unit1) = N_Subprogram_Body
kono
parents:
diff changeset
466 or else
kono
parents:
diff changeset
467 Nkind (Unit1) = N_Package_Body
kono
parents:
diff changeset
468 then
kono
parents:
diff changeset
469 if Library_Unit (Cunit (Unum1)) = Cunit (Unum2) then
kono
parents:
diff changeset
470 return Yes_After;
kono
parents:
diff changeset
471 end if;
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473 elsif Nkind (Unit2) = N_Subprogram_Body
kono
parents:
diff changeset
474 or else
kono
parents:
diff changeset
475 Nkind (Unit2) = N_Package_Body
kono
parents:
diff changeset
476 then
kono
parents:
diff changeset
477 if Library_Unit (Cunit (Unum2)) = Cunit (Unum1) then
kono
parents:
diff changeset
478 return Yes_Before;
kono
parents:
diff changeset
479 end if;
kono
parents:
diff changeset
480 end if;
kono
parents:
diff changeset
481
kono
parents:
diff changeset
482 -- At this point it is certain that the two locations denote two
kono
parents:
diff changeset
483 -- entirely separate units.
kono
parents:
diff changeset
484
kono
parents:
diff changeset
485 return No;
kono
parents:
diff changeset
486
kono
parents:
diff changeset
487 <<Continue>>
kono
parents:
diff changeset
488 Counter := Counter + 1;
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 -- Prevent looping forever
kono
parents:
diff changeset
491
kono
parents:
diff changeset
492 if Counter > Max_Iterations then
kono
parents:
diff changeset
493
kono
parents:
diff changeset
494 -- ??? Not quite right, but return a value to be able to generate
kono
parents:
diff changeset
495 -- SCIL files and hope for the best.
kono
parents:
diff changeset
496
kono
parents:
diff changeset
497 if CodePeer_Mode then
kono
parents:
diff changeset
498 return No;
kono
parents:
diff changeset
499 else
kono
parents:
diff changeset
500 raise Program_Error;
kono
parents:
diff changeset
501 end if;
kono
parents:
diff changeset
502 end if;
kono
parents:
diff changeset
503 end loop;
kono
parents:
diff changeset
504 end Check_Same_Extended_Unit;
kono
parents:
diff changeset
505
kono
parents:
diff changeset
506 -------------------------------
kono
parents:
diff changeset
507 -- Compilation_Switches_Last --
kono
parents:
diff changeset
508 -------------------------------
kono
parents:
diff changeset
509
kono
parents:
diff changeset
510 function Compilation_Switches_Last return Nat is
kono
parents:
diff changeset
511 begin
kono
parents:
diff changeset
512 return Compilation_Switches.Last;
kono
parents:
diff changeset
513 end Compilation_Switches_Last;
kono
parents:
diff changeset
514
kono
parents:
diff changeset
515 ---------------------------
kono
parents:
diff changeset
516 -- Enable_Switch_Storing --
kono
parents:
diff changeset
517 ---------------------------
kono
parents:
diff changeset
518
kono
parents:
diff changeset
519 procedure Enable_Switch_Storing is
kono
parents:
diff changeset
520 begin
kono
parents:
diff changeset
521 Switch_Storing_Enabled := True;
kono
parents:
diff changeset
522 end Enable_Switch_Storing;
kono
parents:
diff changeset
523
kono
parents:
diff changeset
524 ----------------------------
kono
parents:
diff changeset
525 -- Disable_Switch_Storing --
kono
parents:
diff changeset
526 ----------------------------
kono
parents:
diff changeset
527
kono
parents:
diff changeset
528 procedure Disable_Switch_Storing is
kono
parents:
diff changeset
529 begin
kono
parents:
diff changeset
530 Switch_Storing_Enabled := False;
kono
parents:
diff changeset
531 end Disable_Switch_Storing;
kono
parents:
diff changeset
532
kono
parents:
diff changeset
533 ------------------------------
kono
parents:
diff changeset
534 -- Earlier_In_Extended_Unit --
kono
parents:
diff changeset
535 ------------------------------
kono
parents:
diff changeset
536
kono
parents:
diff changeset
537 function Earlier_In_Extended_Unit
kono
parents:
diff changeset
538 (S1 : Source_Ptr;
kono
parents:
diff changeset
539 S2 : Source_Ptr) return Boolean
kono
parents:
diff changeset
540 is
kono
parents:
diff changeset
541 begin
kono
parents:
diff changeset
542 return Check_Same_Extended_Unit (S1, S2) = Yes_Before;
kono
parents:
diff changeset
543 end Earlier_In_Extended_Unit;
kono
parents:
diff changeset
544
kono
parents:
diff changeset
545 function Earlier_In_Extended_Unit
kono
parents:
diff changeset
546 (N1 : Node_Or_Entity_Id;
kono
parents:
diff changeset
547 N2 : Node_Or_Entity_Id) return Boolean
kono
parents:
diff changeset
548 is
kono
parents:
diff changeset
549 begin
kono
parents:
diff changeset
550 return Earlier_In_Extended_Unit (Sloc (N1), Sloc (N2));
kono
parents:
diff changeset
551 end Earlier_In_Extended_Unit;
kono
parents:
diff changeset
552
kono
parents:
diff changeset
553 -----------------------
kono
parents:
diff changeset
554 -- Exact_Source_Name --
kono
parents:
diff changeset
555 -----------------------
kono
parents:
diff changeset
556
kono
parents:
diff changeset
557 function Exact_Source_Name (Loc : Source_Ptr) return String is
kono
parents:
diff changeset
558 U : constant Unit_Number_Type := Get_Source_Unit (Loc);
kono
parents:
diff changeset
559 Buf : constant Source_Buffer_Ptr := Source_Text (Source_Index (U));
kono
parents:
diff changeset
560 Orig : constant Source_Ptr := Original_Location (Loc);
kono
parents:
diff changeset
561 P : Source_Ptr;
kono
parents:
diff changeset
562
kono
parents:
diff changeset
563 WC : Char_Code;
kono
parents:
diff changeset
564 Err : Boolean;
kono
parents:
diff changeset
565 pragma Warnings (Off, WC);
kono
parents:
diff changeset
566 pragma Warnings (Off, Err);
kono
parents:
diff changeset
567
kono
parents:
diff changeset
568 begin
kono
parents:
diff changeset
569 -- Entity is character literal
kono
parents:
diff changeset
570
kono
parents:
diff changeset
571 if Buf (Orig) = ''' then
kono
parents:
diff changeset
572 return String (Buf (Orig .. Orig + 2));
kono
parents:
diff changeset
573
kono
parents:
diff changeset
574 -- Entity is operator symbol
kono
parents:
diff changeset
575
kono
parents:
diff changeset
576 elsif Buf (Orig) = '"' or else Buf (Orig) = '%' then
kono
parents:
diff changeset
577 P := Orig;
kono
parents:
diff changeset
578
kono
parents:
diff changeset
579 loop
kono
parents:
diff changeset
580 P := P + 1;
kono
parents:
diff changeset
581 exit when Buf (P) = Buf (Orig);
kono
parents:
diff changeset
582 end loop;
kono
parents:
diff changeset
583
kono
parents:
diff changeset
584 return String (Buf (Orig .. P));
kono
parents:
diff changeset
585
kono
parents:
diff changeset
586 -- Entity is identifier
kono
parents:
diff changeset
587
kono
parents:
diff changeset
588 else
kono
parents:
diff changeset
589 P := Orig;
kono
parents:
diff changeset
590
kono
parents:
diff changeset
591 loop
kono
parents:
diff changeset
592 if Is_Start_Of_Wide_Char (Buf, P) then
kono
parents:
diff changeset
593 Scan_Wide (Buf, P, WC, Err);
kono
parents:
diff changeset
594 elsif not Identifier_Char (Buf (P)) then
kono
parents:
diff changeset
595 exit;
kono
parents:
diff changeset
596 else
kono
parents:
diff changeset
597 P := P + 1;
kono
parents:
diff changeset
598 end if;
kono
parents:
diff changeset
599 end loop;
kono
parents:
diff changeset
600
kono
parents:
diff changeset
601 -- Write out the identifier by copying the exact source characters
kono
parents:
diff changeset
602 -- used in its declaration. Note that this means wide characters will
kono
parents:
diff changeset
603 -- be in their original encoded form.
kono
parents:
diff changeset
604
kono
parents:
diff changeset
605 return String (Buf (Orig .. P - 1));
kono
parents:
diff changeset
606 end if;
kono
parents:
diff changeset
607 end Exact_Source_Name;
kono
parents:
diff changeset
608
kono
parents:
diff changeset
609 ----------------------------
kono
parents:
diff changeset
610 -- Entity_Is_In_Main_Unit --
kono
parents:
diff changeset
611 ----------------------------
kono
parents:
diff changeset
612
kono
parents:
diff changeset
613 function Entity_Is_In_Main_Unit (E : Entity_Id) return Boolean is
kono
parents:
diff changeset
614 S : Entity_Id;
kono
parents:
diff changeset
615
kono
parents:
diff changeset
616 begin
kono
parents:
diff changeset
617 S := Scope (E);
kono
parents:
diff changeset
618
kono
parents:
diff changeset
619 while S /= Standard_Standard loop
kono
parents:
diff changeset
620 if S = Main_Unit_Entity then
kono
parents:
diff changeset
621 return True;
kono
parents:
diff changeset
622 elsif Ekind (S) = E_Package and then Is_Child_Unit (S) then
kono
parents:
diff changeset
623 return False;
kono
parents:
diff changeset
624 else
kono
parents:
diff changeset
625 S := Scope (S);
kono
parents:
diff changeset
626 end if;
kono
parents:
diff changeset
627 end loop;
kono
parents:
diff changeset
628
kono
parents:
diff changeset
629 return False;
kono
parents:
diff changeset
630 end Entity_Is_In_Main_Unit;
kono
parents:
diff changeset
631
kono
parents:
diff changeset
632 --------------------------
kono
parents:
diff changeset
633 -- Generic_May_Lack_ALI --
kono
parents:
diff changeset
634 --------------------------
kono
parents:
diff changeset
635
kono
parents:
diff changeset
636 function Generic_May_Lack_ALI (Unum : Unit_Number_Type) return Boolean is
kono
parents:
diff changeset
637 begin
kono
parents:
diff changeset
638 -- We allow internal generic units to be used without having a
kono
parents:
diff changeset
639 -- corresponding ALI files to help bootstrapping with older compilers
kono
parents:
diff changeset
640 -- that did not support generating ALIs for such generics. It is safe
kono
parents:
diff changeset
641 -- to do so because the only thing the generated code would contain
kono
parents:
diff changeset
642 -- is the elaboration boolean, and we are careful to elaborate all
kono
parents:
diff changeset
643 -- predefined units first anyway.
kono
parents:
diff changeset
644
kono
parents:
diff changeset
645 return Is_Internal_Unit (Unum);
kono
parents:
diff changeset
646 end Generic_May_Lack_ALI;
kono
parents:
diff changeset
647
kono
parents:
diff changeset
648 -----------------------------
kono
parents:
diff changeset
649 -- Get_Code_Or_Source_Unit --
kono
parents:
diff changeset
650 -----------------------------
kono
parents:
diff changeset
651
kono
parents:
diff changeset
652 function Get_Code_Or_Source_Unit
kono
parents:
diff changeset
653 (S : Source_Ptr;
kono
parents:
diff changeset
654 Unwind_Instances : Boolean;
kono
parents:
diff changeset
655 Unwind_Subunits : Boolean) return Unit_Number_Type
kono
parents:
diff changeset
656 is
kono
parents:
diff changeset
657 begin
kono
parents:
diff changeset
658 -- Search table unless we have No_Location, which can happen if the
kono
parents:
diff changeset
659 -- relevant location has not been set yet. Happens for example when
kono
parents:
diff changeset
660 -- we obtain Sloc (Cunit (Main_Unit)) before it is set.
kono
parents:
diff changeset
661
kono
parents:
diff changeset
662 if S /= No_Location then
kono
parents:
diff changeset
663 declare
kono
parents:
diff changeset
664 Source_File : Source_File_Index;
kono
parents:
diff changeset
665 Source_Unit : Unit_Number_Type;
kono
parents:
diff changeset
666 Unit_Node : Node_Id;
kono
parents:
diff changeset
667
kono
parents:
diff changeset
668 begin
kono
parents:
diff changeset
669 Source_File := Get_Source_File_Index (S);
kono
parents:
diff changeset
670
kono
parents:
diff changeset
671 if Unwind_Instances then
kono
parents:
diff changeset
672 while Template (Source_File) > No_Source_File loop
kono
parents:
diff changeset
673 Source_File := Template (Source_File);
kono
parents:
diff changeset
674 end loop;
kono
parents:
diff changeset
675 end if;
kono
parents:
diff changeset
676
kono
parents:
diff changeset
677 Source_Unit := Unit (Source_File);
kono
parents:
diff changeset
678
kono
parents:
diff changeset
679 if Unwind_Subunits then
kono
parents:
diff changeset
680 Unit_Node := Unit (Cunit (Source_Unit));
kono
parents:
diff changeset
681
kono
parents:
diff changeset
682 while Nkind (Unit_Node) = N_Subunit
kono
parents:
diff changeset
683 and then Present (Corresponding_Stub (Unit_Node))
kono
parents:
diff changeset
684 loop
kono
parents:
diff changeset
685 Source_Unit :=
kono
parents:
diff changeset
686 Get_Code_Or_Source_Unit
kono
parents:
diff changeset
687 (Sloc (Corresponding_Stub (Unit_Node)),
kono
parents:
diff changeset
688 Unwind_Instances => Unwind_Instances,
kono
parents:
diff changeset
689 Unwind_Subunits => Unwind_Subunits);
kono
parents:
diff changeset
690 Unit_Node := Unit (Cunit (Source_Unit));
kono
parents:
diff changeset
691 end loop;
kono
parents:
diff changeset
692 end if;
kono
parents:
diff changeset
693
kono
parents:
diff changeset
694 if Source_Unit /= No_Unit then
kono
parents:
diff changeset
695 return Source_Unit;
kono
parents:
diff changeset
696 end if;
kono
parents:
diff changeset
697 end;
kono
parents:
diff changeset
698 end if;
kono
parents:
diff changeset
699
kono
parents:
diff changeset
700 -- If S was No_Location, or was not in the table, we must be in the main
kono
parents:
diff changeset
701 -- source unit (and the value has not been placed in the table yet),
kono
parents:
diff changeset
702 -- or in one of the configuration pragma files.
kono
parents:
diff changeset
703
kono
parents:
diff changeset
704 return Main_Unit;
kono
parents:
diff changeset
705 end Get_Code_Or_Source_Unit;
kono
parents:
diff changeset
706
kono
parents:
diff changeset
707 -------------------
kono
parents:
diff changeset
708 -- Get_Code_Unit --
kono
parents:
diff changeset
709 -------------------
kono
parents:
diff changeset
710
kono
parents:
diff changeset
711 function Get_Code_Unit (S : Source_Ptr) return Unit_Number_Type is
kono
parents:
diff changeset
712 begin
kono
parents:
diff changeset
713 return
kono
parents:
diff changeset
714 Get_Code_Or_Source_Unit
kono
parents:
diff changeset
715 (Top_Level_Location (S),
kono
parents:
diff changeset
716 Unwind_Instances => False,
kono
parents:
diff changeset
717 Unwind_Subunits => False);
kono
parents:
diff changeset
718 end Get_Code_Unit;
kono
parents:
diff changeset
719
kono
parents:
diff changeset
720 function Get_Code_Unit (N : Node_Or_Entity_Id) return Unit_Number_Type is
kono
parents:
diff changeset
721 begin
kono
parents:
diff changeset
722 return Get_Code_Unit (Sloc (N));
kono
parents:
diff changeset
723 end Get_Code_Unit;
kono
parents:
diff changeset
724
kono
parents:
diff changeset
725 ----------------------------
kono
parents:
diff changeset
726 -- Get_Compilation_Switch --
kono
parents:
diff changeset
727 ----------------------------
kono
parents:
diff changeset
728
kono
parents:
diff changeset
729 function Get_Compilation_Switch (N : Pos) return String_Ptr is
kono
parents:
diff changeset
730 begin
kono
parents:
diff changeset
731 if N <= Compilation_Switches.Last then
kono
parents:
diff changeset
732 return Compilation_Switches.Table (N);
kono
parents:
diff changeset
733 else
kono
parents:
diff changeset
734 return null;
kono
parents:
diff changeset
735 end if;
kono
parents:
diff changeset
736 end Get_Compilation_Switch;
kono
parents:
diff changeset
737
kono
parents:
diff changeset
738 ----------------------------------
kono
parents:
diff changeset
739 -- Get_Cunit_Entity_Unit_Number --
kono
parents:
diff changeset
740 ----------------------------------
kono
parents:
diff changeset
741
kono
parents:
diff changeset
742 function Get_Cunit_Entity_Unit_Number
kono
parents:
diff changeset
743 (E : Entity_Id) return Unit_Number_Type
kono
parents:
diff changeset
744 is
kono
parents:
diff changeset
745 begin
kono
parents:
diff changeset
746 for U in Units.First .. Units.Last loop
kono
parents:
diff changeset
747 if Cunit_Entity (U) = E then
kono
parents:
diff changeset
748 return U;
kono
parents:
diff changeset
749 end if;
kono
parents:
diff changeset
750 end loop;
kono
parents:
diff changeset
751
kono
parents:
diff changeset
752 -- If not in the table, must be the main source unit, and we just
kono
parents:
diff changeset
753 -- have not got it put into the table yet.
kono
parents:
diff changeset
754
kono
parents:
diff changeset
755 return Main_Unit;
kono
parents:
diff changeset
756 end Get_Cunit_Entity_Unit_Number;
kono
parents:
diff changeset
757
kono
parents:
diff changeset
758 ---------------------------
kono
parents:
diff changeset
759 -- Get_Cunit_Unit_Number --
kono
parents:
diff changeset
760 ---------------------------
kono
parents:
diff changeset
761
kono
parents:
diff changeset
762 function Get_Cunit_Unit_Number (N : Node_Id) return Unit_Number_Type is
kono
parents:
diff changeset
763 begin
kono
parents:
diff changeset
764 for U in Units.First .. Units.Last loop
kono
parents:
diff changeset
765 if Cunit (U) = N then
kono
parents:
diff changeset
766 return U;
kono
parents:
diff changeset
767 end if;
kono
parents:
diff changeset
768 end loop;
kono
parents:
diff changeset
769
kono
parents:
diff changeset
770 -- If not in the table, must be a spec created for a main unit that is a
kono
parents:
diff changeset
771 -- child subprogram body which we have not inserted into the table yet.
kono
parents:
diff changeset
772
kono
parents:
diff changeset
773 if N = Library_Unit (Cunit (Main_Unit)) then
kono
parents:
diff changeset
774 return Main_Unit;
kono
parents:
diff changeset
775
kono
parents:
diff changeset
776 -- If it is anything else, something is seriously wrong, and we really
kono
parents:
diff changeset
777 -- don't want to proceed, even if assertions are off, so we explicitly
kono
parents:
diff changeset
778 -- raise an exception in this case to terminate compilation.
kono
parents:
diff changeset
779
kono
parents:
diff changeset
780 else
kono
parents:
diff changeset
781 raise Program_Error;
kono
parents:
diff changeset
782 end if;
kono
parents:
diff changeset
783 end Get_Cunit_Unit_Number;
kono
parents:
diff changeset
784
kono
parents:
diff changeset
785 ---------------------
kono
parents:
diff changeset
786 -- Get_Source_Unit --
kono
parents:
diff changeset
787 ---------------------
kono
parents:
diff changeset
788
kono
parents:
diff changeset
789 function Get_Source_Unit (S : Source_Ptr) return Unit_Number_Type is
kono
parents:
diff changeset
790 begin
kono
parents:
diff changeset
791 return
kono
parents:
diff changeset
792 Get_Code_Or_Source_Unit
kono
parents:
diff changeset
793 (S => S,
kono
parents:
diff changeset
794 Unwind_Instances => True,
kono
parents:
diff changeset
795 Unwind_Subunits => False);
kono
parents:
diff changeset
796 end Get_Source_Unit;
kono
parents:
diff changeset
797
kono
parents:
diff changeset
798 function Get_Source_Unit (N : Node_Or_Entity_Id) return Unit_Number_Type is
kono
parents:
diff changeset
799 begin
kono
parents:
diff changeset
800 return Get_Source_Unit (Sloc (N));
kono
parents:
diff changeset
801 end Get_Source_Unit;
kono
parents:
diff changeset
802
kono
parents:
diff changeset
803 -----------------------------
kono
parents:
diff changeset
804 -- Get_Top_Level_Code_Unit --
kono
parents:
diff changeset
805 -----------------------------
kono
parents:
diff changeset
806
kono
parents:
diff changeset
807 function Get_Top_Level_Code_Unit (S : Source_Ptr) return Unit_Number_Type is
kono
parents:
diff changeset
808 begin
kono
parents:
diff changeset
809 return
kono
parents:
diff changeset
810 Get_Code_Or_Source_Unit
kono
parents:
diff changeset
811 (Top_Level_Location (S),
kono
parents:
diff changeset
812 Unwind_Instances => False,
kono
parents:
diff changeset
813 Unwind_Subunits => True);
kono
parents:
diff changeset
814 end Get_Top_Level_Code_Unit;
kono
parents:
diff changeset
815
kono
parents:
diff changeset
816 function Get_Top_Level_Code_Unit
kono
parents:
diff changeset
817 (N : Node_Or_Entity_Id) return Unit_Number_Type is
kono
parents:
diff changeset
818 begin
kono
parents:
diff changeset
819 return Get_Top_Level_Code_Unit (Sloc (N));
kono
parents:
diff changeset
820 end Get_Top_Level_Code_Unit;
kono
parents:
diff changeset
821
kono
parents:
diff changeset
822 --------------------------------
kono
parents:
diff changeset
823 -- In_Extended_Main_Code_Unit --
kono
parents:
diff changeset
824 --------------------------------
kono
parents:
diff changeset
825
kono
parents:
diff changeset
826 function In_Extended_Main_Code_Unit
kono
parents:
diff changeset
827 (N : Node_Or_Entity_Id) return Boolean
kono
parents:
diff changeset
828 is
kono
parents:
diff changeset
829 begin
kono
parents:
diff changeset
830 if Sloc (N) = Standard_Location then
kono
parents:
diff changeset
831 return False;
kono
parents:
diff changeset
832
kono
parents:
diff changeset
833 elsif Sloc (N) = No_Location then
kono
parents:
diff changeset
834 return False;
kono
parents:
diff changeset
835
kono
parents:
diff changeset
836 -- Special case Itypes to test the Sloc of the associated node. The
kono
parents:
diff changeset
837 -- reason we do this is for possible calls from gigi after -gnatD
kono
parents:
diff changeset
838 -- processing is complete in sprint. This processing updates the
kono
parents:
diff changeset
839 -- sloc fields of all nodes in the tree, but itypes are not in the
kono
parents:
diff changeset
840 -- tree so their slocs do not get updated.
kono
parents:
diff changeset
841
kono
parents:
diff changeset
842 elsif Nkind (N) = N_Defining_Identifier
kono
parents:
diff changeset
843 and then Is_Itype (N)
kono
parents:
diff changeset
844 then
kono
parents:
diff changeset
845 return In_Extended_Main_Code_Unit (Associated_Node_For_Itype (N));
kono
parents:
diff changeset
846
kono
parents:
diff changeset
847 -- Otherwise see if we are in the main unit
kono
parents:
diff changeset
848
kono
parents:
diff changeset
849 elsif Get_Code_Unit (Sloc (N)) = Get_Code_Unit (Cunit (Main_Unit)) then
kono
parents:
diff changeset
850 return True;
kono
parents:
diff changeset
851
kono
parents:
diff changeset
852 -- Node may be in spec (or subunit etc) of main unit
kono
parents:
diff changeset
853
kono
parents:
diff changeset
854 else
kono
parents:
diff changeset
855 return In_Same_Extended_Unit (N, Cunit (Main_Unit));
kono
parents:
diff changeset
856 end if;
kono
parents:
diff changeset
857 end In_Extended_Main_Code_Unit;
kono
parents:
diff changeset
858
kono
parents:
diff changeset
859 function In_Extended_Main_Code_Unit (Loc : Source_Ptr) return Boolean is
kono
parents:
diff changeset
860 begin
kono
parents:
diff changeset
861 if Loc = Standard_Location then
kono
parents:
diff changeset
862 return False;
kono
parents:
diff changeset
863
kono
parents:
diff changeset
864 elsif Loc = No_Location then
kono
parents:
diff changeset
865 return False;
kono
parents:
diff changeset
866
kono
parents:
diff changeset
867 -- Otherwise see if we are in the main unit
kono
parents:
diff changeset
868
kono
parents:
diff changeset
869 elsif Get_Code_Unit (Loc) = Get_Code_Unit (Cunit (Main_Unit)) then
kono
parents:
diff changeset
870 return True;
kono
parents:
diff changeset
871
kono
parents:
diff changeset
872 -- Location may be in spec (or subunit etc) of main unit
kono
parents:
diff changeset
873
kono
parents:
diff changeset
874 else
kono
parents:
diff changeset
875 return In_Same_Extended_Unit (Loc, Sloc (Cunit (Main_Unit)));
kono
parents:
diff changeset
876 end if;
kono
parents:
diff changeset
877 end In_Extended_Main_Code_Unit;
kono
parents:
diff changeset
878
kono
parents:
diff changeset
879 ----------------------------------
kono
parents:
diff changeset
880 -- In_Extended_Main_Source_Unit --
kono
parents:
diff changeset
881 ----------------------------------
kono
parents:
diff changeset
882
kono
parents:
diff changeset
883 function In_Extended_Main_Source_Unit
kono
parents:
diff changeset
884 (N : Node_Or_Entity_Id) return Boolean
kono
parents:
diff changeset
885 is
kono
parents:
diff changeset
886 Nloc : constant Source_Ptr := Sloc (N);
kono
parents:
diff changeset
887 Mloc : constant Source_Ptr := Sloc (Cunit (Main_Unit));
kono
parents:
diff changeset
888
kono
parents:
diff changeset
889 begin
kono
parents:
diff changeset
890 -- If parsing, then use the global flag to indicate result
kono
parents:
diff changeset
891
kono
parents:
diff changeset
892 if Compiler_State = Parsing then
kono
parents:
diff changeset
893 return Parsing_Main_Extended_Source;
kono
parents:
diff changeset
894
kono
parents:
diff changeset
895 -- Special value cases
kono
parents:
diff changeset
896
kono
parents:
diff changeset
897 elsif Nloc = Standard_Location then
kono
parents:
diff changeset
898 return False;
kono
parents:
diff changeset
899
kono
parents:
diff changeset
900 elsif Nloc = No_Location then
kono
parents:
diff changeset
901 return False;
kono
parents:
diff changeset
902
kono
parents:
diff changeset
903 -- Special case Itypes to test the Sloc of the associated node. The
kono
parents:
diff changeset
904 -- reason we do this is for possible calls from gigi after -gnatD
kono
parents:
diff changeset
905 -- processing is complete in sprint. This processing updates the
kono
parents:
diff changeset
906 -- sloc fields of all nodes in the tree, but itypes are not in the
kono
parents:
diff changeset
907 -- tree so their slocs do not get updated.
kono
parents:
diff changeset
908
kono
parents:
diff changeset
909 elsif Nkind (N) = N_Defining_Identifier
kono
parents:
diff changeset
910 and then Is_Itype (N)
kono
parents:
diff changeset
911 then
kono
parents:
diff changeset
912 return In_Extended_Main_Source_Unit (Associated_Node_For_Itype (N));
kono
parents:
diff changeset
913
kono
parents:
diff changeset
914 -- Otherwise compare original locations to see if in same unit
kono
parents:
diff changeset
915
kono
parents:
diff changeset
916 else
kono
parents:
diff changeset
917 return
kono
parents:
diff changeset
918 In_Same_Extended_Unit
kono
parents:
diff changeset
919 (Original_Location (Nloc), Original_Location (Mloc));
kono
parents:
diff changeset
920 end if;
kono
parents:
diff changeset
921 end In_Extended_Main_Source_Unit;
kono
parents:
diff changeset
922
kono
parents:
diff changeset
923 function In_Extended_Main_Source_Unit
kono
parents:
diff changeset
924 (Loc : Source_Ptr) return Boolean
kono
parents:
diff changeset
925 is
kono
parents:
diff changeset
926 Mloc : constant Source_Ptr := Sloc (Cunit (Main_Unit));
kono
parents:
diff changeset
927
kono
parents:
diff changeset
928 begin
kono
parents:
diff changeset
929 -- If parsing, then use the global flag to indicate result
kono
parents:
diff changeset
930
kono
parents:
diff changeset
931 if Compiler_State = Parsing then
kono
parents:
diff changeset
932 return Parsing_Main_Extended_Source;
kono
parents:
diff changeset
933
kono
parents:
diff changeset
934 -- Special value cases
kono
parents:
diff changeset
935
kono
parents:
diff changeset
936 elsif Loc = Standard_Location then
kono
parents:
diff changeset
937 return False;
kono
parents:
diff changeset
938
kono
parents:
diff changeset
939 elsif Loc = No_Location then
kono
parents:
diff changeset
940 return False;
kono
parents:
diff changeset
941
kono
parents:
diff changeset
942 -- Otherwise compare original locations to see if in same unit
kono
parents:
diff changeset
943
kono
parents:
diff changeset
944 else
kono
parents:
diff changeset
945 return
kono
parents:
diff changeset
946 In_Same_Extended_Unit
kono
parents:
diff changeset
947 (Original_Location (Loc), Original_Location (Mloc));
kono
parents:
diff changeset
948 end if;
kono
parents:
diff changeset
949 end In_Extended_Main_Source_Unit;
kono
parents:
diff changeset
950
kono
parents:
diff changeset
951 ----------------------
kono
parents:
diff changeset
952 -- In_Internal_Unit --
kono
parents:
diff changeset
953 ----------------------
kono
parents:
diff changeset
954
kono
parents:
diff changeset
955 function In_Internal_Unit (N : Node_Or_Entity_Id) return Boolean is
kono
parents:
diff changeset
956 begin
kono
parents:
diff changeset
957 return In_Internal_Unit (Sloc (N));
kono
parents:
diff changeset
958 end In_Internal_Unit;
kono
parents:
diff changeset
959
kono
parents:
diff changeset
960 function In_Internal_Unit (S : Source_Ptr) return Boolean is
kono
parents:
diff changeset
961 Unit : constant Unit_Number_Type := Get_Source_Unit (S);
kono
parents:
diff changeset
962 begin
kono
parents:
diff changeset
963 return Is_Internal_Unit (Unit);
kono
parents:
diff changeset
964 end In_Internal_Unit;
kono
parents:
diff changeset
965
kono
parents:
diff changeset
966 ----------------------------
kono
parents:
diff changeset
967 -- In_Predefined_Renaming --
kono
parents:
diff changeset
968 ----------------------------
kono
parents:
diff changeset
969
kono
parents:
diff changeset
970 function In_Predefined_Renaming (N : Node_Or_Entity_Id) return Boolean is
kono
parents:
diff changeset
971 begin
kono
parents:
diff changeset
972 return In_Predefined_Renaming (Sloc (N));
kono
parents:
diff changeset
973 end In_Predefined_Renaming;
kono
parents:
diff changeset
974
kono
parents:
diff changeset
975 function In_Predefined_Renaming (S : Source_Ptr) return Boolean is
kono
parents:
diff changeset
976 Unit : constant Unit_Number_Type := Get_Source_Unit (S);
kono
parents:
diff changeset
977 begin
kono
parents:
diff changeset
978 return Is_Predefined_Renaming (Unit);
kono
parents:
diff changeset
979 end In_Predefined_Renaming;
kono
parents:
diff changeset
980
kono
parents:
diff changeset
981 ------------------------
kono
parents:
diff changeset
982 -- In_Predefined_Unit --
kono
parents:
diff changeset
983 ------------------------
kono
parents:
diff changeset
984
kono
parents:
diff changeset
985 function In_Predefined_Unit (N : Node_Or_Entity_Id) return Boolean is
kono
parents:
diff changeset
986 begin
kono
parents:
diff changeset
987 return In_Predefined_Unit (Sloc (N));
kono
parents:
diff changeset
988 end In_Predefined_Unit;
kono
parents:
diff changeset
989
kono
parents:
diff changeset
990 function In_Predefined_Unit (S : Source_Ptr) return Boolean is
kono
parents:
diff changeset
991 Unit : constant Unit_Number_Type := Get_Source_Unit (S);
kono
parents:
diff changeset
992 begin
kono
parents:
diff changeset
993 return Is_Predefined_Unit (Unit);
kono
parents:
diff changeset
994 end In_Predefined_Unit;
kono
parents:
diff changeset
995
kono
parents:
diff changeset
996 -----------------------
kono
parents:
diff changeset
997 -- In_Same_Code_Unit --
kono
parents:
diff changeset
998 -----------------------
kono
parents:
diff changeset
999
kono
parents:
diff changeset
1000 function In_Same_Code_Unit (N1, N2 : Node_Or_Entity_Id) return Boolean is
kono
parents:
diff changeset
1001 S1 : constant Source_Ptr := Sloc (N1);
kono
parents:
diff changeset
1002 S2 : constant Source_Ptr := Sloc (N2);
kono
parents:
diff changeset
1003
kono
parents:
diff changeset
1004 begin
kono
parents:
diff changeset
1005 if S1 = No_Location or else S2 = No_Location then
kono
parents:
diff changeset
1006 return False;
kono
parents:
diff changeset
1007
kono
parents:
diff changeset
1008 elsif S1 = Standard_Location then
kono
parents:
diff changeset
1009 return S2 = Standard_Location;
kono
parents:
diff changeset
1010
kono
parents:
diff changeset
1011 elsif S2 = Standard_Location then
kono
parents:
diff changeset
1012 return False;
kono
parents:
diff changeset
1013 end if;
kono
parents:
diff changeset
1014
kono
parents:
diff changeset
1015 return Get_Code_Unit (N1) = Get_Code_Unit (N2);
kono
parents:
diff changeset
1016 end In_Same_Code_Unit;
kono
parents:
diff changeset
1017
kono
parents:
diff changeset
1018 ---------------------------
kono
parents:
diff changeset
1019 -- In_Same_Extended_Unit --
kono
parents:
diff changeset
1020 ---------------------------
kono
parents:
diff changeset
1021
kono
parents:
diff changeset
1022 function In_Same_Extended_Unit
kono
parents:
diff changeset
1023 (N1, N2 : Node_Or_Entity_Id) return Boolean
kono
parents:
diff changeset
1024 is
kono
parents:
diff changeset
1025 begin
kono
parents:
diff changeset
1026 return Check_Same_Extended_Unit (Sloc (N1), Sloc (N2)) /= No;
kono
parents:
diff changeset
1027 end In_Same_Extended_Unit;
kono
parents:
diff changeset
1028
kono
parents:
diff changeset
1029 function In_Same_Extended_Unit (S1, S2 : Source_Ptr) return Boolean is
kono
parents:
diff changeset
1030 begin
kono
parents:
diff changeset
1031 return Check_Same_Extended_Unit (S1, S2) /= No;
kono
parents:
diff changeset
1032 end In_Same_Extended_Unit;
kono
parents:
diff changeset
1033
kono
parents:
diff changeset
1034 -------------------------
kono
parents:
diff changeset
1035 -- In_Same_Source_Unit --
kono
parents:
diff changeset
1036 -------------------------
kono
parents:
diff changeset
1037
kono
parents:
diff changeset
1038 function In_Same_Source_Unit (N1, N2 : Node_Or_Entity_Id) return Boolean is
kono
parents:
diff changeset
1039 S1 : constant Source_Ptr := Sloc (N1);
kono
parents:
diff changeset
1040 S2 : constant Source_Ptr := Sloc (N2);
kono
parents:
diff changeset
1041
kono
parents:
diff changeset
1042 begin
kono
parents:
diff changeset
1043 if S1 = No_Location or else S2 = No_Location then
kono
parents:
diff changeset
1044 return False;
kono
parents:
diff changeset
1045
kono
parents:
diff changeset
1046 elsif S1 = Standard_Location then
kono
parents:
diff changeset
1047 return S2 = Standard_Location;
kono
parents:
diff changeset
1048
kono
parents:
diff changeset
1049 elsif S2 = Standard_Location then
kono
parents:
diff changeset
1050 return False;
kono
parents:
diff changeset
1051 end if;
kono
parents:
diff changeset
1052
kono
parents:
diff changeset
1053 return Get_Source_Unit (N1) = Get_Source_Unit (N2);
kono
parents:
diff changeset
1054 end In_Same_Source_Unit;
kono
parents:
diff changeset
1055
kono
parents:
diff changeset
1056 -----------------------------------
kono
parents:
diff changeset
1057 -- Increment_Primary_Stack_Count --
kono
parents:
diff changeset
1058 -----------------------------------
kono
parents:
diff changeset
1059
kono
parents:
diff changeset
1060 procedure Increment_Primary_Stack_Count (Increment : Int) is
kono
parents:
diff changeset
1061 PSC : Int renames Units.Table (Current_Sem_Unit).Primary_Stack_Count;
kono
parents:
diff changeset
1062 begin
kono
parents:
diff changeset
1063 PSC := PSC + Increment;
kono
parents:
diff changeset
1064 end Increment_Primary_Stack_Count;
kono
parents:
diff changeset
1065
kono
parents:
diff changeset
1066 -------------------------------
kono
parents:
diff changeset
1067 -- Increment_Sec_Stack_Count --
kono
parents:
diff changeset
1068 -------------------------------
kono
parents:
diff changeset
1069
kono
parents:
diff changeset
1070 procedure Increment_Sec_Stack_Count (Increment : Int) is
kono
parents:
diff changeset
1071 SSC : Int renames Units.Table (Current_Sem_Unit).Sec_Stack_Count;
kono
parents:
diff changeset
1072 begin
kono
parents:
diff changeset
1073 SSC := SSC + Increment;
kono
parents:
diff changeset
1074 end Increment_Sec_Stack_Count;
kono
parents:
diff changeset
1075
kono
parents:
diff changeset
1076 -----------------------------
kono
parents:
diff changeset
1077 -- Increment_Serial_Number --
kono
parents:
diff changeset
1078 -----------------------------
kono
parents:
diff changeset
1079
kono
parents:
diff changeset
1080 function Increment_Serial_Number return Nat is
kono
parents:
diff changeset
1081 TSN : Int renames Units.Table (Current_Sem_Unit).Serial_Number;
kono
parents:
diff changeset
1082 begin
kono
parents:
diff changeset
1083 TSN := TSN + 1;
kono
parents:
diff changeset
1084 return TSN;
kono
parents:
diff changeset
1085 end Increment_Serial_Number;
kono
parents:
diff changeset
1086
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1087 ----------------------
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1088 -- Init_Unit_Name --
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1089 ----------------------
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1090
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1091 procedure Init_Unit_Name (U : Unit_Number_Type; N : Unit_Name_Type) is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1092 begin
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1093 Units.Table (U).Unit_Name := N;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1094 Unit_Names.Set (N, U);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1095 end Init_Unit_Name;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1096
111
kono
parents:
diff changeset
1097 ----------------
kono
parents:
diff changeset
1098 -- Initialize --
kono
parents:
diff changeset
1099 ----------------
kono
parents:
diff changeset
1100
kono
parents:
diff changeset
1101 procedure Initialize is
kono
parents:
diff changeset
1102 begin
kono
parents:
diff changeset
1103 Linker_Option_Lines.Init;
kono
parents:
diff changeset
1104 Notes.Init;
kono
parents:
diff changeset
1105 Load_Stack.Init;
kono
parents:
diff changeset
1106 Units.Init;
kono
parents:
diff changeset
1107 Compilation_Switches.Init;
kono
parents:
diff changeset
1108 end Initialize;
kono
parents:
diff changeset
1109
kono
parents:
diff changeset
1110 ---------------
kono
parents:
diff changeset
1111 -- Is_Loaded --
kono
parents:
diff changeset
1112 ---------------
kono
parents:
diff changeset
1113
kono
parents:
diff changeset
1114 function Is_Loaded (Uname : Unit_Name_Type) return Boolean is
kono
parents:
diff changeset
1115 begin
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1116 return Unit_Names.Get (Uname) /= No_Unit;
111
kono
parents:
diff changeset
1117 end Is_Loaded;
kono
parents:
diff changeset
1118
kono
parents:
diff changeset
1119 ---------------
kono
parents:
diff changeset
1120 -- Last_Unit --
kono
parents:
diff changeset
1121 ---------------
kono
parents:
diff changeset
1122
kono
parents:
diff changeset
1123 function Last_Unit return Unit_Number_Type is
kono
parents:
diff changeset
1124 begin
kono
parents:
diff changeset
1125 return Units.Last;
kono
parents:
diff changeset
1126 end Last_Unit;
kono
parents:
diff changeset
1127
kono
parents:
diff changeset
1128 ----------
kono
parents:
diff changeset
1129 -- List --
kono
parents:
diff changeset
1130 ----------
kono
parents:
diff changeset
1131
kono
parents:
diff changeset
1132 procedure List (File_Names_Only : Boolean := False) is separate;
kono
parents:
diff changeset
1133
kono
parents:
diff changeset
1134 ----------
kono
parents:
diff changeset
1135 -- Lock --
kono
parents:
diff changeset
1136 ----------
kono
parents:
diff changeset
1137
kono
parents:
diff changeset
1138 procedure Lock is
kono
parents:
diff changeset
1139 begin
kono
parents:
diff changeset
1140 Linker_Option_Lines.Release;
kono
parents:
diff changeset
1141 Linker_Option_Lines.Locked := True;
kono
parents:
diff changeset
1142 Load_Stack.Release;
kono
parents:
diff changeset
1143 Load_Stack.Locked := True;
kono
parents:
diff changeset
1144 Units.Release;
kono
parents:
diff changeset
1145 Units.Locked := True;
kono
parents:
diff changeset
1146 end Lock;
kono
parents:
diff changeset
1147
kono
parents:
diff changeset
1148 ---------------
kono
parents:
diff changeset
1149 -- Num_Units --
kono
parents:
diff changeset
1150 ---------------
kono
parents:
diff changeset
1151
kono
parents:
diff changeset
1152 function Num_Units return Nat is
kono
parents:
diff changeset
1153 begin
kono
parents:
diff changeset
1154 return Int (Units.Last) - Int (Main_Unit) + 1;
kono
parents:
diff changeset
1155 end Num_Units;
kono
parents:
diff changeset
1156
kono
parents:
diff changeset
1157 -----------------
kono
parents:
diff changeset
1158 -- Remove_Unit --
kono
parents:
diff changeset
1159 -----------------
kono
parents:
diff changeset
1160
kono
parents:
diff changeset
1161 procedure Remove_Unit (U : Unit_Number_Type) is
kono
parents:
diff changeset
1162 begin
kono
parents:
diff changeset
1163 if U = Units.Last then
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1164 Unit_Names.Set (Unit_Name (U), No_Unit);
111
kono
parents:
diff changeset
1165 Units.Decrement_Last;
kono
parents:
diff changeset
1166 end if;
kono
parents:
diff changeset
1167 end Remove_Unit;
kono
parents:
diff changeset
1168
kono
parents:
diff changeset
1169 ----------------------------------
kono
parents:
diff changeset
1170 -- Replace_Linker_Option_String --
kono
parents:
diff changeset
1171 ----------------------------------
kono
parents:
diff changeset
1172
kono
parents:
diff changeset
1173 procedure Replace_Linker_Option_String
kono
parents:
diff changeset
1174 (S : String_Id; Match_String : String)
kono
parents:
diff changeset
1175 is
kono
parents:
diff changeset
1176 begin
kono
parents:
diff changeset
1177 if Match_String'Length > 0 then
kono
parents:
diff changeset
1178 for J in 1 .. Linker_Option_Lines.Last loop
kono
parents:
diff changeset
1179 String_To_Name_Buffer (Linker_Option_Lines.Table (J).Option);
kono
parents:
diff changeset
1180
kono
parents:
diff changeset
1181 if Match_String = Name_Buffer (1 .. Match_String'Length) then
kono
parents:
diff changeset
1182 Linker_Option_Lines.Table (J).Option := S;
kono
parents:
diff changeset
1183 return;
kono
parents:
diff changeset
1184 end if;
kono
parents:
diff changeset
1185 end loop;
kono
parents:
diff changeset
1186 end if;
kono
parents:
diff changeset
1187
kono
parents:
diff changeset
1188 Store_Linker_Option_String (S);
kono
parents:
diff changeset
1189 end Replace_Linker_Option_String;
kono
parents:
diff changeset
1190
kono
parents:
diff changeset
1191 ----------
kono
parents:
diff changeset
1192 -- Sort --
kono
parents:
diff changeset
1193 ----------
kono
parents:
diff changeset
1194
kono
parents:
diff changeset
1195 procedure Sort (Tbl : in out Unit_Ref_Table) is separate;
kono
parents:
diff changeset
1196
kono
parents:
diff changeset
1197 ------------------------------
kono
parents:
diff changeset
1198 -- Store_Compilation_Switch --
kono
parents:
diff changeset
1199 ------------------------------
kono
parents:
diff changeset
1200
kono
parents:
diff changeset
1201 procedure Store_Compilation_Switch (Switch : String) is
kono
parents:
diff changeset
1202 begin
kono
parents:
diff changeset
1203 if Switch_Storing_Enabled then
kono
parents:
diff changeset
1204 Compilation_Switches.Increment_Last;
kono
parents:
diff changeset
1205 Compilation_Switches.Table (Compilation_Switches.Last) :=
kono
parents:
diff changeset
1206 new String'(Switch);
kono
parents:
diff changeset
1207
kono
parents:
diff changeset
1208 -- Fix up --RTS flag which has been transformed by the gcc driver
kono
parents:
diff changeset
1209 -- into -fRTS
kono
parents:
diff changeset
1210
kono
parents:
diff changeset
1211 if Switch'Last >= Switch'First + 4
kono
parents:
diff changeset
1212 and then Switch (Switch'First .. Switch'First + 4) = "-fRTS"
kono
parents:
diff changeset
1213 then
kono
parents:
diff changeset
1214 Compilation_Switches.Table
kono
parents:
diff changeset
1215 (Compilation_Switches.Last) (Switch'First + 1) := '-';
kono
parents:
diff changeset
1216 end if;
kono
parents:
diff changeset
1217 end if;
kono
parents:
diff changeset
1218 end Store_Compilation_Switch;
kono
parents:
diff changeset
1219
kono
parents:
diff changeset
1220 --------------------------------
kono
parents:
diff changeset
1221 -- Store_Linker_Option_String --
kono
parents:
diff changeset
1222 --------------------------------
kono
parents:
diff changeset
1223
kono
parents:
diff changeset
1224 procedure Store_Linker_Option_String (S : String_Id) is
kono
parents:
diff changeset
1225 begin
kono
parents:
diff changeset
1226 Linker_Option_Lines.Append ((Option => S, Unit => Current_Sem_Unit));
kono
parents:
diff changeset
1227 end Store_Linker_Option_String;
kono
parents:
diff changeset
1228
kono
parents:
diff changeset
1229 ----------------
kono
parents:
diff changeset
1230 -- Store_Note --
kono
parents:
diff changeset
1231 ----------------
kono
parents:
diff changeset
1232
kono
parents:
diff changeset
1233 procedure Store_Note (N : Node_Id) is
kono
parents:
diff changeset
1234 Sfile : constant Source_File_Index := Get_Source_File_Index (Sloc (N));
kono
parents:
diff changeset
1235
kono
parents:
diff changeset
1236 begin
kono
parents:
diff changeset
1237 -- Notes for a generic are emitted when processing the template, never
kono
parents:
diff changeset
1238 -- in instances.
kono
parents:
diff changeset
1239
kono
parents:
diff changeset
1240 if In_Extended_Main_Code_Unit (N)
kono
parents:
diff changeset
1241 and then Instance (Sfile) = No_Instance_Id
kono
parents:
diff changeset
1242 then
kono
parents:
diff changeset
1243 Notes.Append (N);
kono
parents:
diff changeset
1244 end if;
kono
parents:
diff changeset
1245 end Store_Note;
kono
parents:
diff changeset
1246
kono
parents:
diff changeset
1247 -------------------------------
kono
parents:
diff changeset
1248 -- Synchronize_Serial_Number --
kono
parents:
diff changeset
1249 -------------------------------
kono
parents:
diff changeset
1250
kono
parents:
diff changeset
1251 procedure Synchronize_Serial_Number is
kono
parents:
diff changeset
1252 TSN : Int renames Units.Table (Current_Sem_Unit).Serial_Number;
kono
parents:
diff changeset
1253 begin
kono
parents:
diff changeset
1254 TSN := TSN + 1;
kono
parents:
diff changeset
1255 end Synchronize_Serial_Number;
kono
parents:
diff changeset
1256
kono
parents:
diff changeset
1257 ---------------
kono
parents:
diff changeset
1258 -- Tree_Read --
kono
parents:
diff changeset
1259 ---------------
kono
parents:
diff changeset
1260
kono
parents:
diff changeset
1261 procedure Tree_Read is
kono
parents:
diff changeset
1262 N : Nat;
kono
parents:
diff changeset
1263 S : String_Ptr;
kono
parents:
diff changeset
1264
kono
parents:
diff changeset
1265 begin
kono
parents:
diff changeset
1266 Units.Tree_Read;
kono
parents:
diff changeset
1267
kono
parents:
diff changeset
1268 -- Read Compilation_Switches table. First release the memory occupied
kono
parents:
diff changeset
1269 -- by the previously loaded switches.
kono
parents:
diff changeset
1270
kono
parents:
diff changeset
1271 for J in Compilation_Switches.First .. Compilation_Switches.Last loop
kono
parents:
diff changeset
1272 Free (Compilation_Switches.Table (J));
kono
parents:
diff changeset
1273 end loop;
kono
parents:
diff changeset
1274
kono
parents:
diff changeset
1275 Tree_Read_Int (N);
kono
parents:
diff changeset
1276 Compilation_Switches.Set_Last (N);
kono
parents:
diff changeset
1277
kono
parents:
diff changeset
1278 for J in 1 .. N loop
kono
parents:
diff changeset
1279 Tree_Read_Str (S);
kono
parents:
diff changeset
1280 Compilation_Switches.Table (J) := S;
kono
parents:
diff changeset
1281 end loop;
kono
parents:
diff changeset
1282 end Tree_Read;
kono
parents:
diff changeset
1283
kono
parents:
diff changeset
1284 ----------------
kono
parents:
diff changeset
1285 -- Tree_Write --
kono
parents:
diff changeset
1286 ----------------
kono
parents:
diff changeset
1287
kono
parents:
diff changeset
1288 procedure Tree_Write is
kono
parents:
diff changeset
1289 begin
kono
parents:
diff changeset
1290 Units.Tree_Write;
kono
parents:
diff changeset
1291
kono
parents:
diff changeset
1292 -- Write Compilation_Switches table
kono
parents:
diff changeset
1293
kono
parents:
diff changeset
1294 Tree_Write_Int (Compilation_Switches.Last);
kono
parents:
diff changeset
1295
kono
parents:
diff changeset
1296 for J in 1 .. Compilation_Switches.Last loop
kono
parents:
diff changeset
1297 Tree_Write_Str (Compilation_Switches.Table (J));
kono
parents:
diff changeset
1298 end loop;
kono
parents:
diff changeset
1299 end Tree_Write;
kono
parents:
diff changeset
1300
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1301 --------------------
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1302 -- Unit_Name_Hash --
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1303 --------------------
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1304
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1305 function Unit_Name_Hash (Id : Unit_Name_Type) return Unit_Name_Header_Num is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1306 begin
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1307 return Unit_Name_Header_Num (Id mod Unit_Name_Table_Size);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1308 end Unit_Name_Hash;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1309
111
kono
parents:
diff changeset
1310 ------------
kono
parents:
diff changeset
1311 -- Unlock --
kono
parents:
diff changeset
1312 ------------
kono
parents:
diff changeset
1313
kono
parents:
diff changeset
1314 procedure Unlock is
kono
parents:
diff changeset
1315 begin
kono
parents:
diff changeset
1316 Linker_Option_Lines.Locked := False;
kono
parents:
diff changeset
1317 Load_Stack.Locked := False;
kono
parents:
diff changeset
1318 Units.Locked := False;
kono
parents:
diff changeset
1319 end Unlock;
kono
parents:
diff changeset
1320
kono
parents:
diff changeset
1321 -----------------
kono
parents:
diff changeset
1322 -- Version_Get --
kono
parents:
diff changeset
1323 -----------------
kono
parents:
diff changeset
1324
kono
parents:
diff changeset
1325 function Version_Get (U : Unit_Number_Type) return Word_Hex_String is
kono
parents:
diff changeset
1326 begin
kono
parents:
diff changeset
1327 return Get_Hex_String (Units.Table (U).Version);
kono
parents:
diff changeset
1328 end Version_Get;
kono
parents:
diff changeset
1329
kono
parents:
diff changeset
1330 ------------------------
kono
parents:
diff changeset
1331 -- Version_Referenced --
kono
parents:
diff changeset
1332 ------------------------
kono
parents:
diff changeset
1333
kono
parents:
diff changeset
1334 procedure Version_Referenced (S : String_Id) is
kono
parents:
diff changeset
1335 begin
kono
parents:
diff changeset
1336 Version_Ref.Append (S);
kono
parents:
diff changeset
1337 end Version_Referenced;
kono
parents:
diff changeset
1338
kono
parents:
diff changeset
1339 ---------------------
kono
parents:
diff changeset
1340 -- Write_Unit_Info --
kono
parents:
diff changeset
1341 ---------------------
kono
parents:
diff changeset
1342
kono
parents:
diff changeset
1343 procedure Write_Unit_Info
kono
parents:
diff changeset
1344 (Unit_Num : Unit_Number_Type;
kono
parents:
diff changeset
1345 Item : Node_Id;
kono
parents:
diff changeset
1346 Prefix : String := "";
kono
parents:
diff changeset
1347 Withs : Boolean := False)
kono
parents:
diff changeset
1348 is
kono
parents:
diff changeset
1349 begin
kono
parents:
diff changeset
1350 Write_Str (Prefix);
kono
parents:
diff changeset
1351 Write_Unit_Name (Unit_Name (Unit_Num));
kono
parents:
diff changeset
1352 Write_Str (", unit ");
kono
parents:
diff changeset
1353 Write_Int (Int (Unit_Num));
kono
parents:
diff changeset
1354 Write_Str (", ");
kono
parents:
diff changeset
1355 Write_Int (Int (Item));
kono
parents:
diff changeset
1356 Write_Str ("=");
kono
parents:
diff changeset
1357 Write_Str (Node_Kind'Image (Nkind (Item)));
kono
parents:
diff changeset
1358
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1359 if Is_Rewrite_Substitution (Item) then
111
kono
parents:
diff changeset
1360 Write_Str (", orig = ");
kono
parents:
diff changeset
1361 Write_Int (Int (Original_Node (Item)));
kono
parents:
diff changeset
1362 Write_Str ("=");
kono
parents:
diff changeset
1363 Write_Str (Node_Kind'Image (Nkind (Original_Node (Item))));
kono
parents:
diff changeset
1364 end if;
kono
parents:
diff changeset
1365
kono
parents:
diff changeset
1366 Write_Eol;
kono
parents:
diff changeset
1367
kono
parents:
diff changeset
1368 -- Skip the rest if we're not supposed to print the withs
kono
parents:
diff changeset
1369
kono
parents:
diff changeset
1370 if not Withs then
kono
parents:
diff changeset
1371 return;
kono
parents:
diff changeset
1372 end if;
kono
parents:
diff changeset
1373
kono
parents:
diff changeset
1374 declare
kono
parents:
diff changeset
1375 Context_Item : Node_Id;
kono
parents:
diff changeset
1376
kono
parents:
diff changeset
1377 begin
kono
parents:
diff changeset
1378 Context_Item := First (Context_Items (Cunit (Unit_Num)));
kono
parents:
diff changeset
1379 while Present (Context_Item)
kono
parents:
diff changeset
1380 and then (Nkind (Context_Item) /= N_With_Clause
kono
parents:
diff changeset
1381 or else Limited_Present (Context_Item))
kono
parents:
diff changeset
1382 loop
kono
parents:
diff changeset
1383 Context_Item := Next (Context_Item);
kono
parents:
diff changeset
1384 end loop;
kono
parents:
diff changeset
1385
kono
parents:
diff changeset
1386 if Present (Context_Item) then
kono
parents:
diff changeset
1387 Indent;
kono
parents:
diff changeset
1388 Write_Line ("withs:");
kono
parents:
diff changeset
1389 Indent;
kono
parents:
diff changeset
1390
kono
parents:
diff changeset
1391 while Present (Context_Item) loop
kono
parents:
diff changeset
1392 if Nkind (Context_Item) = N_With_Clause
kono
parents:
diff changeset
1393 and then not Limited_Present (Context_Item)
kono
parents:
diff changeset
1394 then
kono
parents:
diff changeset
1395 pragma Assert (Present (Library_Unit (Context_Item)));
kono
parents:
diff changeset
1396 Write_Unit_Name
kono
parents:
diff changeset
1397 (Unit_Name
kono
parents:
diff changeset
1398 (Get_Cunit_Unit_Number (Library_Unit (Context_Item))));
kono
parents:
diff changeset
1399
kono
parents:
diff changeset
1400 if Implicit_With (Context_Item) then
kono
parents:
diff changeset
1401 Write_Str (" -- implicit");
kono
parents:
diff changeset
1402 end if;
kono
parents:
diff changeset
1403
kono
parents:
diff changeset
1404 Write_Eol;
kono
parents:
diff changeset
1405 end if;
kono
parents:
diff changeset
1406
kono
parents:
diff changeset
1407 Context_Item := Next (Context_Item);
kono
parents:
diff changeset
1408 end loop;
kono
parents:
diff changeset
1409
kono
parents:
diff changeset
1410 Outdent;
kono
parents:
diff changeset
1411 Write_Line ("end withs");
kono
parents:
diff changeset
1412 Outdent;
kono
parents:
diff changeset
1413 end if;
kono
parents:
diff changeset
1414 end;
kono
parents:
diff changeset
1415 end Write_Unit_Info;
kono
parents:
diff changeset
1416
kono
parents:
diff changeset
1417 end Lib;