ali.ads 41.6 KB
Newer Older
Richard Kenner committed
1 2 3 4 5 6 7 8
------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                                  A L I                                   --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
Arnaud Charlet committed
9
--          Copyright (C) 1992-2016, Free Software Foundation, Inc.         --
Richard Kenner committed
10 11 12
--                                                                          --
-- GNAT is free software;  you can  redistribute it  and/or modify it under --
-- 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- --
Richard Kenner committed
14 15 16 17
-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
-- for  more details.  You should have  received  a copy of the GNU General --
18 19
-- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
-- http://www.gnu.org/licenses for a complete copy of the license.          --
Richard Kenner committed
20 21
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
22
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
Richard Kenner committed
23 24 25 26
--                                                                          --
------------------------------------------------------------------------------

--  This package defines the internal data structures used for representation
27 28
--  of Ada Library Information (ALI) acquired from the ALI files generated by
--  the front end.
Richard Kenner committed
29 30 31

with Casing;  use Casing;
with Gnatvsn; use Gnatvsn;
32
with Namet;   use Namet;
Richard Kenner committed
33 34 35 36 37 38 39 40 41 42 43 44
with Rident;  use Rident;
with Table;
with Types;   use Types;

with GNAT.HTable; use GNAT.HTable;

package ALI is

   --------------
   -- Id Types --
   --------------

Arnaud Charlet committed
45
   type ALI_Id is range 0 .. 99_999_999;
Richard Kenner committed
46 47
   --  Id values used for ALIs table entries

Arnaud Charlet committed
48
   type Unit_Id is range 0 .. 99_999_999;
Richard Kenner committed
49 50
   --  Id values used for Unit table entries

Arnaud Charlet committed
51
   type With_Id is range 0 .. 99_999_999;
Richard Kenner committed
52 53
   --  Id values used for Withs table entries

Arnaud Charlet committed
54
   type Arg_Id is range 0 .. 99_999_999;
Richard Kenner committed
55 56
   --  Id values used for argument table entries

Arnaud Charlet committed
57
   type Sdep_Id is range 0 .. 99_999_999;
Richard Kenner committed
58 59
   --  Id values used for Sdep table entries

Arnaud Charlet committed
60
   type Source_Id is range 0 .. 99_999_999;
Richard Kenner committed
61 62
   --  Id values used for Source table entries

Arnaud Charlet committed
63
   type Interrupt_State_Id is range 0 .. 99_999_999;
64 65
   --  Id values used for Interrupt_State table entries

Arnaud Charlet committed
66
   type Priority_Specific_Dispatching_Id is range 0 .. 99_999_999;
67 68
   --  Id values used for Priority_Specific_Dispatching table entries

Richard Kenner committed
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
   --------------------
   -- ALI File Table --
   --------------------

   --  Each ALI file read generates an entry in the ALIs table

   No_ALI_Id : constant ALI_Id := ALI_Id'First;
   --  Special value indicating no ALI entry

   First_ALI_Entry : constant ALI_Id := No_ALI_Id + 1;
   --  Id of first actual entry in table

   type Main_Program_Type is (None, Proc, Func);
   --  Indicator of whether unit can be used as main program

   type ALIs_Record is record

      Afile : File_Name_Type;
      --  Name of ALI file

89
      Ofile_Full_Name : File_Name_Type;
Richard Kenner committed
90 91 92 93 94 95 96 97
      --  Full name of object file corresponding to the ALI file

      Sfile : File_Name_Type;
      --  Name of source file that generates this ALI file (which is equal
      --  to the name of the source file in the first unit table entry for
      --  this ALI file, since the body if present is always first).

      Ver : String (1 .. Ver_Len_Max);
98 99
      --  Value of library version (V line in ALI file). Not set if
      --  V lines are ignored as a result of the Ignore_Lines parameter.
Richard Kenner committed
100 101

      Ver_Len : Natural;
Arnaud Charlet committed
102 103
      --  Length of characters stored in Ver. Not set if V lines are ignored as
      --  a result of the Ignore_Lines parameter.
104

Robert Dewar committed
105
      SAL_Interface : Boolean;
106
      --  Set True when this is an interface to a standalone library
Richard Kenner committed
107 108 109 110 111 112 113 114 115 116 117 118 119 120

      First_Unit : Unit_Id;
      --  Id of first Unit table entry for this file

      Last_Unit : Unit_Id;
      --  Id of last Unit table entry for this file

      First_Sdep : Sdep_Id;
      --  Id of first Sdep table entry for this file

      Last_Sdep : Sdep_Id;
      --  Id of last Sdep table entry for this file

      Main_Program : Main_Program_Type;
121 122
      --  Indicator of whether first unit can be used as main program. Not set
      --  if 'M' appears in Ignore_Lines.
Richard Kenner committed
123 124

      Main_Priority : Int;
125 126 127 128
      --  Indicates priority value if Main_Program field indicates that this
      --  can be a main program. A value of -1 (No_Main_Priority) indicates
      --  that no parameter was found, or no M line was present. Not set if
      --  'M' appears in Ignore_Lines.
Richard Kenner committed
129

Arnaud Charlet committed
130 131 132 133 134 135
      Main_CPU : Int;
      --  Indicates processor if Main_Program field indicates that this can
      --  be a main program. A value of -1 (No_Main_CPU) indicates that no C
      --  parameter was found, or no M line was present. Not set if 'M' appears
      --  in Ignore_Lines.

Richard Kenner committed
136 137
      Time_Slice_Value : Int;
      --  Indicates value of time slice parameter from T=xxx on main program
138 139
      --  line. A value of -1 indicates that no T=xxx parameter was found, or
      --  no M line was present. Not set if 'M' appears in Ignore_Lines.
