annotate gcc/ada/csinfo.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 SYSTEM UTILITIES --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- C S I N F O --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
9 -- Copyright (C) 1992-2019, Free Software Foundation, Inc. --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
kono
parents:
diff changeset
17 -- for more details. You should have received a copy of the GNU General --
kono
parents:
diff changeset
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
kono
parents:
diff changeset
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
kono
parents:
diff changeset
20 -- --
kono
parents:
diff changeset
21 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
23 -- --
kono
parents:
diff changeset
24 ------------------------------------------------------------------------------
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 -- Check consistency of sinfo.ads and sinfo.adb. Checks that field name usage
kono
parents:
diff changeset
27 -- is consistent and that assertion cross-reference lists are correct, as well
kono
parents:
diff changeset
28 -- as making sure that all the comments on field name usage are consistent.
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 -- Note that this is used both as a standalone program, and as a procedure
kono
parents:
diff changeset
31 -- called by XSinfo. This raises an unhandled exception if it finds any
kono
parents:
diff changeset
32 -- errors; we don't attempt any sophisticated error recovery.
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
kono
parents:
diff changeset
35 with Ada.Strings.Unbounded.Text_IO; use Ada.Strings.Unbounded.Text_IO;
kono
parents:
diff changeset
36 with Ada.Strings.Maps; use Ada.Strings.Maps;
kono
parents:
diff changeset
37 with Ada.Strings.Maps.Constants; use Ada.Strings.Maps.Constants;
kono
parents:
diff changeset
38 with Ada.Text_IO; use Ada.Text_IO;
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 with GNAT.Spitbol; use GNAT.Spitbol;
kono
parents:
diff changeset
41 with GNAT.Spitbol.Patterns; use GNAT.Spitbol.Patterns;
kono
parents:
diff changeset
42 with GNAT.Spitbol.Table_Boolean;
kono
parents:
diff changeset
43 with GNAT.Spitbol.Table_VString;
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 procedure CSinfo is
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 package TB renames GNAT.Spitbol.Table_Boolean;
kono
parents:
diff changeset
48 package TV renames GNAT.Spitbol.Table_VString;
kono
parents:
diff changeset
49 use TB, TV;
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 Infil : File_Type;
kono
parents:
diff changeset
52 Lineno : Natural := 0;
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 Err : exception;
kono
parents:
diff changeset
55 -- Raised on fatal error
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 Done : exception;
kono
parents:
diff changeset
58 -- Raised after error is found to terminate run
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 WSP : constant Pattern := Span (' ' & ASCII.HT);
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 Fields : TV.Table (300);
kono
parents:
diff changeset
63 Fields1 : TV.Table (300);
kono
parents:
diff changeset
64 Refs : TV.Table (300);
kono
parents:
diff changeset
65 Refscopy : TV.Table (300);
kono
parents:
diff changeset
66 Special : TB.Table (50);
kono
parents:
diff changeset
67 Inlines : TV.Table (100);
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 -- The following define the standard fields used for binary operator,
kono
parents:
diff changeset
70 -- unary operator, and other expression nodes. Numbers in the range 1-5
kono
parents:
diff changeset
71 -- refer to the Fieldn fields. Letters D-R refer to flags:
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 -- D = Flag4
kono
parents:
diff changeset
74 -- E = Flag5
kono
parents:
diff changeset
75 -- F = Flag6
kono
parents:
diff changeset
76 -- G = Flag7
kono
parents:
diff changeset
77 -- H = Flag8
kono
parents:
diff changeset
78 -- I = Flag9
kono
parents:
diff changeset
79 -- J = Flag10
kono
parents:
diff changeset
80 -- K = Flag11
kono
parents:
diff changeset
81 -- L = Flag12
kono
parents:
diff changeset
82 -- M = Flag13
kono
parents:
diff changeset
83 -- N = Flag14
kono
parents:
diff changeset
84 -- O = Flag15
kono
parents:
diff changeset
85 -- P = Flag16
kono
parents:
diff changeset
86 -- Q = Flag17
kono
parents:
diff changeset
87 -- R = Flag18
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 Flags : TV.Table (20);
kono
parents:
diff changeset
90 -- Maps flag numbers to letters
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 N_Fields : constant Pattern := BreakX ("JL");
kono
parents:
diff changeset
93 E_Fields : constant Pattern := BreakX ("5EFGHIJLOP");
kono
parents:
diff changeset
94 U_Fields : constant Pattern := BreakX ("1345EFGHIJKLOPQ");
kono
parents:
diff changeset
95 B_Fields : constant Pattern := BreakX ("12345EFGHIJKLOPQ");
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 Line : VString;
kono
parents:
diff changeset
98 Bad : Boolean;
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 Field : constant VString := Nul;
kono
parents:
diff changeset
101 Fields_Used : VString := Nul;
kono
parents:
diff changeset
102 Name : constant VString := Nul;
kono
parents:
diff changeset
103 Next : constant VString := Nul;
kono
parents:
diff changeset
104 Node : VString := Nul;
kono
parents:
diff changeset
105 Ref : VString := Nul;
kono
parents:
diff changeset
106 Synonym : constant VString := Nul;
kono
parents:
diff changeset
107 Nxtref : constant VString := Nul;
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 Which_Field : aliased VString := Nul;
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 Node_Search : constant Pattern := WSP & "-- N_" & Rest * Node;
kono
parents:
diff changeset
112 Break_Punc : constant Pattern := Break (" .,");
kono
parents:
diff changeset
113 Plus_Binary : constant Pattern := WSP
kono
parents:
diff changeset
114 & "-- plus fields for binary operator";
kono
parents:
diff changeset
115 Plus_Unary : constant Pattern := WSP
kono
parents:
diff changeset
116 & "-- plus fields for unary operator";
kono
parents:
diff changeset
117 Plus_Expr : constant Pattern := WSP
kono
parents:
diff changeset
118 & "-- plus fields for expression";
kono
parents:
diff changeset
119 Break_Syn : constant Pattern := WSP & "-- "
kono
parents:
diff changeset
120 & Break (' ') * Synonym
kono
parents:
diff changeset
121 & " (" & Break (')') * Field;
kono
parents:
diff changeset
122 Break_Field : constant Pattern := BreakX ('-') * Field;
kono
parents:
diff changeset
123 Get_Field : constant Pattern := BreakX (Decimal_Digit_Set)
kono
parents:
diff changeset
124 & Span (Decimal_Digit_Set) * Which_Field;
kono
parents:
diff changeset
125 Break_WFld : constant Pattern := Break (Which_Field'Access);
kono
parents:
diff changeset
126 Get_Funcsyn : constant Pattern := WSP & "function " & Rest * Synonym;
kono
parents:
diff changeset
127 Extr_Field : constant Pattern := BreakX ('-') & "-- " & Rest * Field;
kono
parents:
diff changeset
128 Get_Procsyn : constant Pattern := WSP & "procedure Set_" & Rest * Synonym;
kono
parents:
diff changeset
129 Get_Inline : constant Pattern := WSP & "pragma Inline ("
kono
parents:
diff changeset
130 & Break (')') * Name;
kono
parents:
diff changeset
131 Set_Name : constant Pattern := "Set_" & Rest * Name;
kono
parents:
diff changeset
132 Func_Rest : constant Pattern := " function " & Rest * Synonym;
kono
parents:
diff changeset
133 Get_Nxtref : constant Pattern := Break (',') * Nxtref & ',';
kono
parents:
diff changeset
134 Test_Syn : constant Pattern := Break ('=') & "= N_"
kono
parents:
diff changeset
135 & (Break (" ,)") or Rest) * Next;
kono
parents:
diff changeset
136 Chop_Comma : constant Pattern := BreakX (',') * Next;
kono
parents:
diff changeset
137 Return_Fld : constant Pattern := WSP & "return " & Break (' ') * Field;
kono
parents:
diff changeset
138 Set_Syn : constant Pattern := " procedure Set_" & Rest * Synonym;
kono
parents:
diff changeset
139 Set_Fld : constant Pattern := WSP & "Set_" & Break (' ') * Field
kono
parents:
diff changeset
140 & " (N, Val)";
kono
parents:
diff changeset
141 Break_With : constant Pattern := Break ('_') ** Field & "_With_Parent";
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 type VStringA is array (Natural range <>) of VString;
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 procedure Next_Line;
kono
parents:
diff changeset
146 -- Read next line trimmed from Infil into Line and bump Lineno
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148 procedure Sort (A : in out VStringA);
kono
parents:
diff changeset
149 -- Sort a (small) array of VString's
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 procedure Next_Line is
kono
parents:
diff changeset
152 begin
kono
parents:
diff changeset
153 Line := Get_Line (Infil);
kono
parents:
diff changeset
154 Trim (Line);
kono
parents:
diff changeset
155 Lineno := Lineno + 1;
kono
parents:
diff changeset
156 end Next_Line;
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 procedure Sort (A : in out VStringA) is
kono
parents:
diff changeset
159 Temp : VString;
kono
parents:
diff changeset
160 begin
kono
parents:
diff changeset
161 <<Sort>>
kono
parents:
diff changeset
162 for J in 1 .. A'Length - 1 loop
kono
parents:
diff changeset
163 if A (J) > A (J + 1) then
kono
parents:
diff changeset
164 Temp := A (J);
kono
parents:
diff changeset
165 A (J) := A (J + 1);
kono
parents:
diff changeset
166 A (J + 1) := Temp;
kono
parents:
diff changeset
167 goto Sort;
kono
parents:
diff changeset
168 end if;
kono
parents:
diff changeset
169 end loop;
kono
parents:
diff changeset
170 end Sort;
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 -- Start of processing for CSinfo
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 begin
kono
parents:
diff changeset
175 Anchored_Mode := True;
kono
parents:
diff changeset
176 New_Line;
kono
parents:
diff changeset
177 Open (Infil, In_File, "sinfo.ads");
kono
parents:
diff changeset
178 Put_Line ("Check for field name consistency");
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 -- Setup table for mapping flag numbers to letters
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 Set (Flags, "4", V ("D"));
kono
parents:
diff changeset
183 Set (Flags, "5", V ("E"));
kono
parents:
diff changeset
184 Set (Flags, "6", V ("F"));
kono
parents:
diff changeset
185 Set (Flags, "7", V ("G"));
kono
parents:
diff changeset
186 Set (Flags, "8", V ("H"));
kono
parents:
diff changeset
187 Set (Flags, "9", V ("I"));
kono
parents:
diff changeset
188 Set (Flags, "10", V ("J"));
kono
parents:
diff changeset
189 Set (Flags, "11", V ("K"));
kono
parents:
diff changeset
190 Set (Flags, "12", V ("L"));
kono
parents:
diff changeset
191 Set (Flags, "13", V ("M"));
kono
parents:
diff changeset
192 Set (Flags, "14", V ("N"));
kono
parents:
diff changeset
193 Set (Flags, "15", V ("O"));
kono
parents:
diff changeset
194 Set (Flags, "16", V ("P"));
kono
parents:
diff changeset
195 Set (Flags, "17", V ("Q"));
kono
parents:
diff changeset
196 Set (Flags, "18", V ("R"));
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 -- Special fields table. The following names are not recorded or checked
kono
parents:
diff changeset
199 -- by Csinfo, since they are specially handled. This means that any field
kono
parents:
diff changeset
200 -- definition or subprogram with a matching name is ignored.
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 Set (Special, "Analyzed", True);
kono
parents:
diff changeset
203 Set (Special, "Assignment_OK", True);
kono
parents:
diff changeset
204 Set (Special, "Associated_Node", True);
kono
parents:
diff changeset
205 Set (Special, "Cannot_Be_Constant", True);
kono
parents:
diff changeset
206 Set (Special, "Chars", True);
kono
parents:
diff changeset
207 Set (Special, "Comes_From_Source", True);
kono
parents:
diff changeset
208 Set (Special, "Do_Overflow_Check", True);
kono
parents:
diff changeset
209 Set (Special, "Do_Range_Check", True);
kono
parents:
diff changeset
210 Set (Special, "Entity", True);
kono
parents:
diff changeset
211 Set (Special, "Entity_Or_Associated_Node", True);
kono
parents:
diff changeset
212 Set (Special, "Error_Posted", True);
kono
parents:
diff changeset
213 Set (Special, "Etype", True);
kono
parents:
diff changeset
214 Set (Special, "Evaluate_Once", True);
kono
parents:
diff changeset
215 Set (Special, "First_Itype", True);
kono
parents:
diff changeset
216 Set (Special, "Has_Aspect_Specifications", True);
kono
parents:
diff changeset
217 Set (Special, "Has_Dynamic_Itype", True);
kono
parents:
diff changeset
218 Set (Special, "Has_Dynamic_Range_Check", True);
kono
parents:
diff changeset
219 Set (Special, "Has_Dynamic_Length_Check", True);
kono
parents:
diff changeset
220 Set (Special, "Has_Private_View", True);
kono
parents:
diff changeset
221 Set (Special, "Is_Controlling_Actual", True);
kono
parents:
diff changeset
222 Set (Special, "Is_Overloaded", True);
kono
parents:
diff changeset
223 Set (Special, "Is_Static_Expression", True);
kono
parents:
diff changeset
224 Set (Special, "Left_Opnd", True);
kono
parents:
diff changeset
225 Set (Special, "Must_Not_Freeze", True);
kono
parents:
diff changeset
226 Set (Special, "Nkind_In", True);
kono
parents:
diff changeset
227 Set (Special, "Parens", True);
kono
parents:
diff changeset
228 Set (Special, "Pragma_Name", True);
kono
parents:
diff changeset
229 Set (Special, "Raises_Constraint_Error", True);
kono
parents:
diff changeset
230 Set (Special, "Right_Opnd", True);
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 -- Loop to acquire information from node definitions in sinfo.ads,
kono
parents:
diff changeset
233 -- checking for consistency in Op/Flag assignments to each synonym
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 loop
kono
parents:
diff changeset
236 Bad := False;
kono
parents:
diff changeset
237 Next_Line;
kono
parents:
diff changeset
238 exit when Match (Line, " -- Node Access Functions");
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 if Match (Line, Node_Search)
kono
parents:
diff changeset
241 and then not Match (Node, Break_Punc)
kono
parents:
diff changeset
242 then
kono
parents:
diff changeset
243 Fields_Used := Nul;
kono
parents:
diff changeset
244
kono
parents:
diff changeset
245 elsif Node = "" then
kono
parents:
diff changeset
246 null;
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 elsif Line = "" then
kono
parents:
diff changeset
249 Node := Nul;
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 elsif Match (Line, Plus_Binary) then
kono
parents:
diff changeset
252 Bad := Match (Fields_Used, B_Fields);
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 elsif Match (Line, Plus_Unary) then
kono
parents:
diff changeset
255 Bad := Match (Fields_Used, U_Fields);
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 elsif Match (Line, Plus_Expr) then
kono
parents:
diff changeset
258 Bad := Match (Fields_Used, E_Fields);
kono
parents:
diff changeset
259
kono
parents:
diff changeset
260 elsif not Match (Line, Break_Syn) then
kono
parents:
diff changeset
261 null;
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 elsif Match (Synonym, "plus") then
kono
parents:
diff changeset
264 null;
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 else
kono
parents:
diff changeset
267 Match (Field, Break_Field);
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 if not Present (Special, Synonym) then
kono
parents:
diff changeset
270 if Present (Fields, Synonym) then
kono
parents:
diff changeset
271 if Field /= Get (Fields, Synonym) then
kono
parents:
diff changeset
272 Put_Line
kono
parents:
diff changeset
273 ("Inconsistent field reference at line" &
kono
parents:
diff changeset
274 Lineno'Img & " for " & Synonym);
kono
parents:
diff changeset
275 raise Done;
kono
parents:
diff changeset
276 end if;
kono
parents:
diff changeset
277
kono
parents:
diff changeset
278 else
kono
parents:
diff changeset
279 Set (Fields, Synonym, Field);
kono
parents:
diff changeset
280 end if;
kono
parents:
diff changeset
281
kono
parents:
diff changeset
282 Set (Refs, Synonym, Node & ',' & Get (Refs, Synonym));
kono
parents:
diff changeset
283 Match (Field, Get_Field);
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 if Match (Field, "Flag") then
kono
parents:
diff changeset
286 Which_Field := Get (Flags, Which_Field);
kono
parents:
diff changeset
287 end if;
kono
parents:
diff changeset
288
kono
parents:
diff changeset
289 if Match (Fields_Used, Break_WFld) then
kono
parents:
diff changeset
290 Put_Line
kono
parents:
diff changeset
291 ("Overlapping field at line " & Lineno'Img &
kono
parents:
diff changeset
292 " for " & Synonym);
kono
parents:
diff changeset
293 raise Done;
kono
parents:
diff changeset
294 end if;
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 Append (Fields_Used, Which_Field);
kono
parents:
diff changeset
297 Bad := Bad or Match (Fields_Used, N_Fields);
kono
parents:
diff changeset
298 end if;
kono
parents:
diff changeset
299 end if;
kono
parents:
diff changeset
300
kono
parents:
diff changeset
301 if Bad then
kono
parents:
diff changeset
302 Put_Line ("fields conflict with standard fields for node " & Node);
kono
parents:
diff changeset
303 raise Done;
kono
parents:
diff changeset
304 end if;
kono
parents:
diff changeset
305 end loop;
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 Put_Line (" OK");
kono
parents:
diff changeset
308 New_Line;
kono
parents:
diff changeset
309 Put_Line ("Check for function consistency");
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 -- Loop through field function definitions to make sure they are OK
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 Fields1 := Fields;
kono
parents:
diff changeset
314 loop
kono
parents:
diff changeset
315 Next_Line;
kono
parents:
diff changeset
316 exit when Match (Line, " -- Node Update");
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 if Match (Line, Get_Funcsyn)
kono
parents:
diff changeset
319 and then not Present (Special, Synonym)
kono
parents:
diff changeset
320 then
kono
parents:
diff changeset
321 if not Present (Fields1, Synonym) then
kono
parents:
diff changeset
322 Put_Line
kono
parents:
diff changeset
323 ("function on line " & Lineno &
kono
parents:
diff changeset
324 " is for unused synonym");
kono
parents:
diff changeset
325 raise Done;
kono
parents:
diff changeset
326 end if;
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 Next_Line;
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 if not Match (Line, Extr_Field) then
kono
parents:
diff changeset
331 raise Err;
kono
parents:
diff changeset
332 end if;
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 if Field /= Get (Fields1, Synonym) then
kono
parents:
diff changeset
335 Put_Line ("Wrong field in function " & Synonym);
kono
parents:
diff changeset
336 raise Done;
kono
parents:
diff changeset
337
kono
parents:
diff changeset
338 else
kono
parents:
diff changeset
339 Delete (Fields1, Synonym);
kono
parents:
diff changeset
340 end if;
kono
parents:
diff changeset
341 end if;
kono
parents:
diff changeset
342 end loop;
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 Put_Line (" OK");
kono
parents:
diff changeset
345 New_Line;
kono
parents:
diff changeset
346 Put_Line ("Check for missing functions");
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 declare
kono
parents:
diff changeset
349 List : constant TV.Table_Array := Convert_To_Array (Fields1);
kono
parents:
diff changeset
350
kono
parents:
diff changeset
351 begin
kono
parents:
diff changeset
352 if List'Length > 0 then
kono
parents:
diff changeset
353 Put_Line ("No function for field synonym " & List (1).Name);
kono
parents:
diff changeset
354 raise Done;
kono
parents:
diff changeset
355 end if;
kono
parents:
diff changeset
356 end;
kono
parents:
diff changeset
357
kono
parents:
diff changeset
358 -- Check field set procedures
kono
parents:
diff changeset
359
kono
parents:
diff changeset
360 Put_Line (" OK");
kono
parents:
diff changeset
361 New_Line;
kono
parents:
diff changeset
362 Put_Line ("Check for set procedure consistency");
kono
parents:
diff changeset
363
kono
parents:
diff changeset
364 Fields1 := Fields;
kono
parents:
diff changeset
365 loop
kono
parents:
diff changeset
366 Next_Line;
kono
parents:
diff changeset
367 exit when Match (Line, " -- Inline Pragmas");
kono
parents:
diff changeset
368 exit when Match (Line, " -- Iterator Procedures");
kono
parents:
diff changeset
369
kono
parents:
diff changeset
370 if Match (Line, Get_Procsyn)
kono
parents:
diff changeset
371 and then not Present (Special, Synonym)
kono
parents:
diff changeset
372 then
kono
parents:
diff changeset
373 if not Present (Fields1, Synonym) then
kono
parents:
diff changeset
374 Put_Line
kono
parents:
diff changeset
375 ("procedure on line " & Lineno & " is for unused synonym");
kono
parents:
diff changeset
376 raise Done;
kono
parents:
diff changeset
377 end if;
kono
parents:
diff changeset
378
kono
parents:
diff changeset
379 Next_Line;
kono
parents:
diff changeset
380
kono
parents:
diff changeset
381 if not Match (Line, Extr_Field) then
kono
parents:
diff changeset
382 raise Err;
kono
parents:
diff changeset
383 end if;
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 if Field /= Get (Fields1, Synonym) then
kono
parents:
diff changeset
386 Put_Line ("Wrong field in procedure Set_" & Synonym);
kono
parents:
diff changeset
387 raise Done;
kono
parents:
diff changeset
388
kono
parents:
diff changeset
389 else
kono
parents:
diff changeset
390 Delete (Fields1, Synonym);
kono
parents:
diff changeset
391 end if;
kono
parents:
diff changeset
392 end if;
kono
parents:
diff changeset
393 end loop;
kono
parents:
diff changeset
394
kono
parents:
diff changeset
395 Put_Line (" OK");
kono
parents:
diff changeset
396 New_Line;
kono
parents:
diff changeset
397 Put_Line ("Check for missing set procedures");
kono
parents:
diff changeset
398
kono
parents:
diff changeset
399 declare
kono
parents:
diff changeset
400 List : constant TV.Table_Array := Convert_To_Array (Fields1);
kono
parents:
diff changeset
401
kono
parents:
diff changeset
402 begin
kono
parents:
diff changeset
403 if List'Length > 0 then
kono
parents:
diff changeset
404 Put_Line ("No procedure for field synonym Set_" & List (1).Name);
kono
parents:
diff changeset
405 raise Done;
kono
parents:
diff changeset
406 end if;
kono
parents:
diff changeset
407 end;
kono
parents:
diff changeset
408
kono
parents:
diff changeset
409 Put_Line (" OK");
kono
parents:
diff changeset
410 New_Line;
kono
parents:
diff changeset
411 Put_Line ("Check pragma Inlines are all for existing subprograms");
kono
parents:
diff changeset
412
kono
parents:
diff changeset
413 Clear (Fields1);
kono
parents:
diff changeset
414 while not End_Of_File (Infil) loop
kono
parents:
diff changeset
415 Next_Line;
kono
parents:
diff changeset
416
kono
parents:
diff changeset
417 if Match (Line, Get_Inline)
kono
parents:
diff changeset
418 and then not Present (Special, Name)
kono
parents:
diff changeset
419 then
kono
parents:
diff changeset
420 exit when Match (Name, Set_Name);
kono
parents:
diff changeset
421
kono
parents:
diff changeset
422 if not Present (Fields, Name) then
kono
parents:
diff changeset
423 Put_Line
kono
parents:
diff changeset
424 ("Pragma Inline on line " & Lineno &
kono
parents:
diff changeset
425 " does not correspond to synonym");
kono
parents:
diff changeset
426 raise Done;
kono
parents:
diff changeset
427
kono
parents:
diff changeset
428 else
kono
parents:
diff changeset
429 Set (Inlines, Name, Get (Inlines, Name) & 'r');
kono
parents:
diff changeset
430 end if;
kono
parents:
diff changeset
431 end if;
kono
parents:
diff changeset
432 end loop;
kono
parents:
diff changeset
433
kono
parents:
diff changeset
434 Put_Line (" OK");
kono
parents:
diff changeset
435 New_Line;
kono
parents:
diff changeset
436 Put_Line ("Check no pragma Inlines were omitted");
kono
parents:
diff changeset
437
kono
parents:
diff changeset
438 declare
kono
parents:
diff changeset
439 List : constant TV.Table_Array := Convert_To_Array (Fields);
kono
parents:
diff changeset
440 Nxt : VString := Nul;
kono
parents:
diff changeset
441
kono
parents:
diff changeset
442 begin
kono
parents:
diff changeset
443 for M in List'Range loop
kono
parents:
diff changeset
444 Nxt := List (M).Name;
kono
parents:
diff changeset
445
kono
parents:
diff changeset
446 if Get (Inlines, Nxt) /= "r" then
kono
parents:
diff changeset
447 Put_Line ("Incorrect pragma Inlines for " & Nxt);
kono
parents:
diff changeset
448 raise Done;
kono
parents:
diff changeset
449 end if;
kono
parents:
diff changeset
450 end loop;
kono
parents:
diff changeset
451 end;
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 Put_Line (" OK");
kono
parents:
diff changeset
454 New_Line;
kono
parents:
diff changeset
455 Clear (Inlines);
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 Close (Infil);
kono
parents:
diff changeset
458 Open (Infil, In_File, "sinfo.adb");
kono
parents:
diff changeset
459 Lineno := 0;
kono
parents:
diff changeset
460 Put_Line ("Check references in functions in body");
kono
parents:
diff changeset
461
kono
parents:
diff changeset
462 Refscopy := Refs;
kono
parents:
diff changeset
463 loop
kono
parents:
diff changeset
464 Next_Line;
kono
parents:
diff changeset
465 exit when Match (Line, " -- Field Access Functions --");
kono
parents:
diff changeset
466 end loop;
kono
parents:
diff changeset
467
kono
parents:
diff changeset
468 loop
kono
parents:
diff changeset
469 Next_Line;
kono
parents:
diff changeset
470 exit when Match (Line, " -- Field Set Procedures --");
kono
parents:
diff changeset
471
kono
parents:
diff changeset
472 if Match (Line, Func_Rest)
kono
parents:
diff changeset
473 and then not Present (Special, Synonym)
kono
parents:
diff changeset
474 then
kono
parents:
diff changeset
475 Ref := Get (Refs, Synonym);
kono
parents:
diff changeset
476 Delete (Refs, Synonym);
kono
parents:
diff changeset
477
kono
parents:
diff changeset
478 if Ref = "" then
kono
parents:
diff changeset
479 Put_Line
kono
parents:
diff changeset
480 ("Function on line " & Lineno & " is for unknown synonym");
kono
parents:
diff changeset
481 raise Err;
kono
parents:
diff changeset
482 end if;
kono
parents:
diff changeset
483
kono
parents:
diff changeset
484 -- Alpha sort of references for this entry
kono
parents:
diff changeset
485
kono
parents:
diff changeset
486 declare
kono
parents:
diff changeset
487 Refa : VStringA (1 .. 100);
kono
parents:
diff changeset
488 N : Natural := 0;
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 begin
kono
parents:
diff changeset
491 loop
kono
parents:
diff changeset
492 exit when not Match (Ref, Get_Nxtref, Nul);
kono
parents:
diff changeset
493 N := N + 1;
kono
parents:
diff changeset
494 Refa (N) := Nxtref;
kono
parents:
diff changeset
495 end loop;
kono
parents:
diff changeset
496
kono
parents:
diff changeset
497 Sort (Refa (1 .. N));
kono
parents:
diff changeset
498 Next_Line;
kono
parents:
diff changeset
499 Next_Line;
kono
parents:
diff changeset
500 Next_Line;
kono
parents:
diff changeset
501
kono
parents:
diff changeset
502 -- Checking references for one entry
kono
parents:
diff changeset
503
kono
parents:
diff changeset
504 for M in 1 .. N loop
kono
parents:
diff changeset
505 Next_Line;
kono
parents:
diff changeset
506
kono
parents:
diff changeset
507 if not Match (Line, Test_Syn) then
kono
parents:
diff changeset
508 Put_Line ("Expecting N_" & Refa (M) & " at line " & Lineno);
kono
parents:
diff changeset
509 raise Done;
kono
parents:
diff changeset
510 end if;
kono
parents:
diff changeset
511
kono
parents:
diff changeset
512 Match (Next, Chop_Comma);
kono
parents:
diff changeset
513
kono
parents:
diff changeset
514 if Next /= Refa (M) then
kono
parents:
diff changeset
515 Put_Line ("Expecting N_" & Refa (M) & " at line " & Lineno);
kono
parents:
diff changeset
516 raise Done;
kono
parents:
diff changeset
517 end if;
kono
parents:
diff changeset
518 end loop;
kono
parents:
diff changeset
519
kono
parents:
diff changeset
520 Next_Line;
kono
parents:
diff changeset
521 Match (Line, Return_Fld);
kono
parents:
diff changeset
522
kono
parents:
diff changeset
523 if Field /= Get (Fields, Synonym) then
kono
parents:
diff changeset
524 Put_Line
kono
parents:
diff changeset
525 ("Wrong field for function " & Synonym & " at line " &
kono
parents:
diff changeset
526 Lineno & " should be " & Get (Fields, Synonym));
kono
parents:
diff changeset
527 raise Done;
kono
parents:
diff changeset
528 end if;
kono
parents:
diff changeset
529 end;
kono
parents:
diff changeset
530 end if;
kono
parents:
diff changeset
531 end loop;
kono
parents:
diff changeset
532
kono
parents:
diff changeset
533 Put_Line (" OK");
kono
parents:
diff changeset
534 New_Line;
kono
parents:
diff changeset
535 Put_Line ("Check for missing functions in body");
kono
parents:
diff changeset
536
kono
parents:
diff changeset
537 declare
kono
parents:
diff changeset
538 List : constant TV.Table_Array := Convert_To_Array (Refs);
kono
parents:
diff changeset
539
kono
parents:
diff changeset
540 begin
kono
parents:
diff changeset
541 if List'Length /= 0 then
kono
parents:
diff changeset
542 Put_Line ("Missing function " & List (1).Name & " in body");
kono
parents:
diff changeset
543 raise Done;
kono
parents:
diff changeset
544 end if;
kono
parents:
diff changeset
545 end;
kono
parents:
diff changeset
546
kono
parents:
diff changeset
547 Put_Line (" OK");
kono
parents:
diff changeset
548 New_Line;
kono
parents:
diff changeset
549 Put_Line ("Check Set procedures in body");
kono
parents:
diff changeset
550 Refs := Refscopy;
kono
parents:
diff changeset
551
kono
parents:
diff changeset
552 loop
kono
parents:
diff changeset
553 Next_Line;
kono
parents:
diff changeset
554 exit when Match (Line, "end");
kono
parents:
diff changeset
555 exit when Match (Line, " -- Iterator Procedures");
kono
parents:
diff changeset
556
kono
parents:
diff changeset
557 if Match (Line, Set_Syn)
kono
parents:
diff changeset
558 and then not Present (Special, Synonym)
kono
parents:
diff changeset
559 then
kono
parents:
diff changeset
560 Ref := Get (Refs, Synonym);
kono
parents:
diff changeset
561 Delete (Refs, Synonym);
kono
parents:
diff changeset
562
kono
parents:
diff changeset
563 if Ref = "" then
kono
parents:
diff changeset
564 Put_Line
kono
parents:
diff changeset
565 ("Function on line " & Lineno & " is for unknown synonym");
kono
parents:
diff changeset
566 raise Err;
kono
parents:
diff changeset
567 end if;
kono
parents:
diff changeset
568
kono
parents:
diff changeset
569 -- Alpha sort of references for this entry
kono
parents:
diff changeset
570
kono
parents:
diff changeset
571 declare
kono
parents:
diff changeset
572 Refa : VStringA (1 .. 100);
kono
parents:
diff changeset
573 N : Natural;
kono
parents:
diff changeset
574
kono
parents:
diff changeset
575 begin
kono
parents:
diff changeset
576 N := 0;
kono
parents:
diff changeset
577
kono
parents:
diff changeset
578 loop
kono
parents:
diff changeset
579 exit when not Match (Ref, Get_Nxtref, Nul);
kono
parents:
diff changeset
580 N := N + 1;
kono
parents:
diff changeset
581 Refa (N) := Nxtref;
kono
parents:
diff changeset
582 end loop;
kono
parents:
diff changeset
583
kono
parents:
diff changeset
584 Sort (Refa (1 .. N));
kono
parents:
diff changeset
585
kono
parents:
diff changeset
586 Next_Line;
kono
parents:
diff changeset
587 Next_Line;
kono
parents:
diff changeset
588 Next_Line;
kono
parents:
diff changeset
589
kono
parents:
diff changeset
590 -- Checking references for one entry
kono
parents:
diff changeset
591
kono
parents:
diff changeset
592 for M in 1 .. N loop
kono
parents:
diff changeset
593 Next_Line;
kono
parents:
diff changeset
594
kono
parents:
diff changeset
595 if not Match (Line, Test_Syn)
kono
parents:
diff changeset
596 or else Next /= Refa (M)
kono
parents:
diff changeset
597 then
kono
parents:
diff changeset
598 Put_Line ("Expecting N_" & Refa (M) & " at line " & Lineno);
kono
parents:
diff changeset
599 raise Err;
kono
parents:
diff changeset
600 end if;
kono
parents:
diff changeset
601 end loop;
kono
parents:
diff changeset
602
kono
parents:
diff changeset
603 loop
kono
parents:
diff changeset
604 Next_Line;
kono
parents:
diff changeset
605 exit when Match (Line, Set_Fld);
kono
parents:
diff changeset
606 end loop;
kono
parents:
diff changeset
607
kono
parents:
diff changeset
608 Match (Field, Break_With);
kono
parents:
diff changeset
609
kono
parents:
diff changeset
610 if Field /= Get (Fields, Synonym) then
kono
parents:
diff changeset
611 Put_Line
kono
parents:
diff changeset
612 ("Wrong field for procedure Set_" & Synonym &
kono
parents:
diff changeset
613 " at line " & Lineno & " should be " &
kono
parents:
diff changeset
614 Get (Fields, Synonym));
kono
parents:
diff changeset
615 raise Done;
kono
parents:
diff changeset
616 end if;
kono
parents:
diff changeset
617
kono
parents:
diff changeset
618 Delete (Fields1, Synonym);
kono
parents:
diff changeset
619 end;
kono
parents:
diff changeset
620 end if;
kono
parents:
diff changeset
621 end loop;
kono
parents:
diff changeset
622
kono
parents:
diff changeset
623 Put_Line (" OK");
kono
parents:
diff changeset
624 New_Line;
kono
parents:
diff changeset
625 Put_Line ("Check for missing set procedures in body");
kono
parents:
diff changeset
626
kono
parents:
diff changeset
627 declare
kono
parents:
diff changeset
628 List : constant TV.Table_Array := Convert_To_Array (Fields1);
kono
parents:
diff changeset
629 begin
kono
parents:
diff changeset
630 if List'Length /= 0 then
kono
parents:
diff changeset
631 Put_Line ("Missing procedure Set_" & List (1).Name & " in body");
kono
parents:
diff changeset
632 raise Done;
kono
parents:
diff changeset
633 end if;
kono
parents:
diff changeset
634 end;
kono
parents:
diff changeset
635
kono
parents:
diff changeset
636 Put_Line (" OK");
kono
parents:
diff changeset
637 New_Line;
kono
parents:
diff changeset
638 Put_Line ("All tests completed successfully, no errors detected");
kono
parents:
diff changeset
639
kono
parents:
diff changeset
640 end CSinfo;