]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/ada/symbols-processing-vms-alpha.adb
exp_atag.ads, [...]: Replace headers with GPL v3 headers.
[thirdparty/gcc.git] / gcc / ada / symbols-processing-vms-alpha.adb
1 ------------------------------------------------------------------------------
2 -- --
3 -- GNAT COMPILER COMPONENTS --
4 -- --
5 -- S Y M B O L S . P R O C E S S I N G --
6 -- --
7 -- B o d y --
8 -- --
9 -- Copyright (C) 2003-2007, 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 ------------------------------------------------------------------------------
25
26 -- This is the VMS Alpha version of this package
27
28 separate (Symbols)
29 package body Processing is
30
31 type Number is mod 2**16;
32 -- 16 bits unsigned number for number of characters
33
34 GSD : constant Number := 10;
35 -- Code for the Global Symbol Definition section
36
37 C_SYM : constant Number := 1;
38 -- Code for a Symbol subsection
39
40 V_DEF_Mask : constant Number := 2**1;
41 V_NORM_Mask : constant Number := 2**6;
42
43 B : Byte;
44
45 Number_Of_Characters : Natural := 0;
46 -- The number of characters of each section
47
48 -- The following variables are used by procedure Process when reading an
49 -- object file.
50
51 Code : Number := 0;
52 Length : Natural := 0;
53
54 Dummy : Number;
55
56 Nchars : Natural := 0;
57 Flags : Number := 0;
58
59 Symbol : String (1 .. 255);
60 LSymb : Natural;
61
62 procedure Get (N : out Number);
63 -- Read two bytes from the object file LSB first as unsigned 16 bit number
64
65 procedure Get (N : out Natural);
66 -- Read two bytes from the object file, LSByte first, as a Natural
67
68 ---------
69 -- Get --
70 ---------
71
72 procedure Get (N : out Number) is
73 C : Byte;
74 LSByte : Number;
75 begin
76 Read (File, C);
77 LSByte := Byte'Pos (C);
78 Read (File, C);
79 N := LSByte + (256 * Byte'Pos (C));
80 end Get;
81
82 procedure Get (N : out Natural) is
83 Result : Number;
84 begin
85 Get (Result);
86 N := Natural (Result);
87 end Get;
88
89 -------------
90 -- Process --
91 -------------
92
93 procedure Process
94 (Object_File : String;
95 Success : out Boolean)
96 is
97 OK : Boolean := True;
98
99 begin
100 -- Open the object file with Byte_IO. Return with Success = False if
101 -- this fails.
102
103 begin
104 Open (File, In_File, Object_File);
105 exception
106 when others =>
107 Put_Line
108 ("*** Unable to open object file """ & Object_File & """");
109 Success := False;
110 return;
111 end;
112
113 -- Assume that the object file has a correct format
114
115 Success := True;
116
117 -- Get the different sections one by one from the object file
118
119 while not End_Of_File (File) loop
120
121 Get (Code);
122 Get (Number_Of_Characters);
123 Number_Of_Characters := Number_Of_Characters - 4;
124
125 -- If this is not a Global Symbol Definition section, skip to the
126 -- next section.
127
128 if Code /= GSD then
129
130 for J in 1 .. Number_Of_Characters loop
131 Read (File, B);
132 end loop;
133
134 else
135
136 -- Skip over the next 4 bytes
137
138 Get (Dummy);
139 Get (Dummy);
140 Number_Of_Characters := Number_Of_Characters - 4;
141
142 -- Get each subsection in turn
143
144 loop
145 Get (Code);
146 Get (Nchars);
147 Get (Dummy);
148 Get (Flags);
149 Number_Of_Characters := Number_Of_Characters - 8;
150 Nchars := Nchars - 8;
151
152 -- If this is a symbol and the V_DEF flag is set, get the
153 -- symbol.
154
155 if Code = C_SYM and then ((Flags and V_DEF_Mask) /= 0) then
156 -- First, reach the symbol length
157
158 for J in 1 .. 25 loop
159 Read (File, B);
160 Nchars := Nchars - 1;
161 Number_Of_Characters := Number_Of_Characters - 1;
162 end loop;
163
164 Length := Byte'Pos (B);
165 LSymb := 0;
166
167 -- Get the symbol characters
168
169 for J in 1 .. Nchars loop
170 Read (File, B);
171 Number_Of_Characters := Number_Of_Characters - 1;
172 if Length > 0 then
173 LSymb := LSymb + 1;
174 Symbol (LSymb) := B;
175 Length := Length - 1;
176 end if;
177 end loop;
178
179 -- Check if it is a symbol from a generic body
180
181 OK := True;
182
183 for J in 1 .. LSymb - 2 loop
184 if Symbol (J) = 'G' and then Symbol (J + 1) = 'P'
185 and then Symbol (J + 2) in '0' .. '9'
186 then
187 OK := False;
188 exit;
189 end if;
190 end loop;
191
192 if OK then
193
194 -- Create the new Symbol
195
196 declare
197 S_Data : Symbol_Data;
198
199 begin
200 S_Data.Name := new String'(Symbol (1 .. LSymb));
201
202 -- The symbol kind (Data or Procedure) depends on the
203 -- V_NORM flag.
204
205 if (Flags and V_NORM_Mask) = 0 then
206 S_Data.Kind := Data;
207
208 else
209 S_Data.Kind := Proc;
210 end if;
211
212 -- Put the new symbol in the table
213
214 Symbol_Table.Append (Complete_Symbols, S_Data);
215 end;
216 end if;
217
218 else
219 -- As it is not a symbol subsection, skip to the next
220 -- subsection.
221
222 for J in 1 .. Nchars loop
223 Read (File, B);
224 Number_Of_Characters := Number_Of_Characters - 1;
225 end loop;
226 end if;
227
228 -- Exit the GSD section when number of characters reaches 0
229
230 exit when Number_Of_Characters = 0;
231 end loop;
232 end if;
233 end loop;
234
235 -- The object file has been processed, close it
236
237 Close (File);
238
239 exception
240 -- For any exception, output an error message, close the object file
241 -- and return with Success = False.
242
243 when X : others =>
244 Put_Line ("unexpected exception raised while processing """
245 & Object_File & """");
246 Put_Line (Exception_Information (X));
247 Close (File);
248 Success := False;
249 end Process;
250
251 end Processing;