Richard Kenner committed
140 141 142

      WC_Encoding : Character;
      --  Wide character encoding if main procedure. Otherwise not relevant.
143
      --  Not set if 'M' appears in Ignore_Lines.
Richard Kenner committed
144 145

      Locking_Policy : Character;
146 147 148 149
      --  Indicates locking policy for units in this file. Space means tasking
      --  was not used, or that no Locking_Policy pragma was present or that
      --  this is a language defined unit. Otherwise set to first character
      --  (upper case) of policy name. Not set if 'P' appears in Ignore_Lines.
Richard Kenner committed
150

Arnaud Charlet committed
151 152 153 154 155 156
      Partition_Elaboration_Policy : Character;
      --  Indicates partition elaboration policy for units in this file. Space
      --  means that no Partition_Elaboration_Policy pragma was present or that
      --  this is a language defined unit. Otherwise set to first character
      --  (upper case) of policy name. Not set if 'P' appears in Ignore_Lines.

Richard Kenner committed
157
      Queuing_Policy : Character;
158 159 160 161
      --  Indicates queuing policy for units in this file. Space means tasking
      --  was not used, or that no Queuing_Policy pragma was present or that
      --  this is a language defined unit. Otherwise set to first character
      --  (upper case) of policy name. Not set if 'P' appears in Ignore_Lines.
Richard Kenner committed
162 163

      Task_Dispatching_Policy : Character;
164 165 166 167 168
      --  Indicates task dispatching policy for units in this file. Space means
      --  tasking was not used, or that no Task_Dispatching_Policy pragma was
      --  present or that this is a language defined unit. Otherwise set to
      --  first character (upper case) of policy name. Not set if 'P' appears
      --  in Ignore_Lines.
Richard Kenner committed
169 170

      Compile_Errors : Boolean;
171 172 173
      --  Set to True if compile errors for unit. Note that No_Object will
      --  always be set as well in this case. Not set if 'P' appears in
      --  Ignore_Lines.
Richard Kenner committed
174

Arnaud Charlet committed
175 176 177 178 179
      GNATprove_Mode : Boolean;
      --  Set to True if ALI and object file produced in GNATprove_Mode as
      --  signalled by GP appearing on the P line. Not set if 'P' appears in
      --  Ignore_Lines.

Richard Kenner committed
180
      No_Object : Boolean;
181 182
      --  Set to True if no object file generated. Not set if 'P' appears in
      --  Ignore_Lines.
Richard Kenner committed
183 184

      Normalize_Scalars : Boolean;
185 186 187
      --  Set to True if file was compiled with Normalize_Scalars. Not set if
      --  'P' appears in Ignore_Lines.

Arnaud Charlet committed
188 189 190 191 192 193
      SSO_Default : Character;
      --  Set to 'H' or 'L' if file was compiled with a configuration pragma
      --  file containing Default_Scalar_Storage_Order (High/Low_Order_First).
      --  Set to ' ' if neither pragma was present. Not set if 'P' appears in
      --  Ignore_Lines.

Richard Kenner committed
194
      Unit_Exception_Table : Boolean;
195 196
      --  Set to True if unit exception table pointer generated. Not set if 'P'
      --  appears in Ignore_Lines.
Richard Kenner committed
197

198 199 200 201
      Frontend_Exceptions : Boolean;
      --  Set to True if file was compiled with front-end exceptions. Not set
      --  if 'P' appears in Ignore_Lines.

Richard Kenner committed
202
      Zero_Cost_Exceptions : Boolean;
203 204
      --  Set to True if file was compiled with zero cost exceptions. Not set
      --  if 'P' appears in Ignore_Lines.
Richard Kenner committed
205

Arnaud Charlet committed
206 207
      Restrictions : Restrictions_Info;
      --  Restrictions information reconstructed from R lines
208 209 210

      First_Interrupt_State : Interrupt_State_Id;
      Last_Interrupt_State  : Interrupt_State_Id'Base;
211 212 213 214 215
      --  These point to the first and last entries in the interrupt state
      --  table for this unit. If no entries, then Last_Interrupt_State =
      --  First_Interrupt_State - 1 (that's why the 'Base reference is there,
      --  it can be one less than the lower bound of the subtype). Not set if
      --  'I' appears in Ignore_Lines
Richard Kenner committed
216

217 218 219 220 221 222 223 224
      First_Specific_Dispatching : Priority_Specific_Dispatching_Id;
      Last_Specific_Dispatching  : Priority_Specific_Dispatching_Id'Base;
      --  These point to the first and last entries in the priority specific
      --  dispatching table for this unit. If there are no entries, then
      --  Last_Specific_Dispatching = First_Specific_Dispatching - 1. That
      --  is why the 'Base reference is there, it can be one less than the
      --  lower bound of the subtype. Not set if 'S' appears in Ignore_Lines.

Richard Kenner committed
225 226 227 228 229
   end record;

   No_Main_Priority : constant Int := -1;
   --  Code for no main priority set

Arnaud Charlet committed
230 231 232
   No_Main_CPU : constant Int := -1;
   --  Code for no main cpu set

