fixing pr42337
[official-gcc.git] / gcc / ada / put_scos.adb
blobbca3f698815182c109aa3fc61bc9431cb87e5a23
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, exit
95 when 'S' | 'T' =>
96 Write_Info_Char (' ');
97 Output_Range (T);
99 -- Decision
101 when 'I' | 'E' | 'W' | 'X' =>
102 if T.C2 = ' ' then
103 Start := Start + 1;
104 end if;
106 -- Loop through table entries for this decision
108 loop
109 declare
110 T : SCO_Table_Entry renames SCO_Table.Table (Start);
112 begin
113 Write_Info_Char (' ');
115 if T.C1 = '!' or else
116 T.C1 = '^' or else
117 T.C1 = '&' or else
118 T.C1 = '|'
119 then
120 Write_Info_Char (T.C1);
122 else
123 Write_Info_Char (T.C2);
124 Output_Range (T);
125 end if;
127 exit when T.Last;
128 Start := Start + 1;
129 end;
130 end loop;
132 when others =>
133 raise Program_Error;
134 end case;
136 Write_Info_Terminate;
137 end Output_SCO_Line;
139 Start := Start + 1;
140 end loop;
141 end;
142 end loop;
143 end Put_SCOs;