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

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
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 -- G E T _ S P A R K _ X R E F S --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
kono
parents:
diff changeset
9 -- Copyright (C) 2011-2016, Free Software Foundation, Inc. --
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
kono
parents:
diff changeset
17 -- for more details. You should have received a copy of the GNU General --
kono
parents:
diff changeset
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
kono
parents:
diff changeset
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
kono
parents:
diff changeset
20 -- --
kono
parents:
diff changeset
21 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
23 -- --
kono
parents:
diff changeset
24 ------------------------------------------------------------------------------
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 with SPARK_Xrefs; use SPARK_Xrefs;
kono
parents:
diff changeset
27 with Types; use Types;
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 with Ada.IO_Exceptions; use Ada.IO_Exceptions;
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 procedure Get_SPARK_Xrefs is
kono
parents:
diff changeset
32 C : Character;
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 use ASCII;
kono
parents:
diff changeset
35 -- For CR/LF
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 Cur_File : Nat;
kono
parents:
diff changeset
38 -- Dependency number for the current file
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 Cur_Scope : Nat;
kono
parents:
diff changeset
41 -- Scope number for the current scope entity
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 Cur_File_Idx : File_Index;
kono
parents:
diff changeset
44 -- Index in SPARK_File_Table of the current file
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 Cur_Scope_Idx : Scope_Index;
kono
parents:
diff changeset
47 -- Index in SPARK_Scope_Table of the current scope
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 Name_Str : String (1 .. 32768);
kono
parents:
diff changeset
50 Name_Len : Natural := 0;
kono
parents:
diff changeset
51 -- Local string used to store name of File/entity scanned as
kono
parents:
diff changeset
52 -- Name_Str (1 .. Name_Len).
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 File_Name : String_Ptr;
kono
parents:
diff changeset
55 Unit_File_Name : String_Ptr;
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 -----------------------
kono
parents:
diff changeset
58 -- Local Subprograms --
kono
parents:
diff changeset
59 -----------------------
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 function At_EOL return Boolean;
kono
parents:
diff changeset
62 -- Skips any spaces, then checks if at the end of a line. If so, returns
kono
parents:
diff changeset
63 -- True (but does not skip the EOL sequence). If not, then returns False.
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 procedure Check (C : Character);
kono
parents:
diff changeset
66 -- Checks that file is positioned at given character, and if so skips past
kono
parents:
diff changeset
67 -- it, If not, raises Data_Error.
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 function Get_Nat return Nat;
kono
parents:
diff changeset
70 -- On entry the file is positioned to a digit. On return, the file is
kono
parents:
diff changeset
71 -- positioned past the last digit, and the returned result is the decimal
kono
parents:
diff changeset
72 -- value read. Data_Error is raised for overflow (value greater than
kono
parents:
diff changeset
73 -- Int'Last), or if the initial character is not a digit.
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 procedure Get_Name;
kono
parents:
diff changeset
76 -- On entry the file is positioned to a name. On return, the file is
kono
parents:
diff changeset
77 -- positioned past the last character, and the name scanned is returned
kono
parents:
diff changeset
78 -- in Name_Str (1 .. Name_Len).
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 procedure Skip_EOL;
kono
parents:
diff changeset
81 -- Called with the current character about to be read being LF or CR. Skips
kono
parents:
diff changeset
82 -- past CR/LF characters until either a non-CR/LF character is found, or
kono
parents:
diff changeset
83 -- the end of file is encountered.
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 procedure Skip_Spaces;
kono
parents:
diff changeset
86 -- Skips zero or more spaces at the current position, leaving the file
kono
parents:
diff changeset
87 -- positioned at the first non-blank character (or Types.EOF).
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 ------------
kono
parents:
diff changeset
90 -- At_EOL --
kono
parents:
diff changeset
91 ------------
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 function At_EOL return Boolean is
kono
parents:
diff changeset
94 begin
kono
parents:
diff changeset
95 Skip_Spaces;
kono
parents:
diff changeset
96 return Nextc = CR or else Nextc = LF;
kono
parents:
diff changeset
97 end At_EOL;
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 -----------
kono
parents:
diff changeset
100 -- Check --
kono
parents:
diff changeset
101 -----------
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 procedure Check (C : Character) is
kono
parents:
diff changeset
104 begin
kono
parents:
diff changeset
105 if Nextc = C then
kono
parents:
diff changeset
106 Skipc;
kono
parents:
diff changeset
107 else
kono
parents:
diff changeset
108 raise Data_Error;
kono
parents:
diff changeset
109 end if;
kono
parents:
diff changeset
110 end Check;
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 -------------
kono
parents:
diff changeset
113 -- Get_Nat --
kono
parents:
diff changeset
114 -------------
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 function Get_Nat return Nat is
kono
parents:
diff changeset
117 C : Character := Nextc;
kono
parents:
diff changeset
118 Val : Nat := 0;
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 begin
kono
parents:
diff changeset
121 if C not in '0' .. '9' then
kono
parents:
diff changeset
122 raise Data_Error;
kono
parents:
diff changeset
123 end if;
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 -- Loop to read digits of integer value
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 loop
kono
parents:
diff changeset
128 declare
kono
parents:
diff changeset
129 pragma Unsuppress (Overflow_Check);
kono
parents:
diff changeset
130 begin
kono
parents:
diff changeset
131 Val := Val * 10 + (Character'Pos (C) - Character'Pos ('0'));
kono
parents:
diff changeset
132 end;
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 Skipc;
kono
parents:
diff changeset
135 C := Nextc;
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 exit when C not in '0' .. '9';
kono
parents:
diff changeset
138 end loop;
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 return Val;
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 exception
kono
parents:
diff changeset
143 when Constraint_Error =>
kono
parents:
diff changeset
144 raise Data_Error;
kono
parents:
diff changeset
145 end Get_Nat;
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 --------------
kono
parents:
diff changeset
148 -- Get_Name --
kono
parents:
diff changeset
149 --------------
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 procedure Get_Name is
kono
parents:
diff changeset
152 N : Natural := 0;
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 begin
kono
parents:
diff changeset
155 while Nextc > ' ' loop
kono
parents:
diff changeset
156 N := N + 1;
kono
parents:
diff changeset
157 Name_Str (N) := Getc;
kono
parents:
diff changeset
158 end loop;
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 Name_Len := N;
kono
parents:
diff changeset
161 end Get_Name;
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 --------------
kono
parents:
diff changeset
164 -- Skip_EOL --
kono
parents:
diff changeset
165 --------------
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 procedure Skip_EOL is
kono
parents:
diff changeset
168 C : Character;
kono
parents:
diff changeset
169
kono
parents:
diff changeset
170 begin
kono
parents:
diff changeset
171 loop
kono
parents:
diff changeset
172 Skipc;
kono
parents:
diff changeset
173 C := Nextc;
kono
parents:
diff changeset
174 exit when C /= LF and then C /= CR;
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 if C = ' ' then
kono
parents:
diff changeset
177 Skip_Spaces;
kono
parents:
diff changeset
178 C := Nextc;
kono
parents:
diff changeset
179 exit when C /= LF and then C /= CR;
kono
parents:
diff changeset
180 end if;
kono
parents:
diff changeset
181 end loop;
kono
parents:
diff changeset
182 end Skip_EOL;
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 -----------------
kono
parents:
diff changeset
185 -- Skip_Spaces --
kono
parents:
diff changeset
186 -----------------
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 procedure Skip_Spaces is
kono
parents:
diff changeset
189 begin
kono
parents:
diff changeset
190 while Nextc = ' ' loop
kono
parents:
diff changeset
191 Skipc;
kono
parents:
diff changeset
192 end loop;
kono
parents:
diff changeset
193 end Skip_Spaces;
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 -- Start of processing for Get_SPARK_Xrefs
kono
parents:
diff changeset
196
kono
parents:
diff changeset
197 begin
kono
parents:
diff changeset
198 Initialize_SPARK_Tables;
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200 Cur_File := 0;
kono
parents:
diff changeset
201 Cur_Scope := 0;
kono
parents:
diff changeset
202 Cur_File_Idx := 1;
kono
parents:
diff changeset
203 Cur_Scope_Idx := 0;
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 -- Loop through lines of SPARK cross-reference information
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 while Nextc = 'F' loop
kono
parents:
diff changeset
208 Skipc;
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 C := Getc;
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 -- Make sure first line is a File line
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 if SPARK_File_Table.Last = 0 and then C /= 'D' then
kono
parents:
diff changeset
215 raise Data_Error;
kono
parents:
diff changeset
216 end if;
kono
parents:
diff changeset
217
kono
parents:
diff changeset
218 -- Otherwise dispatch on type of line
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 case C is
kono
parents:
diff changeset
221
kono
parents:
diff changeset
222 -- Header entry for scope section
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 when 'D' =>
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 -- Complete previous entry if any
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 if SPARK_File_Table.Last /= 0 then
kono
parents:
diff changeset
229 SPARK_File_Table.Table (SPARK_File_Table.Last).To_Scope :=
kono
parents:
diff changeset
230 SPARK_Scope_Table.Last;
kono
parents:
diff changeset
231 end if;
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 -- Scan out dependency number and file name
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 Skip_Spaces;
kono
parents:
diff changeset
236 Cur_File := Get_Nat;
kono
parents:
diff changeset
237 Skip_Spaces;
kono
parents:
diff changeset
238
kono
parents:
diff changeset
239 Get_Name;
kono
parents:
diff changeset
240 File_Name := new String'(Name_Str (1 .. Name_Len));
kono
parents:
diff changeset
241 Skip_Spaces;
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 -- Scan out unit file name when present (for subunits)
kono
parents:
diff changeset
244
kono
parents:
diff changeset
245 if Nextc = '-' then
kono
parents:
diff changeset
246 Skipc;
kono
parents:
diff changeset
247 Check ('>');
kono
parents:
diff changeset
248 Skip_Spaces;
kono
parents:
diff changeset
249 Get_Name;
kono
parents:
diff changeset
250 Unit_File_Name := new String'(Name_Str (1 .. Name_Len));
kono
parents:
diff changeset
251
kono
parents:
diff changeset
252 else
kono
parents:
diff changeset
253 Unit_File_Name := null;
kono
parents:
diff changeset
254 end if;
kono
parents:
diff changeset
255
kono
parents:
diff changeset
256 -- Make new File table entry (will fill in To_Scope later)
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 SPARK_File_Table.Append (
kono
parents:
diff changeset
259 (File_Name => File_Name,
kono
parents:
diff changeset
260 Unit_File_Name => Unit_File_Name,
kono
parents:
diff changeset
261 File_Num => Cur_File,
kono
parents:
diff changeset
262 From_Scope => SPARK_Scope_Table.Last + 1,
kono
parents:
diff changeset
263 To_Scope => 0));
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 -- Initialize counter for scopes
kono
parents:
diff changeset
266
kono
parents:
diff changeset
267 Cur_Scope := 1;
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 -- Scope entry
kono
parents:
diff changeset
270
kono
parents:
diff changeset
271 when 'S' =>
kono
parents:
diff changeset
272 declare
kono
parents:
diff changeset
273 Spec_File : Nat;
kono
parents:
diff changeset
274 Spec_Scope : Nat;
kono
parents:
diff changeset
275 Scope : Nat;
kono
parents:
diff changeset
276 Line : Nat;
kono
parents:
diff changeset
277 Col : Nat;
kono
parents:
diff changeset
278 Typ : Character;
kono
parents:
diff changeset
279
kono
parents:
diff changeset
280 begin
kono
parents:
diff changeset
281 -- Scan out location
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 Skip_Spaces;
kono
parents:
diff changeset
284 Check ('.');
kono
parents:
diff changeset
285 Scope := Get_Nat;
kono
parents:
diff changeset
286 Check (' ');
kono
parents:
diff changeset
287 Line := Get_Nat;
kono
parents:
diff changeset
288 Typ := Getc;
kono
parents:
diff changeset
289 Col := Get_Nat;
kono
parents:
diff changeset
290
kono
parents:
diff changeset
291 pragma Assert (Scope = Cur_Scope);
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 -- Scan out scope entity name
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 Skip_Spaces;
kono
parents:
diff changeset
296 Get_Name;
kono
parents:
diff changeset
297 Skip_Spaces;
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 if Nextc = '-' then
kono
parents:
diff changeset
300 Skipc;
kono
parents:
diff changeset
301 Check ('>');
kono
parents:
diff changeset
302 Skip_Spaces;
kono
parents:
diff changeset
303 Spec_File := Get_Nat;
kono
parents:
diff changeset
304 Check ('.');
kono
parents:
diff changeset
305 Spec_Scope := Get_Nat;
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 else
kono
parents:
diff changeset
308 Spec_File := 0;
kono
parents:
diff changeset
309 Spec_Scope := 0;
kono
parents:
diff changeset
310 end if;
kono
parents:
diff changeset
311
kono
parents:
diff changeset
312 -- Make new scope table entry (will fill in From_Xref and
kono
parents:
diff changeset
313 -- To_Xref later). Initial range (From_Xref .. To_Xref) is
kono
parents:
diff changeset
314 -- empty for scopes without entities.
kono
parents:
diff changeset
315
kono
parents:
diff changeset
316 SPARK_Scope_Table.Append (
kono
parents:
diff changeset
317 (Scope_Entity => Empty,
kono
parents:
diff changeset
318 Scope_Name => new String'(Name_Str (1 .. Name_Len)),
kono
parents:
diff changeset
319 File_Num => Cur_File,
kono
parents:
diff changeset
320 Scope_Num => Cur_Scope,
kono
parents:
diff changeset
321 Spec_File_Num => Spec_File,
kono
parents:
diff changeset
322 Spec_Scope_Num => Spec_Scope,
kono
parents:
diff changeset
323 Line => Line,
kono
parents:
diff changeset
324 Stype => Typ,
kono
parents:
diff changeset
325 Col => Col,
kono
parents:
diff changeset
326 From_Xref => 1,
kono
parents:
diff changeset
327 To_Xref => 0));
kono
parents:
diff changeset
328 end;
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 -- Update counter for scopes
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332 Cur_Scope := Cur_Scope + 1;
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 -- Header entry for cross-ref section
kono
parents:
diff changeset
335
kono
parents:
diff changeset
336 when 'X' =>
kono
parents:
diff changeset
337
kono
parents:
diff changeset
338 -- Scan out dependency number and file name (ignored)
kono
parents:
diff changeset
339
kono
parents:
diff changeset
340 Skip_Spaces;
kono
parents:
diff changeset
341 Cur_File := Get_Nat;
kono
parents:
diff changeset
342 Skip_Spaces;
kono
parents:
diff changeset
343 Get_Name;
kono
parents:
diff changeset
344
kono
parents:
diff changeset
345 -- Update component From_Xref of current file if first reference
kono
parents:
diff changeset
346 -- in this file.
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 while SPARK_File_Table.Table (Cur_File_Idx).File_Num /= Cur_File
kono
parents:
diff changeset
349 loop
kono
parents:
diff changeset
350 Cur_File_Idx := Cur_File_Idx + 1;
kono
parents:
diff changeset
351 end loop;
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 -- Scan out scope entity number and entity name (ignored)
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 Skip_Spaces;
kono
parents:
diff changeset
356 Check ('.');
kono
parents:
diff changeset
357 Cur_Scope := Get_Nat;
kono
parents:
diff changeset
358 Skip_Spaces;
kono
parents:
diff changeset
359 Get_Name;
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 -- Update component To_Xref of previous scope
kono
parents:
diff changeset
362
kono
parents:
diff changeset
363 if Cur_Scope_Idx /= 0 then
kono
parents:
diff changeset
364 SPARK_Scope_Table.Table (Cur_Scope_Idx).To_Xref :=
kono
parents:
diff changeset
365 SPARK_Xref_Table.Last;
kono
parents:
diff changeset
366 end if;
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 -- Update component From_Xref of current scope
kono
parents:
diff changeset
369
kono
parents:
diff changeset
370 Cur_Scope_Idx := SPARK_File_Table.Table (Cur_File_Idx).From_Scope;
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 while SPARK_Scope_Table.Table (Cur_Scope_Idx).Scope_Num /=
kono
parents:
diff changeset
373 Cur_Scope
kono
parents:
diff changeset
374 loop
kono
parents:
diff changeset
375 Cur_Scope_Idx := Cur_Scope_Idx + 1;
kono
parents:
diff changeset
376 end loop;
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378 SPARK_Scope_Table.Table (Cur_Scope_Idx).From_Xref :=
kono
parents:
diff changeset
379 SPARK_Xref_Table.Last + 1;
kono
parents:
diff changeset
380
kono
parents:
diff changeset
381 -- Cross reference entry
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 when ' ' =>
kono
parents:
diff changeset
384 declare
kono
parents:
diff changeset
385 XR_Entity : String_Ptr;
kono
parents:
diff changeset
386 XR_Entity_Line : Nat;
kono
parents:
diff changeset
387 XR_Entity_Col : Nat;
kono
parents:
diff changeset
388 XR_Entity_Typ : Character;
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 XR_File : Nat;
kono
parents:
diff changeset
391 -- Keeps track of the current file (changed by nn|)
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 XR_Scope : Nat;
kono
parents:
diff changeset
394 -- Keeps track of the current scope (changed by nn:)
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396 begin
kono
parents:
diff changeset
397 XR_File := Cur_File;
kono
parents:
diff changeset
398 XR_Scope := Cur_Scope;
kono
parents:
diff changeset
399
kono
parents:
diff changeset
400 XR_Entity_Line := Get_Nat;
kono
parents:
diff changeset
401 XR_Entity_Typ := Getc;
kono
parents:
diff changeset
402 XR_Entity_Col := Get_Nat;
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 Skip_Spaces;
kono
parents:
diff changeset
405 Get_Name;
kono
parents:
diff changeset
406 XR_Entity := new String'(Name_Str (1 .. Name_Len));
kono
parents:
diff changeset
407
kono
parents:
diff changeset
408 -- Initialize to scan items on one line
kono
parents:
diff changeset
409
kono
parents:
diff changeset
410 Skip_Spaces;
kono
parents:
diff changeset
411
kono
parents:
diff changeset
412 -- Loop through cross-references for this entity
kono
parents:
diff changeset
413
kono
parents:
diff changeset
414 loop
kono
parents:
diff changeset
415 declare
kono
parents:
diff changeset
416 Line : Nat;
kono
parents:
diff changeset
417 Col : Nat;
kono
parents:
diff changeset
418 N : Nat;
kono
parents:
diff changeset
419 Rtype : Character;
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 begin
kono
parents:
diff changeset
422 Skip_Spaces;
kono
parents:
diff changeset
423
kono
parents:
diff changeset
424 if At_EOL then
kono
parents:
diff changeset
425 Skip_EOL;
kono
parents:
diff changeset
426 exit when Nextc /= '.';
kono
parents:
diff changeset
427 Skipc;
kono
parents:
diff changeset
428 Skip_Spaces;
kono
parents:
diff changeset
429 end if;
kono
parents:
diff changeset
430
kono
parents:
diff changeset
431 if Nextc = '.' then
kono
parents:
diff changeset
432 Skipc;
kono
parents:
diff changeset
433 XR_Scope := Get_Nat;
kono
parents:
diff changeset
434 Check (':');
kono
parents:
diff changeset
435
kono
parents:
diff changeset
436 else
kono
parents:
diff changeset
437 N := Get_Nat;
kono
parents:
diff changeset
438
kono
parents:
diff changeset
439 if Nextc = '|' then
kono
parents:
diff changeset
440 XR_File := N;
kono
parents:
diff changeset
441 Skipc;
kono
parents:
diff changeset
442
kono
parents:
diff changeset
443 else
kono
parents:
diff changeset
444 Line := N;
kono
parents:
diff changeset
445 Rtype := Getc;
kono
parents:
diff changeset
446 Col := Get_Nat;
kono
parents:
diff changeset
447
kono
parents:
diff changeset
448 pragma Assert
kono
parents:
diff changeset
449 (Rtype = 'r' or else
kono
parents:
diff changeset
450 Rtype = 'c' or else
kono
parents:
diff changeset
451 Rtype = 'm' or else
kono
parents:
diff changeset
452 Rtype = 's');
kono
parents:
diff changeset
453
kono
parents:
diff changeset
454 SPARK_Xref_Table.Append (
kono
parents:
diff changeset
455 (Entity_Name => XR_Entity,
kono
parents:
diff changeset
456 Entity_Line => XR_Entity_Line,
kono
parents:
diff changeset
457 Etype => XR_Entity_Typ,
kono
parents:
diff changeset
458 Entity_Col => XR_Entity_Col,
kono
parents:
diff changeset
459 File_Num => XR_File,
kono
parents:
diff changeset
460 Scope_Num => XR_Scope,
kono
parents:
diff changeset
461 Line => Line,
kono
parents:
diff changeset
462 Rtype => Rtype,
kono
parents:
diff changeset
463 Col => Col));
kono
parents:
diff changeset
464 end if;
kono
parents:
diff changeset
465 end if;
kono
parents:
diff changeset
466 end;
kono
parents:
diff changeset
467 end loop;
kono
parents:
diff changeset
468 end;
kono
parents:
diff changeset
469
kono
parents:
diff changeset
470 -- No other SPARK lines are possible
kono
parents:
diff changeset
471
kono
parents:
diff changeset
472 when others =>
kono
parents:
diff changeset
473 raise Data_Error;
kono
parents:
diff changeset
474 end case;
kono
parents:
diff changeset
475
kono
parents:
diff changeset
476 -- For cross reference lines, the EOL character has been skipped already
kono
parents:
diff changeset
477
kono
parents:
diff changeset
478 if C /= ' ' then
kono
parents:
diff changeset
479 Skip_EOL;
kono
parents:
diff changeset
480 end if;
kono
parents:
diff changeset
481 end loop;
kono
parents:
diff changeset
482
kono
parents:
diff changeset
483 -- Here with all Xrefs stored, complete last entries in File/Scope tables
kono
parents:
diff changeset
484
kono
parents:
diff changeset
485 if SPARK_File_Table.Last /= 0 then
kono
parents:
diff changeset
486 SPARK_File_Table.Table (SPARK_File_Table.Last).To_Scope :=
kono
parents:
diff changeset
487 SPARK_Scope_Table.Last;
kono
parents:
diff changeset
488 end if;
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 if Cur_Scope_Idx /= 0 then
kono
parents:
diff changeset
491 SPARK_Scope_Table.Table (Cur_Scope_Idx).To_Xref := SPARK_Xref_Table.Last;
kono
parents:
diff changeset
492 end if;
kono
parents:
diff changeset
493 end Get_SPARK_Xrefs;