Richard Kenner committed
233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
   package ALIs is new Table.Table (
     Table_Component_Type => ALIs_Record,
     Table_Index_Type     => ALI_Id,
     Table_Low_Bound      => First_ALI_Entry,
     Table_Initial        => 500,
     Table_Increment      => 200,
     Table_Name           => "ALIs");

   ----------------
   -- Unit Table --
   ----------------

   --  Each unit within an ALI file generates an entry in the unit table

   No_Unit_Id : constant Unit_Id := Unit_Id'First;
   --  Special value indicating no unit table entry

   First_Unit_Entry : constant Unit_Id := No_Unit_Id + 1;
   --  Id of first actual entry in table

   type Unit_Type is (Is_Spec, Is_Body, Is_Spec_Only, Is_Body_Only);
   --  Indicates type of entry, if both body and spec appear in the ALI file,
   --  then the first unit is marked Is_Body, and the second is marked Is_Spec.
   --  If only a spec appears, then it is marked as Is_Spec_Only, and if only
   --  a body appears, then it is marked Is_Body_Only).

   subtype Version_String is String (1 .. 8);
   --  Version string, taken from unit record

   type Unit_Record is record

      My_ALI : ALI_Id;
      --  Corresponding ALI entry

      Uname : Unit_Name_Type;
      --  Name of Unit

      Sfile : File_Name_Type;
      --  Name of source file

      Preelab : Boolean;
      --  Indicates presence of PR parameter for a preelaborated package

      No_Elab : Boolean;
      --  Indicates presence of NE parameter for a unit that has does not
      --  have an elaboration routine (since it has no elaboration code).

      Pure : Boolean;
281
      --  Indicates presence of PU parameter for a package having pragma Pure
Richard Kenner committed
282 283

      Dynamic_Elab : Boolean;
284 285 286
      --  Set to True if the unit was compiled with dynamic elaboration checks
      --  (i.e. either -gnatE or pragma Elaboration_Checks (RM) was used to
      --  compile the unit).
Richard Kenner committed
287 288

      Elaborate_Body : Boolean;
289 290
      --  Indicates presence of EB parameter for a package which has a pragma
      --  Elaborate_Body, and also for generic package instantiations.
Richard Kenner committed
291 292 293 294

      Set_Elab_Entity : Boolean;
      --  Indicates presence of EE parameter for a unit which has an
      --  elaboration entity which must be set true as part of the
Arnaud Charlet committed
295
      --  elaboration of the unit.
Richard Kenner committed
296 297

      Has_RACW : Boolean;
298 299
      --  Indicates presence of RA parameter for a package that declares at
      --  least one Remote Access to Class_Wide (RACW) object.
Richard Kenner committed
300 301 302 303 304

      Remote_Types : Boolean;
      --  Indicates presence of RT parameter for a package which has a
      --  pragma Remote_Types.

Arnaud Charlet committed
305 306 307 308
      Serious_Errors : Boolean;
      --  Indicates presence of SE parameter indicating that compilation of
      --  the unit encountered as serious error.

Richard Kenner committed
309
      Shared_Passive : Boolean;
310 311
      --  Indicates presence of SP parameter for a package which has a pragma
      --  Shared_Passive.
Richard Kenner committed
312 313

      RCI : Boolean;
314 315
      --  Indicates presence of RC parameter for a package which has a pragma
      --  Remote_Call_Interface.
Richard Kenner committed
316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350

      Predefined : Boolean;
      --  Indicates if unit is language predefined (or a child of such a unit)

      Internal : Boolean;
      --  Indicates if unit is an internal unit (or a child of such a unit)

      First_With : With_Id;
      --  Id of first withs table entry for this file

      Last_With : With_Id;
      --  Id of last withs table entry for this file

      First_Arg : Arg_Id;
      --  Id of first args table entry for this file

      Last_Arg : Arg_Id;
      --  Id of last args table entry for this file

      Utype : Unit_Type;
      --  Type of entry

      Is_Generic : Boolean;
      --  True for generic unit (i.e. a generic declaration, or a generic
      --  body). False for a non-generic unit.

      Unit_Kind : Character;
      --  Indicates the nature of the unit. 'p' for Packages and 's' for
      --  subprograms.

      Version : Version_String;
      --  Version of unit

      Icasing : Casing_Type;
      --  Indicates casing of identifiers in source file for this unit. This
351 352
      --  is used for informational output, and also for constructing the main
      --  unit if it is being built in Ada.
Richard Kenner committed
353 354

      Kcasing : Casing_Type;
355 356 357
      --  Indicates casing of keywords in source file for this unit. This is
      --  used for informational output, and also for constructing the main
      --  unit if it is being built in Ada.
Richard Kenner committed
358 359 360 361 362 363 364 365 366 367

      Elab_Position : aliased Natural;
      --  Initialized to zero. Set non-zero when a unit is chosen and
      --  placed in the elaboration order. The value represents the
      --  ordinal position in the elaboration order.

      Init_Scalars : Boolean;
      --  Set True if IS qualifier appears in ALI file, indicating that
      --  an Initialize_Scalars pragma applies to the unit.

Robert Dewar committed
368
      SAL_Interface : Boolean;
369 370
      --  Set True when this is an interface to a standalone library

371 372 373
      Directly_Scanned : Boolean;
      --  True iff it is a unit from an ALI file specified to gnatbind

374 375 376
      Body_Needed_For_SAL : Boolean;
      --  Indicates that the source for the body of the unit (subprogram,
      --  package, or generic unit) must be included in a standalone library.
377 378 379 380 381 382 383 384

      Elaborate_Body_Desirable : Boolean;
      --  Indicates that the front end elaboration circuitry decided that it
      --  would be a good idea if this package had Elaborate_Body. The binder
      --  will attempt, but does not promise, to place the elaboration call
      --  for the body right after the call for the spec, or at least as close
      --  together as possible.

385 386 387
      Optimize_Alignment : Character;
      --  Optimize_Alignment setting. Set to L/S/T/O for OL/OS/OT/OO present

388 389 390
      Has_Finalizer : Boolean;
      --  Indicates whether a package body or a spec has a library-level
      --  finalization routine.
