1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
5 -- S Y M B O L S . P R O C E S S I N G --
9 -- Copyright (C) 2003-2005 Free Software Foundation, Inc. --
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 2, 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 COPYING. If not, write --
19 -- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, --
20 -- Boston, MA 02110-1301, USA. --
22 -- GNAT was originally developed by the GNAT team at New York University. --
23 -- Extensive contributions were provided by Ada Core Technologies Inc. --
25 ------------------------------------------------------------------------------
27 -- This is the VMS Alpha version of this package
30 package body Processing
is
32 type Number
is mod 2**16;
33 -- 16 bits unsigned number for number of characters
35 GSD
: constant Number
:= 10;
36 -- Code for the Global Symbol Definition section
38 C_SYM
: constant Number
:= 1;
39 -- Code for a Symbol subsection
41 V_DEF_Mask
: constant Number
:= 2**1;
42 V_NORM_Mask
: constant Number
:= 2**6;
46 Number_Of_Characters
: Natural := 0;
47 -- The number of characters of each section
49 -- The following variables are used by procedure Process when reading an
53 Length
: Natural := 0;
57 Nchars
: Natural := 0;
60 Symbol
: String (1 .. 255);
63 procedure Get
(N
: out Number
);
64 -- Read two bytes from the object file LSB first as unsigned 16 bit number
66 procedure Get
(N
: out Natural);
67 -- Read two bytes from the object file, LSByte first, as a Natural
73 procedure Get
(N
: out Number
) is
78 LSByte
:= Byte
'Pos (C
);
80 N
:= LSByte
+ (256 * Byte
'Pos (C
));
83 procedure Get
(N
: out Natural) is
87 N
:= Natural (Result
);
95 (Object_File
: String;
96 Success
: out Boolean)
99 -- Open the object file with Byte_IO. Return with Success = False if
103 Open
(File
, In_File
, Object_File
);
107 ("*** Unable to open object file """ & Object_File
& """");
112 -- Assume that the object file has a correct format
116 -- Get the different sections one by one from the object file
118 while not End_Of_File
(File
) loop
121 Get
(Number_Of_Characters
);
122 Number_Of_Characters
:= Number_Of_Characters
- 4;
124 -- If this is not a Global Symbol Definition section, skip to the
129 for J
in 1 .. Number_Of_Characters
loop
135 -- Skip over the next 4 bytes
139 Number_Of_Characters
:= Number_Of_Characters
- 4;
141 -- Get each subsection in turn
148 Number_Of_Characters
:= Number_Of_Characters
- 8;
149 Nchars
:= Nchars
- 8;
151 -- If this is a symbol and the V_DEF flag is set, get the
154 if Code
= C_SYM
and then ((Flags
and V_DEF_Mask
) /= 0) then
155 -- First, reach the symbol length
157 for J
in 1 .. 25 loop
159 Nchars
:= Nchars
- 1;
160 Number_Of_Characters
:= Number_Of_Characters
- 1;
163 Length
:= Byte
'Pos (B
);
166 -- Get the symbol characters
168 for J
in 1 .. Nchars
loop
170 Number_Of_Characters
:= Number_Of_Characters
- 1;
174 Length
:= Length
- 1;
178 -- Create the new Symbol
181 S_Data
: Symbol_Data
;
183 S_Data
.Name
:= new String'(Symbol (1 .. LSymb));
185 -- The symbol kind (Data or Procedure) depends on the
188 if (Flags and V_NORM_Mask) = 0 then
195 -- Put the new symbol in the table
197 Symbol_Table.Increment_Last (Complete_Symbols);
198 Complete_Symbols.Table
199 (Symbol_Table.Last (Complete_Symbols)) := S_Data;
203 -- As it is not a symbol subsection, skip to the next
206 for J in 1 .. Nchars loop
208 Number_Of_Characters := Number_Of_Characters - 1;
212 -- Exit the GSD section when number of characters reaches 0
214 exit when Number_Of_Characters = 0;
219 -- The object file has been processed, close it
224 -- For any exception, output an error message, close the object file
225 -- and return with Success = False.
228 Put_Line ("unexpected exception raised while processing """
229 & Object_File & """");
230 Put_Line (Exception_Information (X));