File : types.ads


   1 ------------------------------------------------------------------------------
   2 --                                                                          --
   3 --                         GNAT COMPILER COMPONENTS                         --
   4 --                                                                          --
   5 --                                T Y P E S                                 --
   6 --                                                                          --
   7 --                                 S p e c                                  --
   8 --                                                                          --
   9 --          Copyright (C) 1992-2016, Free Software Foundation, Inc.         --
  10 --                                                                          --
  11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  12 -- terms of the  GNU General Public License as published  by the Free Soft- --
  13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
  14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  16 -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
  17 --                                                                          --
  18 --                                                                          --
  19 --                                                                          --
  20 --                                                                          --
  21 --                                                                          --
  22 -- You should have received a copy of the GNU General Public License and    --
  23 -- a copy of the GCC Runtime Library Exception along with this program;     --
  24 -- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
  25 -- <http://www.gnu.org/licenses/>.                                          --
  26 --                                                                          --
  27 -- GNAT was originally developed  by the GNAT team at  New York University. --
  28 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
  29 --                                                                          --
  30 ------------------------------------------------------------------------------
  31 
  32 --  This package contains host independent type definitions which are used
  33 --  in more than one unit in the compiler. They are gathered here for easy
  34 --  reference, although in some cases the full description is found in the
  35 --  relevant module which implements the definition. The main reason that they
  36 --  are not in their "natural" specs is that this would cause a lot of inter-
  37 --  spec dependencies, and in particular some awkward circular dependencies
  38 --  would have to be dealt with.
  39 
  40 --  WARNING: There is a C version of this package. Any changes to this source
  41 --  file must be properly reflected in the C header file types.h declarations.
  42 
  43 --  Note: the declarations in this package reflect an expectation that the host
  44 --  machine has an efficient integer base type with a range at least 32 bits
  45 --  2s-complement. If there are any machines for which this is not a correct
  46 --  assumption, a significant number of changes will be required.
  47 
  48 with System;
  49 with Unchecked_Conversion;
  50 with Unchecked_Deallocation;
  51 
  52 package Types is
  53    pragma Preelaborate;
  54 
  55    -------------------------------
  56    -- General Use Integer Types --
  57    -------------------------------
  58 
  59    type Int is range -2 ** 31 .. +2 ** 31 - 1;
  60    --  Signed 32-bit integer
  61 
  62    subtype Nat is Int range 0 .. Int'Last;
  63    --  Non-negative Int values
  64 
  65    subtype Pos is Int range 1 .. Int'Last;
  66    --  Positive Int values
  67 
  68    type Word is mod 2 ** 32;
  69    --  Unsigned 32-bit integer
  70 
  71    type Short is range -32768 .. +32767;
  72    for Short'Size use 16;
  73    --  16-bit signed integer
  74 
  75    type Byte is mod 2 ** 8;
  76    for Byte'Size use 8;
  77    --  8-bit unsigned integer
  78 
  79    type size_t is mod 2 ** Standard'Address_Size;
  80    --  Memory size value, for use in calls to C routines
  81 
  82    --------------------------------------
  83    -- 8-Bit Character and String Types --
  84    --------------------------------------
  85 
  86    --  We use Standard.Character and Standard.String freely, since we are
  87    --  compiling ourselves, and we properly implement the required 8-bit
  88    --  character code as required in Ada 95. This section defines a few
  89    --  general use constants and subtypes.
  90 
  91    EOF : constant Character := ASCII.SUB;
  92    --  The character SUB (16#1A#) is used in DOS and other systems derived
  93    --  from DOS (XP, NT etc) to signal the end of a text file. Internally
  94    --  all source files are ended by an EOF character, even on Unix systems.
  95    --  An EOF character acts as the end of file only as the last character
  96    --  of a source buffer, in any other position, it is treated as a blank
  97    --  if it appears between tokens, and as an illegal character otherwise.
  98    --  This makes life easier dealing with files that originated from DOS,
  99    --  including concatenated files with interspersed EOF characters.
 100 
 101    subtype Graphic_Character is Character range ' ' .. '~';
 102    --  Graphic characters, as defined in ARM
 103 
 104    subtype Line_Terminator is Character range ASCII.LF .. ASCII.CR;
 105    --  Line terminator characters (LF, VT, FF, CR). For further details, see
 106    --  the extensive discussion of line termination in the Sinput spec.
 107 
 108    subtype Upper_Half_Character is
 109      Character range Character'Val (16#80#) .. Character'Val (16#FF#);
 110    --  8-bit Characters with the upper bit set
 111 
 112    type Character_Ptr    is access all Character;
 113    type String_Ptr       is access all String;
 114    type String_Ptr_Const is access constant String;
 115    --  Standard character and string pointers
 116 
 117    procedure Free is new Unchecked_Deallocation (String, String_Ptr);
 118    --  Procedure for freeing dynamically allocated String values
 119 
 120    subtype Big_String is String (Positive);
 121    type Big_String_Ptr is access all Big_String;
 122    --  Virtual type for handling imported big strings. Note that we should
 123    --  never have any allocators for this type, but we don't give a storage
 124    --  size of zero, since there are legitimate deallocations going on.
 125 
 126    function To_Big_String_Ptr is
 127      new Unchecked_Conversion (System.Address, Big_String_Ptr);
 128    --  Used to obtain Big_String_Ptr values from external addresses
 129 
 130    subtype Word_Hex_String is String (1 .. 8);
 131    --  Type used to represent Word value as 8 hex digits, with lower case
 132    --  letters for the alphabetic cases.
 133 
 134    function Get_Hex_String (W : Word) return Word_Hex_String;
 135    --  Convert word value to 8-character hex string
 136 
 137    -----------------------------------------
 138    -- Types Used for Text Buffer Handling --
 139    -----------------------------------------
 140 
 141    --  We can not use type String for text buffers, since we must use the
 142    --  standard 32-bit integer as an index value, since we count on all index
 143    --  values being the same size.
 144 
 145    type Text_Ptr is new Int;
 146    --  Type used for subscripts in text buffer
 147 
 148    type Text_Buffer is array (Text_Ptr range <>) of Character;
 149    --  Text buffer used to hold source file or library information file
 150 
 151    type Text_Buffer_Ptr is access all Text_Buffer;
 152    --  Text buffers for input files are allocated dynamically and this type
 153    --  is used to reference these text buffers.
 154 
 155    procedure Free is new Unchecked_Deallocation (Text_Buffer, Text_Buffer_Ptr);
 156    --  Procedure for freeing dynamically allocated text buffers
 157 
 158    ------------------------------------------
 159    -- Types Used for Source Input Handling --
 160    ------------------------------------------
 161 
 162    type Logical_Line_Number is range 0 .. Int'Last;
 163    for Logical_Line_Number'Size use 32;
 164    --  Line number type, used for storing logical line numbers (i.e. line
 165    --  numbers that include effects of any Source_Reference pragmas in the
 166    --  source file). The value zero indicates a line containing a source
 167    --  reference pragma.
 168 
 169    No_Line_Number : constant Logical_Line_Number := 0;
 170    --  Special value used to indicate no line number
 171 
 172    type Physical_Line_Number is range 1 .. Int'Last;
 173    for Physical_Line_Number'Size use 32;
 174    --  Line number type, used for storing physical line numbers (i.e. line
 175    --  numbers in the physical file being compiled, unaffected by the presence
 176    --  of source reference pragmas).
 177 
 178    type Column_Number is range 0 .. 32767;
 179    for Column_Number'Size use 16;
 180    --  Column number (assume that 2**15 - 1 is large enough). The range for
 181    --  this type is used to compute Hostparm.Max_Line_Length. See also the
 182    --  processing for -gnatyM in Stylesw).
 183 
 184    No_Column_Number : constant Column_Number := 0;
 185    --  Special value used to indicate no column number
 186 
 187    Source_Align : constant := 2 ** 12;
 188    --  Alignment requirement for source buffers (by keeping source buffers
 189    --  aligned, we can optimize the implementation of Get_Source_File_Index.
 190    --  See this routine in Sinput for details.
 191 
 192    subtype Source_Buffer is Text_Buffer;
 193    --  Type used to store text of a source file. The buffer for the main
 194    --  source (the source specified on the command line) has a lower bound
 195    --  starting at zero. Subsequent subsidiary sources have lower bounds
 196    --  which are one greater than the previous upper bound, rounded up to
 197    --  a multiple of Source_Align.
 198 
 199    subtype Big_Source_Buffer is Text_Buffer (0 .. Text_Ptr'Last);
 200    --  This is a virtual type used as the designated type of the access type
 201    --  Source_Buffer_Ptr, see Osint.Read_Source_File for details.
 202 
 203    type Source_Buffer_Ptr is access all Big_Source_Buffer;
 204    --  Pointer to source buffer. We use virtual origin addressing for source
 205    --  buffers, with thin pointers. The pointer points to a virtual instance
 206    --  of type Big_Source_Buffer, where the actual type is in fact of type
 207    --  Source_Buffer. The address is adjusted so that the virtual origin
 208    --  addressing works correctly. See Osint.Read_Source_Buffer for further
 209    --  details. Again, as for Big_String_Ptr, we should never allocate using
 210    --  this type, but we don't give a storage size clause of zero, since we
 211    --  may end up doing deallocations of instances allocated manually.
 212 
 213    subtype Source_Ptr is Text_Ptr;
 214    --  Type used to represent a source location, which is a subscript of a
 215    --  character in the source buffer. As noted above, different source buffers
 216    --  have different ranges, so it is possible to tell from a Source_Ptr value
 217    --  which source it refers to. Note that negative numbers are allowed to
 218    --  accommodate the following special values.
 219 
 220    No_Location : constant Source_Ptr := -1;
 221    --  Value used to indicate no source position set in a node. A test for a
 222    --  Source_Ptr value being > No_Location is the approved way to test for a
 223    --  standard value that does not include No_Location or any of the following
 224    --  special definitions. One important use of No_Location is to label
 225    --  generated nodes that we don't want the debugger to see in normal mode
 226    --  (very often we conditionalize so that we set No_Location in normal mode
 227    --  and the corresponding source line in -gnatD mode).
 228 
 229    Standard_Location : constant Source_Ptr := -2;
 230    --  Used for all nodes in the representation of package Standard other than
 231    --  nodes representing the contents of Standard.ASCII. Note that testing for
 232    --  a value being <= Standard_Location tests for both Standard_Location and
 233    --  for Standard_ASCII_Location.
 234 
 235    Standard_ASCII_Location : constant Source_Ptr := -3;
 236    --  Used for all nodes in the presentation of package Standard.ASCII
 237 
 238    System_Location : constant Source_Ptr := -4;
 239    --  Used to identify locations of pragmas scanned by Targparm, where we know
 240    --  the location is in System, but we don't know exactly what line.
 241 
 242    First_Source_Ptr : constant Source_Ptr := 0;
 243    --  Starting source pointer index value for first source program
 244 
 245    -------------------------------------
 246    -- Range Definitions for Tree Data --
 247    -------------------------------------
 248 
 249    --  The tree has fields that can hold any of the following types:
 250 
 251    --    Pointers to other tree nodes (type Node_Id)
 252    --    List pointers (type List_Id)
 253    --    Element list pointers (type Elist_Id)
 254    --    Names (type Name_Id)
 255    --    Strings (type String_Id)
 256    --    Universal integers (type Uint)
 257    --    Universal reals (type Ureal)
 258 
 259    --  In most contexts, the strongly typed interface determines which of these
 260    --  types is present. However, there are some situations (involving untyped
 261    --  traversals of the tree), where it is convenient to be easily able to
 262    --  distinguish these values. The underlying representation in all cases is
 263    --  an integer type Union_Id, and we ensure that the range of the various
 264    --  possible values for each of the above types is disjoint so that this
 265    --  distinction is possible.
 266 
 267    --  Note: it is also helpful for debugging purposes to make these ranges
 268    --  distinct. If a bug leads to misidentification of a value, then it will
 269    --  typically result in an out of range value and a Constraint_Error.
 270 
 271    type Union_Id is new Int;
 272    --  The type in the tree for a union of possible ID values
 273 
 274    List_Low_Bound : constant := -100_000_000;
 275    --  The List_Id values are subscripts into an array of list headers which
 276    --  has List_Low_Bound as its lower bound. This value is chosen so that all
 277    --  List_Id values are negative, and the value zero is in the range of both
 278    --  List_Id and Node_Id values (see further description below).
 279 
 280    List_High_Bound : constant := 0;
 281    --  Maximum List_Id subscript value. This allows up to 100 million list Id
 282    --  values, which is in practice infinite, and there is no need to check the
 283    --  range. The range overlaps the node range by one element (with value
 284    --  zero), which is used both for the Empty node, and for indicating no
 285    --  list. The fact that the same value is used is convenient because it
 286    --  means that the default value of Empty applies to both nodes and lists,
 287    --  and also is more efficient to test for.
 288 
 289    Node_Low_Bound : constant := 0;
 290    --  The tree Id values start at zero, because we use zero for Empty (to
 291    --  allow a zero test for Empty). Actual tree node subscripts start at 0
 292    --  since Empty is a legitimate node value.
 293 
 294    Node_High_Bound : constant := 099_999_999;
 295    --  Maximum number of nodes that can be allocated is 100 million, which
 296    --  is in practice infinite, and there is no need to check the range.
 297 
 298    Elist_Low_Bound : constant := 100_000_000;
 299    --  The Elist_Id values are subscripts into an array of elist headers which
 300    --  has Elist_Low_Bound as its lower bound.
 301 
 302    Elist_High_Bound : constant := 199_999_999;
 303    --  Maximum Elist_Id subscript value. This allows up to 100 million Elists,
 304    --  which is in practice infinite and there is no need to check the range.
 305 
 306    Elmt_Low_Bound : constant := 200_000_000;
 307    --  Low bound of element Id values. The use of these values is internal to
 308    --  the Elists package, but the definition of the range is included here
 309    --  since it must be disjoint from other Id values. The Elmt_Id values are
 310    --  subscripts into an array of list elements which has this as lower bound.
 311 
 312    Elmt_High_Bound : constant := 299_999_999;
 313    --  Upper bound of Elmt_Id values. This allows up to 100 million element
 314    --  list members, which is in practice infinite (no range check needed).
 315 
 316    Names_Low_Bound : constant := 300_000_000;
 317    --  Low bound for name Id values
 318 
 319    Names_High_Bound : constant := 399_999_999;
 320    --  Maximum number of names that can be allocated is 100 million, which is
 321    --  in practice infinite and there is no need to check the range.
 322 
 323    Strings_Low_Bound : constant := 400_000_000;
 324    --  Low bound for string Id values
 325 
 326    Strings_High_Bound : constant := 499_999_999;
 327    --  Maximum number of strings that can be allocated is 100 million, which
 328    --  is in practice infinite and there is no need to check the range.
 329 
 330    Ureal_Low_Bound : constant := 500_000_000;
 331    --  Low bound for Ureal values
 332 
 333    Ureal_High_Bound : constant := 599_999_999;
 334    --  Maximum number of Ureal values stored is 100_000_000 which is in
 335    --  practice infinite so that no check is required.
 336 
 337    Uint_Low_Bound : constant := 600_000_000;
 338    --  Low bound for Uint values
 339 
 340    Uint_Table_Start : constant := 2_000_000_000;
 341    --  Location where table entries for universal integers start (see
 342    --  Uintp spec for details of the representation of Uint values).
 343 
 344    Uint_High_Bound : constant := 2_099_999_999;
 345    --  The range of Uint values is very large, since a substantial part
 346    --  of this range is used to store direct values, see Uintp for details.
 347 
 348    --  The following subtype definitions are used to provide convenient names
 349    --  for membership tests on Int values to see what data type range they
 350    --  lie in. Such tests appear only in the lowest level packages.
 351 
 352    subtype List_Range      is Union_Id
 353      range List_Low_Bound    .. List_High_Bound;
 354 
 355    subtype Node_Range      is Union_Id
 356      range Node_Low_Bound    .. Node_High_Bound;
 357 
 358    subtype Elist_Range     is Union_Id
 359      range Elist_Low_Bound   .. Elist_High_Bound;
 360 
 361    subtype Elmt_Range      is Union_Id
 362      range Elmt_Low_Bound    .. Elmt_High_Bound;
 363 
 364    subtype Names_Range     is Union_Id
 365      range Names_Low_Bound   .. Names_High_Bound;
 366 
 367    subtype Strings_Range   is Union_Id
 368      range Strings_Low_Bound .. Strings_High_Bound;
 369 
 370    subtype Uint_Range      is Union_Id
 371      range Uint_Low_Bound    .. Uint_High_Bound;
 372 
 373    subtype Ureal_Range     is Union_Id
 374      range Ureal_Low_Bound   .. Ureal_High_Bound;
 375 
 376    -----------------------------
 377    -- Types for Atree Package --
 378    -----------------------------
 379 
 380    --  Node_Id values are used to identify nodes in the tree. They are
 381    --  subscripts into the Nodes table declared in package Atree. Note that
 382    --  the special values Empty and Error are subscripts into this table.
 383    --  See package Atree for further details.
 384 
 385    type Node_Id is range Node_Low_Bound .. Node_High_Bound;
 386    --  Type used to identify nodes in the tree
 387 
 388    subtype Entity_Id is Node_Id;
 389    --  A synonym for node types, used in the Einfo package to refer to nodes
 390    --  that are entities (i.e. nodes with an Nkind of N_Defining_xxx). All such
 391    --  nodes are extended nodes and these are the only extended nodes, so that
 392    --  in practice entity and extended nodes are synonymous.
 393 
 394    subtype Node_Or_Entity_Id is Node_Id;
 395    --  A synonym for node types, used in cases where a given value may be used
 396    --  to represent either a node or an entity. We like to minimize such uses
 397    --  for obvious reasons of logical type consistency, but where such uses
 398    --  occur, they should be documented by use of this type.
 399 
 400    Empty : constant Node_Id := Node_Low_Bound;
 401    --  Used to indicate null node. A node is actually allocated with this
 402    --  Id value, so that Nkind (Empty) = N_Empty. Note that Node_Low_Bound
 403    --  is zero, so Empty = No_List = zero.
 404 
 405    Empty_List_Or_Node : constant := 0;
 406    --  This constant is used in situations (e.g. initializing empty fields)
 407    --  where the value set will be used to represent either an empty node or
 408    --  a non-existent list, depending on the context.
 409 
 410    Error : constant Node_Id := Node_Low_Bound + 1;
 411    --  Used to indicate an error in the source program. A node is actually
 412    --  allocated with this Id value, so that Nkind (Error) = N_Error.
 413 
 414    Empty_Or_Error : constant Node_Id := Error;
 415    --  Since Empty and Error are the first two Node_Id values, the test for
 416    --  N <= Empty_Or_Error tests to see if N is Empty or Error. This definition
 417    --  provides convenient self-documentation for such tests.
 418 
 419    First_Node_Id  : constant Node_Id := Node_Low_Bound;
 420    --  Subscript of first allocated node. Note that Empty and Error are both
 421    --  allocated nodes, whose Nkind fields can be accessed without error.
 422 
 423    ------------------------------
 424    -- Types for Nlists Package --
 425    ------------------------------
 426 
 427    --  List_Id values are used to identify node lists stored in the tree, so
 428    --  that each node can be on at most one such list (see package Nlists for
 429    --  further details). Note that the special value Error_List is a subscript
 430    --  in this table, but the value No_List is *not* a valid subscript, and any
 431    --  attempt to apply list operations to No_List will cause a (detected)
 432    --  error.
 433 
 434    type List_Id is range List_Low_Bound .. List_High_Bound;
 435    --  Type used to identify a node list
 436 
 437    No_List : constant List_Id := List_High_Bound;
 438    --  Used to indicate absence of a list. Note that the value is zero, which
 439    --  is the same as Empty, which is helpful in initializing nodes where a
 440    --  value of zero can represent either an empty node or an empty list.
 441 
 442    Error_List : constant List_Id := List_Low_Bound;
 443    --  Used to indicate that there was an error in the source program in a
 444    --  context which would normally require a list. This node appears to be
 445    --  an empty list to the list operations (a null list is actually allocated
 446    --  which has this Id value).
 447 
 448    First_List_Id : constant List_Id := Error_List;
 449    --  Subscript of first allocated list header
 450 
 451    ------------------------------
 452    -- Types for Elists Package --
 453    ------------------------------
 454 
 455    --  Element list Id values are used to identify element lists stored outside
 456    --  of the tree, allowing nodes to be members of more than one such list
 457    --  (see package Elists for further details).
 458 
 459    type Elist_Id is range Elist_Low_Bound .. Elist_High_Bound;
 460    --  Type used to identify an element list (Elist header table subscript)
 461 
 462    No_Elist : constant Elist_Id := Elist_Low_Bound;
 463    --  Used to indicate absence of an element list. Note that this is not an
 464    --  actual Elist header, so element list operations on this value are not
 465    --  valid.
 466 
 467    First_Elist_Id : constant Elist_Id := No_Elist + 1;
 468    --  Subscript of first allocated Elist header
 469 
 470    --  Element Id values are used to identify individual elements of an element
 471    --  list (see package Elists for further details).
 472 
 473    type Elmt_Id is range Elmt_Low_Bound .. Elmt_High_Bound;
 474    --  Type used to identify an element list
 475 
 476    No_Elmt : constant Elmt_Id := Elmt_Low_Bound;
 477    --  Used to represent empty element
 478 
 479    First_Elmt_Id : constant Elmt_Id := No_Elmt + 1;
 480    --  Subscript of first allocated Elmt table entry
 481 
 482    -------------------------------
 483    -- Types for Stringt Package --
 484    -------------------------------
 485 
 486    --  String_Id values are used to identify entries in the strings table. They
 487    --  are subscripts into the Strings table defined in package Stringt.
 488 
 489    --  Note that with only a few exceptions, which are clearly documented, the
 490    --  type String_Id should be regarded as a private type. In particular it is
 491    --  never appropriate to perform arithmetic operations using this type.
 492    --  Doesn't this also apply to all other *_Id types???
 493 
 494    type String_Id is range Strings_Low_Bound .. Strings_High_Bound;
 495    --  Type used to identify entries in the strings table
 496 
 497    No_String : constant String_Id := Strings_Low_Bound;
 498    --  Used to indicate missing string Id. Note that the value zero is used
 499    --  to indicate a missing data value for all the Int types in this section.
 500 
 501    First_String_Id : constant String_Id := No_String + 1;
 502    --  First subscript allocated in string table
 503 
 504    -------------------------
 505    -- Character Code Type --
 506    -------------------------
 507 
 508    --  The type Char is used for character data internally in the compiler, but
 509    --  character codes in the source are represented by the Char_Code type.
 510    --  Each character literal in the source is interpreted as being one of the
 511    --  16#7FFF_FFFF# possible Wide_Wide_Character codes, and a unique Integer
 512    --  value is assigned, corresponding to the UTF-32 value, which also
 513    --  corresponds to the Pos value in the Wide_Wide_Character type, and also
 514    --  corresponds to the Pos value in the Wide_Character and Character types
 515    --  for values that are in appropriate range. String literals are similarly
 516    --  interpreted as a sequence of such codes.
 517 
 518    type Char_Code_Base is mod 2 ** 32;
 519    for Char_Code_Base'Size use 32;
 520 
 521    subtype Char_Code is Char_Code_Base range 0 .. 16#7FFF_FFFF#;
 522    for Char_Code'Value_Size use 32;
 523    for Char_Code'Object_Size use 32;
 524 
 525    function Get_Char_Code (C : Character) return Char_Code;
 526    pragma Inline (Get_Char_Code);
 527    --  Function to obtain internal character code from source character. For
 528    --  the moment, the internal character code is simply the Pos value of the
 529    --  input source character, but we provide this interface for possible
 530    --  later support of alternative character sets.
 531 
 532    function In_Character_Range (C : Char_Code) return Boolean;
 533    pragma Inline (In_Character_Range);
 534    --  Determines if the given character code is in range of type Character,
 535    --  and if so, returns True. If not, returns False.
 536 
 537    function In_Wide_Character_Range (C : Char_Code) return Boolean;
 538    pragma Inline (In_Wide_Character_Range);
 539    --  Determines if the given character code is in range of the type
 540    --  Wide_Character, and if so, returns True. If not, returns False.
 541 
 542    function Get_Character (C : Char_Code) return Character;
 543    pragma Inline (Get_Character);
 544    --  For a character C that is in Character range (see above function), this
 545    --  function returns the corresponding Character value. It is an error to
 546    --  call Get_Character if C is not in Character range.
 547 
 548    function Get_Wide_Character (C : Char_Code) return Wide_Character;
 549    --  For a character C that is in Wide_Character range (see above function),
 550    --  this function returns the corresponding Wide_Character value. It is an
 551    --  error to call Get_Wide_Character if C is not in Wide_Character range.
 552 
 553    ---------------------------------------
 554    -- Types used for Library Management --
 555    ---------------------------------------
 556 
 557    type Unit_Number_Type is new Int range -1 .. Int'Last;
 558    --  Unit number. The main source is unit 0, and subsidiary sources have
 559    --  non-zero numbers starting with 1. Unit numbers are used to index the
 560    --  Units table in package Lib.
 561 
 562    Main_Unit : constant Unit_Number_Type := 0;
 563    --  Unit number value for main unit
 564 
 565    No_Unit : constant Unit_Number_Type := -1;
 566    --  Special value used to signal no unit
 567 
 568    type Source_File_Index is new Int range -1 .. Int'Last;
 569    --  Type used to index the source file table (see package Sinput)
 570 
 571    Internal_Source_File : constant Source_File_Index :=
 572                             Source_File_Index'First;
 573    --  Value used to indicate the buffer for the source-code-like strings
 574    --  internally created withing the compiler (see package Sinput)
 575 
 576    No_Source_File : constant Source_File_Index := 0;
 577    --  Value used to indicate no source file present
 578 
 579    -----------------------------------
 580    -- Representation of Time Stamps --
 581    -----------------------------------
 582 
 583    --  All compiled units are marked with a time stamp which is derived from
 584    --  the source file (we assume that the host system has the concept of a
 585    --  file time stamp which is modified when a file is modified). These
 586    --  time stamps are used to ensure consistency of the set of units that
 587    --  constitutes a library. Time stamps are 14-character strings with
 588    --  with the following format:
 589 
 590    --     YYYYMMDDHHMMSS
 591 
 592    --       YYYY   year
 593    --       MM     month (2 digits 01-12)
 594    --       DD     day (2 digits 01-31)
 595    --       HH     hour (2 digits 00-23)
 596    --       MM     minutes (2 digits 00-59)
 597    --       SS     seconds (2 digits 00-59)
 598 
 599    --  In the case of Unix systems (and other systems which keep the time in
 600    --  GMT), the time stamp is the GMT time of the file, not the local time.
 601    --  This solves problems in using libraries across networks with clients
 602    --  spread across multiple time-zones.
 603 
 604    Time_Stamp_Length : constant := 14;
 605    --  Length of time stamp value
 606 
 607    subtype Time_Stamp_Index is Natural range 1 .. Time_Stamp_Length;
 608    type Time_Stamp_Type is new String (Time_Stamp_Index);
 609    --  Type used to represent time stamp
 610 
 611    Empty_Time_Stamp : constant Time_Stamp_Type := (others => ' ');
 612    --  Value representing an empty or missing time stamp. Looks less than any
 613    --  real time stamp if two time stamps are compared. Note that although this
 614    --  is not private, clients should not rely on the exact way in which this
 615    --  string is represented, and instead should use the subprograms below.
 616 
 617    Dummy_Time_Stamp : constant Time_Stamp_Type := (others => '0');
 618    --  This is used for dummy time stamp values used in the D lines for
 619    --  non-existent files, and is intended to be an impossible value.
 620 
 621    function "="  (Left, Right : Time_Stamp_Type) return Boolean;
 622    function "<=" (Left, Right : Time_Stamp_Type) return Boolean;
 623    function ">=" (Left, Right : Time_Stamp_Type) return Boolean;
 624    function "<"  (Left, Right : Time_Stamp_Type) return Boolean;
 625    function ">"  (Left, Right : Time_Stamp_Type) return Boolean;
 626    --  Comparison functions on time stamps. Note that two time stamps are
 627    --  defined as being equal if they have the same day/month/year and the
 628    --  hour/minutes/seconds values are within 2 seconds of one another. This
 629    --  deals with rounding effects in library file time stamps caused by
 630    --  copying operations during installation. We have particularly noticed
 631    --  that WinNT seems susceptible to such changes.
 632    --
 633    --  Note: the Empty_Time_Stamp value looks equal to itself, and less than
 634    --  any non-empty time stamp value.
 635 
 636    procedure Split_Time_Stamp
 637      (TS      : Time_Stamp_Type;
 638       Year    : out Nat;
 639       Month   : out Nat;
 640       Day     : out Nat;
 641       Hour    : out Nat;
 642       Minutes : out Nat;
 643       Seconds : out Nat);
 644    --  Given a time stamp, decompose it into its components
 645 
 646    procedure Make_Time_Stamp
 647      (Year    : Nat;
 648       Month   : Nat;
 649       Day     : Nat;
 650       Hour    : Nat;
 651       Minutes : Nat;
 652       Seconds : Nat;
 653       TS      : out Time_Stamp_Type);
 654    --  Given the components of a time stamp, initialize the value
 655 
 656    -------------------------------------
 657    -- Types used for Check Management --
 658    -------------------------------------
 659 
 660    type Check_Id is new Nat;
 661    --  Type used to represent a check id
 662 
 663    No_Check_Id : constant := 0;
 664    --  Check_Id value used to indicate no check
 665 
 666    Access_Check           : constant :=  1;
 667    Accessibility_Check    : constant :=  2;
 668    Alignment_Check        : constant :=  3;
 669    Allocation_Check       : constant :=  4;
 670    Atomic_Synchronization : constant :=  5;
 671    Discriminant_Check     : constant :=  6;
 672    Division_Check         : constant :=  7;
 673    Duplicated_Tag_Check   : constant :=  8;
 674    Elaboration_Check      : constant :=  9;
 675    Index_Check            : constant := 10;
 676    Length_Check           : constant := 11;
 677    Overflow_Check         : constant := 12;
 678    Predicate_Check        : constant := 13;
 679    Range_Check            : constant := 14;
 680    Storage_Check          : constant := 15;
 681    Tag_Check              : constant := 16;
 682    Validity_Check         : constant := 17;
 683    Container_Checks       : constant := 18;
 684    Tampering_Check        : constant := 19;
 685    --  Values used to represent individual predefined checks (including the
 686    --  setting of Atomic_Synchronization, which is implemented internally using
 687    --  a "check" whose name is Atomic_Synchronization).
 688 
 689    All_Checks : constant := 20;
 690    --  Value used to represent All_Checks value
 691 
 692    subtype Predefined_Check_Id is Check_Id range 1 .. All_Checks;
 693    --  Subtype for predefined checks, including All_Checks
 694 
 695    --  The following array contains an entry for each recognized check name
 696    --  for pragma Suppress. It is used to represent current settings of scope
 697    --  based suppress actions from pragma Suppress or command line settings.
 698 
 699    --  Note: when Suppress_Array (All_Checks) is True, then generally all other
 700    --  specific check entries are set True, except for the Elaboration_Check
 701    --  entry which is set only if an explicit Suppress for this check is given.
 702    --  The reason for this non-uniformity is that we do not want All_Checks to
 703    --  suppress elaboration checking when using the static elaboration model.
 704    --  We recognize only an explicit suppress of Elaboration_Check as a signal
 705    --  that the static elaboration checking should skip a compile time check.
 706 
 707    type Suppress_Array is array (Predefined_Check_Id) of Boolean;
 708    pragma Pack (Suppress_Array);
 709 
 710    --  To add a new check type to GNAT, the following steps are required:
 711 
 712    --    1.  Add an entry to Snames spec for the new name
 713    --    2.  Add an entry to the definition of Check_Id above
 714    --    3.  Add a new function to Checks to handle the new check test
 715    --    4.  Add a new Do_xxx_Check flag to Sinfo (if required)
 716    --    5.  Add appropriate checks for the new test
 717 
 718    --  The following provides precise details on the mode used to generate
 719    --  code for intermediate operations in expressions for signed integer
 720    --  arithmetic (and how to generate overflow checks if enabled). Note
 721    --  that this only affects handling of intermediate results. The final
 722    --  result must always fit within the target range, and if overflow
 723    --  checking is enabled, the check on the final result is against this
 724    --  target range.
 725 
 726    type Overflow_Mode_Type is (
 727       Not_Set,
 728       --  Dummy value used during initialization process to show that the
 729       --  corresponding value has not yet been initialized.
 730 
 731       Strict,
 732       --  Operations are done in the base type of the subexpression. If
 733       --  overflow checks are enabled, then the check is against the range
 734       --  of this base type.
 735 
 736       Minimized,
 737       --  Where appropriate, intermediate arithmetic operations are performed
 738       --  with an extended range, using Long_Long_Integer if necessary. If
 739       --  overflow checking is enabled, then the check is against the range
 740       --  of Long_Long_Integer.
 741 
 742       Eliminated);
 743       --  In this mode arbitrary precision arithmetic is used as needed to
 744       --  ensure that it is impossible for intermediate arithmetic to cause an
 745       --  overflow. In this mode, intermediate expressions are not affected by
 746       --  the overflow checking mode, since overflows are eliminated.
 747 
 748    subtype Minimized_Or_Eliminated is
 749      Overflow_Mode_Type range Minimized .. Eliminated;
 750    --  Define subtype so that clients don't need to know ordering. Note that
 751    --  Overflow_Mode_Type is not marked as an ordered enumeration type.
 752 
 753    --  The following structure captures the state of check suppression or
 754    --  activation at a particular point in the program execution.
 755 
 756    type Suppress_Record is record
 757       Suppress : Suppress_Array;
 758       --  Indicates suppression status of each possible check
 759 
 760       Overflow_Mode_General : Overflow_Mode_Type;
 761       --  This field indicates the mode for handling code generation and
 762       --  overflow checking (if enabled) for intermediate expression values.
 763       --  This applies to general expressions outside assertions.
 764 
 765       Overflow_Mode_Assertions : Overflow_Mode_Type;
 766       --  This field indicates the mode for handling code generation and
 767       --  overflow checking (if enabled) for intermediate expression values.
 768       --  This applies to any expression occuring inside assertions.
 769    end record;
 770 
 771    -----------------------------------
 772    -- Global Exception Declarations --
 773    -----------------------------------
 774 
 775    --  This section contains declarations of exceptions that are used
 776    --  throughout the compiler or in other GNAT tools.
 777 
 778    Unrecoverable_Error : exception;
 779    --  This exception is raised to immediately terminate the compilation of the
 780    --  current source program. Used in situations where things are bad enough
 781    --  that it doesn't seem worth continuing (e.g. max errors reached, or a
 782    --  required file is not found). Also raised when the compiler finds itself
 783    --  in trouble after an error (see Comperr).
 784 
 785    Terminate_Program : exception;
 786    --  This exception is raised to immediately terminate the tool being
 787    --  executed. Each tool where this exception may be raised must have a
 788    --  single exception handler that contains only a null statement and that is
 789    --  the last statement of the program. If needed, procedure Set_Exit_Status
 790    --  is called with the appropriate exit status before raising
 791    --  Terminate_Program.
 792 
 793    ---------------------------------
 794    -- Parameter Mechanism Control --
 795    ---------------------------------
 796 
 797    --  Function and parameter entities have a field that records the passing
 798    --  mechanism. See specification of Sem_Mech for full details. The following
 799    --  subtype is used to represent values of this type:
 800 
 801    subtype Mechanism_Type is Int range -2 .. Int'Last;
 802    --  Type used to represent a mechanism value. This is a subtype rather than
 803    --  a type to avoid some annoying processing problems with certain routines
 804    --  in Einfo (processing them to create the corresponding C). The values in
 805    --  the range -2 .. 0 are used to represent mechanism types declared as
 806    --  named constants in the spec of Sem_Mech. Positive values are used for
 807    --  the case of a pragma C_Pass_By_Copy that sets a threshold value for the
 808    --  mechanism to be used. For example if pragma C_Pass_By_Copy (32) is given
 809    --  then Default_C_Record_Mechanism is set to 32, and the meaning is to use
 810    --  By_Reference if the size is greater than 32, and By_Copy otherwise.
 811 
 812    ------------------------------
 813    -- Run-Time Exception Codes --
 814    ------------------------------
 815 
 816    --  When the code generator generates a run-time exception, it provides a
 817    --  reason code which is one of the following. This reason code is used to
 818    --  select the appropriate run-time routine to be called, determining both
 819    --  the exception to be raised, and the message text to be added.
 820 
 821    --  The prefix CE/PE/SE indicates the exception to be raised
 822    --    CE = Constraint_Error
 823    --    PE = Program_Error
 824    --    SE = Storage_Error
 825 
 826    --  The remaining part of the name indicates the message text to be added,
 827    --  where all letters are lower case, and underscores are converted to
 828    --  spaces (for example CE_Invalid_Data adds the text "invalid data").
 829 
 830    --  To add a new code, you need to do the following:
 831 
 832    --    1. Assign a new number to the reason. Do not renumber existing codes,
 833    --       since this causes compatibility/bootstrap issues, so always add the
 834    --       new code at the end of the list.
 835 
 836    --    2. Update the contents of the array Kind
 837 
 838    --    3. Modify the corresponding definitions in types.h, including the
 839    --       definition of last_reason_code.
 840 
 841    --    4. Add the name of the routines in exp_ch11.Get_RT_Exception_Name
 842 
 843    --    5. Add a new routine in Ada.Exceptions with the appropriate call and
 844    --       static string constant. Note that there is more than one version
 845    --       of a-except.adb which must be modified.
 846 
 847    --  Note on ordering of references. For the tables in Ada.Exceptions units,
 848    --  usually the ordering does not matter, and we use the same ordering as
 849    --  is used here (note the requirement in the ordering here that CE/PE/SE
 850    --  codes be kept together, so the subtype declarations work OK).
 851 
 852    type RT_Exception_Code is
 853      (CE_Access_Check_Failed,            -- 00
 854       CE_Access_Parameter_Is_Null,       -- 01
 855       CE_Discriminant_Check_Failed,      -- 02
 856       CE_Divide_By_Zero,                 -- 03
 857       CE_Explicit_Raise,                 -- 04
 858       CE_Index_Check_Failed,             -- 05
 859       CE_Invalid_Data,                   -- 06
 860       CE_Length_Check_Failed,            -- 07
 861       CE_Null_Exception_Id,              -- 08
 862       CE_Null_Not_Allowed,               -- 09
 863 
 864       CE_Overflow_Check_Failed,          -- 10
 865       CE_Partition_Check_Failed,         -- 11
 866       CE_Range_Check_Failed,             -- 12
 867       CE_Tag_Check_Failed,               -- 13
 868       PE_Access_Before_Elaboration,      -- 14
 869       PE_Accessibility_Check_Failed,     -- 15
 870       PE_Address_Of_Intrinsic,           -- 16
 871       PE_Aliased_Parameters,             -- 17
 872       PE_All_Guards_Closed,              -- 18
 873       PE_Bad_Predicated_Generic_Type,    -- 19
 874 
 875       PE_Current_Task_In_Entry_Body,     -- 20
 876       PE_Duplicated_Entry_Address,       -- 21
 877       PE_Explicit_Raise,                 -- 22
 878       PE_Finalize_Raised_Exception,      -- 23
 879       PE_Implicit_Return,                -- 24
 880       PE_Misaligned_Address_Value,       -- 25
 881       PE_Missing_Return,                 -- 26
 882       PE_Overlaid_Controlled_Object,     -- 27
 883       PE_Potentially_Blocking_Operation, -- 28
 884       PE_Stubbed_Subprogram_Called,      -- 29
 885 
 886       PE_Unchecked_Union_Restriction,    -- 30
 887       PE_Non_Transportable_Actual,       -- 31
 888       SE_Empty_Storage_Pool,             -- 32
 889       SE_Explicit_Raise,                 -- 33
 890       SE_Infinite_Recursion,             -- 34
 891       SE_Object_Too_Large,               -- 35
 892       PE_Stream_Operation_Not_Allowed);  -- 36
 893 
 894    Last_Reason_Code : constant := 36;
 895    --  Last reason code
 896 
 897    type Reason_Kind is (CE_Reason, PE_Reason, SE_Reason);
 898    --  Categorization of reason codes by exception raised
 899 
 900    Rkind : constant array (RT_Exception_Code range <>) of Reason_Kind :=
 901              (CE_Access_Check_Failed            => CE_Reason,
 902               CE_Access_Parameter_Is_Null       => CE_Reason,
 903               CE_Discriminant_Check_Failed      => CE_Reason,
 904               CE_Divide_By_Zero                 => CE_Reason,
 905               CE_Explicit_Raise                 => CE_Reason,
 906               CE_Index_Check_Failed             => CE_Reason,
 907               CE_Invalid_Data                   => CE_Reason,
 908               CE_Length_Check_Failed            => CE_Reason,
 909               CE_Null_Exception_Id              => CE_Reason,
 910               CE_Null_Not_Allowed               => CE_Reason,
 911               CE_Overflow_Check_Failed          => CE_Reason,
 912               CE_Partition_Check_Failed         => CE_Reason,
 913               CE_Range_Check_Failed             => CE_Reason,
 914               CE_Tag_Check_Failed               => CE_Reason,
 915 
 916               PE_Access_Before_Elaboration      => PE_Reason,
 917               PE_Accessibility_Check_Failed     => PE_Reason,
 918               PE_Address_Of_Intrinsic           => PE_Reason,
 919               PE_Aliased_Parameters             => PE_Reason,
 920               PE_All_Guards_Closed              => PE_Reason,
 921               PE_Bad_Predicated_Generic_Type    => PE_Reason,
 922               PE_Current_Task_In_Entry_Body     => PE_Reason,
 923               PE_Duplicated_Entry_Address       => PE_Reason,
 924               PE_Explicit_Raise                 => PE_Reason,
 925               PE_Finalize_Raised_Exception      => PE_Reason,
 926               PE_Implicit_Return                => PE_Reason,
 927               PE_Misaligned_Address_Value       => PE_Reason,
 928               PE_Missing_Return                 => PE_Reason,
 929               PE_Overlaid_Controlled_Object     => PE_Reason,
 930               PE_Potentially_Blocking_Operation => PE_Reason,
 931               PE_Stubbed_Subprogram_Called      => PE_Reason,
 932               PE_Unchecked_Union_Restriction    => PE_Reason,
 933               PE_Non_Transportable_Actual       => PE_Reason,
 934               PE_Stream_Operation_Not_Allowed   => PE_Reason,
 935 
 936               SE_Empty_Storage_Pool             => SE_Reason,
 937               SE_Explicit_Raise                 => SE_Reason,
 938               SE_Infinite_Recursion             => SE_Reason,
 939               SE_Object_Too_Large               => SE_Reason);
 940 
 941 end Types;