Richard Kenner committed
391 392 393 394 395 396 397 398 399 400
   end record;

   package Units is new Table.Table (
     Table_Component_Type => Unit_Record,
     Table_Index_Type     => Unit_Id,
     Table_Low_Bound      => First_Unit_Entry,
     Table_Initial        => 100,
     Table_Increment      => 200,
     Table_Name           => "Unit");

401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428
   ---------------------------
   -- Interrupt State Table --
   ---------------------------

   --  An entry is made in this table for each I (interrupt state) line
   --  encountered in the input ALI file. The First/Last_Interrupt_Id
   --  fields of the ALI file entry show the range of entries defined
   --  within a particular ALI file.

   type Interrupt_State_Record is record
      Interrupt_Id : Nat;
      --  Id from interrupt state entry

      Interrupt_State : Character;
      --  State from interrupt state entry ('u'/'r'/'s')

      IS_Pragma_Line : Nat;
      --  Line number of Interrupt_State pragma
   end record;

   package Interrupt_States is new Table.Table (
     Table_Component_Type => Interrupt_State_Record,
     Table_Index_Type     => Interrupt_State_Id'Base,
     Table_Low_Bound      => Interrupt_State_Id'First,
     Table_Initial        => 100,
     Table_Increment      => 200,
     Table_Name           => "Interrupt_States");

429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462
   -----------------------------------------
   -- Priority Specific Dispatching Table --
   -----------------------------------------

   --  An entry is made in this table for each S (priority specific
   --  dispatching) line encountered in the input ALI file. The
   --  First/Last_Specific_Dispatching_Id fields of the ALI file
   --  entry show the range of entries defined within a particular
   --  ALI file.

   type Specific_Dispatching_Record is record
      Dispatching_Policy : Character;
      --  First character (upper case) of the corresponding policy name

      First_Priority     : Nat;
      --  Lower bound of the priority range to which the specified dispatching
      --  policy applies.

      Last_Priority      : Nat;
      --  Upper bound of the priority range to which the specified dispatching
      --  policy applies.

      PSD_Pragma_Line : Nat;
      --  Line number of Priority_Specific_Dispatching pragma
   end record;

   package Specific_Dispatching is new Table.Table (
     Table_Component_Type => Specific_Dispatching_Record,
     Table_Index_Type     => Priority_Specific_Dispatching_Id'Base,
     Table_Low_Bound      => Priority_Specific_Dispatching_Id'First,
     Table_Initial        => 100,
     Table_Increment      => 200,
     Table_Name           => "Priority_Specific_Dispatching");

Richard Kenner committed
463 464 465 466 467 468 469
   --------------
   -- Switches --
   --------------

   --  These switches record status information about ali files that
   --  have been read, for quick reference without searching tables.

470 471 472
   --  Note: a switch will be left set at its default value if the line
   --  which might otherwise set it is ignored (from Ignore_Lines).

Richard Kenner committed
473
   Dynamic_Elaboration_Checks_Specified : Boolean := False;
474
   --  Set to False by Initialize_ALI. Set to True if Scan_ALI reads
Richard Kenner committed
475 476
   --  a unit for which dynamic elaboration checking is enabled.

477 478 479 480
   Frontend_Exceptions_Specified : Boolean := False;
   --  Set to False by Initialize_ALI. Set to True if an ali file is read that
   --  has a P line specifying the generation of front-end exceptions.

Arnaud Charlet committed
481 482 483
   GNATprove_Mode_Specified : Boolean := False;
   --  Set to True if an ali file was produced in GNATprove mode.

Richard Kenner committed
484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502
   Initialize_Scalars_Used : Boolean := False;
   --  Set True if an ali file contains the Initialize_Scalars flag

   Locking_Policy_Specified : Character := ' ';
   --  Set to blank by Initialize_ALI. Set to the appropriate locking policy
   --  character if an ali file contains a P line setting the locking policy.

   No_Normalize_Scalars_Specified : Boolean := False;
   --  Set to False by Initialize_ALI. Set to True if an ali file indicates
   --  that the file was compiled without normalize scalars.

   No_Object_Specified : Boolean := False;
   --  Set to False by Initialize_ALI. Set to True if an ali file contains
   --  the No_Object flag.

   Normalize_Scalars_Specified : Boolean := False;
   --  Set to False by Initialize_ALI. Set to True if an ali file indicates
   --  that the file was compiled in Normalize_Scalars mode.

Arnaud Charlet committed
503 504 505 506 507
   Partition_Elaboration_Policy_Specified : Character := ' ';
   --  Set to blank by Initialize_ALI. Set to the appropriate partition
   --  elaboration policy character if an ali file contains a P line setting
   --  the policy.

Richard Kenner committed
508 509 510 511
   Queuing_Policy_Specified : Character := ' ';
   --  Set to blank by Initialize_ALI. Set to the appropriate queuing policy
   --  character if an ali file contains a P line setting the queuing policy.

512
   Cumulative_Restrictions : Restrictions_Info := No_Restrictions;
Arnaud Charlet committed
513 514 515
   --  This variable records the cumulative contributions of R lines in all
   --  ali files, showing whether a restriction pragma exists anywhere, and
   --  accumulating the aggregate knowledge of violations.
516

Arnaud Charlet committed
517 518 519 520 521
   SSO_Default_Specified : Boolean := False;
   --  Set to True if at least one ALI file contains an OH/OL flag indicating
   --  that it was compiled with a configuration pragmas file containing the
   --  pragma Default_Scalar_Storage_Order (OH/OL present in ALI file P line).

522 523 524 525
   Stack_Check_Switch_Set : Boolean := False;
   --  Set to True if at least one ALI file contains '-fstack-check' in its
   --  argument list.

