File : lib-writ.ads


   1 ------------------------------------------------------------------------------
   2 --                                                                          --
   3 --                         GNAT COMPILER COMPONENTS                         --
   4 --                                                                          --
   5 --                             L I B . W R I T                              --
   6 --                                                                          --
   7 --                                 S p e c                                  --
   8 --                                                                          --
   9 --          Copyright (C) 1992-2015, Free Software Foundation, Inc.         --
  10 --                                                                          --
  11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  12 -- terms of the  GNU General Public License as published  by the Free Soft- --
  13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
  14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  16 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  17 -- for  more details.  You should have  received  a copy of the GNU General --
  18 -- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
  19 -- http://www.gnu.org/licenses for a complete copy of the license.          --
  20 --                                                                          --
  21 -- GNAT was originally developed  by the GNAT team at  New York University. --
  22 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
  23 --                                                                          --
  24 ------------------------------------------------------------------------------
  25 
  26 --  This package contains the routines for writing the library information
  27 
  28 package Lib.Writ is
  29 
  30    -----------------------------------
  31    -- Format of Library Information --
  32    -----------------------------------
  33 
  34    --  This section describes the format of the library information that is
  35    --  associated with object files. The exact method of this association is
  36    --  potentially implementation dependent and is described and implemented in
  37    --  package ali. From the point of view of the description here, all we need
  38    --  to know is that the information is represented as a string of characters
  39    --  that is somehow associated with an object file, and can be retrieved. If
  40    --  no library information exists for a given object file, then we take this
  41    --  as equivalent to the non-existence of the object file, as if source file
  42    --  has not been previously compiled.
  43 
  44    --  The library information is written as a series of lines of the form:
  45 
  46    --    Key_Character parameter parameter ...
  47 
  48    --  The following sections describe the format of these lines in detail
  49 
  50    --------------------------------------
  51    -- Making Changes to the ALI Format --
  52    --------------------------------------
  53 
  54    --  A number of tools use ali.adb to parse ali files. This means that
  55    --  changes to this format can cause old versions of these tools to be
  56    --  incompatible with new versions of the compiler. Any changes to ali file
  57    --  formats must be carefully evaluated to understand any such possible
  58    --  conflicts, and in particular, it is very undesirable to create conflicts
  59    --  between older versions of GPS and newer versions of the compiler.
  60 
  61    --  If the following guidelines are respected, downward compatibility
  62    --  problems (old tools reading new ali files) should be minimized:
  63 
  64    --    The basic key character format must be kept
  65 
  66    --    The V line must be the first line, this is checked by ali.adb even in
  67    --    Ignore_Errors mode, and is used to verify that the file at hand is
  68    --    indeed likely intended to be an ali file.
  69 
  70    --    The P line must be present, though may be modified in contents
  71    --    according to remaining guidelines. Again, ali.adb assumes the P
  72    --    line is present even in Ignore_Errors mode.
  73 
  74    --    New modifiers can generally be added (in particular adding new two
  75    --    letter modifiers to the P or U lines is always safe)
  76 
  77    --    Adding entirely new lines (with a new key letter) to the ali file is
  78    --    always safe, at any point (other than before the V line), since such
  79    --    lines will be ignored.
  80 
  81    --  Following the guidelines in this section should ensure that this problem
  82    --  is minimized and that old tools will be able to deal successfully with
  83    --  new ali formats. Note that this does not apply to the compiler itself,
  84    --  which always requires consistency between the ali files and the binder.
  85    --  That is because one of the main functions of the binder is to ensure
  86    --  consistency of the partition, and this can be compromised if the ali
  87    --  files are inconsistent.
  88 
  89    ------------------
  90    -- Header Lines --
  91    ------------------
  92 
  93    --  The initial header lines in the file give information about the
  94    --  compilation environment, and identify other special information such as
  95    --  main program parameters.
  96 
  97    --  ----------------
  98    --  -- V  Version --
  99    --  ----------------
 100 
 101    --    V "xxxxxxxxxxxxxxxx"
 102    --
 103    --      This line indicates the library output version, as defined in
 104    --      Gnatvsn. It ensures that separate object modules of a program are
 105    --      consistent. It has to be changed if anything changes which would
 106    --      affect successful binding of separately compiled modules. Examples
 107    --      of such changes are modifications in the format of the library info
 108    --      described in this package, or modifications to calling sequences, or
 109    --      to the way that data is represented.
 110 
 111    --    Note: the V line absolutely must be the first line, and no change
 112    --    to the ALI format should change this, since even in Ignore_Errors
 113    --    mode, Scan_ALI insists on finding a V line.
 114 
 115    --  ---------------------
 116    --  -- M  Main Program --
 117    --  ---------------------
 118 
 119    --    M type [priority] [T=time-slice] [C=cpu] W=?
 120 
 121    --      This line appears only if the main unit for this file is suitable
 122    --      for use as a main program. The parameters are:
 123 
 124    --        type
 125 
 126    --          P for a parameterless procedure
 127    --          F for a function returning a value of integral type
 128    --            (used for writing a main program returning an exit status)
 129 
 130    --        priority
 131 
 132    --          Present only if there was a valid pragma Priority in the
 133    --          corresponding unit to set the main task priority. It is an
 134    --          unsigned decimal integer.
 135 
 136    --        T=time-slice
 137 
 138    --          Present only if there was a valid pragma Time_Slice in the
 139    --          corresponding unit. It is an unsigned decimal integer in the
 140    --          range 0 .. 10**9 giving the time slice value in units of
 141    --          milliseconds. The actual significance of this parameter is
 142    --          target dependent.
 143 
 144    --        C=cpu
 145 
 146    --          Present only if there was a valid pragma CPU in the
 147    --          corresponding unit to set the main task affinity. It is an
 148    --          unsigned decimal integer.
 149 
 150    --        W=?
 151 
 152    --          This parameter indicates the wide character encoding method used
 153    --          when compiling the main program file. The ? character is the
 154    --          single character used in the -gnatW? switch. This is used to
 155    --          provide the default wide-character encoding for Wide_Text_IO
 156    --          files.
 157 
 158    --  -----------------
 159    --  -- A  Argument --
 160    --  -----------------
 161 
 162    --    A argument
 163 
 164    --      One of these lines appears for each of the arguments present in the
 165    --      call to the gnat1 program. This can be used if it is necessary to
 166    --      reconstruct this call (e.g. for fix and continue).
 167 
 168    --  -------------------
 169    --  -- P  Parameters --
 170    --  -------------------
 171 
 172    --    P <<parameters>>
 173 
 174    --      Indicates various information that applies to the compilation of the
 175    --      corresponding source file. Parameters is a sequence of zero or more
 176    --      two letter codes that indicate configuration pragmas and other
 177    --      parameters that apply:
 178 
 179    --      The arguments are as follows:
 180 
 181    --         CE   Compilation errors. If this is present it means that the ali
 182    --              file resulted from a compilation with the -gnatQ switch set,
 183    --              and illegalities were detected. The ali file contents may
 184    --              not be completely reliable, but the format will be correct
 185    --              and complete. Note that NO is always present if CE is
 186    --              present.
 187 
 188    --         DB   Detect_Blocking pragma is in effect for all units in this
 189    --              file.
 190 
 191    --         Ex   A valid Partition_Elaboration_Policy pragma applies to all
 192    --              the units in this file, where x is the first character
 193    --              (upper case) of the policy name (e.g. 'C' for Concurrent).
 194 
 195    --         FX  Units in this file use front-end exceptions, with explicit
 196    --             handlers to trigger AT-END actions on exception paths.
 197 
 198    --         GP   Set if this compilation was done in GNATprove mode, either
 199    --              from direct use of GNATprove, or from use of -gnatdF.
 200 
 201    --         Lx   A valid Locking_Policy pragma applies to all the units in
 202    --              this file, where x is the first character (upper case) of
 203    --              the policy name (e.g. 'C' for Ceiling_Locking).
 204 
 205    --         NO   No object. This flag indicates that the units in this file
 206    --              were not compiled to produce an object. This can occur as a
 207    --              result of the use of -gnatc, or if no object can be produced
 208    --              (e.g. when a package spec is compiled instead of the body,
 209    --              or a subunit on its own). Note that in GNATprove mode, we
 210    --              do produce an object. The object is not suitable for binding
 211    --              and linking, but we do not set NO, instead we set GP.
 212 
 213    --         NR   No_Run_Time. Indicates that a pragma No_Run_Time applies
 214    --              to all units in the file.
 215 
 216    --         NS   Normalize_Scalars pragma in effect for all units in
 217    --              this file.
 218 
 219    --         OH   Pragma Default_Scalar_Storage_Order (High_Order_First) is
 220    --              present in a configuration pragma file that applies.
 221 
 222    --         OL   Pragma Default_Scalar_Storage_Order (Low_Order_First) is
 223    --              present in a configuration pragma file that applies.
 224 
 225    --         Qx   A valid Queueing_Policy pragma applies to all the units
 226    --              in this file, where x is the first character (upper case)
 227    --              of the policy name (e.g. 'P' for Priority_Queueing).
 228 
 229    --         SL   Indicates that the unit is an Interface to a Standalone
 230    --              Library. Note that this indication is never given by the
 231    --              compiler, but is added by the Project Manager in gnatmake
 232    --              when an Interface ALI file is copied to the library
 233    --              directory.
 234 
 235    --         SS   This unit references System.Secondary_Stack (that is,
 236    --              the unit makes use of the secondary stack facilities).
 237 
 238    --         Tx   A valid Task_Dispatching_Policy pragma applies to all
 239    --              the units in this file, where x is the first character
 240    --              (upper case) of the corresponding policy name (e.g. 'F'
 241    --              for FIFO_Within_Priorities).
 242 
 243    --         UA  Unreserve_All_Interrupts pragma was processed in one or
 244    --             more units in this file
 245 
 246    --         ZX  Units in this file use zero-cost exceptions and have
 247    --             generated exception tables. If ZX is not present, the
 248    --             longjmp/setjmp exception scheme is in use.
 249 
 250    --      Note that language defined units never output policy (Lx, Tx, Qx)
 251    --      parameters. Language defined units must correctly handle all
 252    --      possible cases. These values are checked for consistency by the
 253    --      binder and then copied to the generated binder output file.
 254 
 255    --    Note: The P line must be present. Even in Ignore_Errors mode, Scan_ALI
 256    --    insists on finding a P line. So if changes are made to the ALI format,
 257    --    they should not include removing the P line.
 258 
 259    --  ---------------------
 260    --  -- R  Restrictions --
 261    --  ---------------------
 262 
 263    --  There are two forms for R lines, positional and named. The positional
 264    --  notation is now considered obsolescent, it is not generated by the most
 265    --  recent versions of the compiler except under control of the debug switch
 266    --  -gnatdR, but is still recognized by the binder.
 267 
 268    --  The recognition by the binder is to ease the transition, and better deal
 269    --  with some cases of inconsistent builds using incompatible versions of
 270    --  the compiler and binder. The named notation is the current preferred
 271    --  approach.
 272 
 273    --  Note that R lines are generated using the information in unit Rident,
 274    --  and intepreted by the binder using the information in System.Rident.
 275    --  Normally these two units should be effectively identical. However in
 276    --  some cases of inconsistent builds, they may be different. This may lead
 277    --  to binder diagnostics, which can be suppressed using the -C switch for
 278    --  the binder, which results in ignoring unrecognized restrictions in the
 279    --  ali files.
 280 
 281    --  ---------------------------------------
 282    --  -- R  Restrictions (Positional Form) --
 283    --  ---------------------------------------
 284 
 285    --  The first R line records the status of restrictions generated by pragma
 286    --  Restrictions encountered, as well as information on what the compiler
 287    --  has been able to determine with respect to restrictions violations.
 288    --  The format is:
 289 
 290    --    R <<restriction-characters>> <<restriction-param-id-entries>>
 291 
 292    --      The first parameter is a string of characters that records
 293    --      information regarding restrictions that do not take parameter not
 294    --      take parameter values. It is a string of characters, one character
 295    --      for each value (in order) in All_Boolean_Restrictions. There are
 296    --      three possible settings for each restriction:
 297 
 298    --        r   Restricted. Unit was compiled under control of a pragma
 299    --            Restrictions for the corresponding restriction. In this case
 300    --            the unit certainly does not violate the Restriction, since
 301    --            this would have been detected by the compiler.
 302 
 303    --        n   Not used. The unit was not compiled under control of a pragma
 304    --            Restrictions for the corresponding restriction, and does not
 305    --            make any use of the referenced feature.
 306 
 307    --        v   Violated. The unit was not compiled under control of a pragma
 308    --            Restrictions for the corresponding restriction, and it does
 309    --            indeed use the referenced feature.
 310 
 311    --      This information is used in the binder to check consistency, i.e. to
 312    --      detect cases where one unit has "r" and another unit has "v", which
 313    --      is not permitted, since these restrictions are partition-wide.
 314 
 315    --  The second parameter, which immediately follows the first (with no
 316    --  separating space) gives restriction information for identifiers for
 317    --  which a parameter is given.
 318 
 319    --      The parameter is a string of entries, one for each value in
 320    --      Restrict.All_Parameter_Restrictions. Each entry has two components
 321    --      in sequence, the first indicating whether or not there is a
 322    --      restriction, and the second indicating whether or not the compiler
 323    --      detected violations. In the boolean case it is not necessary to
 324    --      separate these, since if a restriction is set, and violated, that is
 325    --      an error. But in the parameter case, this is not true. For example,
 326    --      we can have a unit with a pragma Restrictions (Max_Tasks => 4),
 327    --      where the compiler can detect that there are exactly three tasks
 328    --      declared. Both of these pieces of information must be passed to the
 329    --      binder. The parameter of 4 is important in case the total number of
 330    --      tasks in the partition is greater than 4. The parameter of 3 is
 331    --      important in case some other unit has a restrictions pragma with
 332    --      Max_Tasks=>2.
 333 
 334    --      The component for the presence of restriction has one of two
 335    --      possible forms:
 336 
 337    --         n   No pragma for this restriction is present in the set of units
 338    --             for this ali file.
 339 
 340    --         rN  At least one pragma for this restriction is present in the
 341    --             set of units for this ali file. The value N is the minimum
 342    --             parameter value encountered in any such pragma. N is in the
 343    --             range of Integer (a value larger than N'Last causes the
 344    --             pragma to be ignored).
 345 
 346    --      The component for the violation detection has one of three
 347    --      possible forms:
 348 
 349    --         n   No violations were detected by the compiler
 350 
 351    --         vN  A violation was detected. N is either the maximum or total
 352    --             count of violations (depending on the checking type) in all
 353    --             the units represented by the ali file). Note that this
 354    --             setting is only allowed for restrictions that are in
 355    --             Checked_[Max|Sum]_Parameter_Restrictions. The value here is
 356    --             known to be exact by the compiler and is in the range of
 357    --             Natural.
 358 
 359    --         vN+ A violation was detected. The compiler cannot determine
 360    --             the exact count of violations, but it is at least N.
 361 
 362    --      There are no spaces within the parameter string, so the entry
 363    --      described above in the header of this section for Max_Tasks would
 364    --      appear as the string r4v3.
 365 
 366    --      Note: The restrictions line is required to be present. Even in
 367    --      Ignore_Errors mode, Scan_ALI expects to find an R line and will
 368    --      signal a fatal error if it is missing. This means that future
 369    --      changes to the ALI file format must retain the R line.
 370 
 371    --  ----------------------------------
 372    --  -- R  Restrictions (Named Form) --
 373    --  ----------------------------------
 374 
 375    --  The first R line for named form announces that named notation will be
 376    --  used, and also assures that there is at least one R line present, which
 377    --  makes parsing of ali files simpler. A blank line preceds the RN line.
 378 
 379    --  RN
 380 
 381    --  In named notation, the restrictions are given as a series of lines,
 382    --  one per restrictions that is specified or violated (no information is
 383    --  present for restrictions that are not specified or violated). In the
 384    --  following name is the name of the restriction in all upper case.
 385 
 386    --  For boolean restrictions, we have only two possibilities. A restrictions
 387    --  pragma is present, or a violation is detected:
 388 
 389    --  RR name
 390 
 391    --    A restriction pragma is present for the named boolean restriction.
 392    --    No violations were detected by the compiler (or the unit in question
 393    --    would have been found to be illegal).
 394 
 395    --  RV name
 396 
 397    --    No restriction pragma is present for the named boolean restriction.
 398    --    However, the compiler did detect one or more violations of this
 399    --    restriction, which may require a binder consistency check. Note that
 400    --    one case of a violation is the use of a Restriction_Set attribute for
 401    --    the restriction that yielded False.
 402 
 403    --  For the case of restrictions that take a parameter, we need both the
 404    --  information from pragma if present, and the actual information about
 405    --  what possible violations occur. For example, we can have a unit with
 406    --  a pragma Restrictions (Max_Tasks => 4), where the compiler can detect
 407    --  that there are exactly three tasks declared. Both of these pieces
 408    --  of information must be passed to the binder. The parameter of 4 is
 409    --  important in case the total number of tasks in the partition is greater
 410    --  than 4. The parameter of 3 is important in case some other unit has a
 411    --  restrictions pragma with Max_Tasks=>2.
 412 
 413    --  RR name=N
 414 
 415    --    A restriction pragma is present for the named restriction which is
 416    --    one of the restrictions taking a parameter. The value N (a decimal
 417    --    integer) is the value given in the restriction pragma.
 418 
 419    --  RV name=N
 420 
 421    --    A restriction pragma may or may not be present for the restriction
 422    --    given by name (one of the restrictions taking a parameter). But in
 423    --    either case, the compiler detected possible violations. N (a decimal
 424    --    integer) is the maximum or total count of violations (depending
 425    --    on the checking type) in all the units represented by the ali file).
 426    --    The value here is known to be exact by the compiler and is in the
 427    --    range of Natural. Note that if an RR line is present for the same
 428    --    restriction, then the value in the RV line cannot exceed the value
 429    --    in the RR line (since otherwise the compiler would have detected a
 430    --    violation of the restriction).
 431 
 432    --  RV name=N+
 433 
 434    --    Similar to the above, but the compiler cannot determine the exact
 435    --    count of violations, but it is at least N.
 436 
 437    --  -------------------------------------------------
 438    --  -- R  Restrictions (No_Dependence Information) --
 439    --  -------------------------------------------------
 440 
 441    --  Subsequent R lines are present only if pragma Restriction No_Dependence
 442    --  is used. There is one such line for each such pragma appearing in the
 443    --  extended main unit. The format is:
 444 
 445    --    R unit_name
 446 
 447    --      Here the unit name is in all lower case. The components of the unit
 448    --      name are separated by periods. The names themselves are in encoded
 449    --      form, as documented in Namet.
 450 
 451    --  -------------------------
 452    --  -- I  Interrupt States --
 453    --  -------------------------
 454 
 455    --    I interrupt-number interrupt-state line-number
 456 
 457    --      This line records information from an Interrupt_State pragma. There
 458    --      is one line for each separate pragma, and if no such pragmas are
 459    --      used, then no I lines are present.
 460 
 461    --      The interrupt-number is an unsigned positive integer giving the
 462    --      value of the interrupt as defined in Ada.Interrupts.Names.
 463 
 464    --      The interrupt-state is one of r/s/u for Runtime/System/User
 465 
 466    --      The line number is an unsigned decimal integer giving the line
 467    --      number of the corresponding Interrupt_State pragma. This is used
 468    --      in consistency messages.
 469 
 470    --  --------------------------------------
 471    --  -- S  Priority Specific Dispatching --
 472    --  --------------------------------------
 473 
 474    --    S policy_identifier first_priority last_priority line-number
 475 
 476    --      This line records information from a Priority_Specific_Dispatching
 477    --      pragma. There is one line for each separate pragma, and if no such
 478    --      pragmas are used, then no S lines are present.
 479 
 480    --      The policy_identifier is the first character (upper case) of the
 481    --      corresponding policy name (e.g. 'F' for FIFO_Within_Priorities).
 482 
 483    --      The first_priority and last_priority fields define the range of
 484    --      priorities to which the specified dispatching policy apply.
 485 
 486    --      The line number is an unsigned decimal integer giving the line
 487    --      number of the corresponding Priority_Specific_Dispatching pragma.
 488    --      This is used in consistency messages.
 489 
 490    ----------------------------
 491    -- Compilation Unit Lines --
 492    ----------------------------
 493 
 494    --  Following these header lines, a set of information lines appears for
 495    --  each compilation unit that appears in the corresponding object file. In
 496    --  particular, when a package body or subprogram body is compiled, there
 497    --  will be two sets of information, one for the spec and one for the body,
 498    --  with the entry for the body appearing first. This is the only case in
 499    --  which a single ALI file contains more than one unit (in particular note
 500    --  that subunits do *not* count as compilation units for this purpose, and
 501    --  generate no library information, since they are inlined).
 502 
 503    --  --------------------
 504    --  -- U  Unit Header --
 505    --  --------------------
 506 
 507    --  The lines for each compilation unit have the following form
 508 
 509    --    U unit-name source-name version <<attributes>>
 510 
 511    --      This line identifies the unit to which this section of the library
 512    --      information file applies. The first three parameters are the unit
 513    --      name in internal format, as described in package Uname, and the name
 514    --      of the source file containing the unit.
 515 
 516    --      Version is the version given as eight hexadecimal characters with
 517    --      upper case letters. This value is the exclusive or of the source
 518    --      checksums of the unit and all its semantically dependent units.
 519 
 520    --      The <<attributes>> are a series of two letter codes indicating
 521    --      information about the unit:
 522 
 523    --         BD  Unit does not have pragma Elaborate_Body, but the elaboration
 524    --             circuit has determined that it would be a good idea if this
 525    --             pragma were present, since the body of the package contains
 526    --             elaboration code that modifies one or more variables in the
 527    --             visible part of the package. The binder will try, but does
 528    --             not promise, to keep the elaboration of the body close to
 529    --             the elaboration of the spec.
 530 
 531    --         DE  Dynamic Elaboration. This unit was compiled with the dynamic
 532    --             elaboration model, as set by either the -gnatE switch or
 533    --             pragma Elaboration_Checks (Dynamic).
 534    --
 535    --         EB  Unit has pragma Elaborate_Body, or is a generic instance that
 536    --             has a body. Set for instances because RM 12.3(20) requires
 537    --             that the body be immediately elaborated after the spec (we
 538    --             would normally do that anyway, because elaborate spec and
 539    --             body together whenever possible, and for an instance it is
 540    --             always possible; however setting EB ensures that this is done
 541    --             even when using the -p gnatbind switch).
 542 
 543    --         EE  Elaboration entity is present which must be set true when
 544    --             the unit is elaborated. The name of the elaboration entity is
 545    --             formed from the unit name in the usual way. If EE is present,
 546    --             then this boolean must be set True as part of the elaboration
 547    --             processing routine generated by the binder. Note that EE can
 548    --             be set even if NE is set. This happens when the boolean is
 549    --             needed solely for checking for the case of access before
 550    --             elaboration.
 551 
 552    --         GE  Unit is a generic declaration, or corresponding body
 553    --
 554    --         IL  Unit source uses a style with identifiers in all lower-case
 555    --         IU  (IL) or all upper case (IU). If the standard mixed-case usage
 556    --             is detected, or the compiler cannot determine the style, then
 557    --             no I parameter will appear.
 558 
 559    --         IS  Initialize_Scalars pragma applies to this unit, or else there
 560    --             is at least one use of the Invalid_Value attribute.
 561 
 562    --         KM  Unit source uses a style with keywords in mixed case (KM)
 563    --         KU  or all upper case (KU). If the standard lower-case usage is
 564    --             is detected, or the compiler cannot determine the style, then
 565    --             no K parameter will appear.
 566 
 567    --         NE  Unit has no elaboration routine. All subprogram bodies and
 568    --             specs are in this category. Package bodies and specs may or
 569    --             may not have NE set, depending on whether or not elaboration
 570    --             code is required. Set if N_Compilation_Unit node has flag
 571    --             Has_No_Elaboration_Code set.
 572 
 573    --         OL   The units in this file are compiled with a local pragma
 574    --              Optimize_Alignment, so no consistency requirement applies
 575    --              to these units. All internal units have this status since
 576    --              they have an automatic default of Optimize_Alignment (Off).
 577    --
 578    --         OO   Optimize_Alignment (Off) is the default setting for all
 579    --              units in this file. All files in the partition that specify
 580    --              a default must specify the same default.
 581 
 582    --         OS   Optimize_Alignment (Space) is the default setting for all
 583    --              units in this file. All files in the partition that specify
 584    --              a default must specify the same default.
 585 
 586    --         OT   Optimize_Alignment (Time) is the default setting for all
 587    --              units in this file. All files in the partition that specify
 588    --              a default must specify the same default.
 589 
 590    --         PF  The unit has a library-level (package) finalizer
 591 
 592    --         PK  Unit is package, rather than a subprogram
 593 
 594    --         PU  Unit has pragma Pure
 595 
 596    --         PR  Unit has pragma Preelaborate
 597 
 598    --         RA  Unit declares a Remote Access to Class-Wide (RACW) type
 599 
 600    --         RC  Unit has pragma Remote_Call_Interface
 601 
 602    --         RT  Unit has pragma Remote_Types
 603 
 604    --         SE  Compilation of unit encountered one or more serious errors.
 605    --             Normally the generation of an ALI file is suppressed if there
 606    --             is a serious error, but this can be overridden with -gnatQ.
 607 
 608    --         SP  Unit has pragma Shared_Passive
 609 
 610    --         SU  Unit is a subprogram, rather than a package
 611 
 612    --      The attributes may appear in any order, separated by spaces
 613 
 614    --  -----------------------------
 615    --  -- W, Y and Z Withed Units --
 616    --  -----------------------------
 617 
 618    --  Following each U line, is a series of lines of the form
 619 
 620    --    W unit-name [source-name lib-name] [E] [EA] [ED] [AD]
 621    --      or
 622    --    Y unit-name [source-name lib-name] [E] [EA] [ED] [AD]
 623    --      or
 624    --    Z unit-name [source-name lib-name] [E] [EA] [ED] [AD]
 625 
 626    --      One W line is present for each unit that is mentioned in an explicit
 627    --      non-limited with clause by the current unit. One Y line is present
 628    --      for each unit that is mentioned in an explicit limited with clause
 629    --      by the current unit. One Z line is present for each unit that is
 630    --      only implicitly withed by the current unit. The first parameter is
 631    --      the unit name in internal format. The second parameter is the file
 632    --      name of the file that must be compiled to compile this unit. It is
 633    --      usually the file for the body, except for packages which have no
 634    --      body. For units that need a body, if the source file for the body
 635    --      cannot be found, the file name of the spec is used instead. The
 636    --      third parameter is the file name of the library information file
 637    --      that contains the results of compiling this unit. The optional
 638    --      modifiers are used as follows:
 639 
 640    --        E   pragma Elaborate applies to this unit
 641 
 642    --        EA  pragma Elaborate_All applies to this unit
 643 
 644    --        ED  Elaborate_Desirable set for this unit, which means that there
 645    --            is no Elaborate, but the analysis suggests that Program_Error
 646    --            may be raised if the Elaborate conditions cannot be satisfied.
 647    --            The binder will attempt to treat ED as E if it can.
 648 
 649    --        AD  Elaborate_All_Desirable set for this unit, which means that
 650    --            there is no Elaborate_All, but the analysis suggests that
 651    --            Program_Error may be raised if the Elaborate_All conditions
 652    --            cannot be satisfied. The binder will attempt to treat AD as
 653    --            EA if it can.
 654 
 655    --      The parameter source-name and lib-name are omitted for the case of a
 656    --      generic unit compiled with earlier versions of GNAT which did not
 657    --      generate object or ali files for generics. For compatibility in the
 658    --      bootstrap path we continue to omit these entries for predefined
 659    --      generic units, even though we do now generate object and ali files.
 660 
 661    --      However, in SPARK mode, we always generate source-name and lib-name
 662    --      parameters. Bootstrap issues do not apply there, and we need this
 663    --      information to properly compute frame conditions of subprograms.
 664 
 665    --      The parameter source-name and lib-name are also omitted for the W
 666    --      lines that result from use of a Restriction_Set attribute which gets
 667    --      a result of False from a No_Dependence check, in the case where the
 668    --      unit is not in the semantic closure. In such a case, the bare W
 669    --      line is generated, but no D (dependency) line. This will make the
 670    --      binder do the consistency check, but not include the unit in the
 671    --      partition closure (unless it is properly With'ed somewhere).
 672 
 673    --  -----------------------
 674    --  -- L  Linker_Options --
 675    --  -----------------------
 676 
 677    --  Following the W lines (if any, or the U line if not), are an optional
 678    --  series of lines that indicates the usage of the pragma Linker_Options in
 679    --  the associated unit. For each appearance of a pragma Linker_Options (or
 680    --  Link_With) in the unit, a line is present with the form:
 681 
 682    --    L "string"
 683 
 684    --      where string is the string from the unit line enclosed in quotes.
 685    --      Within the quotes the following can occur:
 686 
 687    --        c    graphic characters in range 20-7E other than " or {
 688    --        ""   indicating a single " character
 689    --        {hh} indicating a character whose code is hex hh (0-9,A-F)
 690    --        {00} [ASCII.NUL] is used as a separator character
 691    --             to separate multiple arguments of a single
 692    --             Linker_Options pragma.
 693 
 694    --      For further details, see Stringt.Write_String_Table_Entry. Note that
 695    --      wide characters in the form {hhhh} cannot be produced, since pragma
 696    --      Linker_Option accepts only String, not Wide_String.
 697 
 698    --      The L lines are required to appear in the same order as the
 699    --      corresponding Linker_Options (or Link_With) pragmas appear in the
 700    --      source file, so that this order is preserved by the binder in
 701    --      constructing the set of linker arguments.
 702 
 703    --  Note: Linker_Options lines never appear in the ALI file generated for
 704    --  a predefined generic unit, and there is cicuitry in Sem_Prag to enforce
 705    --  this restriction, which is needed because of not generating source name
 706    --  and lib name parameters on the with lines for such files, as explained
 707    --  above in the section on with lines.
 708 
 709    --  --------------
 710    --  -- N  Notes --
 711    --  --------------
 712 
 713    --  The final section of unit-specific lines contains notes which record
 714    --  annotations inserted in source code for processing by external tools
 715    --  using pragmas. For each occurrence of any of these pragmas, a line is
 716    --  generated with the following syntax:
 717 
 718    --    N x<sloc> [<arg_id>:]<arg> ...
 719 
 720    --      x is one of:
 721    --        A  pragma Annotate
 722    --        C  pragma Comment
 723    --        I  pragma Ident
 724    --        T  pragma Title
 725    --        S  pragma Subtitle
 726 
 727    --      <sloc> is the source location of the pragma in line:col[:filename]
 728    --      format. The file name is omitted if it is the same as the current
 729    --      unit (it therefore appears explicitly in the case of pragmas
 730    --      occurring in subunits, which do not have U sections of their own).
 731 
 732    --      Successive entries record the pragma_argument_associations.
 733 
 734    --        If a pragma argument identifier is present, the entry is prefixed
 735    --        with the pragma argument identifier <arg_id> followed by a colon.
 736 
 737    --        <arg> represents the pragma argument, and has the following
 738    --        conventions:
 739 
 740    --          - identifiers are output verbatim
 741    --          - static string expressions are output as literals encoded as
 742    --            for L lines
 743    --          - static integer expressions are output as decimal literals
 744    --          - any other expression is replaced by the placeholder "<expr>"
 745 
 746    ---------------------
 747    -- Reference Lines --
 748    ---------------------
 749 
 750    --  The reference lines contain information about references from any of the
 751    --  units in the compilation (including body version and version attributes,
 752    --  linker options pragmas and source dependencies).
 753 
 754    --  ------------------------------------
 755    --  -- E  External Version References --
 756    --  ------------------------------------
 757 
 758    --  One of these lines is present for each use of 'Body_Version or 'Version
 759    --  in any of the units of the compilation. These are used by the linker to
 760    --  determine which version symbols must be output. The format is simply:
 761 
 762    --    E name
 763 
 764    --  where name is the external name, i.e. the unit name with either a S or a
 765    --  B for spec or body version referenced (Body_Version always references
 766    --  the body, Version references the Spec, except in the case of a reference
 767    --  to a subprogram with no separate spec). Upper half and wide character
 768    --  codes are encoded using the same method as in Namet (Uhh for upper half,
 769    --  Whhhh for wide character, where hh are hex digits).
 770 
 771    --  ---------------------
 772    --  -- D  Dependencies --
 773    --  ---------------------
 774 
 775    --  The dependency lines indicate the source files on which the compiled
 776    --  units depend. This is used by the binder for consistency checking.
 777    --  These lines are also referenced by the cross-reference information.
 778 
 779    --    D source-name time-stamp checksum (sub)unit-name line:file-name
 780 
 781    --      source-name also includes preprocessing data file and preprocessing
 782    --      definition file. These preprocessing files may be given as full
 783    --      path names instead of simple file names. If a full path name
 784    --      includes a directory with spaces, the path name is quoted (quote
 785    --      characters (") added at start and end, and any internal quotes are
 786    --      doubled).
 787 
 788    --      The time-stamp field contains the time stamp of the corresponding
 789    --      source file. See types.ads for details on time stamp representation.
 790 
 791    --      The checksum is an 8-hex digit representation of the source file
 792    --      checksum, with letters given in lower case.
 793 
 794    --      If the unit is not a subunit, the (sub)unit name is the unit name in
 795    --      internal format, as described in package Uname. If the unit is a
 796    --      subunit, the (sub)unit name is the fully qualified name of the
 797    --      subunit in all lower case letters.
 798 
 799    --      The line:file-name entry is present only if a Source_Reference
 800    --      pragma appeared in the source file identified by source-name. In
 801    --      this case, it gives the information from this pragma. Note that this
 802    --      allows cross-reference information to be related back to the
 803    --      original file. Note: the reason the line number comes first is that
 804    --      a leading digit immediately identifies this as a Source_Reference
 805    --      entry, rather than a subunit-name.
 806 
 807    --      A line number of zero for line: in this entry indicates that there
 808    --      is more than one source reference pragma. In this case, the line
 809    --      numbers in the cross-reference are correct, and refer to the
 810    --      original line number, but there is no information that allows a
 811    --      reader of the ALI file to determine the exact mapping of physical
 812    --      line numbers back to the original source.
 813 
 814    --      Files with a zero checksum and a non-zero time stamp are in general
 815    --      files on which the compilation depends but which are not Ada files
 816    --      with further dependencies. This includes preprocessor data files
 817    --      and preprocessor definition files.
 818 
 819    --      Note: blank lines are ignored when the library information is read,
 820    --      and separate sections of the file are separated by blank lines to
 821    --      ease readability. Blanks between fields are also ignored.
 822 
 823    --      For entries corresponding to files that were not present (and thus
 824    --      resulted in error messages), or for files that are not part of the
 825    --      dependency set, both the time stamp and checksum are set to all zero
 826    --      characters. These dummy entries are ignored by the binder in
 827    --      dependency checking, but must be present for proper interpretation
 828    --      of the cross-reference data.
 829 
 830    --------------------------
 831    -- Cross-Reference Data --
 832    --------------------------
 833 
 834    --  The cross-reference data follows the dependency lines. See the spec of
 835    --  Lib.Xref in file lib-xref.ads for details on the format of this data.
 836 
 837    ---------------------------------
 838    -- Source Coverage Obligations --
 839    ---------------------------------
 840 
 841    --  The Source Coverage Obligation (SCO) information follows the cross-
 842    --  reference data. See the spec of Par_SCO in file par_sco.ads for full
 843    --  details of the format.
 844 
 845    ---------------------------------------
 846    -- SPARK Cross-Reference Information --
 847    ---------------------------------------
 848 
 849    --  The SPARK cross-reference information follows the SCO information. See
 850    --  the spec of SPARK_Xrefs in file spark_xrefs.ads for full details of the
 851    --  format.
 852 
 853    -------------------------------
 854    -- ALI File Generation for C --
 855    -------------------------------
 856 
 857    --  The C compiler can also generate ALI files for use by the IDE's in
 858    --  providing navigation services in C. These ALI files are a subset of
 859    --  the specification above, lacking all Ada-specific output. Primarily
 860    --  the IDE uses the cross-reference sections of such files.
 861 
 862    ----------------------
 863    -- Global Variables --
 864    ----------------------
 865 
 866    --  The table defined here stores one entry for each Interrupt_State pragma
 867    --  encountered either in the main source or in an ancillary with'ed source.
 868    --  Since interrupt state values have to be consistent across all units in a
 869    --  partition, we detect inconsistencies at compile time when we can.
 870 
 871    type Interrupt_State_Entry is record
 872       Interrupt_Number : Pos;
 873       --  Interrupt number value
 874 
 875       Interrupt_State : Character;
 876       --  Set to r/s/u for Runtime/System/User
 877 
 878       Pragma_Loc : Source_Ptr;
 879       --  Location of pragma setting this value in place
 880    end record;
 881 
 882    package Interrupt_States is new Table.Table (
 883      Table_Component_Type => Interrupt_State_Entry,
 884      Table_Index_Type     => Nat,
 885      Table_Low_Bound      => 1,
 886      Table_Initial        => 30,
 887      Table_Increment      => 200,
 888      Table_Name           => "Name_Interrupt_States");
 889 
 890    --  The table structure defined here stores one entry for each
 891    --  Priority_Specific_Dispatching pragma encountered either in the main
 892    --  source or in an ancillary with'ed source. Since have to be consistent
 893    --  across all units in a partition, we may as well detect inconsistencies
 894    --  at compile time when we can.
 895 
 896    type Specific_Dispatching_Entry is record
 897       Dispatching_Policy : Character;
 898       --  First character (upper case) of the corresponding policy name
 899 
 900       First_Priority     : Nat;
 901       --  Lower bound of the priority range to which the specified dispatching
 902       --  policy applies.
 903 
 904       Last_Priority      : Nat;
 905       --  Upper bound of the priority range to which the specified dispatching
 906       --  policy applies.
 907 
 908       Pragma_Loc         : Source_Ptr;
 909       --  Location of pragma setting this value in place
 910    end record;
 911 
 912    package Specific_Dispatching is new Table.Table (
 913      Table_Component_Type => Specific_Dispatching_Entry,
 914      Table_Index_Type     => Nat,
 915      Table_Low_Bound      => 1,
 916      Table_Initial        => 10,
 917      Table_Increment      => 100,
 918      Table_Name           => "Name_Priority_Specific_Dispatching");
 919 
 920    -----------------
 921    -- Subprograms --
 922    -----------------
 923 
 924    procedure Ensure_System_Dependency;
 925    --  This procedure ensures that a dependency is created on system.ads. Even
 926    --  if there is no semantic dependency, Targparm has read the file to
 927    --  acquire target parameters, so we need a source dependency.
 928 
 929    procedure Write_ALI (Object : Boolean);
 930    --  This procedure writes the library information for the current main unit
 931    --  The Object parameter is true if an object file is created, and false
 932    --  otherwise. Note that the pseudo-object file generated in GNATProve mode
 933    --  does count as an object file from this point of view.
 934    --
 935    --  Note: in the case where we are not generating code (-gnatc mode), this
 936    --  routine only writes an ALI file if it cannot find an existing up to
 937    --  date ALI file. If it *can* find an existing up to date ALI file, then
 938    --  it reads this file and sets the Lib.Compilation_Arguments table from
 939    --  the A lines in this file.
 940 
 941    procedure Add_Preprocessing_Dependency (S : Source_File_Index);
 942    --  Indicate that there is a dependency to be added on a preprocessing data
 943    --  file or on a preprocessing definition file.
 944 
 945 end Lib.Writ;