annotate gcc/ada/spark_xrefs_test.adb @ 143:76e1cf5455ef

add cbc_gc test
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 23 Dec 2018 19:24:05 +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 SYSTEM UTILITIES --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- S P A R K _ X R E F S _ T E S T --
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-2013, 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 -- This utility program is used to test proper operation of the
kono
parents:
diff changeset
27 -- Get_SPARK_Xrefs and Put_SPARK_Xrefs units. To run it, compile any source
kono
parents:
diff changeset
28 -- file with switch -gnatd.E or -gnatd.F to get an ALI file file.ALI
kono
parents:
diff changeset
29 -- containing SPARK information. Then run this utility using:
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 -- spark_xrefs_test file.ali
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 -- This test will read the SPARK cross-reference information from the ALI
kono
parents:
diff changeset
34 -- file, and use Get_SPARK_Xrefs to store this in binary form in the internal
kono
parents:
diff changeset
35 -- tables in SPARK_Xrefs. Then Put_SPARK_Xrefs is used to write the
kono
parents:
diff changeset
36 -- information from these tables back into text form. This output is compared
kono
parents:
diff changeset
37 -- with the original SPARK cross-reference information in the ALI file and the
kono
parents:
diff changeset
38 -- two should be identical. If not an error message is output.
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 with Get_SPARK_Xrefs;
kono
parents:
diff changeset
41 with Put_SPARK_Xrefs;
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 with SPARK_Xrefs; use SPARK_Xrefs;
kono
parents:
diff changeset
44 with Types; use Types;
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 with Ada.Command_Line; use Ada.Command_Line;
kono
parents:
diff changeset
47 with Ada.Streams; use Ada.Streams;
kono
parents:
diff changeset
48 with Ada.Streams.Stream_IO; use Ada.Streams.Stream_IO;
kono
parents:
diff changeset
49 with Ada.Text_IO;
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 with GNAT.OS_Lib; use GNAT.OS_Lib;
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 procedure SPARK_Xrefs_Test is
kono
parents:
diff changeset
54 Infile : File_Type;
kono
parents:
diff changeset
55 Name1 : String_Access;
kono
parents:
diff changeset
56 Outfile_1 : File_Type;
kono
parents:
diff changeset
57 Name2 : String_Access;
kono
parents:
diff changeset
58 Outfile_2 : File_Type;
kono
parents:
diff changeset
59 C : Character;
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 Stop : exception;
kono
parents:
diff changeset
62 -- Terminate execution
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 Diff_Exec : constant String_Access := Locate_Exec_On_Path ("diff");
kono
parents:
diff changeset
65 Diff_Result : Integer;
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 use ASCII;
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 begin
kono
parents:
diff changeset
70 if Argument_Count /= 1 then
kono
parents:
diff changeset
71 Ada.Text_IO.Put_Line ("Usage: spark_xrefs_test FILE.ali");
kono
parents:
diff changeset
72 raise Stop;
kono
parents:
diff changeset
73 end if;
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 Name1 := new String'(Argument (1) & ".1");
kono
parents:
diff changeset
76 Name2 := new String'(Argument (1) & ".2");
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 Open (Infile, In_File, Argument (1));
kono
parents:
diff changeset
79 Create (Outfile_1, Out_File, Name1.all);
kono
parents:
diff changeset
80 Create (Outfile_2, Out_File, Name2.all);
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 -- Read input file till we get to first 'F' line
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 Process : declare
kono
parents:
diff changeset
85 Output_Col : Positive := 1;
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 function Get_Char (F : File_Type) return Character;
kono
parents:
diff changeset
88 -- Read one character from specified file
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 procedure Put_Char (F : File_Type; C : Character);
kono
parents:
diff changeset
91 -- Write one character to specified file
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 function Get_Output_Col return Positive;
kono
parents:
diff changeset
94 -- Return current column in output file, where each line starts at
kono
parents:
diff changeset
95 -- column 1 and terminate with LF, and HT is at columns 1, 9, etc.
kono
parents:
diff changeset
96 -- All output is supposed to be carried through Put_Char.
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 --------------
kono
parents:
diff changeset
99 -- Get_Char --
kono
parents:
diff changeset
100 --------------
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 function Get_Char (F : File_Type) return Character is
kono
parents:
diff changeset
103 Item : Stream_Element_Array (1 .. 1);
kono
parents:
diff changeset
104 Last : Stream_Element_Offset;
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 begin
kono
parents:
diff changeset
107 Read (F, Item, Last);
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 if Last /= 1 then
kono
parents:
diff changeset
110 return Types.EOF;
kono
parents:
diff changeset
111 else
kono
parents:
diff changeset
112 return Character'Val (Item (1));
kono
parents:
diff changeset
113 end if;
kono
parents:
diff changeset
114 end Get_Char;
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 --------------------
kono
parents:
diff changeset
117 -- Get_Output_Col --
kono
parents:
diff changeset
118 --------------------
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 function Get_Output_Col return Positive is
kono
parents:
diff changeset
121 begin
kono
parents:
diff changeset
122 return Output_Col;
kono
parents:
diff changeset
123 end Get_Output_Col;
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 --------------
kono
parents:
diff changeset
126 -- Put_Char --
kono
parents:
diff changeset
127 --------------
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 procedure Put_Char (F : File_Type; C : Character) is
kono
parents:
diff changeset
130 Item : Stream_Element_Array (1 .. 1);
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 begin
kono
parents:
diff changeset
133 if C /= CR and then C /= EOF then
kono
parents:
diff changeset
134 if C = LF then
kono
parents:
diff changeset
135 Output_Col := 1;
kono
parents:
diff changeset
136 elsif C = HT then
kono
parents:
diff changeset
137 Output_Col := ((Output_Col + 6) / 8) * 8 + 1;
kono
parents:
diff changeset
138 else
kono
parents:
diff changeset
139 Output_Col := Output_Col + 1;
kono
parents:
diff changeset
140 end if;
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 Item (1) := Character'Pos (C);
kono
parents:
diff changeset
143 Write (F, Item);
kono
parents:
diff changeset
144 end if;
kono
parents:
diff changeset
145 end Put_Char;
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 -- Subprograms used by Get_SPARK_Xrefs (these also copy the output to
kono
parents:
diff changeset
148 -- Outfile_1 for later comparison with the output generated by
kono
parents:
diff changeset
149 -- Put_SPARK_Xrefs).
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 function Getc return Character;
kono
parents:
diff changeset
152 function Nextc return Character;
kono
parents:
diff changeset
153 procedure Skipc;
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 ----------
kono
parents:
diff changeset
156 -- Getc --
kono
parents:
diff changeset
157 ----------
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 function Getc return Character is
kono
parents:
diff changeset
160 C : Character;
kono
parents:
diff changeset
161 begin
kono
parents:
diff changeset
162 C := Get_Char (Infile);
kono
parents:
diff changeset
163 Put_Char (Outfile_1, C);
kono
parents:
diff changeset
164 return C;
kono
parents:
diff changeset
165 end Getc;
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 -----------
kono
parents:
diff changeset
168 -- Nextc --
kono
parents:
diff changeset
169 -----------
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 function Nextc return Character is
kono
parents:
diff changeset
172 C : Character;
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 begin
kono
parents:
diff changeset
175 C := Get_Char (Infile);
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 if C /= EOF then
kono
parents:
diff changeset
178 Set_Index (Infile, Index (Infile) - 1);
kono
parents:
diff changeset
179 end if;
kono
parents:
diff changeset
180
kono
parents:
diff changeset
181 return C;
kono
parents:
diff changeset
182 end Nextc;
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 -----------
kono
parents:
diff changeset
185 -- Skipc --
kono
parents:
diff changeset
186 -----------
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 procedure Skipc is
kono
parents:
diff changeset
189 C : Character;
kono
parents:
diff changeset
190 pragma Unreferenced (C);
kono
parents:
diff changeset
191 begin
kono
parents:
diff changeset
192 C := Getc;
kono
parents:
diff changeset
193 end Skipc;
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 -- Subprograms used by Put_SPARK_Xrefs, which write information to
kono
parents:
diff changeset
196 -- Outfile_2.
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 function Write_Info_Col return Positive;
kono
parents:
diff changeset
199 procedure Write_Info_Char (C : Character);
kono
parents:
diff changeset
200 procedure Write_Info_Initiate (Key : Character);
kono
parents:
diff changeset
201 procedure Write_Info_Nat (N : Nat);
kono
parents:
diff changeset
202 procedure Write_Info_Terminate;
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 --------------------
kono
parents:
diff changeset
205 -- Write_Info_Col --
kono
parents:
diff changeset
206 --------------------
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 function Write_Info_Col return Positive is
kono
parents:
diff changeset
209 begin
kono
parents:
diff changeset
210 return Get_Output_Col;
kono
parents:
diff changeset
211 end Write_Info_Col;
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 ---------------------
kono
parents:
diff changeset
214 -- Write_Info_Char --
kono
parents:
diff changeset
215 ---------------------
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 procedure Write_Info_Char (C : Character) is
kono
parents:
diff changeset
218 begin
kono
parents:
diff changeset
219 Put_Char (Outfile_2, C);
kono
parents:
diff changeset
220 end Write_Info_Char;
kono
parents:
diff changeset
221
kono
parents:
diff changeset
222 -------------------------
kono
parents:
diff changeset
223 -- Write_Info_Initiate --
kono
parents:
diff changeset
224 -------------------------
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 procedure Write_Info_Initiate (Key : Character) is
kono
parents:
diff changeset
227 begin
kono
parents:
diff changeset
228 Write_Info_Char (Key);
kono
parents:
diff changeset
229 end Write_Info_Initiate;
kono
parents:
diff changeset
230
kono
parents:
diff changeset
231 --------------------
kono
parents:
diff changeset
232 -- Write_Info_Nat --
kono
parents:
diff changeset
233 --------------------
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 procedure Write_Info_Nat (N : Nat) is
kono
parents:
diff changeset
236 begin
kono
parents:
diff changeset
237 if N > 9 then
kono
parents:
diff changeset
238 Write_Info_Nat (N / 10);
kono
parents:
diff changeset
239 end if;
kono
parents:
diff changeset
240
kono
parents:
diff changeset
241 Write_Info_Char (Character'Val (48 + N mod 10));
kono
parents:
diff changeset
242 end Write_Info_Nat;
kono
parents:
diff changeset
243
kono
parents:
diff changeset
244 --------------------------
kono
parents:
diff changeset
245 -- Write_Info_Terminate --
kono
parents:
diff changeset
246 --------------------------
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 procedure Write_Info_Terminate is
kono
parents:
diff changeset
249 begin
kono
parents:
diff changeset
250 Write_Info_Char (LF);
kono
parents:
diff changeset
251 end Write_Info_Terminate;
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 -- Local instantiations of Put_SPARK_Xrefs and Get_SPARK_Xrefs
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 procedure Get_SPARK_Xrefs_Info is new Get_SPARK_Xrefs;
kono
parents:
diff changeset
256 procedure Put_SPARK_Xrefs_Info is new Put_SPARK_Xrefs;
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 -- Start of processing for Process
kono
parents:
diff changeset
259
kono
parents:
diff changeset
260 begin
kono
parents:
diff changeset
261 -- Loop to skip till first 'F' line
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 loop
kono
parents:
diff changeset
264 C := Get_Char (Infile);
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 if C = EOF then
kono
parents:
diff changeset
267 raise Stop;
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 elsif C = LF or else C = CR then
kono
parents:
diff changeset
270 loop
kono
parents:
diff changeset
271 C := Get_Char (Infile);
kono
parents:
diff changeset
272 exit when C /= LF and then C /= CR;
kono
parents:
diff changeset
273 end loop;
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 exit when C = 'F';
kono
parents:
diff changeset
276 end if;
kono
parents:
diff changeset
277 end loop;
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 -- Position back to initial 'F' of first 'F' line
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 Set_Index (Infile, Index (Infile) - 1);
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 -- Read SPARK cross-reference information to internal SPARK tables, also
kono
parents:
diff changeset
284 -- copying SPARK xrefs info to Outfile_1.
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 Initialize_SPARK_Tables;
kono
parents:
diff changeset
287 Get_SPARK_Xrefs_Info;
kono
parents:
diff changeset
288
kono
parents:
diff changeset
289 -- Write SPARK cross-reference information from internal SPARK tables to
kono
parents:
diff changeset
290 -- Outfile_2.
kono
parents:
diff changeset
291
kono
parents:
diff changeset
292 Put_SPARK_Xrefs_Info;
kono
parents:
diff changeset
293
kono
parents:
diff changeset
294 -- Junk blank line (see comment at end of Lib.Writ)
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 Write_Info_Terminate;
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 -- Flush to disk
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 Close (Outfile_1);
kono
parents:
diff changeset
301 Close (Outfile_2);
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 -- Now Outfile_1 and Outfile_2 should be identical
kono
parents:
diff changeset
304
kono
parents:
diff changeset
305 Diff_Result :=
kono
parents:
diff changeset
306 Spawn (Diff_Exec.all,
kono
parents:
diff changeset
307 Argument_String_To_List
kono
parents:
diff changeset
308 ("-u " & Name1.all & " " & Name2.all).all);
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 if Diff_Result /= 0 then
kono
parents:
diff changeset
311 Ada.Text_IO.Put_Line ("diff(1) exit status" & Diff_Result'Img);
kono
parents:
diff changeset
312 end if;
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 OS_Exit (Diff_Result);
kono
parents:
diff changeset
315
kono
parents:
diff changeset
316 end Process;
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 exception
kono
parents:
diff changeset
319 when Stop =>
kono
parents:
diff changeset
320 null;
kono
parents:
diff changeset
321 end SPARK_Xrefs_Test;