| 1 | 
         706 | 
         jeremybenn | 
         ------------------------------------------------------------------------------
  | 
      
      
         | 2 | 
          | 
          | 
         --                                                                          --
  | 
      
      
         | 3 | 
          | 
          | 
         --                        GNAT RUN-TIME COMPONENTS                          --
  | 
      
      
         | 4 | 
          | 
          | 
         --                                                                          --
  | 
      
      
         | 5 | 
          | 
          | 
         --                             T A R G P A R M                              --
  | 
      
      
         | 6 | 
          | 
          | 
         --                                                                          --
  | 
      
      
         | 7 | 
          | 
          | 
         --                                 S p e c                                  --
  | 
      
      
         | 8 | 
          | 
          | 
         --                                                                          --
  | 
      
      
         | 9 | 
          | 
          | 
         --          Copyright (C) 1999-2011, 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 obtains parameters from the target runtime version of System,
  | 
      
      
         | 27 | 
          | 
          | 
         --  to indicate parameters relevant to the target environment.
  | 
      
      
         | 28 | 
          | 
          | 
          
  | 
      
      
         | 29 | 
          | 
          | 
         --  Conceptually, these parameters could be obtained using rtsfind, but
  | 
      
      
         | 30 | 
          | 
          | 
         --  we do not do this for four reasons:
  | 
      
      
         | 31 | 
          | 
          | 
          
  | 
      
      
         | 32 | 
          | 
          | 
         --    1. Compiling System for every compilation wastes time
  | 
      
      
         | 33 | 
          | 
          | 
          
  | 
      
      
         | 34 | 
          | 
          | 
         --    2. This compilation impedes debugging by adding extra compile steps
  | 
      
      
         | 35 | 
          | 
          | 
          
  | 
      
      
         | 36 | 
          | 
          | 
         --    3. There are recursion problems coming from compiling System itself
  | 
      
      
         | 37 | 
          | 
          | 
         --        or any of its children.
  | 
      
      
         | 38 | 
          | 
          | 
          
  | 
      
      
         | 39 | 
          | 
          | 
         --    4. The binder also needs the parameters, and we do not want to have
  | 
      
      
         | 40 | 
          | 
          | 
         --        to drag a lot of front end stuff into the binder.
  | 
      
      
         | 41 | 
          | 
          | 
          
  | 
      
      
         | 42 | 
          | 
          | 
         --  For all these reasons, we read in the source of System, and then scan
  | 
      
      
         | 43 | 
          | 
          | 
         --  it at the text level to extract the parameter values.
  | 
      
      
         | 44 | 
          | 
          | 
          
  | 
      
      
         | 45 | 
          | 
          | 
         --  Note however, that later on, when the ali file is written, we make sure
  | 
      
      
         | 46 | 
          | 
          | 
         --  that the System file is at least parsed, so that the checksum is properly
  | 
      
      
         | 47 | 
          | 
          | 
         --  computed and set in the ali file. This partially negates points 1 and 2
  | 
      
      
         | 48 | 
          | 
          | 
         --  above although just parsing is quick and does not impact debugging much.
  | 
      
      
         | 49 | 
          | 
          | 
          
  | 
      
      
         | 50 | 
          | 
          | 
         --  The parameters acquired by this routine from system.ads fall into four
  | 
      
      
         | 51 | 
          | 
          | 
         --  categories:
  | 
      
      
         | 52 | 
          | 
          | 
          
  | 
      
      
         | 53 | 
          | 
          | 
         --     1. Configuration pragmas, that must appear at the start of the file.
  | 
      
      
         | 54 | 
          | 
          | 
         --        Any such pragmas automatically apply to any unit compiled in the
  | 
      
      
         | 55 | 
          | 
          | 
         --        presence of this system file. Only a limited set of such pragmas
  | 
      
      
         | 56 | 
          | 
          | 
         --        may appear as documented in the corresponding section below,
  | 
      
      
         | 57 | 
          | 
          | 
          
  | 
      
      
         | 58 | 
          | 
          | 
         --     2. Target parameters. These are boolean constants that are defined
  | 
      
      
         | 59 | 
          | 
          | 
         --        in the private part of the package giving fixed information
  | 
      
      
         | 60 | 
          | 
          | 
         --        about the target architecture, and the capabilities of the
  | 
      
      
         | 61 | 
          | 
          | 
         --        code generator and run-time library.
  | 
      
      
         | 62 | 
          | 
          | 
          
  | 
      
      
         | 63 | 
          | 
          | 
         --     3. Identification information. This is an optional string constant
  | 
      
      
         | 64 | 
          | 
          | 
         --        that gives the name of the run-time library configuration. This
  | 
      
      
         | 65 | 
          | 
          | 
         --        line may be omitted for a version of system.ads to be used with
  | 
      
      
         | 66 | 
          | 
          | 
         --        the full Ada 95 run time.
  | 
      
      
         | 67 | 
          | 
          | 
          
  | 
      
      
         | 68 | 
          | 
          | 
         --     4. Other characteristics of package System. At the current time the
  | 
      
      
         | 69 | 
          | 
          | 
         --        only item in this category is whether type Address is private.
  | 
      
      
         | 70 | 
          | 
          | 
          
  | 
      
      
         | 71 | 
          | 
          | 
         with Rident; use Rident;
  | 
      
      
         | 72 | 
          | 
          | 
         with Namet;  use Namet;
  | 
      
      
         | 73 | 
          | 
          | 
         with Types;  use Types;
  | 
      
      
         | 74 | 
          | 
          | 
          
  | 
      
      
         | 75 | 
          | 
          | 
         package Targparm is
  | 
      
      
         | 76 | 
          | 
          | 
          
  | 
      
      
         | 77 | 
          | 
          | 
            ---------------------------
  | 
      
      
         | 78 | 
          | 
          | 
            -- Configuration Pragmas --
  | 
      
      
         | 79 | 
          | 
          | 
            ---------------------------
  | 
      
      
         | 80 | 
          | 
          | 
          
  | 
      
      
         | 81 | 
          | 
          | 
            --  The following switches get set if the corresponding configuration
  | 
      
      
         | 82 | 
          | 
          | 
            --  pragma is scanned from the source of system.ads. No other pragmas
  | 
      
      
         | 83 | 
          | 
          | 
            --  are permitted to appear at the start of the system.ads source file.
  | 
      
      
         | 84 | 
          | 
          | 
          
  | 
      
      
         | 85 | 
          | 
          | 
            --  If a pragma Discard_Names appears, then Opt.Global_Discard_Names is
  | 
      
      
         | 86 | 
          | 
          | 
            --  set to True to indicate that all units must be compiled in this mode.
  | 
      
      
         | 87 | 
          | 
          | 
          
  | 
      
      
         | 88 | 
          | 
          | 
            --  If a pragma Locking_Policy appears, then Opt.Locking_Policy is set
  | 
      
      
         | 89 | 
          | 
          | 
            --  to the first character of the policy name, and Opt.Locking_Policy_Sloc
  | 
      
      
         | 90 | 
          | 
          | 
            --  is set to System_Location.
  | 
      
      
         | 91 | 
          | 
          | 
          
  | 
      
      
         | 92 | 
          | 
          | 
            --  If a pragma Normalize_Scalars appears, then Opt.Normalize_Scalars
  | 
      
      
         | 93 | 
          | 
          | 
            --  is set True, as well as Opt.Init_Or_Norm_Scalars.
  | 
      
      
         | 94 | 
          | 
          | 
          
  | 
      
      
         | 95 | 
          | 
          | 
            --  If a pragma Queuing_Policy appears, then Opt.Queuing_Policy is set
  | 
      
      
         | 96 | 
          | 
          | 
            --  to the first character of the policy name, and Opt.Queuing_Policy_Sloc
  | 
      
      
         | 97 | 
          | 
          | 
            --  is set to System_Location.
  | 
      
      
         | 98 | 
          | 
          | 
          
  | 
      
      
         | 99 | 
          | 
          | 
            --  If a pragma Task_Dispatching_Policy appears, then the flag
  | 
      
      
         | 100 | 
          | 
          | 
            --  Opt.Task_Dispatching_Policy is set to the first character of the
  | 
      
      
         | 101 | 
          | 
          | 
            --  policy name, and Opt.Task_Dispatching_Policy_Sloc is set to
  | 
      
      
         | 102 | 
          | 
          | 
            --  System_Location.
  | 
      
      
         | 103 | 
          | 
          | 
          
  | 
      
      
         | 104 | 
          | 
          | 
            --  If a pragma Polling (On) appears, then the flag Opt.Polling_Required
  | 
      
      
         | 105 | 
          | 
          | 
            --  is set to True.
  | 
      
      
         | 106 | 
          | 
          | 
          
  | 
      
      
         | 107 | 
          | 
          | 
            --  If a pragma Detect_Blocking appears, then the flag Opt.Detect_Blocking
  | 
      
      
         | 108 | 
          | 
          | 
            --  is set to True.
  | 
      
      
         | 109 | 
          | 
          | 
          
  | 
      
      
         | 110 | 
          | 
          | 
            --  if a pragma Suppress_Exception_Locations appears, then the flag
  | 
      
      
         | 111 | 
          | 
          | 
            --  Opt.Exception_Locations_Suppressed is set to True.
  | 
      
      
         | 112 | 
          | 
          | 
          
  | 
      
      
         | 113 | 
          | 
          | 
            --  If a pragma Profile with a valid profile argument appears, then
  | 
      
      
         | 114 | 
          | 
          | 
            --  the appropriate restrictions and policy flags are set.
  | 
      
      
         | 115 | 
          | 
          | 
          
  | 
      
      
         | 116 | 
          | 
          | 
            --  The only other pragma allowed is a pragma Restrictions that specifies
  | 
      
      
         | 117 | 
          | 
          | 
            --  a restriction that will be imposed on all units in the partition. Note
  | 
      
      
         | 118 | 
          | 
          | 
            --  that in this context, only one restriction can be specified in a single
  | 
      
      
         | 119 | 
          | 
          | 
            --  pragma, and the pragma must appear on its own on a single source line.
  | 
      
      
         | 120 | 
          | 
          | 
          
  | 
      
      
         | 121 | 
          | 
          | 
            --  If package System contains exactly the line "type Address is private;"
  | 
      
      
         | 122 | 
          | 
          | 
            --  then the flag Opt.Address_Is_Private is set True, otherwise this flag
  | 
      
      
         | 123 | 
          | 
          | 
            --  is set False.
  | 
      
      
         | 124 | 
          | 
          | 
          
  | 
      
      
         | 125 | 
          | 
          | 
            Restrictions_On_Target : Restrictions_Info := No_Restrictions;
  | 
      
      
         | 126 | 
          | 
          | 
            --  Records restrictions specified by system.ads. Only the Set and Value
  | 
      
      
         | 127 | 
          | 
          | 
            --  members are modified. The Violated and Count fields are never modified.
  | 
      
      
         | 128 | 
          | 
          | 
            --  Note that entries can be set either by a pragma Restrictions or by
  | 
      
      
         | 129 | 
          | 
          | 
            --  a pragma Profile.
  | 
      
      
         | 130 | 
          | 
          | 
          
  | 
      
      
         | 131 | 
          | 
          | 
            -------------------
  | 
      
      
         | 132 | 
          | 
          | 
            -- Run Time Name --
  | 
      
      
         | 133 | 
          | 
          | 
            -------------------
  | 
      
      
         | 134 | 
          | 
          | 
          
  | 
      
      
         | 135 | 
          | 
          | 
            --  This parameter should be regarded as read only by all clients of
  | 
      
      
         | 136 | 
          | 
          | 
            --  of package. The only way they get modified is by calling the
  | 
      
      
         | 137 | 
          | 
          | 
            --  Get_Target_Parameters routine which reads the values from a provided
  | 
      
      
         | 138 | 
          | 
          | 
            --  text buffer containing the source of the system package.
  | 
      
      
         | 139 | 
          | 
          | 
          
  | 
      
      
         | 140 | 
          | 
          | 
            --  The corresponding string constant is placed immediately at the start
  | 
      
      
         | 141 | 
          | 
          | 
            --  of the private part of system.ads if is present, e.g. in the form:
  | 
      
      
         | 142 | 
          | 
          | 
          
  | 
      
      
         | 143 | 
          | 
          | 
            --    Run_Time_Name : constant String := "Zero Footprint Run Time";
  | 
      
      
         | 144 | 
          | 
          | 
          
  | 
      
      
         | 145 | 
          | 
          | 
            --  the corresponding messages will look something like
  | 
      
      
         | 146 | 
          | 
          | 
          
  | 
      
      
         | 147 | 
          | 
          | 
            --    xxx not supported (Zero Footprint Run Time)
  | 
      
      
         | 148 | 
          | 
          | 
          
  | 
      
      
         | 149 | 
          | 
          | 
            Run_Time_Name_On_Target : Name_Id := No_Name;
  | 
      
      
         | 150 | 
          | 
          | 
            --  Set to appropriate names table entry Id value if a Run_Time_Name
  | 
      
      
         | 151 | 
          | 
          | 
            --  string constant is defined in system.ads. This name is used only
  | 
      
      
         | 152 | 
          | 
          | 
            --  for the configurable run-time case, and is used to parameterize
  | 
      
      
         | 153 | 
          | 
          | 
            --  messages that complain about non-supported run-time features.
  | 
      
      
         | 154 | 
          | 
          | 
            --  The name should contain only letters A-Z, digits 1-9, spaces,
  | 
      
      
         | 155 | 
          | 
          | 
            --  and underscores.
  | 
      
      
         | 156 | 
          | 
          | 
          
  | 
      
      
         | 157 | 
          | 
          | 
            --------------------------
  | 
      
      
         | 158 | 
          | 
          | 
            -- Executable Extension --
  | 
      
      
         | 159 | 
          | 
          | 
            --------------------------
  | 
      
      
         | 160 | 
          | 
          | 
          
  | 
      
      
         | 161 | 
          | 
          | 
            Executable_Extension_On_Target : Name_Id := No_Name;
  | 
      
      
         | 162 | 
          | 
          | 
            --  Executable extension on the target. This name is useful for setting
  | 
      
      
         | 163 | 
          | 
          | 
            --  the executable extension in a dynamic way, e.g. depending on the
  | 
      
      
         | 164 | 
          | 
          | 
            --  run time used, rather than using a configure-time macro as done by
  | 
      
      
         | 165 | 
          | 
          | 
            --  Get_Target_Executable_Suffix. If not set (No_Name), instead use
  | 
      
      
         | 166 | 
          | 
          | 
            --  System.OS_Lib.Get_Target_Executable_Suffix.
  | 
      
      
         | 167 | 
          | 
          | 
          
  | 
      
      
         | 168 | 
          | 
          | 
            -----------------------
  | 
      
      
         | 169 | 
          | 
          | 
            -- Target Parameters --
  | 
      
      
         | 170 | 
          | 
          | 
            -----------------------
  | 
      
      
         | 171 | 
          | 
          | 
          
  | 
      
      
         | 172 | 
          | 
          | 
            --  The following parameters correspond to the variables defined in the
  | 
      
      
         | 173 | 
          | 
          | 
            --  private part of System (without the terminating _On_Target). Note
  | 
      
      
         | 174 | 
          | 
          | 
            --  that it is required that all parameters defined here be specified
  | 
      
      
         | 175 | 
          | 
          | 
            --  in the target specific version of system.ads. Thus, to add a new
  | 
      
      
         | 176 | 
          | 
          | 
            --  parameter, add it to all system*.ads files. (There is a defaulting
  | 
      
      
         | 177 | 
          | 
          | 
            --  mechanism, but we don't normally take advantage of it, as explained
  | 
      
      
         | 178 | 
          | 
          | 
            --  below.)
  | 
      
      
         | 179 | 
          | 
          | 
          
  | 
      
      
         | 180 | 
          | 
          | 
            --  The default values here are used if no value is found in system.ads.
  | 
      
      
         | 181 | 
          | 
          | 
            --  This should normally happen if the special version of system.ads used
  | 
      
      
         | 182 | 
          | 
          | 
            --  by the compiler itself is in use or if the value is only relevant to
  | 
      
      
         | 183 | 
          | 
          | 
            --  a particular target (e.g. OpenVMS, AAMP). The default values are
  | 
      
      
         | 184 | 
          | 
          | 
            --  suitable for use in normal environments. This approach allows the
  | 
      
      
         | 185 | 
          | 
          | 
            --  possibility of new versions of the compiler (possibly with new system
  | 
      
      
         | 186 | 
          | 
          | 
            --  parameters added) being used to compile older versions of the compiler
  | 
      
      
         | 187 | 
          | 
          | 
            --  sources, as well as avoiding duplicating values in all system-*.ads
  | 
      
      
         | 188 | 
          | 
          | 
            --  files for flags that are used on a few platforms only.
  | 
      
      
         | 189 | 
          | 
          | 
          
  | 
      
      
         | 190 | 
          | 
          | 
            --  All these parameters should be regarded as read only by all clients
  | 
      
      
         | 191 | 
          | 
          | 
            --  of the package. The only way they get modified is by calling the
  | 
      
      
         | 192 | 
          | 
          | 
            --  Get_Target_Parameters routine which reads the values from a provided
  | 
      
      
         | 193 | 
          | 
          | 
            --  text buffer containing the source of the system package.
  | 
      
      
         | 194 | 
          | 
          | 
          
  | 
      
      
         | 195 | 
          | 
          | 
            ----------------------------
  | 
      
      
         | 196 | 
          | 
          | 
            -- Special Target Control --
  | 
      
      
         | 197 | 
          | 
          | 
            ----------------------------
  | 
      
      
         | 198 | 
          | 
          | 
          
  | 
      
      
         | 199 | 
          | 
          | 
            --  The great majority of GNAT ports are based on GCC. The switches in
  | 
      
      
         | 200 | 
          | 
          | 
            --  This section indicate the use of some non-standard target back end
  | 
      
      
         | 201 | 
          | 
          | 
            --  or other special targetting requirements.
  | 
      
      
         | 202 | 
          | 
          | 
          
  | 
      
      
         | 203 | 
          | 
          | 
            AAMP_On_Target : Boolean := False;
  | 
      
      
         | 204 | 
          | 
          | 
            --  Set to True if target is AAMP
  | 
      
      
         | 205 | 
          | 
          | 
          
  | 
      
      
         | 206 | 
          | 
          | 
            OpenVMS_On_Target : Boolean := False;
  | 
      
      
         | 207 | 
          | 
          | 
            --  Set to True if target is OpenVMS
  | 
      
      
         | 208 | 
          | 
          | 
          
  | 
      
      
         | 209 | 
          | 
          | 
            RTX_RTSS_Kernel_Module_On_Target : Boolean := False;
  | 
      
      
         | 210 | 
          | 
          | 
            --  Set to True if target is RTSS module for RTX
  | 
      
      
         | 211 | 
          | 
          | 
          
  | 
      
      
         | 212 | 
          | 
          | 
            type Virtual_Machine_Kind is (No_VM, JVM_Target, CLI_Target);
  | 
      
      
         | 213 | 
          | 
          | 
            VM_Target : Virtual_Machine_Kind := No_VM;
  | 
      
      
         | 214 | 
          | 
          | 
            --  Kind of virtual machine targetted
  | 
      
      
         | 215 | 
          | 
          | 
            --  No_VM: no virtual machine, default case of a standard processor
  | 
      
      
         | 216 | 
          | 
          | 
            --  JVM_Target: Java Virtual Machine
  | 
      
      
         | 217 | 
          | 
          | 
            --  CLI_Target: CLI/.NET Virtual Machine
  | 
      
      
         | 218 | 
          | 
          | 
          
  | 
      
      
         | 219 | 
          | 
          | 
            -------------------------------
  | 
      
      
         | 220 | 
          | 
          | 
            -- Backend Arithmetic Checks --
  | 
      
      
         | 221 | 
          | 
          | 
            -------------------------------
  | 
      
      
         | 222 | 
          | 
          | 
          
  | 
      
      
         | 223 | 
          | 
          | 
            --  Divide and overflow checks are either done in the front end or
  | 
      
      
         | 224 | 
          | 
          | 
            --  back end. The front end will generate checks when required unless
  | 
      
      
         | 225 | 
          | 
          | 
            --  the corresponding parameter here is set to indicate that the back
  | 
      
      
         | 226 | 
          | 
          | 
            --  end will generate the required checks (or that the checks are
  | 
      
      
         | 227 | 
          | 
          | 
            --  automatically performed by the hardware in an appropriate form).
  | 
      
      
         | 228 | 
          | 
          | 
          
  | 
      
      
         | 229 | 
          | 
          | 
            Backend_Divide_Checks_On_Target : Boolean := False;
  | 
      
      
         | 230 | 
          | 
          | 
            --  Set True if the back end generates divide checks, or if the hardware
  | 
      
      
         | 231 | 
          | 
          | 
            --  checks automatically. Set False if the front end must generate the
  | 
      
      
         | 232 | 
          | 
          | 
            --  required tests using explicit expanded code.
  | 
      
      
         | 233 | 
          | 
          | 
          
  | 
      
      
         | 234 | 
          | 
          | 
            Backend_Overflow_Checks_On_Target : Boolean := False;
  | 
      
      
         | 235 | 
          | 
          | 
            --  Set True if the back end generates arithmetic overflow checks, or if
  | 
      
      
         | 236 | 
          | 
          | 
            --  the hardware checks automatically. Set False if the front end must
  | 
      
      
         | 237 | 
          | 
          | 
            --  generate the required tests using explicit expanded code.
  | 
      
      
         | 238 | 
          | 
          | 
          
  | 
      
      
         | 239 | 
          | 
          | 
            -----------------------------------
  | 
      
      
         | 240 | 
          | 
          | 
            -- Control of Exception Handling --
  | 
      
      
         | 241 | 
          | 
          | 
            -----------------------------------
  | 
      
      
         | 242 | 
          | 
          | 
          
  | 
      
      
         | 243 | 
          | 
          | 
            --  GNAT implements three methods of implementing exceptions:
  | 
      
      
         | 244 | 
          | 
          | 
          
  | 
      
      
         | 245 | 
          | 
          | 
            --    Front-End Longjmp/Setjmp Exceptions
  | 
      
      
         | 246 | 
          | 
          | 
          
  | 
      
      
         | 247 | 
          | 
          | 
            --      This approach uses longjmp/setjmp to handle exceptions. It
  | 
      
      
         | 248 | 
          | 
          | 
            --      uses less storage, and can often propagate exceptions faster,
  | 
      
      
         | 249 | 
          | 
          | 
            --      at the expense of (sometimes considerable) overhead in setting
  | 
      
      
         | 250 | 
          | 
          | 
            --      up an exception handler. This approach is available on all
  | 
      
      
         | 251 | 
          | 
          | 
            --      targets, and is the default where it is the only approach.
  | 
      
      
         | 252 | 
          | 
          | 
          
  | 
      
      
         | 253 | 
          | 
          | 
            --      The generation of the setjmp and longjmp calls is handled by
  | 
      
      
         | 254 | 
          | 
          | 
            --      the front end of the compiler (this includes gigi in the case
  | 
      
      
         | 255 | 
          | 
          | 
            --      of the standard GCC back end). It does not use any back end
  | 
      
      
         | 256 | 
          | 
          | 
            --      support (such as the GCC3 exception handling mechanism). When
  | 
      
      
         | 257 | 
          | 
          | 
            --      this approach is used, the compiler generates special exception
  | 
      
      
         | 258 | 
          | 
          | 
            --      handlers for handling cleanups when an exception is raised.
  | 
      
      
         | 259 | 
          | 
          | 
          
  | 
      
      
         | 260 | 
          | 
          | 
            --    Front-End Zero Cost Exceptions
  | 
      
      
         | 261 | 
          | 
          | 
          
  | 
      
      
         | 262 | 
          | 
          | 
            --      This approach uses separate exception tables. These use extra
  | 
      
      
         | 263 | 
          | 
          | 
            --      storage, and exception propagation can be quite slow, but there
  | 
      
      
         | 264 | 
          | 
          | 
            --      is no overhead in setting up an exception handler (it is to this
  | 
      
      
         | 265 | 
          | 
          | 
            --      latter operation that the phrase zero-cost refers). This approach
  | 
      
      
         | 266 | 
          | 
          | 
            --      is only available on some targets, and is the default where it is
  | 
      
      
         | 267 | 
          | 
          | 
            --      available.
  | 
      
      
         | 268 | 
          | 
          | 
          
  | 
      
      
         | 269 | 
          | 
          | 
            --      The generation of the exception tables is handled by the front
  | 
      
      
         | 270 | 
          | 
          | 
            --      end of the compiler. It does not use any back end support (such
  | 
      
      
         | 271 | 
          | 
          | 
            --      as the GCC3 exception handling mechanism). When this approach
  | 
      
      
         | 272 | 
          | 
          | 
            --      is used, the compiler generates special exception handlers for
  | 
      
      
         | 273 | 
          | 
          | 
            --      handling cleanups when an exception is raised.
  | 
      
      
         | 274 | 
          | 
          | 
          
  | 
      
      
         | 275 | 
          | 
          | 
            --    Back-End Zero Cost Exceptions
  | 
      
      
         | 276 | 
          | 
          | 
          
  | 
      
      
         | 277 | 
          | 
          | 
            --      With this approach, the back end handles the generation and
  | 
      
      
         | 278 | 
          | 
          | 
            --      handling of exceptions. For example, the GCC3 exception handling
  | 
      
      
         | 279 | 
          | 
          | 
            --      mechanisms are used in this mode. The front end simply generates
  | 
      
      
         | 280 | 
          | 
          | 
            --      code for explicit exception handlers, and AT END cleanup handlers
  | 
      
      
         | 281 | 
          | 
          | 
            --      are simply passed unchanged to the backend for generating cleanups
  | 
      
      
         | 282 | 
          | 
          | 
            --      both in the exceptional and non-exceptional cases.
  | 
      
      
         | 283 | 
          | 
          | 
          
  | 
      
      
         | 284 | 
          | 
          | 
            --      As the name implies, this approach generally uses a zero-cost
  | 
      
      
         | 285 | 
          | 
          | 
            --      mechanism with tables, but the tables are generated by the back
  | 
      
      
         | 286 | 
          | 
          | 
            --      end. However, since the back-end is entirely responsible for the
  | 
      
      
         | 287 | 
          | 
          | 
            --      handling of exceptions, another mechanism might be used. In the
  | 
      
      
         | 288 | 
          | 
          | 
            --      case of GCC3 for instance, it might be the case that the compiler
  | 
      
      
         | 289 | 
          | 
          | 
            --      is configured for setjmp/longjmp handling, then everything will
  | 
      
      
         | 290 | 
          | 
          | 
            --      work correctly. However, it is definitely preferred that the
  | 
      
      
         | 291 | 
          | 
          | 
            --      back end provide zero cost exception handling.
  | 
      
      
         | 292 | 
          | 
          | 
          
  | 
      
      
         | 293 | 
          | 
          | 
            --    Controlling the selection of methods
  | 
      
      
         | 294 | 
          | 
          | 
          
  | 
      
      
         | 295 | 
          | 
          | 
            --      On most implementations, back-end zero-cost exceptions are used.
  | 
      
      
         | 296 | 
          | 
          | 
            --      Otherwise, Front-End Longjmp/Setjmp approach is used.
  | 
      
      
         | 297 | 
          | 
          | 
            --      Note that there is a requirement that all Ada units in a partition
  | 
      
      
         | 298 | 
          | 
          | 
            --      be compiled with the same exception model.
  | 
      
      
         | 299 | 
          | 
          | 
          
  | 
      
      
         | 300 | 
          | 
          | 
            --    Control of Available Methods and Defaults
  | 
      
      
         | 301 | 
          | 
          | 
          
  | 
      
      
         | 302 | 
          | 
          | 
            --      The following switches specify whether ZCX is available, and
  | 
      
      
         | 303 | 
          | 
          | 
            --      whether it is enabled by default.
  | 
      
      
         | 304 | 
          | 
          | 
          
  | 
      
      
         | 305 | 
          | 
          | 
            ZCX_By_Default_On_Target : Boolean := False;
  | 
      
      
         | 306 | 
          | 
          | 
            --  Indicates if zero cost exceptions are active by default. If this
  | 
      
      
         | 307 | 
          | 
          | 
            --  variable is False, then the only possible exception method is the
  | 
      
      
         | 308 | 
          | 
          | 
            --  front-end setjmp/longjmp approach, and this is the default. If
  | 
      
      
         | 309 | 
          | 
          | 
            --  this variable is True, then GCC ZCX is used.
  | 
      
      
         | 310 | 
          | 
          | 
          
  | 
      
      
         | 311 | 
          | 
          | 
            ------------------------------------
  | 
      
      
         | 312 | 
          | 
          | 
            -- Run-Time Library Configuration --
  | 
      
      
         | 313 | 
          | 
          | 
            ------------------------------------
  | 
      
      
         | 314 | 
          | 
          | 
          
  | 
      
      
         | 315 | 
          | 
          | 
            --  In configurable run-time mode, the system run-time may not support
  | 
      
      
         | 316 | 
          | 
          | 
            --  the full Ada language. The effect of setting this switch is to let
  | 
      
      
         | 317 | 
          | 
          | 
            --  the compiler know that it is not surprising (i.e. the system is not
  | 
      
      
         | 318 | 
          | 
          | 
            --  misconfigured) if run-time library units or entities within units are
  | 
      
      
         | 319 | 
          | 
          | 
            --  not present in the run-time.
  | 
      
      
         | 320 | 
          | 
          | 
          
  | 
      
      
         | 321 | 
          | 
          | 
            Configurable_Run_Time_On_Target : Boolean := False;
  | 
      
      
         | 322 | 
          | 
          | 
            --  Indicates that the system.ads file is for a configurable run-time
  | 
      
      
         | 323 | 
          | 
          | 
            --
  | 
      
      
         | 324 | 
          | 
          | 
            --  This has some specific effects as follows
  | 
      
      
         | 325 | 
          | 
          | 
            --
  | 
      
      
         | 326 | 
          | 
          | 
            --    The binder generates the gnat_argc/argv/envp variables in the
  | 
      
      
         | 327 | 
          | 
          | 
            --    binder file instead of being imported from the run-time library.
  | 
      
      
         | 328 | 
          | 
          | 
            --    If Command_Line_Args_On_Target is set to False, then the
  | 
      
      
         | 329 | 
          | 
          | 
            --    generation of these variables is suppressed completely.
  | 
      
      
         | 330 | 
          | 
          | 
            --
  | 
      
      
         | 331 | 
          | 
          | 
            --    The binder generates the gnat_exit_status variable in the binder
  | 
      
      
         | 332 | 
          | 
          | 
            --    file instead of being imported from the run-time library. If
  | 
      
      
         | 333 | 
          | 
          | 
            --    Exit_Status_Supported_On_Target is set to False, then the
  | 
      
      
         | 334 | 
          | 
          | 
            --    generation of this variable is suppressed entirely.
  | 
      
      
         | 335 | 
          | 
          | 
            --
  | 
      
      
         | 336 | 
          | 
          | 
            --    The routine __gnat_break_start is defined within the binder file
  | 
      
      
         | 337 | 
          | 
          | 
            --    instead of being imported from the run-time library.
  | 
      
      
         | 338 | 
          | 
          | 
            --
  | 
      
      
         | 339 | 
          | 
          | 
            --    The variable __gnat_exit_status is generated within the binder file
  | 
      
      
         | 340 | 
          | 
          | 
            --    instead of being imported from the run-time library.
  | 
      
      
         | 341 | 
          | 
          | 
          
  | 
      
      
         | 342 | 
          | 
          | 
            Suppress_Standard_Library_On_Target : Boolean := False;
  | 
      
      
         | 343 | 
          | 
          | 
            --  If this flag is True, then the standard library is not included by
  | 
      
      
         | 344 | 
          | 
          | 
            --  default in the executable (see unit System.Standard_Library in file
  | 
      
      
         | 345 | 
          | 
          | 
            --  s-stalib.ads for details of what this includes). This is for example
  | 
      
      
         | 346 | 
          | 
          | 
            --  set True for the zero foot print case, where these files should not
  | 
      
      
         | 347 | 
          | 
          | 
            --  be included by default.
  | 
      
      
         | 348 | 
          | 
          | 
            --
  | 
      
      
         | 349 | 
          | 
          | 
            --  This flag has some other related effects:
  | 
      
      
         | 350 | 
          | 
          | 
            --
  | 
      
      
         | 351 | 
          | 
          | 
            --    The generation of global variables in the bind file is suppressed,
  | 
      
      
         | 352 | 
          | 
          | 
            --    with the exception of the priority of the environment task, which
  | 
      
      
         | 353 | 
          | 
          | 
            --    is needed by the Ravenscar run-time.
  | 
      
      
         | 354 | 
          | 
          | 
            --
  | 
      
      
         | 355 | 
          | 
          | 
            --    The calls to __gnat_initialize and __gnat_finalize are omitted
  | 
      
      
         | 356 | 
          | 
          | 
            --
  | 
      
      
         | 357 | 
          | 
          | 
            --    All finalization and initialization (controlled types) is omitted
  | 
      
      
         | 358 | 
          | 
          | 
            --
  | 
      
      
         | 359 | 
          | 
          | 
            --    The routine __gnat_handler_installed is not imported
  | 
      
      
         | 360 | 
          | 
          | 
          
  | 
      
      
         | 361 | 
          | 
          | 
            Preallocated_Stacks_On_Target : Boolean := False;
  | 
      
      
         | 362 | 
          | 
          | 
            --  If this flag is True, then the expander preallocates all task stacks
  | 
      
      
         | 363 | 
          | 
          | 
            --  at compile time. If the flag is False, then task stacks are not pre-
  | 
      
      
         | 364 | 
          | 
          | 
            --  allocated, and task stack allocation is the responsibility of the
  | 
      
      
         | 365 | 
          | 
          | 
            --  run-time (which typically delegates the task to the underlying
  | 
      
      
         | 366 | 
          | 
          | 
            --  operating system environment).
  | 
      
      
         | 367 | 
          | 
          | 
          
  | 
      
      
         | 368 | 
          | 
          | 
            ---------------------
  | 
      
      
         | 369 | 
          | 
          | 
            -- Duration Format --
  | 
      
      
         | 370 | 
          | 
          | 
            ---------------------
  | 
      
      
         | 371 | 
          | 
          | 
          
  | 
      
      
         | 372 | 
          | 
          | 
            --  By default, type Duration is a 64-bit fixed-point type with a delta
  | 
      
      
         | 373 | 
          | 
          | 
            --  and small of 10**(-9) (i.e. it is a count in nanoseconds. This flag
  | 
      
      
         | 374 | 
          | 
          | 
            --  allows that standard format to be modified.
  | 
      
      
         | 375 | 
          | 
          | 
          
  | 
      
      
         | 376 | 
          | 
          | 
            Duration_32_Bits_On_Target : Boolean := False;
  | 
      
      
         | 377 | 
          | 
          | 
            --  If True, then Duration is represented in 32 bits and the delta and
  | 
      
      
         | 378 | 
          | 
          | 
            --  small values are set to 20.0*(10**(-3)) (i.e. it is a count in units
  | 
      
      
         | 379 | 
          | 
          | 
            --  of 20 milliseconds.
  | 
      
      
         | 380 | 
          | 
          | 
          
  | 
      
      
         | 381 | 
          | 
          | 
            ------------------------------------
  | 
      
      
         | 382 | 
          | 
          | 
            -- Back-End Code Generation Flags --
  | 
      
      
         | 383 | 
          | 
          | 
            ------------------------------------
  | 
      
      
         | 384 | 
          | 
          | 
          
  | 
      
      
         | 385 | 
          | 
          | 
            --  These flags indicate possible limitations in what the code generator
  | 
      
      
         | 386 | 
          | 
          | 
            --  can handle. They will all be True for a full run-time, but one or more
  | 
      
      
         | 387 | 
          | 
          | 
            --  of these may be false for a configurable run-time, and if a feature is
  | 
      
      
         | 388 | 
          | 
          | 
            --  used at the source level, and the corresponding flag is false, then an
  | 
      
      
         | 389 | 
          | 
          | 
            --  error message will be issued saying the feature is not supported.
  | 
      
      
         | 390 | 
          | 
          | 
          
  | 
      
      
         | 391 | 
          | 
          | 
            Support_Aggregates_On_Target : Boolean := True;
  | 
      
      
         | 392 | 
          | 
          | 
            --  In the general case, the use of aggregates may generate calls
  | 
      
      
         | 393 | 
          | 
          | 
            --  to run-time routines in the C library, including memset, memcpy,
  | 
      
      
         | 394 | 
          | 
          | 
            --  memmove, and bcopy. This flag is set to True if these routines
  | 
      
      
         | 395 | 
          | 
          | 
            --  are available. If any of these routines is not available, then
  | 
      
      
         | 396 | 
          | 
          | 
            --  this flag is False, and the use of aggregates is not permitted.
  | 
      
      
         | 397 | 
          | 
          | 
          
  | 
      
      
         | 398 | 
          | 
          | 
            Support_Composite_Assign_On_Target : Boolean := True;
  | 
      
      
         | 399 | 
          | 
          | 
            --  The assignment of composite objects other than small records and
  | 
      
      
         | 400 | 
          | 
          | 
            --  arrays whose size is 64-bits or less and is set by an explicit
  | 
      
      
         | 401 | 
          | 
          | 
            --  size clause may generate calls to memcpy, memmove, and bcopy.
  | 
      
      
         | 402 | 
          | 
          | 
            --  If versions of all these routines are available, then this flag
  | 
      
      
         | 403 | 
          | 
          | 
            --  is set to True. If any of these routines is not available, then
  | 
      
      
         | 404 | 
          | 
          | 
            --  the flag is set False, and composite assignments are not allowed.
  | 
      
      
         | 405 | 
          | 
          | 
          
  | 
      
      
         | 406 | 
          | 
          | 
            Support_Composite_Compare_On_Target : Boolean := True;
  | 
      
      
         | 407 | 
          | 
          | 
            --  If this flag is True, then the back end supports bit-wise comparison
  | 
      
      
         | 408 | 
          | 
          | 
            --  of composite objects for equality, either generating inline code or
  | 
      
      
         | 409 | 
          | 
          | 
            --  calling appropriate (and available) run-time routines. If this flag
  | 
      
      
         | 410 | 
          | 
          | 
            --  is False, then the back end does not provide this support, and the
  | 
      
      
         | 411 | 
          | 
          | 
            --  front end uses component by component comparison for composites.
  | 
      
      
         | 412 | 
          | 
          | 
          
  | 
      
      
         | 413 | 
          | 
          | 
            Support_Long_Shifts_On_Target : Boolean := True;
  | 
      
      
         | 414 | 
          | 
          | 
            --  If True, the back end supports 64-bit shift operations. If False, then
  | 
      
      
         | 415 | 
          | 
          | 
            --  the source program may not contain explicit 64-bit shifts. In addition,
  | 
      
      
         | 416 | 
          | 
          | 
            --  the code generated for packed arrays will avoid the use of long shifts.
  | 
      
      
         | 417 | 
          | 
          | 
          
  | 
      
      
         | 418 | 
          | 
          | 
            --------------------
  | 
      
      
         | 419 | 
          | 
          | 
            -- Indirect Calls --
  | 
      
      
         | 420 | 
          | 
          | 
            --------------------
  | 
      
      
         | 421 | 
          | 
          | 
          
  | 
      
      
         | 422 | 
          | 
          | 
            Always_Compatible_Rep_On_Target : Boolean := True;
  | 
      
      
         | 423 | 
          | 
          | 
            --  If True, the Can_Use_Internal_Rep flag (see Einfo) is set to False in
  | 
      
      
         | 424 | 
          | 
          | 
            --  all cases. This corresponds to the traditional code generation
  | 
      
      
         | 425 | 
          | 
          | 
            --  strategy. False allows the front end to choose a policy that partly or
  | 
      
      
         | 426 | 
          | 
          | 
            --  entirely eliminates dynamically generated trampolines.
  | 
      
      
         | 427 | 
          | 
          | 
          
  | 
      
      
         | 428 | 
          | 
          | 
            -------------------------------
  | 
      
      
         | 429 | 
          | 
          | 
            -- Control of Stack Checking --
  | 
      
      
         | 430 | 
          | 
          | 
            -------------------------------
  | 
      
      
         | 431 | 
          | 
          | 
          
  | 
      
      
         | 432 | 
          | 
          | 
            --  GNAT provides three methods of implementing exceptions:
  | 
      
      
         | 433 | 
          | 
          | 
          
  | 
      
      
         | 434 | 
          | 
          | 
            --    GCC Probing Mechanism
  | 
      
      
         | 435 | 
          | 
          | 
          
  | 
      
      
         | 436 | 
          | 
          | 
            --      This approach uses the standard GCC mechanism for
  | 
      
      
         | 437 | 
          | 
          | 
            --      stack checking. The method assumes that accessing
  | 
      
      
         | 438 | 
          | 
          | 
            --      storage immediately beyond the end of the stack
  | 
      
      
         | 439 | 
          | 
          | 
            --      will result in a trap that is converted to a storage
  | 
      
      
         | 440 | 
          | 
          | 
            --      error by the runtime system. This mechanism has
  | 
      
      
         | 441 | 
          | 
          | 
            --      minimal overhead, but requires complex hardware,
  | 
      
      
         | 442 | 
          | 
          | 
            --      operating system and run-time support. Probing is
  | 
      
      
         | 443 | 
          | 
          | 
            --      the default method where it is available. The stack
  | 
      
      
         | 444 | 
          | 
          | 
            --      size for the environment task depends on the operating
  | 
      
      
         | 445 | 
          | 
          | 
            --      system and cannot be set in a system-independent way.
  | 
      
      
         | 446 | 
          | 
          | 
          
  | 
      
      
         | 447 | 
          | 
          | 
            --   GCC Stack-limit Mechanism
  | 
      
      
         | 448 | 
          | 
          | 
          
  | 
      
      
         | 449 | 
          | 
          | 
            --      This approach uses the GCC stack limits mechanism.
  | 
      
      
         | 450 | 
          | 
          | 
            --      It relies on comparing the stack pointer with the
  | 
      
      
         | 451 | 
          | 
          | 
            --      values of a global symbol. If the check fails, a
  | 
      
      
         | 452 | 
          | 
          | 
            --      trap is explicitly generated. The advantage is
  | 
      
      
         | 453 | 
          | 
          | 
            --      that the mechanism requires no memory protection,
  | 
      
      
         | 454 | 
          | 
          | 
            --      but operating system and run-time support are
  | 
      
      
         | 455 | 
          | 
          | 
            --      needed to manage the per-task values of the symbol.
  | 
      
      
         | 456 | 
          | 
          | 
            --      This is the default method after probing where it
  | 
      
      
         | 457 | 
          | 
          | 
            --      is available.
  | 
      
      
         | 458 | 
          | 
          | 
          
  | 
      
      
         | 459 | 
          | 
          | 
            --   GNAT Stack-limit Checking
  | 
      
      
         | 460 | 
          | 
          | 
          
  | 
      
      
         | 461 | 
          | 
          | 
            --      This method relies on comparing the stack pointer
  | 
      
      
         | 462 | 
          | 
          | 
            --      with per-task stack limits. If the check fails, an
  | 
      
      
         | 463 | 
          | 
          | 
            --      exception is explicitly raised. The advantage is
  | 
      
      
         | 464 | 
          | 
          | 
            --      that the method requires no extra system dependent
  | 
      
      
         | 465 | 
          | 
          | 
            --      runtime support and can be used on systems without
  | 
      
      
         | 466 | 
          | 
          | 
            --      memory protection as well, but at the cost of more
  | 
      
      
         | 467 | 
          | 
          | 
            --      overhead for doing the check. This is the fallback
  | 
      
      
         | 468 | 
          | 
          | 
            --      method if the above two are not supported.
  | 
      
      
         | 469 | 
          | 
          | 
          
  | 
      
      
         | 470 | 
          | 
          | 
            Stack_Check_Probes_On_Target : Boolean := False;
  | 
      
      
         | 471 | 
          | 
          | 
            --  Indicates if the GCC probing mechanism is used
  | 
      
      
         | 472 | 
          | 
          | 
          
  | 
      
      
         | 473 | 
          | 
          | 
            Stack_Check_Limits_On_Target : Boolean := False;
  | 
      
      
         | 474 | 
          | 
          | 
            --  Indicates if the GCC stack-limit mechanism is used
  | 
      
      
         | 475 | 
          | 
          | 
          
  | 
      
      
         | 476 | 
          | 
          | 
            --  Both flags cannot be simultaneously set to True. If neither
  | 
      
      
         | 477 | 
          | 
          | 
            --  is, the target independent fallback method is used.
  | 
      
      
         | 478 | 
          | 
          | 
          
  | 
      
      
         | 479 | 
          | 
          | 
            Stack_Check_Default_On_Target : Boolean := False;
  | 
      
      
         | 480 | 
          | 
          | 
            --  Indicates if stack checking is on by default
  | 
      
      
         | 481 | 
          | 
          | 
          
  | 
      
      
         | 482 | 
          | 
          | 
            ----------------------------
  | 
      
      
         | 483 | 
          | 
          | 
            -- Command Line Arguments --
  | 
      
      
         | 484 | 
          | 
          | 
            ----------------------------
  | 
      
      
         | 485 | 
          | 
          | 
          
  | 
      
      
         | 486 | 
          | 
          | 
            --  For most ports of GNAT, command line arguments are supported. The
  | 
      
      
         | 487 | 
          | 
          | 
            --  following flag is set to False for targets that do not support
  | 
      
      
         | 488 | 
          | 
          | 
            --  command line arguments (VxWorks and AAMP). Note that support of
  | 
      
      
         | 489 | 
          | 
          | 
            --  command line arguments is not required on such targets (RM A.15(13)).
  | 
      
      
         | 490 | 
          | 
          | 
          
  | 
      
      
         | 491 | 
          | 
          | 
            Command_Line_Args_On_Target : Boolean := True;
  | 
      
      
         | 492 | 
          | 
          | 
            --  Set False if no command line arguments on target. Note that if this
  | 
      
      
         | 493 | 
          | 
          | 
            --  is False in with Configurable_Run_Time_On_Target set to True, then
  | 
      
      
         | 494 | 
          | 
          | 
            --  this causes suppression of generation of the argv/argc variables
  | 
      
      
         | 495 | 
          | 
          | 
            --  used to record command line arguments.
  | 
      
      
         | 496 | 
          | 
          | 
          
  | 
      
      
         | 497 | 
          | 
          | 
            --  Similarly, most ports support the use of an exit status, but AAMP
  | 
      
      
         | 498 | 
          | 
          | 
            --  is an exception (as allowed by RM A.15(18-20))
  | 
      
      
         | 499 | 
          | 
          | 
          
  | 
      
      
         | 500 | 
          | 
          | 
            Exit_Status_Supported_On_Target : Boolean := True;
  | 
      
      
         | 501 | 
          | 
          | 
            --  Set False if returning of an exit status is not supported on target.
  | 
      
      
         | 502 | 
          | 
          | 
            --  Note that if this False in with Configurable_Run_Time_On_Target
  | 
      
      
         | 503 | 
          | 
          | 
            --  set to True, then this causes suppression of the gnat_exit_status
  | 
      
      
         | 504 | 
          | 
          | 
            --  variable used to record the exit status.
  | 
      
      
         | 505 | 
          | 
          | 
          
  | 
      
      
         | 506 | 
          | 
          | 
            -----------------------
  | 
      
      
         | 507 | 
          | 
          | 
            -- Main Program Name --
  | 
      
      
         | 508 | 
          | 
          | 
            -----------------------
  | 
      
      
         | 509 | 
          | 
          | 
          
  | 
      
      
         | 510 | 
          | 
          | 
            --  When the binder generates the main program to be used to create the
  | 
      
      
         | 511 | 
          | 
          | 
            --  executable, the main program name is main by default (to match the
  | 
      
      
         | 512 | 
          | 
          | 
            --  usual Unix practice). If this parameter is set to True, then the
  | 
      
      
         | 513 | 
          | 
          | 
            --  name is instead by default taken from the actual Ada main program
  | 
      
      
         | 514 | 
          | 
          | 
            --  name (just the name of the child if the main program is a child unit).
  | 
      
      
         | 515 | 
          | 
          | 
            --  In either case, this value can be overridden using -M name.
  | 
      
      
         | 516 | 
          | 
          | 
          
  | 
      
      
         | 517 | 
          | 
          | 
            Use_Ada_Main_Program_Name_On_Target : Boolean := False;
  | 
      
      
         | 518 | 
          | 
          | 
            --  Set True to use the Ada main program name as the main name
  | 
      
      
         | 519 | 
          | 
          | 
          
  | 
      
      
         | 520 | 
          | 
          | 
            ----------------------------------------------
  | 
      
      
         | 521 | 
          | 
          | 
            -- Boolean-Valued Floating-Point Attributes --
  | 
      
      
         | 522 | 
          | 
          | 
            ----------------------------------------------
  | 
      
      
         | 523 | 
          | 
          | 
          
  | 
      
      
         | 524 | 
          | 
          | 
            --  The constants below give the values for representation oriented
  | 
      
      
         | 525 | 
          | 
          | 
            --  floating-point attributes that are the same for all float types
  | 
      
      
         | 526 | 
          | 
          | 
            --  on the target. These are all boolean values.
  | 
      
      
         | 527 | 
          | 
          | 
          
  | 
      
      
         | 528 | 
          | 
          | 
            --  A value is only True if the target reliably supports the corresponding
  | 
      
      
         | 529 | 
          | 
          | 
            --  feature. Reliably here means that support is guaranteed for all
  | 
      
      
         | 530 | 
          | 
          | 
            --  possible settings of the relevant compiler switches (like -mieee),
  | 
      
      
         | 531 | 
          | 
          | 
            --  since we cannot control the user setting of those switches.
  | 
      
      
         | 532 | 
          | 
          | 
          
  | 
      
      
         | 533 | 
          | 
          | 
            --  The attributes cannot dependent on the current setting of compiler
  | 
      
      
         | 534 | 
          | 
          | 
            --  switches, since the values must be static and consistent throughout
  | 
      
      
         | 535 | 
          | 
          | 
            --  the partition. We probably should add such consistency checks in future,
  | 
      
      
         | 536 | 
          | 
          | 
            --  but for now we don't do this.
  | 
      
      
         | 537 | 
          | 
          | 
          
  | 
      
      
         | 538 | 
          | 
          | 
            --  Note: the compiler itself does not use floating-point, so the
  | 
      
      
         | 539 | 
          | 
          | 
            --  settings of the defaults here are not really relevant.
  | 
      
      
         | 540 | 
          | 
          | 
          
  | 
      
      
         | 541 | 
          | 
          | 
            --  Note: in some cases, proper support of some of these floating point
  | 
      
      
         | 542 | 
          | 
          | 
            --  features may require a specific switch (e.g. -mieee on the Alpha)
  | 
      
      
         | 543 | 
          | 
          | 
            --  to be used to obtain full RM compliant support.
  | 
      
      
         | 544 | 
          | 
          | 
          
  | 
      
      
         | 545 | 
          | 
          | 
            Denorm_On_Target : Boolean := False;
  | 
      
      
         | 546 | 
          | 
          | 
            --  Set to False on targets that do not reliably support denormals
  | 
      
      
         | 547 | 
          | 
          | 
          
  | 
      
      
         | 548 | 
          | 
          | 
            Machine_Rounds_On_Target : Boolean := True;
  | 
      
      
         | 549 | 
          | 
          | 
            --  Set to False for targets where S'Machine_Rounds is False
  | 
      
      
         | 550 | 
          | 
          | 
          
  | 
      
      
         | 551 | 
          | 
          | 
            Machine_Overflows_On_Target : Boolean := False;
  | 
      
      
         | 552 | 
          | 
          | 
            --  Set to True for targets where S'Machine_Overflows is True
  | 
      
      
         | 553 | 
          | 
          | 
          
  | 
      
      
         | 554 | 
          | 
          | 
            Signed_Zeros_On_Target : Boolean := True;
  | 
      
      
         | 555 | 
          | 
          | 
            --  Set to False on targets that do not reliably support signed zeros
  | 
      
      
         | 556 | 
          | 
          | 
          
  | 
      
      
         | 557 | 
          | 
          | 
            -------------------------------------------
  | 
      
      
         | 558 | 
          | 
          | 
            -- Boolean-Valued Fixed-Point Attributes --
  | 
      
      
         | 559 | 
          | 
          | 
            -------------------------------------------
  | 
      
      
         | 560 | 
          | 
          | 
          
  | 
      
      
         | 561 | 
          | 
          | 
            Fractional_Fixed_Ops_On_Target : Boolean := False;
  | 
      
      
         | 562 | 
          | 
          | 
            --  Set to True for targets that support fixed-by-fixed multiplication
  | 
      
      
         | 563 | 
          | 
          | 
            --  and division for fixed-point types with a small value equal to
  | 
      
      
         | 564 | 
          | 
          | 
            --  2 ** (-(T'Object_Size - 1)) and whose values have an absolute
  | 
      
      
         | 565 | 
          | 
          | 
            --  value less than 1.0.
  | 
      
      
         | 566 | 
          | 
          | 
          
  | 
      
      
         | 567 | 
          | 
          | 
            -----------------
  | 
      
      
         | 568 | 
          | 
          | 
            -- Data Layout --
  | 
      
      
         | 569 | 
          | 
          | 
            -----------------
  | 
      
      
         | 570 | 
          | 
          | 
          
  | 
      
      
         | 571 | 
          | 
          | 
            --  Normally when using the GCC backend, Gigi and GCC perform much of the
  | 
      
      
         | 572 | 
          | 
          | 
            --  data layout using the standard layout capabilities of GCC. If the
  | 
      
      
         | 573 | 
          | 
          | 
            --  parameter Backend_Layout is set to False, then the front end must
  | 
      
      
         | 574 | 
          | 
          | 
            --  perform all data layout. For further details see the package Layout.
  | 
      
      
         | 575 | 
          | 
          | 
          
  | 
      
      
         | 576 | 
          | 
          | 
            Frontend_Layout_On_Target : Boolean := False;
  | 
      
      
         | 577 | 
          | 
          | 
            --  Set True if front end does layout
  | 
      
      
         | 578 | 
          | 
          | 
          
  | 
      
      
         | 579 | 
          | 
          | 
            -----------------
  | 
      
      
         | 580 | 
          | 
          | 
            -- Subprograms --
  | 
      
      
         | 581 | 
          | 
          | 
            -----------------
  | 
      
      
         | 582 | 
          | 
          | 
          
  | 
      
      
         | 583 | 
          | 
          | 
            --  These subprograms are used to initialize the target parameter values
  | 
      
      
         | 584 | 
          | 
          | 
            --  from the system.ads file. Note that this is only done once, so if more
  | 
      
      
         | 585 | 
          | 
          | 
            --  than one call is made to either routine, the second and subsequent
  | 
      
      
         | 586 | 
          | 
          | 
            --  calls are ignored.
  | 
      
      
         | 587 | 
          | 
          | 
          
  | 
      
      
         | 588 | 
          | 
          | 
            procedure Get_Target_Parameters
  | 
      
      
         | 589 | 
          | 
          | 
              (System_Text  : Source_Buffer_Ptr;
  | 
      
      
         | 590 | 
          | 
          | 
               Source_First : Source_Ptr;
  | 
      
      
         | 591 | 
          | 
          | 
               Source_Last  : Source_Ptr);
  | 
      
      
         | 592 | 
          | 
          | 
            --  Called at the start of execution to obtain target parameters from
  | 
      
      
         | 593 | 
          | 
          | 
            --  the source of package System. The parameters provide the source
  | 
      
      
         | 594 | 
          | 
          | 
            --  text to be scanned (in System_Text (Source_First .. Source_Last)).
  | 
      
      
         | 595 | 
          | 
          | 
          
  | 
      
      
         | 596 | 
          | 
          | 
            procedure Get_Target_Parameters;
  | 
      
      
         | 597 | 
          | 
          | 
            --  This version reads in system.ads using Osint. The idea is that the
  | 
      
      
         | 598 | 
          | 
          | 
            --  caller uses the first version if they have to read system.ads anyway
  | 
      
      
         | 599 | 
          | 
          | 
            --  (e.g. the compiler) and uses this simpler interface if system.ads is
  | 
      
      
         | 600 | 
          | 
          | 
            --  not otherwise needed.
  | 
      
      
         | 601 | 
          | 
          | 
          
  | 
      
      
         | 602 | 
          | 
          | 
         end Targparm;
  |