Richard Kenner committed
526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544
   Task_Dispatching_Policy_Specified : Character := ' ';
   --  Set to blank by Initialize_ALI. Set to the appropriate task dispatching
   --  policy character if an ali file contains a P line setting the
   --  task dispatching policy.

   Unreserve_All_Interrupts_Specified : Boolean := False;
   --  Set to False by Initialize_ALI. Set to True if an ali file is read that
   --  has  P line specifying unreserve all interrupts mode.

   Zero_Cost_Exceptions_Specified : Boolean := False;
   --  Set to False by Initialize_ALI. Set to True if an ali file is read that
   --  has a P line specifying the generation of zero cost exceptions.

   -----------------
   -- Withs Table --
   -----------------

   --  Each With line (W line) in an ALI file generates a Withs table entry

545 546
   --  Note: there will be no entries in this table if 'W' lines are ignored

Richard Kenner committed
547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570
   No_With_Id : constant With_Id := With_Id'First;
   --  Special value indicating no withs table entry

   First_With_Entry : constant With_Id := No_With_Id + 1;
   --  Id of first actual entry in table

   type With_Record is record

      Uname : Unit_Name_Type;
      --  Name of Unit

      Sfile : File_Name_Type;
      --  Name of source file, set to No_File in generic case

      Afile : File_Name_Type;
      --  Name of ALI file, set to No_File in generic case

      Elaborate : Boolean;
      --  Indicates presence of E parameter

      Elaborate_All : Boolean;
      --  Indicates presence of EA parameter

      Elab_All_Desirable : Boolean;
571 572 573
      --  Indicates presence of AD parameter

      Elab_Desirable     : Boolean;
Richard Kenner committed
574 575
      --  Indicates presence of ED parameter

Robert Dewar committed
576
      SAL_Interface : Boolean := False;
Arnaud Charlet committed
577
      --  True if the Unit is an Interface of a Stand-Alone Library
578

579 580
      Limited_With : Boolean := False;
      --  True if unit is named in a limited_with_clause
Arnaud Charlet committed
581 582 583

      Implicit_With_From_Instantiation : Boolean := False;
      --  True if this is an implicit with from a generic instantiation
Richard Kenner committed
584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599
   end record;

   package Withs is new Table.Table (
     Table_Component_Type => With_Record,
     Table_Index_Type     => With_Id,
     Table_Low_Bound      => First_With_Entry,
     Table_Initial        => 5000,
     Table_Increment      => 200,
     Table_Name           => "Withs");

   ---------------------
   -- Arguments Table --
   ---------------------

   --  Each Arg line (A line) in an ALI file generates an Args table entry

600 601
   --  Note: there will be no entries in this table if 'A' lines are ignored

Richard Kenner committed
602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619
   No_Arg_Id : constant Arg_Id := Arg_Id'First;
   --  Special value indicating no args table entry

   First_Arg_Entry : constant Arg_Id := No_Arg_Id + 1;
   --  Id of first actual entry in table

   package Args is new Table.Table (
     Table_Component_Type => String_Ptr,
     Table_Index_Type     => Arg_Id,
     Table_Low_Bound      => First_Arg_Entry,
     Table_Initial        => 1000,
     Table_Increment      => 100,
     Table_Name           => "Args");

   --------------------------
   -- Linker_Options Table --
   --------------------------

620 621 622 623 624
   --  If an ALI file has one of more Linker_Options lines, then a single
   --  entry is made in this table. If more than one Linker_Options lines
   --  appears in a given ALI file, then the arguments are concatenated
   --  to form the entry in this table, using a NUL character as the
   --  separator, and a final NUL character is appended to the end.
Richard Kenner committed
625

626 627
   --  Note: there will be no entries in this table if 'L' lines are ignored

Richard Kenner committed
628
   type Linker_Option_Record is record
629 630 631 632 633 634 635
      Name : Name_Id;
      --  Name entry containing concatenated list of Linker_Options
      --  arguments separated by NUL and ended by NUL as described above.

      Unit : Unit_Id;
      --  Unit_Id for the entry

Richard Kenner committed
636
      Internal_File : Boolean;
637 638 639 640 641 642 643 644
      --  Set True if the linker options are from an internal file. This is
      --  used to insert certain standard entries after all the user entries
      --  but before the entries from the run-time.

      Original_Pos : Positive;
      --  Keep track of original position in the linker options table. This
      --  is used to implement a stable sort when we sort the linker options
      --  table.
Richard Kenner committed
645 646 647 648 649 650 651 652 653 654 655 656 657
   end record;

   --  The indexes of active entries in this table range from 1 to the
   --  value of Linker_Options.Last. The zero'th element is for sort call.

   package Linker_Options is new Table.Table (
     Table_Component_Type => Linker_Option_Record,
     Table_Index_Type     => Integer,
     Table_Low_Bound      => 0,
     Table_Initial        => 200,
     Table_Increment      => 400,
     Table_Name           => "Linker_Options");

658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673
   -----------------
   -- Notes Table --
   -----------------

   --  The notes table records entries from N lines

   type Notes_Record is record
      Pragma_Type : Character;
      --  'A', 'C', 'I', 'S', 'T' for Annotate/Comment/Ident/Subtitle/Title

      Pragma_Line : Nat;
      --  Line number of pragma

      Pragma_Col : Nat;
      --  Column number of pragma

674 675
      Pragma_Source_File : File_Name_Type;
      --  Source file of pragma
