1 |
281 |
jeremybenn |
------------------------------------------------------------------------------
|
2 |
|
|
-- --
|
3 |
|
|
-- GNAT COMPILER COMPONENTS --
|
4 |
|
|
-- --
|
5 |
|
|
-- L I B --
|
6 |
|
|
-- --
|
7 |
|
|
-- S p e c --
|
8 |
|
|
-- --
|
9 |
|
|
-- Copyright (C) 1992-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. --
|
17 |
|
|
-- --
|
18 |
|
|
-- As a special exception under Section 7 of GPL version 3, you are granted --
|
19 |
|
|
-- additional permissions described in the GCC Runtime Library Exception, --
|
20 |
|
|
-- version 3.1, as published by the Free Software Foundation. --
|
21 |
|
|
-- --
|
22 |
|
|
-- You should have received a copy of the GNU General Public License and --
|
23 |
|
|
-- a copy of the GCC Runtime Library Exception along with this program; --
|
24 |
|
|
-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
|
25 |
|
|
-- <http://www.gnu.org/licenses/>. --
|
26 |
|
|
-- --
|
27 |
|
|
-- GNAT was originally developed by the GNAT team at New York University. --
|
28 |
|
|
-- Extensive contributions were provided by Ada Core Technologies Inc. --
|
29 |
|
|
-- --
|
30 |
|
|
------------------------------------------------------------------------------
|
31 |
|
|
|
32 |
|
|
-- This package contains routines for accessing and outputting the library
|
33 |
|
|
-- information. It contains the routine to load subsidiary units.
|
34 |
|
|
|
35 |
|
|
with Alloc;
|
36 |
|
|
with Namet; use Namet;
|
37 |
|
|
with Table;
|
38 |
|
|
with Types; use Types;
|
39 |
|
|
|
40 |
|
|
package Lib is
|
41 |
|
|
|
42 |
|
|
--------------------------------------------
|
43 |
|
|
-- General Approach to Library Management --
|
44 |
|
|
--------------------------------------------
|
45 |
|
|
|
46 |
|
|
-- As described in GNote #1, when a unit is compiled, all its subsidiary
|
47 |
|
|
-- units are recompiled, including the following:
|
48 |
|
|
|
49 |
|
|
-- (a) Corresponding spec for a body
|
50 |
|
|
-- (b) Parent spec of a child library spec
|
51 |
|
|
-- (d) With'ed specs
|
52 |
|
|
-- (d) Parent body of a subunit
|
53 |
|
|
-- (e) Subunits corresponding to any specified stubs
|
54 |
|
|
-- (f) Bodies of inlined subprograms that are called
|
55 |
|
|
-- (g) Bodies of generic subprograms or packages that are instantiated
|
56 |
|
|
-- (h) Bodies of packages containing either of the above two items
|
57 |
|
|
-- (i) Specs and bodies of runtime units
|
58 |
|
|
-- (j) Parent specs for with'ed child library units
|
59 |
|
|
|
60 |
|
|
-- If a unit is being compiled only for syntax checking, then no subsidiary
|
61 |
|
|
-- units are loaded, the syntax check applies only to the main unit,
|
62 |
|
|
-- i.e. the one contained in the source submitted to the library.
|
63 |
|
|
|
64 |
|
|
-- If a unit is being compiled for syntax and semantic checking, then only
|
65 |
|
|
-- cases (a)-(d) loads are performed, since the full semantic checking can
|
66 |
|
|
-- be carried out without needing (e)-(i) loads. In this case no object
|
67 |
|
|
-- file, or library information file, is generated, so the missing units
|
68 |
|
|
-- do not affect the results.
|
69 |
|
|
|
70 |
|
|
-- Specifications of library subprograms, subunits, and generic specs
|
71 |
|
|
-- and bodies, can only be compiled in syntax/semantic checking mode,
|
72 |
|
|
-- since no code is ever generated directly for these units. In the case
|
73 |
|
|
-- of subunits, only the compilation of the ultimate parent unit generates
|
74 |
|
|
-- actual code. If a subunit is submitted to the compiler in syntax/
|
75 |
|
|
-- semantic checking mode, the parent (or parents in the nested case) are
|
76 |
|
|
-- semantically checked only up to the point of the corresponding stub.
|
77 |
|
|
|
78 |
|
|
-- If code is being generated, then all the above units are required,
|
79 |
|
|
-- although the need for bodies of inlined procedures can be suppressed
|
80 |
|
|
-- by the use of a switch that sets the mode to ignore pragma Inline
|
81 |
|
|
-- statements.
|
82 |
|
|
|
83 |
|
|
-- The two main sections of the front end, Par and Sem, are recursive.
|
84 |
|
|
-- Compilation proceeds unit by unit making recursive calls as necessary.
|
85 |
|
|
-- The process is controlled from the GNAT main program, which makes calls
|
86 |
|
|
-- to Par and Sem sequence for the main unit.
|
87 |
|
|
|
88 |
|
|
-- Par parses the given unit, and then, after the parse is complete, uses
|
89 |
|
|
-- the Par.Load subprogram to load all its subsidiary units in categories
|
90 |
|
|
-- (a)-(d) above, installing pointers to the loaded units in the parse
|
91 |
|
|
-- tree, as described in a later section of this spec. If any of these
|
92 |
|
|
-- required units is missing, a fatal error is signalled, so that no
|
93 |
|
|
-- attempt is made to run Sem in such cases, since it is assumed that
|
94 |
|
|
-- too many cascaded errors would result, and the confusion would not
|
95 |
|
|
-- be helpful.
|
96 |
|
|
|
97 |
|
|
-- Following the call to Par on the main unit, the entire tree of required
|
98 |
|
|
-- units is thus loaded, and Sem is called on the main unit. The parameter
|
99 |
|
|
-- passed to Sem is the unit to be analyzed. The visibility table, which
|
100 |
|
|
-- is a single global structure, starts out containing only the entries
|
101 |
|
|
-- for the visible entities in Standard. Every call to Sem establishes a
|
102 |
|
|
-- new scope stack table, pushing an entry for Standard on entry to provide
|
103 |
|
|
-- the proper initial scope environment.
|
104 |
|
|
|
105 |
|
|
-- Sem first proceeds to perform semantic analysis on the currently loaded
|
106 |
|
|
-- units as follows:
|
107 |
|
|
|
108 |
|
|
-- In the case of a body (case (a) above), Sem analyzes the corresponding
|
109 |
|
|
-- spec, using a recursive call to Sem. As is always expected to be the
|
110 |
|
|
-- case with calls to Sem, any entities installed in the visibility table
|
111 |
|
|
-- are removed on exit from Sem, so that these entities have to be
|
112 |
|
|
-- reinstalled on return to continue the analysis of the body which of
|
113 |
|
|
-- course needs visibility of these entities.
|
114 |
|
|
--
|
115 |
|
|
-- In the case of the parent of a child spec (case (b) above), a similar
|
116 |
|
|
-- call is made to Sem to analyze the parent. Again, on return, the
|
117 |
|
|
-- entities from the analyzed parent spec have to be installed in the
|
118 |
|
|
-- visibility table of the caller (the child unit), which must have
|
119 |
|
|
-- visibility to the entities in its parent spec.
|
120 |
|
|
|
121 |
|
|
-- For with'ed specs (case (c) above), a recursive call to Sem is made
|
122 |
|
|
-- to analyze each spec in turn. After all the spec's have been analyzed,
|
123 |
|
|
-- but not till that point, the entities from all the with'ed units are
|
124 |
|
|
-- reinstalled in the visibility table so that the caller can proceed
|
125 |
|
|
-- with the analysis of the unit doing the with's with the necessary
|
126 |
|
|
-- entities made either potentially use visible or visible by selection
|
127 |
|
|
-- as needed.
|
128 |
|
|
|
129 |
|
|
-- Case (d) arises when Sem is passed a subunit to analyze. This means
|
130 |
|
|
-- that the main unit is a subunit, and the unit passed to Sem is either
|
131 |
|
|
-- the main unit, or one of its ancestors that is still a subunit. Since
|
132 |
|
|
-- analysis must start at the top of the tree, Sem essentially cancels
|
133 |
|
|
-- the current call by immediately making a call to analyze the parent
|
134 |
|
|
-- (when this call is finished it immediately returns, so logically this
|
135 |
|
|
-- call is like a goto). The subunit will then be analyzed at the proper
|
136 |
|
|
-- time as described for the stub case. Note that we also turn off the
|
137 |
|
|
-- indication that code should be generated in this case, since the only
|
138 |
|
|
-- time we generate code for subunits is when compiling the main parent.
|
139 |
|
|
|
140 |
|
|
-- Case (e), subunits corresponding to stubs, are handled as the stubs
|
141 |
|
|
-- are encountered. There are three sub-cases:
|
142 |
|
|
|
143 |
|
|
-- If the subunit has already been loaded, then this means that the
|
144 |
|
|
-- main unit was a subunit, and we are back on our way down to it
|
145 |
|
|
-- after following the initial processing described for case (d).
|
146 |
|
|
-- In this case we analyze this particular subunit, as described
|
147 |
|
|
-- for the case where we are generating code, but when we get back
|
148 |
|
|
-- we are all done, since the rest of the parent is irrelevant. To
|
149 |
|
|
-- get out of the parent, we raise the exception Subunit_Found, which
|
150 |
|
|
-- is handled at the outer level of Sem.
|
151 |
|
|
|
152 |
|
|
-- The cases where the subunit has not already been loaded correspond
|
153 |
|
|
-- to cases where the main unit was a parent. In this case the action
|
154 |
|
|
-- depends on whether or not we are generating code. If we are not
|
155 |
|
|
-- generating code, then this is the case where we can simply ignore
|
156 |
|
|
-- the subunit, since in checking mode we don't even want to insist
|
157 |
|
|
-- that the subunit exist, much less waste time checking it.
|
158 |
|
|
|
159 |
|
|
-- If we are generating code, then we need to load and analyze
|
160 |
|
|
-- all subunits. This is achieved with a call to Lib.Load to load
|
161 |
|
|
-- and parse the unit, followed by processing that installs the
|
162 |
|
|
-- context clause of the subunit, analyzes the subunit, and then
|
163 |
|
|
-- removes the context clause (from the visibility chains of the
|
164 |
|
|
-- parent). Note that we do *not* do a recursive call to Sem in
|
165 |
|
|
-- this case, precisely because we need to do the analysis of the
|
166 |
|
|
-- subunit with the current visibility table and scope stack.
|
167 |
|
|
|
168 |
|
|
-- Case (f) applies only to subprograms for which a pragma Inline is
|
169 |
|
|
-- given, providing that the compiler is operating in the mode where
|
170 |
|
|
-- pragma Inline's are activated. When the expander encounters a call
|
171 |
|
|
-- to such a subprogram, it loads the body of the subprogram if it has
|
172 |
|
|
-- not already been loaded, and calls Sem to process it.
|
173 |
|
|
|
174 |
|
|
-- Case (g) is similar to case (f), except that the body of a generic
|
175 |
|
|
-- is unconditionally required, regardless of compiler mode settings.
|
176 |
|
|
-- As in the subprogram case, when the expander encounters a generic
|
177 |
|
|
-- instantiation, it loads the generic body of the subprogram if it
|
178 |
|
|
-- has not already been loaded, and calls Sem to process it.
|
179 |
|
|
|
180 |
|
|
-- Case (h) arises when a package contains either an inlined subprogram
|
181 |
|
|
-- which is called, or a generic which is instantiated. In this case the
|
182 |
|
|
-- body of the package must be loaded and analyzed with a call to Sem.
|
183 |
|
|
|
184 |
|
|
-- Case (i) is handled by adding implicit with clauses to the context
|
185 |
|
|
-- clauses of all units that potentially reference the relevant runtime
|
186 |
|
|
-- entities. Note that since we have the full set of units available,
|
187 |
|
|
-- the parser can always determine the set of runtime units that is
|
188 |
|
|
-- needed. These with clauses do not have associated use clauses, so
|
189 |
|
|
-- all references to the entities must be by selection. Once the with
|
190 |
|
|
-- clauses have been added, subsequent processing is as for normal
|
191 |
|
|
-- with clauses.
|
192 |
|
|
|
193 |
|
|
-- Case (j) is also handled by adding appropriate implicit with clauses
|
194 |
|
|
-- to any unit that withs a child unit. Again there is no use clause,
|
195 |
|
|
-- and subsequent processing proceeds as for an explicit with clause.
|
196 |
|
|
|
197 |
|
|
-- Sem thus completes the loading of all required units, except those
|
198 |
|
|
-- required for inline subprogram bodies or inlined generics. If any
|
199 |
|
|
-- of these load attempts fails, then the expander will not be called,
|
200 |
|
|
-- even if code was to be generated. If the load attempts all succeed
|
201 |
|
|
-- then the expander is called, though the attempt to generate code may
|
202 |
|
|
-- still fail if an error occurs during a load attempt for an inlined
|
203 |
|
|
-- body or a generic body.
|
204 |
|
|
|
205 |
|
|
-------------------------------------------
|
206 |
|
|
-- Special Handling of Subprogram Bodies --
|
207 |
|
|
-------------------------------------------
|
208 |
|
|
|
209 |
|
|
-- A subprogram body (in an adb file) may stand for both a spec and a body.
|
210 |
|
|
-- A simple model (and one that was adopted through version 2.07) is simply
|
211 |
|
|
-- to assume that such an adb file acts as its own spec if no ads file is
|
212 |
|
|
-- is present.
|
213 |
|
|
|
214 |
|
|
-- However, this is not correct. RM 10.1.4(4) requires that such a body
|
215 |
|
|
-- act as a spec unless a subprogram declaration of the same name is
|
216 |
|
|
-- already present. The correct interpretation of this in GNAT library
|
217 |
|
|
-- terms is to ignore an existing ads file of the same name unless this
|
218 |
|
|
-- ads file contains a subprogram declaration with the same name.
|
219 |
|
|
|
220 |
|
|
-- If there is an ads file with a unit other than a subprogram declaration
|
221 |
|
|
-- with the same name, then a fatal message is output, noting that this
|
222 |
|
|
-- irrelevant file must be deleted before the body can be compiled. See
|
223 |
|
|
-- ACVC test CA1020D to see how this processing is required.
|
224 |
|
|
|
225 |
|
|
-----------------
|
226 |
|
|
-- Global Data --
|
227 |
|
|
-----------------
|
228 |
|
|
|
229 |
|
|
Current_Sem_Unit : Unit_Number_Type := Main_Unit;
|
230 |
|
|
-- Unit number of unit currently being analyzed/expanded. This is set when
|
231 |
|
|
-- ever a new unit is entered, saving and restoring the old value, so that
|
232 |
|
|
-- it always reflects the unit currently being analyzed. The initial value
|
233 |
|
|
-- of Main_Unit ensures that a proper value is set initially, and in
|
234 |
|
|
-- particular for analysis of configuration pragmas in gnat.adc.
|
235 |
|
|
|
236 |
|
|
Main_Unit_Entity : Entity_Id;
|
237 |
|
|
-- Entity of main unit, same as Cunit_Entity (Main_Unit) except where
|
238 |
|
|
-- Main_Unit is a body with a separate spec, in which case it is the
|
239 |
|
|
-- entity for the spec.
|
240 |
|
|
|
241 |
|
|
-----------------
|
242 |
|
|
-- Units Table --
|
243 |
|
|
-----------------
|
244 |
|
|
|
245 |
|
|
-- The units table has an entry for each unit (source file) read in by the
|
246 |
|
|
-- current compilation. The table is indexed by the unit number value,
|
247 |
|
|
-- The first entry in the table, subscript Main_Unit, is for the main file.
|
248 |
|
|
-- Each entry in this units table contains the following data.
|
249 |
|
|
|
250 |
|
|
-- Unit_File_Name
|
251 |
|
|
-- The name of the source file containing the unit. Set when the entry
|
252 |
|
|
-- is created by a call to Lib.Load, and then cannot be changed.
|
253 |
|
|
|
254 |
|
|
-- Source_Index
|
255 |
|
|
-- The index in the source file table of the corresponding source file.
|
256 |
|
|
-- Set when the entry is created by a call to Lib.Load and then cannot
|
257 |
|
|
-- be changed.
|
258 |
|
|
|
259 |
|
|
-- Munit_Index
|
260 |
|
|
-- The index of the unit within the file for multiple unit per file
|
261 |
|
|
-- mode. Set to zero in normal single unit per file mode.
|
262 |
|
|
|
263 |
|
|
-- Error_Location
|
264 |
|
|
-- This is copied from the Sloc field of the Enode argument passed
|
265 |
|
|
-- to Load_Unit. It refers to the enclosing construct which caused
|
266 |
|
|
-- this unit to be loaded, e.g. most typically the with clause that
|
267 |
|
|
-- referenced the unit, and is used for error handling in Par.Load.
|
268 |
|
|
|
269 |
|
|
-- Expected_Unit
|
270 |
|
|
-- This is the expected unit name for a file other than the main unit,
|
271 |
|
|
-- since these are cases where we load the unit using Lib.Load and we
|
272 |
|
|
-- know the unit that is expected. It must be the same as Unit_Name
|
273 |
|
|
-- if it is set (see test in Par.Load). Expected_Unit is set to
|
274 |
|
|
-- No_Name for the main unit.
|
275 |
|
|
|
276 |
|
|
-- Unit_Name
|
277 |
|
|
-- The name of the unit. Initialized to No_Name by Lib.Load, and then
|
278 |
|
|
-- set by the parser when the unit is parsed to the unit name actually
|
279 |
|
|
-- found in the file (which should, in the absence of errors) be the
|
280 |
|
|
-- same name as Expected_Unit.
|
281 |
|
|
|
282 |
|
|
-- Cunit
|
283 |
|
|
-- Pointer to the N_Compilation_Unit node. Initially set to Empty by
|
284 |
|
|
-- Lib.Load, and then reset to the required node by the parser when
|
285 |
|
|
-- the unit is parsed.
|
286 |
|
|
|
287 |
|
|
-- Cunit_Entity
|
288 |
|
|
-- Pointer to the entity node for the compilation unit. Initially set
|
289 |
|
|
-- to Empty by Lib.Load, and then reset to the required entity by the
|
290 |
|
|
-- parser when the unit is parsed.
|
291 |
|
|
|
292 |
|
|
-- Dependency_Num
|
293 |
|
|
-- This is the number of the unit within the generated dependency
|
294 |
|
|
-- lines (D lines in the ALI file) which are sorted into alphabetical
|
295 |
|
|
-- order. The number is ones origin, so a value of 2 refers to the
|
296 |
|
|
-- second generated D line. The Dependency_Number values are set
|
297 |
|
|
-- as the D lines are generated, and are used to generate proper
|
298 |
|
|
-- unit references in the generated xref information and SCO output.
|
299 |
|
|
|
300 |
|
|
-- Dynamic_Elab
|
301 |
|
|
-- A flag indicating if this unit was compiled with dynamic elaboration
|
302 |
|
|
-- checks specified (as the result of using the -gnatE compilation
|
303 |
|
|
-- option or a pragma Elaboration_Checks (Dynamic).
|
304 |
|
|
|
305 |
|
|
-- Fatal_Error
|
306 |
|
|
-- A flag that is initialized to False, and gets set to True if a fatal
|
307 |
|
|
-- error occurs during the processing of a unit. A fatal error is one
|
308 |
|
|
-- defined as serious enough to stop the next phase of the compiler
|
309 |
|
|
-- from running (i.e. fatal error during parsing stops semantics,
|
310 |
|
|
-- fatal error during semantics stops code generation). Note that
|
311 |
|
|
-- currently, errors of any kind cause Fatal_Error to be set, but
|
312 |
|
|
-- eventually perhaps only errors labeled as Fatal_Errors should be
|
313 |
|
|
-- this severe if we decide to try Sem on sources with minor errors.
|
314 |
|
|
|
315 |
|
|
-- Generate_Code
|
316 |
|
|
-- This flag is set True for all units in the current file for which
|
317 |
|
|
-- code is to be generated. This includes the unit explicitly compiled,
|
318 |
|
|
-- together with its specification, and any subunits.
|
319 |
|
|
|
320 |
|
|
-- Has_RACW
|
321 |
|
|
-- A Boolean flag, initially set to False when a unit entry is created,
|
322 |
|
|
-- and set to True if the unit defines a remote access to class wide
|
323 |
|
|
-- (RACW) object. This is used for controlling generation of the RA
|
324 |
|
|
-- attribute in the ali file.
|
325 |
|
|
|
326 |
|
|
-- Is_Compiler_Unit
|
327 |
|
|
-- A Boolean flag, initially set False by default, set to True if a
|
328 |
|
|
-- pragma Compiler_Unit appears in the unit.
|
329 |
|
|
|
330 |
|
|
-- Ident_String
|
331 |
|
|
-- N_String_Literal node from a valid pragma Ident that applies to
|
332 |
|
|
-- this unit. If no Ident pragma applies to the unit, then Empty.
|
333 |
|
|
|
334 |
|
|
-- Loading
|
335 |
|
|
-- A flag that is used to catch circular WITH dependencies. It is set
|
336 |
|
|
-- True when an entry is initially created in the file table, and set
|
337 |
|
|
-- False when the load is completed, or ends with an error.
|
338 |
|
|
|
339 |
|
|
-- Main_Priority
|
340 |
|
|
-- This field is used to indicate the priority of a possible main
|
341 |
|
|
-- program, as set by a pragma Priority. A value of -1 indicates
|
342 |
|
|
-- that the default priority is to be used (and is also used for
|
343 |
|
|
-- entries that do not correspond to possible main programs).
|
344 |
|
|
|
345 |
|
|
-- OA_Setting
|
346 |
|
|
-- This is a character field containing L if Optimize_Alignment mode
|
347 |
|
|
-- was set locally, and O/T/S for Off/Time/Space default if not.
|
348 |
|
|
|
349 |
|
|
-- Serial_Number
|
350 |
|
|
-- This field holds a serial number used by New_Internal_Name to
|
351 |
|
|
-- generate unique temporary numbers on a unit by unit basis. The
|
352 |
|
|
-- only access to this field is via the Increment_Serial_Number
|
353 |
|
|
-- routine which increments the current value and returns it. This
|
354 |
|
|
-- serial number is separate for each unit.
|
355 |
|
|
|
356 |
|
|
-- Version
|
357 |
|
|
-- This field holds the version of the unit, which is computed as
|
358 |
|
|
-- the exclusive or of the checksums of this unit, and all its
|
359 |
|
|
-- semantically dependent units. Access to the version number field
|
360 |
|
|
-- is not direct, but is done through the routines described below.
|
361 |
|
|
-- When a unit table entry is created, this field is initialized to
|
362 |
|
|
-- the checksum of the corresponding source file. Version_Update is
|
363 |
|
|
-- then called to reflect the contributions of any unit on which this
|
364 |
|
|
-- unit is semantically dependent.
|
365 |
|
|
|
366 |
|
|
-- The units table is reset to empty at the start of the compilation of
|
367 |
|
|
-- each main unit by Lib.Initialize. Entries are then added by calls to
|
368 |
|
|
-- the Lib.Load procedure. The following subprograms are used to access
|
369 |
|
|
-- and modify entries in the Units table. Individual entries are accessed
|
370 |
|
|
-- using a unit number value which ranges from Main_Unit (the first entry,
|
371 |
|
|
-- which is always for the current main unit) to Last_Unit.
|
372 |
|
|
|
373 |
|
|
Default_Main_Priority : constant Int := -1;
|
374 |
|
|
-- Value used in Main_Priority field to indicate default main priority
|
375 |
|
|
|
376 |
|
|
function Cunit (U : Unit_Number_Type) return Node_Id;
|
377 |
|
|
function Cunit_Entity (U : Unit_Number_Type) return Entity_Id;
|
378 |
|
|
function Dependency_Num (U : Unit_Number_Type) return Nat;
|
379 |
|
|
function Dynamic_Elab (U : Unit_Number_Type) return Boolean;
|
380 |
|
|
function Error_Location (U : Unit_Number_Type) return Source_Ptr;
|
381 |
|
|
function Expected_Unit (U : Unit_Number_Type) return Unit_Name_Type;
|
382 |
|
|
function Fatal_Error (U : Unit_Number_Type) return Boolean;
|
383 |
|
|
function Generate_Code (U : Unit_Number_Type) return Boolean;
|
384 |
|
|
function Ident_String (U : Unit_Number_Type) return Node_Id;
|
385 |
|
|
function Has_RACW (U : Unit_Number_Type) return Boolean;
|
386 |
|
|
function Is_Compiler_Unit (U : Unit_Number_Type) return Boolean;
|
387 |
|
|
function Loading (U : Unit_Number_Type) return Boolean;
|
388 |
|
|
function Main_Priority (U : Unit_Number_Type) return Int;
|
389 |
|
|
function Munit_Index (U : Unit_Number_Type) return Nat;
|
390 |
|
|
function OA_Setting (U : Unit_Number_Type) return Character;
|
391 |
|
|
function Source_Index (U : Unit_Number_Type) return Source_File_Index;
|
392 |
|
|
function Unit_File_Name (U : Unit_Number_Type) return File_Name_Type;
|
393 |
|
|
function Unit_Name (U : Unit_Number_Type) return Unit_Name_Type;
|
394 |
|
|
-- Get value of named field from given units table entry
|
395 |
|
|
|
396 |
|
|
procedure Set_Cunit (U : Unit_Number_Type; N : Node_Id);
|
397 |
|
|
procedure Set_Cunit_Entity (U : Unit_Number_Type; E : Entity_Id);
|
398 |
|
|
procedure Set_Dynamic_Elab (U : Unit_Number_Type; B : Boolean := True);
|
399 |
|
|
procedure Set_Error_Location (U : Unit_Number_Type; W : Source_Ptr);
|
400 |
|
|
procedure Set_Fatal_Error (U : Unit_Number_Type; B : Boolean := True);
|
401 |
|
|
procedure Set_Generate_Code (U : Unit_Number_Type; B : Boolean := True);
|
402 |
|
|
procedure Set_Has_RACW (U : Unit_Number_Type; B : Boolean := True);
|
403 |
|
|
procedure Set_Is_Compiler_Unit (U : Unit_Number_Type; B : Boolean := True);
|
404 |
|
|
procedure Set_Ident_String (U : Unit_Number_Type; N : Node_Id);
|
405 |
|
|
procedure Set_Loading (U : Unit_Number_Type; B : Boolean := True);
|
406 |
|
|
procedure Set_Main_Priority (U : Unit_Number_Type; P : Int);
|
407 |
|
|
procedure Set_OA_Setting (U : Unit_Number_Type; C : Character);
|
408 |
|
|
procedure Set_Unit_Name (U : Unit_Number_Type; N : Unit_Name_Type);
|
409 |
|
|
-- Set value of named field for given units table entry. Note that we
|
410 |
|
|
-- do not have an entry for each possible field, since some of the fields
|
411 |
|
|
-- can only be set by specialized interfaces (defined below).
|
412 |
|
|
|
413 |
|
|
function Version_Get (U : Unit_Number_Type) return Word_Hex_String;
|
414 |
|
|
-- Returns the version as a string with 8 hex digits (upper case letters)
|
415 |
|
|
|
416 |
|
|
function Last_Unit return Unit_Number_Type;
|
417 |
|
|
-- Unit number of last allocated unit
|
418 |
|
|
|
419 |
|
|
function Num_Units return Nat;
|
420 |
|
|
-- Number of units currently in unit table
|
421 |
|
|
|
422 |
|
|
procedure Remove_Unit (U : Unit_Number_Type);
|
423 |
|
|
-- Remove unit U from unit table. Currently this is effective only
|
424 |
|
|
-- if U is the last unit currently stored in the unit table.
|
425 |
|
|
|
426 |
|
|
function Entity_Is_In_Main_Unit (E : Entity_Id) return Boolean;
|
427 |
|
|
-- Returns True if the entity E is declared in the main unit, or, in
|
428 |
|
|
-- its corresponding spec, or one of its subunits. Entities declared
|
429 |
|
|
-- within generic instantiations return True if the instantiation is
|
430 |
|
|
-- itself "in the main unit" by this definition. Otherwise False.
|
431 |
|
|
|
432 |
|
|
function Get_Source_Unit (N : Node_Or_Entity_Id) return Unit_Number_Type;
|
433 |
|
|
pragma Inline (Get_Source_Unit);
|
434 |
|
|
function Get_Source_Unit (S : Source_Ptr) return Unit_Number_Type;
|
435 |
|
|
-- Return unit number of file identified by given source pointer value.
|
436 |
|
|
-- This call must always succeed, since any valid source pointer value
|
437 |
|
|
-- belongs to some previously loaded module. If the given source pointer
|
438 |
|
|
-- value is within an instantiation, this function returns the unit number
|
439 |
|
|
-- of the template, i.e. the unit containing the source code corresponding
|
440 |
|
|
-- to the given Source_Ptr value. The version taking a Node_Id argument, N,
|
441 |
|
|
-- simply applies the function to Sloc (N).
|
442 |
|
|
|
443 |
|
|
function Get_Code_Unit (N : Node_Or_Entity_Id) return Unit_Number_Type;
|
444 |
|
|
pragma Inline (Get_Code_Unit);
|
445 |
|
|
function Get_Code_Unit (S : Source_Ptr) return Unit_Number_Type;
|
446 |
|
|
-- This is like Get_Source_Unit, except that in the instantiation case,
|
447 |
|
|
-- it uses the location of the top level instantiation, rather than the
|
448 |
|
|
-- template, so it returns the unit number containing the code that
|
449 |
|
|
-- corresponds to the node N, or the source location S.
|
450 |
|
|
|
451 |
|
|
function In_Same_Source_Unit (N1, N2 : Node_Or_Entity_Id) return Boolean;
|
452 |
|
|
pragma Inline (In_Same_Source_Unit);
|
453 |
|
|
-- Determines if the two nodes or entities N1 and N2 are in the same
|
454 |
|
|
-- source unit, the criterion being that Get_Source_Unit yields the
|
455 |
|
|
-- same value for each argument.
|
456 |
|
|
|
457 |
|
|
function In_Same_Code_Unit (N1, N2 : Node_Or_Entity_Id) return Boolean;
|
458 |
|
|
pragma Inline (In_Same_Code_Unit);
|
459 |
|
|
-- Determines if the two nodes or entities N1 and N2 are in the same
|
460 |
|
|
-- code unit, the criterion being that Get_Code_Unit yields the same
|
461 |
|
|
-- value for each argument.
|
462 |
|
|
|
463 |
|
|
function In_Same_Extended_Unit (N1, N2 : Node_Or_Entity_Id) return Boolean;
|
464 |
|
|
pragma Inline (In_Same_Extended_Unit);
|
465 |
|
|
-- Determines if two nodes or entities N1 and N2 are in the same
|
466 |
|
|
-- extended unit, where an extended unit is defined as a unit and all
|
467 |
|
|
-- its subunits (considered recursively, i.e. subunits of subunits are
|
468 |
|
|
-- included). Returns true if S1 and S2 are in the same extended unit
|
469 |
|
|
-- and False otherwise.
|
470 |
|
|
|
471 |
|
|
function In_Same_Extended_Unit (S1, S2 : Source_Ptr) return Boolean;
|
472 |
|
|
pragma Inline (In_Same_Extended_Unit);
|
473 |
|
|
-- Determines if the two source locations S1 and S2 are in the same
|
474 |
|
|
-- extended unit, where an extended unit is defined as a unit and all
|
475 |
|
|
-- its subunits (considered recursively, i.e. subunits of subunits are
|
476 |
|
|
-- included). Returns true if S1 and S2 are in the same extended unit
|
477 |
|
|
-- and False otherwise.
|
478 |
|
|
|
479 |
|
|
function In_Extended_Main_Code_Unit
|
480 |
|
|
(N : Node_Or_Entity_Id) return Boolean;
|
481 |
|
|
-- Return True if the node is in the generated code of the extended main
|
482 |
|
|
-- unit, defined as the main unit, its specification (if any), and all
|
483 |
|
|
-- its subunits (considered recursively). Units for which this enquiry
|
484 |
|
|
-- returns True are those for which code will be generated. Nodes from
|
485 |
|
|
-- instantiations are included in the extended main unit for this call.
|
486 |
|
|
-- If the main unit is itself a subunit, then the extended main unit
|
487 |
|
|
-- includes its parent unit, and the parent unit spec if it is separate.
|
488 |
|
|
|
489 |
|
|
function In_Extended_Main_Code_Unit (Loc : Source_Ptr) return Boolean;
|
490 |
|
|
-- Same function as above, but argument is a source pointer rather
|
491 |
|
|
-- than a node.
|
492 |
|
|
|
493 |
|
|
function In_Extended_Main_Source_Unit
|
494 |
|
|
(N : Node_Or_Entity_Id) return Boolean;
|
495 |
|
|
-- Return True if the node is in the source text of the extended main
|
496 |
|
|
-- unit, defined as the main unit, its specification (if any), and all
|
497 |
|
|
-- its subunits (considered recursively). Units for which this enquiry
|
498 |
|
|
-- returns True are those for which code will be generated. This differs
|
499 |
|
|
-- from In_Extended_Main_Code_Unit only in that instantiations are not
|
500 |
|
|
-- included for the purposes of this call. If the main unit is itself
|
501 |
|
|
-- a subunit, then the extended main unit includes its parent unit,
|
502 |
|
|
-- and the parent unit spec if it is separate.
|
503 |
|
|
|
504 |
|
|
function In_Extended_Main_Source_Unit (Loc : Source_Ptr) return Boolean;
|
505 |
|
|
-- Same function as above, but argument is a source pointer
|
506 |
|
|
|
507 |
|
|
function In_Predefined_Unit (N : Node_Or_Entity_Id) return Boolean;
|
508 |
|
|
-- Returns True if the given node or entity appears within the source text
|
509 |
|
|
-- of a predefined unit (i.e. within Ada, Interfaces, System or within one
|
510 |
|
|
-- of the descendent packages of one of these three packages).
|
511 |
|
|
|
512 |
|
|
function In_Predefined_Unit (S : Source_Ptr) return Boolean;
|
513 |
|
|
-- Same function as above but argument is a source pointer
|
514 |
|
|
|
515 |
|
|
function Earlier_In_Extended_Unit (S1, S2 : Source_Ptr) return Boolean;
|
516 |
|
|
-- Given two Sloc values for which In_Same_Extended_Unit is true, determine
|
517 |
|
|
-- if S1 appears before S2. Returns True if S1 appears before S2, and False
|
518 |
|
|
-- otherwise. The result is undefined if S1 and S2 are not in the same
|
519 |
|
|
-- extended unit. Note: this routine will not give reliable results if
|
520 |
|
|
-- called after Sprint has been called with -gnatD set.
|
521 |
|
|
|
522 |
|
|
function Compilation_Switches_Last return Nat;
|
523 |
|
|
-- Return the count of stored compilation switches
|
524 |
|
|
|
525 |
|
|
function Get_Compilation_Switch (N : Pos) return String_Ptr;
|
526 |
|
|
-- Return the Nth stored compilation switch, or null if less than N
|
527 |
|
|
-- switches have been stored. Used by ASIS and back ends written in Ada.
|
528 |
|
|
|
529 |
|
|
function Get_Cunit_Unit_Number (N : Node_Id) return Unit_Number_Type;
|
530 |
|
|
-- Return unit number of the unit whose N_Compilation_Unit node is the
|
531 |
|
|
-- one passed as an argument. This must always succeed since the node
|
532 |
|
|
-- could not have been built without making a unit table entry.
|
533 |
|
|
|
534 |
|
|
function Get_Cunit_Entity_Unit_Number
|
535 |
|
|
(E : Entity_Id) return Unit_Number_Type;
|
536 |
|
|
-- Return unit number of the unit whose compilation unit spec entity is
|
537 |
|
|
-- the one passed as an argument. This must always succeed since the
|
538 |
|
|
-- entity could not have been built without making a unit table entry.
|
539 |
|
|
|
540 |
|
|
function Increment_Serial_Number return Nat;
|
541 |
|
|
-- Increment Serial_Number field for current unit, and return the
|
542 |
|
|
-- incremented value.
|
543 |
|
|
|
544 |
|
|
procedure Synchronize_Serial_Number;
|
545 |
|
|
-- This function increments the Serial_Number field for the current unit
|
546 |
|
|
-- but does not return the incremented value. This is used when there
|
547 |
|
|
-- is a situation where one path of control increments a serial number
|
548 |
|
|
-- (using Increment_Serial_Number), and the other path does not and it is
|
549 |
|
|
-- important to keep the serial numbers synchronized in the two cases (e.g.
|
550 |
|
|
-- when the references in a package and a client must be kept consistent).
|
551 |
|
|
|
552 |
|
|
procedure Replace_Linker_Option_String
|
553 |
|
|
(S : String_Id;
|
554 |
|
|
Match_String : String);
|
555 |
|
|
-- Replace an existing Linker_Option if the prefix Match_String matches,
|
556 |
|
|
-- otherwise call Store_Linker_Option_String.
|
557 |
|
|
|
558 |
|
|
procedure Store_Compilation_Switch (Switch : String);
|
559 |
|
|
-- Called to register a compilation switch, either front-end or back-end,
|
560 |
|
|
-- which may influence the generated output file(s). Switch is the text of
|
561 |
|
|
-- the switch to store (except that -fRTS gets changed back to --RTS).
|
562 |
|
|
|
563 |
|
|
procedure Enable_Switch_Storing;
|
564 |
|
|
-- Enable registration of switches by Store_Compilation_Switch. Used to
|
565 |
|
|
-- avoid registering switches added automatically by the gcc driver at the
|
566 |
|
|
-- beginning of the command line.
|
567 |
|
|
|
568 |
|
|
procedure Disable_Switch_Storing;
|
569 |
|
|
-- Disable registration of switches by Store_Compilation_Switch. Used to
|
570 |
|
|
-- avoid registering switches added automatically by the gcc driver at the
|
571 |
|
|
-- end of the command line.
|
572 |
|
|
|
573 |
|
|
procedure Store_Linker_Option_String (S : String_Id);
|
574 |
|
|
-- This procedure is called to register the string from a pragma
|
575 |
|
|
-- Linker_Option. The argument is the Id of the string to register.
|
576 |
|
|
|
577 |
|
|
procedure Initialize;
|
578 |
|
|
-- Initialize internal tables
|
579 |
|
|
|
580 |
|
|
procedure Lock;
|
581 |
|
|
-- Lock internal tables before calling back end
|
582 |
|
|
|
583 |
|
|
procedure Unlock;
|
584 |
|
|
-- Unlock internal tables, in cases where the back end needs to modify them
|
585 |
|
|
|
586 |
|
|
procedure Tree_Read;
|
587 |
|
|
-- Initializes internal tables from current tree file using the relevant
|
588 |
|
|
-- Table.Tree_Read routines.
|
589 |
|
|
|
590 |
|
|
procedure Tree_Write;
|
591 |
|
|
-- Writes out internal tables to current tree file using the relevant
|
592 |
|
|
-- Table.Tree_Write routines.
|
593 |
|
|
|
594 |
|
|
function Is_Loaded (Uname : Unit_Name_Type) return Boolean;
|
595 |
|
|
-- Determines if unit with given name is already loaded, i.e. there is
|
596 |
|
|
-- already an entry in the file table with this unit name for which the
|
597 |
|
|
-- corresponding file was found and parsed. Note that the Fatal_Error flag
|
598 |
|
|
-- of this entry must be checked before proceeding with further processing.
|
599 |
|
|
|
600 |
|
|
procedure Version_Referenced (S : String_Id);
|
601 |
|
|
-- This routine is called from Exp_Attr to register the use of a Version
|
602 |
|
|
-- or Body_Version attribute. The argument is the external name used to
|
603 |
|
|
-- access the version string.
|
604 |
|
|
|
605 |
|
|
procedure List (File_Names_Only : Boolean := False);
|
606 |
|
|
-- Lists units in active library (i.e. generates output consisting of a
|
607 |
|
|
-- sorted listing of the units represented in File table, except for the
|
608 |
|
|
-- main unit). If File_Names_Only is set to True, then the list includes
|
609 |
|
|
-- only file names, and no other information. Otherwise the unit name and
|
610 |
|
|
-- time stamp are also output. File_Names_Only also restricts the list to
|
611 |
|
|
-- exclude any predefined files.
|
612 |
|
|
|
613 |
|
|
function Generic_May_Lack_ALI (Sfile : File_Name_Type) return Boolean;
|
614 |
|
|
-- Generic units must be separately compiled. Since we always use
|
615 |
|
|
-- macro substitution for generics, the resulting object file is a dummy
|
616 |
|
|
-- one with no code, but the ALI file has the normal form, and we need
|
617 |
|
|
-- this ALI file so that the binder can work out a correct order of
|
618 |
|
|
-- elaboration.
|
619 |
|
|
|
620 |
|
|
-- However, ancient versions of GNAT used to not generate code or ALI
|
621 |
|
|
-- files for generic units, and this would yield complex order of
|
622 |
|
|
-- elaboration issues. These were fixed in GNAT 3.10. The support for not
|
623 |
|
|
-- compiling language-defined library generics was retained nonetheless
|
624 |
|
|
-- to facilitate bootstrap. Specifically, it is convenient to have
|
625 |
|
|
-- the same list of files to be compiled for all stages. So, if the
|
626 |
|
|
-- bootstrap compiler does not generate code for a given file, then
|
627 |
|
|
-- the stage1 compiler (and binder) also must deal with the case of
|
628 |
|
|
-- that file not being compiled. The predicate Generic_May_Lack_ALI is
|
629 |
|
|
-- True for those generic units for which missing ALI files are allowed.
|
630 |
|
|
|
631 |
|
|
private
|
632 |
|
|
pragma Inline (Cunit);
|
633 |
|
|
pragma Inline (Cunit_Entity);
|
634 |
|
|
pragma Inline (Dependency_Num);
|
635 |
|
|
pragma Inline (Fatal_Error);
|
636 |
|
|
pragma Inline (Generate_Code);
|
637 |
|
|
pragma Inline (Has_RACW);
|
638 |
|
|
pragma Inline (Is_Compiler_Unit);
|
639 |
|
|
pragma Inline (Increment_Serial_Number);
|
640 |
|
|
pragma Inline (Loading);
|
641 |
|
|
pragma Inline (Main_Priority);
|
642 |
|
|
pragma Inline (Munit_Index);
|
643 |
|
|
pragma Inline (OA_Setting);
|
644 |
|
|
pragma Inline (Set_Cunit);
|
645 |
|
|
pragma Inline (Set_Cunit_Entity);
|
646 |
|
|
pragma Inline (Set_Fatal_Error);
|
647 |
|
|
pragma Inline (Set_Generate_Code);
|
648 |
|
|
pragma Inline (Set_Has_RACW);
|
649 |
|
|
pragma Inline (Set_Loading);
|
650 |
|
|
pragma Inline (Set_Main_Priority);
|
651 |
|
|
pragma Inline (Set_OA_Setting);
|
652 |
|
|
pragma Inline (Set_Unit_Name);
|
653 |
|
|
pragma Inline (Source_Index);
|
654 |
|
|
pragma Inline (Unit_File_Name);
|
655 |
|
|
pragma Inline (Unit_Name);
|
656 |
|
|
|
657 |
|
|
type Unit_Record is record
|
658 |
|
|
Unit_File_Name : File_Name_Type;
|
659 |
|
|
Unit_Name : Unit_Name_Type;
|
660 |
|
|
Munit_Index : Nat;
|
661 |
|
|
Expected_Unit : Unit_Name_Type;
|
662 |
|
|
Source_Index : Source_File_Index;
|
663 |
|
|
Cunit : Node_Id;
|
664 |
|
|
Cunit_Entity : Entity_Id;
|
665 |
|
|
Dependency_Num : Int;
|
666 |
|
|
Ident_String : Node_Id;
|
667 |
|
|
Main_Priority : Int;
|
668 |
|
|
Serial_Number : Nat;
|
669 |
|
|
Version : Word;
|
670 |
|
|
Error_Location : Source_Ptr;
|
671 |
|
|
Fatal_Error : Boolean;
|
672 |
|
|
Generate_Code : Boolean;
|
673 |
|
|
Has_RACW : Boolean;
|
674 |
|
|
Is_Compiler_Unit : Boolean;
|
675 |
|
|
Dynamic_Elab : Boolean;
|
676 |
|
|
Loading : Boolean;
|
677 |
|
|
OA_Setting : Character;
|
678 |
|
|
end record;
|
679 |
|
|
|
680 |
|
|
-- The following representation clause ensures that the above record
|
681 |
|
|
-- has no holes. We do this so that when instances of this record are
|
682 |
|
|
-- written by Tree_Gen, we do not write uninitialized values to the file.
|
683 |
|
|
|
684 |
|
|
for Unit_Record use record
|
685 |
|
|
Unit_File_Name at 0 range 0 .. 31;
|
686 |
|
|
Unit_Name at 4 range 0 .. 31;
|
687 |
|
|
Munit_Index at 8 range 0 .. 31;
|
688 |
|
|
Expected_Unit at 12 range 0 .. 31;
|
689 |
|
|
Source_Index at 16 range 0 .. 31;
|
690 |
|
|
Cunit at 20 range 0 .. 31;
|
691 |
|
|
Cunit_Entity at 24 range 0 .. 31;
|
692 |
|
|
Dependency_Num at 28 range 0 .. 31;
|
693 |
|
|
Ident_String at 32 range 0 .. 31;
|
694 |
|
|
Main_Priority at 36 range 0 .. 31;
|
695 |
|
|
Serial_Number at 40 range 0 .. 31;
|
696 |
|
|
Version at 44 range 0 .. 31;
|
697 |
|
|
Error_Location at 48 range 0 .. 31;
|
698 |
|
|
Fatal_Error at 52 range 0 .. 7;
|
699 |
|
|
Generate_Code at 53 range 0 .. 7;
|
700 |
|
|
Has_RACW at 54 range 0 .. 7;
|
701 |
|
|
Dynamic_Elab at 55 range 0 .. 7;
|
702 |
|
|
Is_Compiler_Unit at 56 range 0 .. 7;
|
703 |
|
|
OA_Setting at 57 range 0 .. 7;
|
704 |
|
|
Loading at 58 range 0 .. 15;
|
705 |
|
|
end record;
|
706 |
|
|
|
707 |
|
|
for Unit_Record'Size use 60 * 8;
|
708 |
|
|
-- This ensures that we did not leave out any fields
|
709 |
|
|
|
710 |
|
|
package Units is new Table.Table (
|
711 |
|
|
Table_Component_Type => Unit_Record,
|
712 |
|
|
Table_Index_Type => Unit_Number_Type,
|
713 |
|
|
Table_Low_Bound => Main_Unit,
|
714 |
|
|
Table_Initial => Alloc.Units_Initial,
|
715 |
|
|
Table_Increment => Alloc.Units_Increment,
|
716 |
|
|
Table_Name => "Units");
|
717 |
|
|
|
718 |
|
|
-- The following table stores strings from pragma Linker_Option lines
|
719 |
|
|
|
720 |
|
|
type Linker_Option_Entry is record
|
721 |
|
|
Option : String_Id;
|
722 |
|
|
-- The string for the linker option line
|
723 |
|
|
|
724 |
|
|
Unit : Unit_Number_Type;
|
725 |
|
|
-- The unit from which the linker option comes
|
726 |
|
|
end record;
|
727 |
|
|
|
728 |
|
|
package Linker_Option_Lines is new Table.Table (
|
729 |
|
|
Table_Component_Type => Linker_Option_Entry,
|
730 |
|
|
Table_Index_Type => Integer,
|
731 |
|
|
Table_Low_Bound => 1,
|
732 |
|
|
Table_Initial => Alloc.Linker_Option_Lines_Initial,
|
733 |
|
|
Table_Increment => Alloc.Linker_Option_Lines_Increment,
|
734 |
|
|
Table_Name => "Linker_Option_Lines");
|
735 |
|
|
|
736 |
|
|
-- The following table records the compilation switches used to compile
|
737 |
|
|
-- the main unit. The table includes only switches. It excludes -o
|
738 |
|
|
-- switches as well as artifacts of the gcc/gnat1 interface such as
|
739 |
|
|
-- -quiet, -dumpbase, or -auxbase.
|
740 |
|
|
|
741 |
|
|
-- This table is set as part of the compiler argument scanning in
|
742 |
|
|
-- Back_End. It can also be reset in -gnatc mode from the data in an
|
743 |
|
|
-- existing ali file, and is read and written by the Tree_Read and
|
744 |
|
|
-- Tree_Write routines for ASIS.
|
745 |
|
|
|
746 |
|
|
package Compilation_Switches is new Table.Table (
|
747 |
|
|
Table_Component_Type => String_Ptr,
|
748 |
|
|
Table_Index_Type => Nat,
|
749 |
|
|
Table_Low_Bound => 1,
|
750 |
|
|
Table_Initial => 30,
|
751 |
|
|
Table_Increment => 100,
|
752 |
|
|
Table_Name => "Compilation_Switches");
|
753 |
|
|
|
754 |
|
|
Load_Msg_Sloc : Source_Ptr;
|
755 |
|
|
-- Location for placing error messages (a token in the main source text)
|
756 |
|
|
-- This is set from Sloc (Enode) by Load only in the case where this Sloc
|
757 |
|
|
-- is in the main source file. This ensures that not found messages and
|
758 |
|
|
-- circular dependency messages reference the original with in this source.
|
759 |
|
|
|
760 |
|
|
type Unit_Ref_Table is array (Pos range <>) of Unit_Number_Type;
|
761 |
|
|
-- Type to hold list of indirect references to unit number table
|
762 |
|
|
|
763 |
|
|
type Load_Stack_Entry is record
|
764 |
|
|
Unit_Number : Unit_Number_Type;
|
765 |
|
|
With_Node : Node_Id;
|
766 |
|
|
end record;
|
767 |
|
|
|
768 |
|
|
-- The Load_Stack table contains a list of unit numbers (indices into the
|
769 |
|
|
-- unit table) of units being loaded on a single dependency chain, and a
|
770 |
|
|
-- flag to indicate whether this unit is loaded through a limited_with
|
771 |
|
|
-- clause. The First entry is the main unit. The second entry, if present
|
772 |
|
|
-- is a unit on which the first unit depends, etc. This stack is used to
|
773 |
|
|
-- generate error messages showing the dependency chain if a file is not
|
774 |
|
|
-- found, or whether a true circular dependency exists. The Load_Unit
|
775 |
|
|
-- function makes an entry in this table when it is called, and removes
|
776 |
|
|
-- the entry just before it returns.
|
777 |
|
|
|
778 |
|
|
package Load_Stack is new Table.Table (
|
779 |
|
|
Table_Component_Type => Load_Stack_Entry,
|
780 |
|
|
Table_Index_Type => Int,
|
781 |
|
|
Table_Low_Bound => 0,
|
782 |
|
|
Table_Initial => Alloc.Load_Stack_Initial,
|
783 |
|
|
Table_Increment => Alloc.Load_Stack_Increment,
|
784 |
|
|
Table_Name => "Load_Stack");
|
785 |
|
|
|
786 |
|
|
procedure Sort (Tbl : in out Unit_Ref_Table);
|
787 |
|
|
-- This procedure sorts the given unit reference table in order of
|
788 |
|
|
-- ascending unit names, where the ordering relation is as described
|
789 |
|
|
-- by the comparison routines provided by package Uname.
|
790 |
|
|
|
791 |
|
|
-- The Version_Ref table records Body_Version and Version attribute
|
792 |
|
|
-- references. The entries are simply the strings for the external
|
793 |
|
|
-- names that correspond to the referenced values.
|
794 |
|
|
|
795 |
|
|
package Version_Ref is new Table.Table (
|
796 |
|
|
Table_Component_Type => String_Id,
|
797 |
|
|
Table_Index_Type => Nat,
|
798 |
|
|
Table_Low_Bound => 1,
|
799 |
|
|
Table_Initial => 20,
|
800 |
|
|
Table_Increment => 100,
|
801 |
|
|
Table_Name => "Version_Ref");
|
802 |
|
|
|
803 |
|
|
end Lib;
|