gcc/
[official-gcc.git] / gcc / ada / put_scos.adb
blob39b6288520e74bd58227c5ca138fd0696276e471
1 ------------------------------------------------------------------------------
2 -- --
3 -- GNAT COMPILER COMPONENTS --
4 -- --
5 -- P U T _ S C O S --
6 -- --
7 -- B o d y --
8 -- --
9 -- Copyright (C) 2009, Free Software Foundation, Inc. --
10 -- --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
17 -- for more details. You should have received a copy of the GNU General --
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
20 -- --
21 -- GNAT was originally developed by the GNAT team at New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
23 -- --
24 ------------------------------------------------------------------------------
26 with SCOs; use SCOs;
28 procedure Put_SCOs is
29 begin
30 -- Loop through entries in SCO_Unit_Table
32 for U in 1 .. SCO_Unit_Table.Last loop
33 declare
34 SUT : SCO_Unit_Table_Entry renames SCO_Unit_Table.Table (U);
36 Start : Nat;
37 Stop : Nat;
39 begin
40 Start := SUT.From;
41 Stop := SUT.To;
43 -- Write unit header (omitted if no SCOs are generated for this unit)
45 if Start <= Stop then
46 Write_Info_Initiate ('C');
47 Write_Info_Char (' ');
48 Write_Info_Nat (SUT.Dep_Num);
49 Write_Info_Char (' ');
51 for N in SUT.File_Name'Range loop
52 Write_Info_Char (SUT.File_Name (N));
53 end loop;
55 Write_Info_Terminate;
56 end if;
58 -- Loop through SCO entries for this unit
60 loop
61 exit when Start = Stop + 1;
62 pragma Assert (Start <= Stop);
64 Output_SCO_Line : declare
65 T : SCO_Table_Entry renames SCO_Table.Table (Start);
67 procedure Output_Range (T : SCO_Table_Entry);
68 -- Outputs T.From and T.To in line:col-line:col format
70 ------------------
71 -- Output_Range --
72 ------------------
74 procedure Output_Range (T : SCO_Table_Entry) is
75 begin
76 Write_Info_Nat (Nat (T.From.Line));
77 Write_Info_Char (':');
78 Write_Info_Nat (Nat (T.From.Col));
79 Write_Info_Char ('-');
80 Write_Info_Nat (Nat (T.To.Line));
81 Write_Info_Char (':');
82 Write_Info_Nat (Nat (T.To.Col));
83 end Output_Range;
85 -- Start of processing for Output_SCO_Line
87 begin
88 Write_Info_Initiate ('C');
89 Write_Info_Char (T.C1);
91 case T.C1 is
93 -- Statements
95 when 'S' =>
96 loop
97 Write_Info_Char (' ');
99 if SCO_Table.Table (Start).C2 /= ' ' then
100 Write_Info_Char (SCO_Table.Table (Start).C2);
101 end if;
103 Output_Range (SCO_Table.Table (Start));
104 exit when SCO_Table.Table (Start).Last;
106 Start := Start + 1;
107 pragma Assert (SCO_Table.Table (Start).C1 = 's');
108 end loop;
110 -- Statement continuations should not occur since they
111 -- are supposed to have been handled in the loop above.
113 when 's' =>
114 raise Program_Error;
116 -- Decision
118 when 'I' | 'E' | 'P' | 'W' | 'X' =>
119 if T.C2 = ' ' then
120 Start := Start + 1;
121 end if;
123 -- Loop through table entries for this decision
125 loop
126 declare
127 T : SCO_Table_Entry renames SCO_Table.Table (Start);
129 begin
130 Write_Info_Char (' ');
132 if T.C1 = '!' or else
133 T.C1 = '^' or else
134 T.C1 = '&' or else
135 T.C1 = '|'
136 then
137 Write_Info_Char (T.C1);
139 else
140 Write_Info_Char (T.C2);
141 Output_Range (T);
142 end if;
144 exit when T.Last;
145 Start := Start + 1;
146 end;
147 end loop;
149 when others =>
150 raise Program_Error;
151 end case;
153 Write_Info_Terminate;
154 end Output_SCO_Line;
156 Start := Start + 1;
157 end loop;
158 end;
159 end loop;
160 end Put_SCOs;