676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695

      Pragma_Args : Name_Id;
      --  Pragma arguments. No_Name if no arguments, otherwise a single
      --  name table entry consisting of all the characters on the notes
      --  line from the first non-blank character following the source
      --  location to the last character on the line.
   end record;

   --  The indexes of active entries in this table range from 1 to the
   --  value of Linker_Options.Last. The zero'th element is for convenience
   --  if the table needs to be sorted.

   package Notes is new Table.Table (
     Table_Component_Type => Notes_Record,
     Table_Index_Type     => Integer,
     Table_Low_Bound      => 0,
     Table_Initial        => 200,
     Table_Increment      => 400,
     Table_Name           => "Notes");

Richard Kenner committed
696 697 698 699 700 701 702 703
   -------------------------------------------
   -- External Version Reference Hash Table --
   -------------------------------------------

   --  This hash table keeps track of external version reference strings
   --  as read from E lines in the ali file. The stored values do not
   --  include the terminating quote characters.

704 705
   --  Note: there will be no entries in this table if 'E' lines are ignored

Richard Kenner committed
706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722
   type Vindex is range 0 .. 98;
   --  Type to define range of headers

   function SHash (S : String_Ptr) return Vindex;
   --  Hash function for this table

   function SEq (F1, F2 : String_Ptr) return Boolean;
   --  Equality function for this table

   package Version_Ref is new Simple_HTable (
     Header_Num => Vindex,
     Element    => Boolean,
     No_Element => False,
     Key        => String_Ptr,
     Hash       => SHash,
     Equal      => SEq);

723 724 725 726 727 728 729 730 731
   -------------------------
   -- No_Dependency Table --
   -------------------------

   --  Each R line for a No_Dependency Restriction generates an entry in
   --  this No_Dependency table.

   type No_Dep_Record is record
      ALI_File : ALI_Id;
732
      --  ALI File containing the entry
733 734

      No_Dep_Unit : Name_Id;
735
      --  Id for names table entry including entire name, including periods
736 737 738 739 740 741 742 743 744 745
   end record;

   package No_Deps is new Table.Table (
     Table_Component_Type => No_Dep_Record,
     Table_Index_Type     => Integer,
     Table_Low_Bound      => 0,
     Table_Initial        => 200,
     Table_Increment      => 400,
     Table_Name           => "No_Deps");

Richard Kenner committed
746 747 748 749
   ------------------------------------
   -- Sdep (Source Dependency) Table --
   ------------------------------------

750 751
   --  Each source dependency (D line) in an ALI file generates an entry in the
   --  Sdep table.
Richard Kenner committed
752

753 754
   --  Note: there will be no entries in this table if 'D' lines are ignored

Richard Kenner committed
755 756 757
   No_Sdep_Id : constant Sdep_Id := Sdep_Id'First;
   --  Special value indicating no Sdep table entry

Arnaud Charlet committed
758
   First_Sdep_Entry : Sdep_Id := No_Sdep_Id + 1;
759 760 761
   --  Id of first Sdep entry for current ali file. This is initialized to the
   --  first Sdep entry in the table, and then incremented appropriately as
   --  successive ALI files are scanned.
Richard Kenner committed
762 763 764 765 766 767 768

   type Sdep_Record is record

      Sfile : File_Name_Type;
      --  Name of source file

      Stamp : Time_Stamp_Type;
769 770
      --  Time stamp value. Note that this will be all zero characters for the
      --  dummy entries for missing or non-dependent files.
Richard Kenner committed
771 772

      Checksum : Word;
773 774
      --  Checksum value. Note that this will be all zero characters for the
      --  dummy entries for missing or non-dependent files
775 776

      Dummy_Entry : Boolean;
777 778
      --  Set True for dummy entries that correspond to missing files or files
      --  where no dependency relationship exists.
Richard Kenner committed
779 780 781 782

      Subunit_Name : Name_Id;
      --  Name_Id for subunit name if present, else No_Name

Arnaud Charlet committed
783
      Unit_Name : Name_Id;
Arnaud Charlet committed
784
      --  Name_Id for the unit name if not a subunit (No_Name for a subunit)
Richard Kenner committed
785
      Rfile : File_Name_Type;
786 787
      --  Reference file name. Same as Sfile unless a Source_Reference pragma
      --  was used, in which case it reflects the name used in the pragma.
Richard Kenner committed
788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807

      Start_Line : Nat;
      --  Starting line number in file. Always 1, unless a Source_Reference
      --  pragma was used, in which case it reflects the line number value
      --  given in the pragma.

   end record;

   package Sdep is new Table.Table (
     Table_Component_Type => Sdep_Record,
     Table_Index_Type     => Sdep_Id,
     Table_Low_Bound      => First_Sdep_Entry,
     Table_Initial        => 5000,
     Table_Increment      => 200,
     Table_Name           => "Sdep");

   ----------------------------
   -- Use of Name Table Info --
   ----------------------------

808 809
   --  All unit names and file names are entered into the Names table. The Info
   --  fields of these entries are used as follows:
Richard Kenner committed
810 811 812 813 814 815 816 817 818

   --    Unit name           Info field has Unit_Id of unit table entry
   --    ALI file name       Info field has ALI_Id of ALI table entry
   --    Source file name    Info field has Source_Id of source table entry

   --------------------------
   -- Cross-Reference Data --
   --------------------------

819 820
   --  The following table records cross-reference sections, there is one entry
   --  for each X header line in the ALI file for an xref section.
821 822

   --  Note: there will be no entries in this table if 'X' lines are ignored
Richard Kenner committed
823 824 825 826 827

   type Xref_Section_Record is record
      File_Num : Sdep_Id;
      --  Dependency number for file (entry in Sdep.Table)

828
      File_Name : File_Name_Type;
