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