Richard Kenner committed
829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845
      --  Name of file

      First_Entity : Nat;
      --  First entry in Xref_Entity table

      Last_Entity : Nat;
      --  Last entry in Xref_Entity table
   end record;

   package Xref_Section is new Table.Table (
     Table_Component_Type => Xref_Section_Record,
     Table_Index_Type     => Nat,
     Table_Low_Bound      => 1,
     Table_Initial        => 50,
     Table_Increment      => 300,
     Table_Name           => "Xref_Section");

846 847 848 849 850 851 852 853 854
   --  The following is used to indicate whether a typeref field is present
   --  for the entity, and if so what kind of typeref field.

   type Tref_Kind is (
     Tref_None,    --  No typeref present
     Tref_Access,  --  Access type typeref (points to designated type)
     Tref_Derived, --  Derived type typeref (points to parent type)
     Tref_Type);   --  All other cases

Arnaud Charlet committed
855 856 857 858 859
   type Visibility_Kind is
     (Global, --  Library level entity
      Static, --  Static C/C++ entity
      Other); --  Local and other entity

Richard Kenner committed
860 861 862 863 864 865 866 867
   --  The following table records entities for which xrefs are recorded

   type Xref_Entity_Record is record
      Line : Pos;
      --  Line number of definition

      Etype : Character;
      --  Set to the identification character for the entity. See section
868
      --  "Cross-Reference Entity Identifiers" in lib-xref.ads for details.
Richard Kenner committed
869 870 871 872

      Col : Pos;
      --  Column number of definition

Arnaud Charlet committed
873
      Visibility : Visibility_Kind;
Ralf Wildenhues committed
874
      --  Visibility of entity
Richard Kenner committed
875 876 877 878

      Entity : Name_Id;
      --  Name of entity

879 880 881 882 883 884 885 886 887 888
      Iref_File_Num : Sdep_Id;
      --  This field is set to the dependency reference for the file containing
      --  the generic entity that this one instantiates, or to No_Sdep_Id if
      --  the current entity is not an instantiation

      Iref_Line : Nat;
      --  This field is set to the line number in Iref_File_Num of the generic
      --  entity that this one instantiates, or to zero if the current entity
      --  is not an instantiation.

889 890 891 892 893 894 895 896
      Rref_Line : Nat;
      --  This field is set to the line number of a renaming reference if
      --  one is present, or to zero if no renaming reference is present

      Rref_Col : Nat;
      --  This field is set to the column number of a renaming reference
      --  if one is present, or to zero if no renaming reference is present.

897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915
      Tref : Tref_Kind;
      --  Indicates if a typeref is present, and if so what kind. Set to
      --  Tref_None if no typeref field is present.

      Tref_File_Num : Sdep_Id;
      --  This field is set to No_Sdep_Id if no typeref is present, or
      --  if the typeref refers to an entity in standard. Otherwise it
      --  it is the dependency reference for the file containing the
      --  declaration of the typeref entity.

      Tref_Line : Nat;
      --  This field is set to zero if no typeref is present, or if the
      --  typeref refers to an entity in standard. Otherwise it contains
      --  the line number of the declaration of the typeref entity.

      Tref_Type : Character;
      --  This field is set to blank if no typeref is present, or if the
      --  typeref refers to an entity in standard. Otherwise it contains
      --  the identification character for the typeref entity. See section
916
      --  "Cross-Reference Entity Identifiers" in lib-xref.ads for details.
Richard Kenner committed
917

918 919 920
      Tref_Col : Nat;
      --  This field is set to zero if no typeref is present, or if the
      --  typeref refers to an entity in standard. Otherwise it contains
Richard Kenner committed
921 922
      --  the column number of the declaration of the parent type.

923 924 925 926 927 928 929
      Tref_Standard_Entity : Name_Id;
      --  This field is set to No_Name if no typeref is present or if the
      --  typeref refers to a declared entity rather than an entity in
      --  package Standard. If there is a typeref that references an
      --  entity in package Standard, then this field is a Name_Id
      --  reference for the entity name.

930
      Oref_File_Num : Sdep_Id;
931
      --  This field is set to No_Sdep_Id if the entity doesn't override any
932
      --  other entity, or to the dependency reference for the overridden
933 934 935 936
      --  entity.

      Oref_Line : Nat;
      Oref_Col  : Nat;
937
      --  These two fields are set to the line and column of the overridden
938 939
      --  entity.

Richard Kenner committed
940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956
      First_Xref : Nat;
      --  Index into Xref table of first cross-reference

      Last_Xref : Nat;
      --  Index into Xref table of last cross-reference. The value in
      --  Last_Xref can be less than the First_Xref value to indicate
      --  that no entries are present in the Xref Table.
   end record;

   package Xref_Entity is new Table.Table (
     Table_Component_Type => Xref_Entity_Record,
     Table_Index_Type     => Nat,
     Table_Low_Bound      => 1,
     Table_Initial        => 500,
     Table_Increment      => 300,
     Table_Name           => "Xref_Entity");

957 958 959 960 961 962 963
   Array_Index_Reference : constant Character := '*';
   Interface_Reference   : constant Character := 'I';
   --  Some special types of references. In the ALI file itself, these
   --  are output as attributes of the entity, not as references, but
   --  there is no provision in Xref_Entity_Record for storing multiple
   --  such references.

Richard Kenner committed
964 965 966 967 968 969 970 971
   --  The following table records actual cross-references

   type Xref_Record is record
      File_Num : Sdep_Id;
      --  Set to the file dependency number for the cross-reference. Note
      --  that if no file entry is present explicitly, this is just a copy
      --  of the reference for the current cross-reference section.

972 973 974
      Line : Nat;
      --  Line number for the reference. This is zero when referencing a
      --  predefined entity, but in this case Name is set.
Richard Kenner committed
975 976 977 978 979 980 981 982 983

      Rtype : Character;
      --  Indicates type of reference, using code used in ALI file:
      --    r = reference
      --    m = modification
      --    b = body entity
      --    c = completion of private or incomplete type
      --    x = type extension
      --    i = implicit reference
984 985 986
      --    Array_Index_Reference = reference to the index of an array
      --    Interface_Reference   = reference to an interface implemented
      --                            by the type
Richard Kenner committed
987 988
      --  See description in lib-xref.ads for further details

989
      Col : Nat;
Richard Kenner committed
990
      --  Column number for the reference
991

992 993 994 995
      Name : Name_Id := No_Name;
      --  This is only used when referencing a predefined entity. Currently,
      --  this only occurs for array indexes.

996 997
      --  Note: for instantiation references, Rtype is set to ' ', and Col is
      --  set to zero. One or more such entries can follow any other reference.
998 999 1000 1001 1002
      --  When there is more than one such entry, this is to be read as:
      --     e.g. ref1  ref2  ref3
      --     ref1 is a reference to an entity that was instantied at ref2.
      --     ref2 itself is also the result of an instantiation, that took
      --     place at ref3
Arnaud Charlet committed
1003 1004 1005 1006

      Imported_Lang : Name_Id := No_Name;
      Imported_Name : Name_Id := No_Name;
      --  Language and name of imported entity reference
Richard Kenner committed
1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021
   end record;

   package Xref is new Table.Table (
     Table_Component_Type => Xref_Record,
     Table_Index_Type     => Nat,
     Table_Low_Bound      => 1,
     Table_Initial        => 2000,
     Table_Increment      => 300,
     Table_Name           => "Xref");

   --------------------------------------
   -- Subprograms for Reading ALI File --
   --------------------------------------

   procedure Initialize_ALI;
1022
   --  Initialize the ALI tables. Also resets all switch values to defaults
Richard Kenner committed
1023 1024

   function Scan_ALI
1025 1026 1027 1028 1029 1030 1031 1032 1033
     (F                : File_Name_Type;
      T                : Text_Buffer_Ptr;
      Ignore_ED        : Boolean;
      Err              : Boolean;
      Read_Xref        : Boolean := False;
      Read_Lines       : String  := "";
      Ignore_Lines     : String  := "X";
      Ignore_Errors    : Boolean := False;
      Directly_Scanned : Boolean := False) return ALI_Id;
Richard Kenner committed
1034 1035 1036 1037 1038 1039
   --  Given the text, T, of an ALI file, F, scan and store the information
   --  from the file, and return the Id of the resulting entry in the ALI
   --  table. Switch settings may be modified as described above in the
   --  switch description settings.
   --
   --    Ignore_ED is normally False. If set to True, it indicates that
1040
   --    all AD/ED (elaboration desirable) indications in the ALI file are
1041 1042
   --    to be ignored. This parameter is obsolete now that the -f switch
   --    is removed from gnatbind, and should be removed ???
Richard Kenner committed
1043 1044 1045 1046 1047 1048
   --
   --    Err determines the action taken on an incorrectly formatted file.
   --    If Err is False, then an error message is output, and the program
   --    is terminated. If Err is True, then no error message is output,
   --    and No_ALI_Id is returned.
   --
1049 1050 1051
   --    Ignore_Lines requests that Scan_ALI ignore any lines that start
   --    with any given key character. The default value of X causes all
   --    Xref lines to be ignored. The corresponding data in the ALI
1052
   --    tables will not be filled in this case. It is not possible
1053 1054 1055 1056 1057 1058 1059 1060 1061 1062
   --    to ignore U (unit) lines, they are always read.
   --
   --    Read_Lines requests that Scan_ALI process only lines that start
   --    with one of the given characters. The corresponding data in the
   --    ALI file for any characters not given in the list will not be
   --    set. The default value of the null string indicates that all
   --    lines should be read (unless Ignore_Lines is specified). U
   --    (unit) lines are always read regardless of the value of this
   --    parameter.
   --
Robert Dewar committed
1063 1064 1065
   --    Note: either Ignore_Lines or Read_Lines should be non-null, but not
   --    both. If both are provided then only the Read_Lines value is used,
   --    and the Ignore_Lines parameter is ignored.
1066
   --
Richard Kenner committed
1067
   --    Read_XREF is set True to read and acquire the cross-reference
Robert Dewar committed
1068 1069 1070 1071
   --    information. If Read_XREF is set to True, then the effect is to ignore
   --    all lines other than U, W, D and X lines and the Ignore_Lines and
   --    Read_Lines parameters are ignored (i.e. the use of True for Read_XREF
   --    is equivalent to specifying an argument of "UWDX" for Read_Lines.
Arnaud Charlet committed
1072 1073 1074 1075 1076 1077 1078
   --
   --    Ignore_Errors is normally False. If it is set True, then Scan_ALI
   --    will do its best to scan through a file and extract all information
   --    it can, even if there are errors. In this case Err is only set if
   --    Scan_ALI was completely unable to process the file (e.g. it did not
   --    look like an ALI file at all). Ignore_Errors is intended to improve
   --    the downward compatibility of new compilers with old tools.
1079 1080 1081 1082 1083 1084
   --
   --    Directly_Scanned is normally False. If it is set to True, then the
   --    units (spec and/or body) corresponding to the ALI file are marked as
   --    such. It is used to decide for what units gnatbind should generate
   --    the symbols corresponding to 'Version or 'Body_Version in
   --    Stand-Alone Libraries.
Richard Kenner committed
1085 1086

end ALI;