.. |with| replace:: *with*
.. |withs| replace:: *with*\ s
.. |withed| replace:: *with*\ ed
.. |withing| replace:: *with*\ ing

.. -- Example: A |withing| unit has a |with| clause, it |withs| a |withed| unit

.. role:: switch(samp)

.. _Building_Executable_Programs_With_GNAT:

**************************************
Building Executable Programs with GNAT
**************************************

This chapter describes first the gnatmake tool
(:ref:`The_GNAT_Make_Program_gnatmake`),
which automatically determines the set of sources
needed by an Ada compilation unit and executes the necessary
(re)compilations, binding and linking.
It also explains how to use each tool individually: the
compiler (gcc, see :ref:`Compiling_with_gcc`),
binder (gnatbind, see :ref:`Binding_with_gnatbind`),
and linker (gnatlink, see :ref:`Linking_with_gnatlink`)
to build executable programs.
Finally, this chapter provides examples of
how to make use of the general GNU make mechanism
in a GNAT context (see :ref:`Using_the_GNU_make_Utility`).

.. only:: PRO or GPL

   For building large systems with components possibly written
   in different languages (such as Ada, C, C++ and Fortran)
   and organized into subsystems and libraries, the GPRbuild
   tool can be used. This tool, and the Project Manager
   facility that it is based upon, is described in
   *GPRbuild and GPR Companion Tools User's Guide*.


.. _The_GNAT_Make_Program_gnatmake:

Building with ``gnatmake``
==========================

.. index:: gnatmake

A typical development cycle when working on an Ada program consists of
the following steps:

#. Edit some sources to fix bugs;

#. Add enhancements;

#. Compile all sources affected;

#. Rebind and relink; and

#. Test.

.. index:: Dependency rules (compilation)

The third step in particular can be tricky, because not only do the modified
files have to be compiled, but any files depending on these files must also be
recompiled. The dependency rules in Ada can be quite complex, especially
in the presence of overloading, ``use`` clauses, generics and inlined
subprograms.

``gnatmake`` automatically takes care of the third and fourth steps
of this process. It determines which sources need to be compiled,
compiles them, and binds and links the resulting object files.

Unlike some other Ada make programs, the dependencies are always
accurately recomputed from the new sources. The source based approach of
the GNAT compilation model makes this possible. This means that if
changes to the source program cause corresponding changes in
dependencies, they will always be tracked exactly correctly by
``gnatmake``.

Note that for advanced forms of project structure, we recommend creating
a project file as explained in the *GNAT_Project_Manager* chapter in the
*GPRbuild User's Guide*, and using the
``gprbuild`` tool which supports building with project files and works similarly
to ``gnatmake``.

.. _Running_gnatmake:

Running ``gnatmake``
--------------------

The usual form of the ``gnatmake`` command is

.. code-block:: sh

     $ gnatmake [<switches>] <file_name> [<file_names>] [<mode_switches>]

The only required argument is one ``file_name``, which specifies
a compilation unit that is a main program. Several ``file_names`` can be
specified: this will result in several executables being built.
If ``switches`` are present, they can be placed before the first
``file_name``, between ``file_names`` or after the last ``file_name``.
If ``mode_switches`` are present, they must always be placed after
the last ``file_name`` and all ``switches``.

If you are using standard file extensions (:file:`.adb` and
:file:`.ads`), then the
extension may be omitted from the ``file_name`` arguments. However, if
you are using non-standard extensions, then it is required that the
extension be given. A relative or absolute directory path can be
specified in a ``file_name``, in which case, the input source file will
be searched for in the specified directory only. Otherwise, the input
source file will first be searched in the directory where
``gnatmake`` was invoked and if it is not found, it will be search on
the source path of the compiler as described in
:ref:`Search_Paths_and_the_Run-Time_Library_RTL`.

All ``gnatmake`` output (except when you specify :switch:`-M`) is sent to
:file:`stderr`. The output produced by the
:switch:`-M` switch is sent to :file:`stdout`.


.. _Switches_for_gnatmake:

Switches for ``gnatmake``
-------------------------

You may specify any of the following switches to ``gnatmake``:


.. index:: --version  (gnatmake)

:switch:`--version`
  Display Copyright and version, then exit disregarding all other options.


.. index:: --help  (gnatmake)

:switch:`--help`
  If ``--version`` was not used, display usage, then exit disregarding
  all other options.


.. index:: --GCC=compiler_name  (gnatmake)

:switch:`--GCC={compiler_name}`
  Program used for compiling. The default is ``gcc``. You need to use
  quotes around ``compiler_name`` if ``compiler_name`` contains
  spaces or other separator characters.
  As an example ``--GCC="foo -x  -y"``
  will instruct ``gnatmake`` to use ``foo -x -y`` as your
  compiler. A limitation of this syntax is that the name and path name of
  the executable itself must not include any embedded spaces. Note that
  switch :switch:`-c` is always inserted after your command name. Thus in the
  above example the compiler command that will be used by ``gnatmake``
  will be ``foo -c -x -y``. If several ``--GCC=compiler_name`` are
  used, only the last ``compiler_name`` is taken into account. However,
  all the additional switches are also taken into account. Thus,
  ``--GCC="foo -x -y" --GCC="bar -z -t"`` is equivalent to
  ``--GCC="bar -x -y -z -t"``.


.. index:: --GNATBIND=binder_name  (gnatmake)

:switch:`--GNATBIND={binder_name}`
  Program used for binding. The default is ``gnatbind``. You need to
  use quotes around ``binder_name`` if ``binder_name`` contains spaces
  or other separator characters.
  As an example ``--GNATBIND="bar -x  -y"``
  will instruct ``gnatmake`` to use ``bar -x -y`` as your
  binder. Binder switches that are normally appended by ``gnatmake``
  to ``gnatbind`` are now appended to the end of ``bar -x -y``.
  A limitation of this syntax is that the name and path name of the executable
  itself must not include any embedded spaces.

.. index:: --GNATLINK=linker_name  (gnatmake)

:switch:`--GNATLINK={linker_name}`
  Program used for linking. The default is ``gnatlink``. You need to
  use quotes around ``linker_name`` if ``linker_name`` contains spaces
  or other separator characters.
  As an example ``--GNATLINK="lan -x  -y"``
  will instruct ``gnatmake`` to use ``lan -x -y`` as your
  linker. Linker switches that are normally appended by ``gnatmake`` to
  ``gnatlink`` are now appended to the end of ``lan -x -y``.
  A limitation of this syntax is that the name and path name of the executable
  itself must not include any embedded spaces.

:switch:`--create-map-file`
  When linking an executable, create a map file. The name of the map file
  has the same name as the executable with extension ".map".

:switch:`--create-map-file={mapfile}`
  When linking an executable, create a map file with the specified name.

.. index:: --create-missing-dirs  (gnatmake)

:switch:`--create-missing-dirs`
  When using project files (:switch:`-P{project}`), automatically create
  missing object directories, library directories and exec
  directories.

:switch:`--single-compile-per-obj-dir`
  Disallow simultaneous compilations in the same object directory when
  project files are used.

:switch:`--subdirs={subdir}`
  Actual object directory of each project file is the subdirectory subdir of the
  object directory specified or defaulted in the project file.

:switch:`--unchecked-shared-lib-imports`
  By default, shared library projects are not allowed to import static library
  projects. When this switch is used on the command line, this restriction is
  relaxed.

:switch:`--source-info={source info file}`
  Specify a source info file. This switch is active only when project files
  are used. If the source info file is specified as a relative path, then it is
  relative to the object directory of the main project. If the source info file
  does not exist, then after the Project Manager has successfully parsed and
  processed the project files and found the sources, it creates the source info
  file. If the source info file already exists and can be read successfully,
  then the Project Manager will get all the needed information about the sources
  from the source info file and will not look for them. This reduces the time
  to process the project files, especially when looking for sources that take a
  long time. If the source info file exists but cannot be parsed successfully,
  the Project Manager will attempt to recreate it. If the Project Manager fails
  to create the source info file, a message is issued, but gnatmake does not
  fail. ``gnatmake`` "trusts" the source info file. This means that
  if the source files have changed (addition, deletion, moving to a different
  source directory), then the source info file need to be deleted and recreated.


.. index:: -a  (gnatmake)

:switch:`-a`
  Consider all files in the make process, even the GNAT internal system
  files (for example, the predefined Ada library files), as well as any
  locked files. Locked files are files whose ALI file is write-protected.
  By default,
  ``gnatmake`` does not check these files,
  because the assumption is that the GNAT internal files are properly up
  to date, and also that any write protected ALI files have been properly
  installed. Note that if there is an installation problem, such that one
  of these files is not up to date, it will be properly caught by the
  binder.
  You may have to specify this switch if you are working on GNAT
  itself. The switch ``-a`` is also useful
  in conjunction with ``-f``
  if you need to recompile an entire application,
  including run-time files, using special configuration pragmas,
  such as a ``Normalize_Scalars`` pragma.

  By default
  ``gnatmake -a`` compiles all GNAT
  internal files with
  ``gcc -c -gnatpg`` rather than ``gcc -c``.


.. index:: -b  (gnatmake)

:switch:`-b`
  Bind only. Can be combined with :switch:`-c` to do
  compilation and binding, but no link.
  Can be combined with :switch:`-l`
  to do binding and linking. When not combined with
  :switch:`-c`
  all the units in the closure of the main program must have been previously
  compiled and must be up to date. The root unit specified by ``file_name``
  may be given without extension, with the source extension or, if no GNAT
  Project File is specified, with the ALI file extension.


.. index:: -c  (gnatmake)

:switch:`-c`
  Compile only. Do not perform binding, except when :switch:`-b`
  is also specified. Do not perform linking, except if both
  :switch:`-b` and
  :switch:`-l` are also specified.
  If the root unit specified by ``file_name`` is not a main unit, this is the
  default. Otherwise ``gnatmake`` will attempt binding and linking
  unless all objects are up to date and the executable is more recent than
  the objects.


.. index:: -C  (gnatmake)

:switch:`-C`
  Use a temporary mapping file. A mapping file is a way to communicate
  to the compiler two mappings: from unit names to file names (without
  any directory information) and from file names to path names (with
  full directory information). A mapping file can make the compiler's
  file searches faster, especially if there are many source directories,
  or the sources are read over a slow network connection. If
  :switch:`-P` is used, a mapping file is always used, so
  :switch:`-C` is unnecessary; in this case the mapping file
  is initially populated based on the project file. If
  :switch:`-C` is used without
  :switch:`-P`,
  the mapping file is initially empty. Each invocation of the compiler
  will add any newly accessed sources to the mapping file.


.. index:: -C=  (gnatmake)

:switch:`-C={file}`
  Use a specific mapping file. The file, specified as a path name (absolute or
  relative) by this switch, should already exist, otherwise the switch is
  ineffective. The specified mapping file will be communicated to the compiler.
  This switch is not compatible with a project file
  (-P`file`) or with multiple compiling processes
  (-jnnn, when nnn is greater than 1).


.. index:: -d  (gnatmake)

:switch:`-d`
  Display progress for each source, up to date or not, as a single line:

  ::

      completed x out of y (zz%)

  If the file needs to be compiled this is displayed after the invocation of
  the compiler. These lines are displayed even in quiet output mode.


.. index:: -D  (gnatmake)

:switch:`-D {dir}`
  Put all object files and ALI file in directory ``dir``.
  If the :switch:`-D` switch is not used, all object files
  and ALI files go in the current working directory.

  This switch cannot be used when using a project file.


.. index:: -eI  (gnatmake)

:switch:`-eI{nnn}`
  Indicates that the main source is a multi-unit source and the rank of the unit
  in the source file is nnn. nnn needs to be a positive number and a valid
  index in the source. This switch cannot be used when ``gnatmake`` is
  invoked for several mains.


.. index:: -eL  (gnatmake)
.. index:: symbolic links

:switch:`-eL`
  Follow all symbolic links when processing project files.
  This should be used if your project uses symbolic links for files or
  directories, but is not needed in other cases.

  .. index:: naming scheme

  This also assumes that no directory matches the naming scheme for files (for
  instance that you do not have a directory called "sources.ads" when using the
  default GNAT naming scheme).

  When you do not have to use this switch (i.e., by default), gnatmake is able to
  save a lot of system calls (several per source file and object file), which
  can result in a significant speed up to load and manipulate a project file,
  especially when using source files from a remote system.


.. index:: -eS  (gnatmake)

:switch:`-eS`
  Output the commands for the compiler, the binder and the linker
  on standard output,
  instead of standard error.


.. index:: -f  (gnatmake)

:switch:`-f`
  Force recompilations. Recompile all sources, even though some object
  files may be up to date, but don't recompile predefined or GNAT internal
  files or locked files (files with a write-protected ALI file),
  unless the :switch:`-a` switch is also specified.


.. index:: -F  (gnatmake)

:switch:`-F`
  When using project files, if some errors or warnings are detected during
  parsing and verbose mode is not in effect (no use of switch
  -v), then error lines start with the full path name of the project
  file, rather than its simple file name.


.. index:: -g  (gnatmake)

:switch:`-g`
  Enable debugging. This switch is simply passed to the compiler and to the
  linker.


.. index:: -i  (gnatmake)

:switch:`-i`
  In normal mode, ``gnatmake`` compiles all object files and ALI files
  into the current directory. If the :switch:`-i` switch is used,
  then instead object files and ALI files that already exist are overwritten
  in place. This means that once a large project is organized into separate
  directories in the desired manner, then ``gnatmake`` will automatically
  maintain and update this organization. If no ALI files are found on the
  Ada object path (see :ref:`Search_Paths_and_the_Run-Time_Library_RTL`),
  the new object and ALI files are created in the
  directory containing the source being compiled. If another organization
  is desired, where objects and sources are kept in different directories,
  a useful technique is to create dummy ALI files in the desired directories.
  When detecting such a dummy file, ``gnatmake`` will be forced to
  recompile the corresponding source file, and it will be put the resulting
  object and ALI files in the directory where it found the dummy file.


.. index:: -j  (gnatmake)
.. index:: Parallel make

:switch:`-j{n}`
  Use ``n`` processes to carry out the (re)compilations. On a multiprocessor
  machine compilations will occur in parallel. If ``n`` is 0, then the
  maximum number of parallel compilations is the number of core processors
  on the platform. In the event of compilation errors, messages from various
  compilations might get interspersed (but ``gnatmake`` will give you the
  full ordered list of failing compiles at the end). If this is problematic,
  rerun the make process with n set to 1 to get a clean list of messages.


.. index:: -k  (gnatmake)

:switch:`-k`
  Keep going. Continue as much as possible after a compilation error. To
  ease the programmer's task in case of compilation errors, the list of
  sources for which the compile fails is given when ``gnatmake``
  terminates.

  If ``gnatmake`` is invoked with several :file:`file_names` and with this
  switch, if there are compilation errors when building an executable,
  ``gnatmake`` will not attempt to build the following executables.


.. index:: -l  (gnatmake)

:switch:`-l`
  Link only. Can be combined with :switch:`-b` to binding
  and linking. Linking will not be performed if combined with
  :switch:`-c`
  but not with :switch:`-b`.
  When not combined with :switch:`-b`
  all the units in the closure of the main program must have been previously
  compiled and must be up to date, and the main program needs to have been bound.
  The root unit specified by ``file_name``
  may be given without extension, with the source extension or, if no GNAT
  Project File is specified, with the ALI file extension.


.. index:: -m  (gnatmake)

:switch:`-m`
  Specify that the minimum necessary amount of recompilations
  be performed. In this mode ``gnatmake`` ignores time
  stamp differences when the only
  modifications to a source file consist in adding/removing comments,
  empty lines, spaces or tabs. This means that if you have changed the
  comments in a source file or have simply reformatted it, using this
  switch will tell ``gnatmake`` not to recompile files that depend on it
  (provided other sources on which these files depend have undergone no
  semantic modifications). Note that the debugging information may be
  out of date with respect to the sources if the :switch:`-m` switch causes
  a compilation to be switched, so the use of this switch represents a
  trade-off between compilation time and accurate debugging information.


.. index:: Dependencies, producing list
.. index:: -M  (gnatmake)

:switch:`-M`
  Check if all objects are up to date. If they are, output the object
  dependences to :file:`stdout` in a form that can be directly exploited in
  a :file:`Makefile`. By default, each source file is prefixed with its
  (relative or absolute) directory name. This name is whatever you
  specified in the various :switch:`-aI`
  and :switch:`-I` switches. If you use
  ``gnatmake -M``  :switch:`-q`
  (see below), only the source file names,
  without relative paths, are output. If you just specify the  :switch:`-M`
  switch, dependencies of the GNAT internal system files are omitted. This
  is typically what you want. If you also specify
  the :switch:`-a` switch,
  dependencies of the GNAT internal files are also listed. Note that
  dependencies of the objects in external Ada libraries (see
  switch  :switch:`-aL{dir}` in the following list)
  are never reported.


.. index:: -n  (gnatmake)

:switch:`-n`
  Don't compile, bind, or link. Checks if all objects are up to date.
  If they are not, the full name of the first file that needs to be
  recompiled is printed.
  Repeated use of this option, followed by compiling the indicated source
  file, will eventually result in recompiling all required units.


.. index:: -o  (gnatmake)

:switch:`-o {exec_name}`
  Output executable name. The name of the final executable program will be
  ``exec_name``. If the :switch:`-o` switch is omitted the default
  name for the executable will be the name of the input file in appropriate form
  for an executable file on the host system.

  This switch cannot be used when invoking ``gnatmake`` with several
  :file:`file_names`.


.. index:: -p  (gnatmake)

:switch:`-p`
  Same as :switch:`--create-missing-dirs`

.. index:: -P  (gnatmake)

:switch:`-P{project}`
  Use project file ``project``. Only one such switch can be used.

.. -- Comment:
  :ref:`gnatmake_and_Project_Files`.


.. index:: -q  (gnatmake)

:switch:`-q`
  Quiet. When this flag is not set, the commands carried out by
  ``gnatmake`` are displayed.


.. index:: -s  (gnatmake)

:switch:`-s`
  Recompile if compiler switches have changed since last compilation.
  All compiler switches but -I and -o are taken into account in the
  following way:
  orders between different 'first letter' switches are ignored, but
  orders between same switches are taken into account. For example,
  :switch:`-O -O2` is different than :switch:`-O2 -O`, but :switch:`-g -O`
  is equivalent to :switch:`-O -g`.

  This switch is recommended when Integrated Preprocessing is used.


.. index:: -u  (gnatmake)

:switch:`-u`
  Unique. Recompile at most the main files. It implies -c. Combined with
  -f, it is equivalent to calling the compiler directly. Note that using
  -u with a project file and no main has a special meaning.

.. --Comment
  (See :ref:`Project_Files_and_Main_Subprograms`.)


.. index:: -U  (gnatmake)

:switch:`-U`
  When used without a project file or with one or several mains on the command
  line, is equivalent to -u. When used with a project file and no main
  on the command line, all sources of all project files are checked and compiled
  if not up to date, and libraries are rebuilt, if necessary.


.. index:: -v  (gnatmake)

:switch:`-v`
  Verbose. Display the reason for all recompilations ``gnatmake``
  decides are necessary, with the highest verbosity level.


.. index:: -vl  (gnatmake)

:switch:`-vl`
  Verbosity level Low. Display fewer lines than in verbosity Medium.


.. index:: -vm  (gnatmake)

:switch:`-vm`
  Verbosity level Medium. Potentially display fewer lines than in verbosity High.


.. index:: -vm  (gnatmake)

:switch:`-vh`
  Verbosity level High. Equivalent to -v.


:switch:`-vP{x}`
  Indicate the verbosity of the parsing of GNAT project files.
  See :ref:`Switches_Related_to_Project_Files`.


.. index:: -x  (gnatmake)

:switch:`-x`
  Indicate that sources that are not part of any Project File may be compiled.
  Normally, when using Project Files, only sources that are part of a Project
  File may be compile. When this switch is used, a source outside of all Project
  Files may be compiled. The ALI file and the object file will be put in the
  object directory of the main Project. The compilation switches used will only
  be those specified on the command line. Even when
  :switch:`-x` is used, mains specified on the
  command line need to be sources of a project file.


:switch:`-X{name}={value}`
  Indicate that external variable ``name`` has the value ``value``.
  The Project Manager will use this value for occurrences of
  ``external(name)`` when parsing the project file.
  :ref:`Switches_Related_to_Project_Files`.


.. index:: -z  (gnatmake)

:switch:`-z`
  No main subprogram. Bind and link the program even if the unit name
  given on the command line is a package name. The resulting executable
  will execute the elaboration routines of the package and its closure,
  then the finalization routines.


.. rubric:: GCC switches

Any uppercase or multi-character switch that is not a ``gnatmake`` switch
is passed to ``gcc`` (e.g., :switch:`-O`, :switch:`-gnato,` etc.)


.. rubric:: Source and library search path switches

.. index:: -aI  (gnatmake)

:switch:`-aI{dir}`
  When looking for source files also look in directory ``dir``.
  The order in which source files search is undertaken is
  described in :ref:`Search_Paths_and_the_Run-Time_Library_RTL`.


.. index:: -aL  (gnatmake)

:switch:`-aL{dir}`
  Consider ``dir`` as being an externally provided Ada library.
  Instructs ``gnatmake`` to skip compilation units whose :file:`.ALI`
  files have been located in directory ``dir``. This allows you to have
  missing bodies for the units in ``dir`` and to ignore out of date bodies
  for the same units. You still need to specify
  the location of the specs for these units by using the switches
  :switch:`-aI{dir}`  or :switch:`-I{dir}`.
  Note: this switch is provided for compatibility with previous versions
  of ``gnatmake``. The easier method of causing standard libraries
  to be excluded from consideration is to write-protect the corresponding
  ALI files.


.. index:: -aO  (gnatmake)

:switch:`-aO{dir}`
  When searching for library and object files, look in directory
  ``dir``. The order in which library files are searched is described in
  :ref:`Search_Paths_for_gnatbind`.


.. index:: Search paths, for gnatmake
.. index:: -A  (gnatmake)

:switch:`-A{dir}`
  Equivalent to :switch:`-aL{dir}` :switch:`-aI{dir}`.


  .. index:: -I  (gnatmake)

:switch:`-I{dir}`
  Equivalent to :switch:`-aO{dir} -aI{dir}`.


.. index:: -I-  (gnatmake)
.. index:: Source files, suppressing search

:switch:`-I-`
  Do not look for source files in the directory containing the source
  file named in the command line.
  Do not look for ALI or object files in the directory
  where ``gnatmake`` was invoked.


.. index:: -L  (gnatmake)
.. index:: Linker libraries

:switch:`-L{dir}`
  Add directory ``dir`` to the list of directories in which the linker
  will search for libraries. This is equivalent to
  :switch:`-largs` :switch:`-L{dir}`.
  Furthermore, under Windows, the sources pointed to by the libraries path
  set in the registry are not searched for.


.. index:: -nostdinc  (gnatmake)

:switch:`-nostdinc`
  Do not look for source files in the system default directory.


.. index:: -nostdlib  (gnatmake)

:switch:`-nostdlib`
  Do not look for library files in the system default directory.


.. index:: --RTS  (gnatmake)

:switch:`--RTS={rts-path}`
  Specifies the default location of the run-time library. GNAT looks for the
  run-time
  in the following directories, and stops as soon as a valid run-time is found
  (:file:`adainclude` or :file:`ada_source_path`, and :file:`adalib` or
  :file:`ada_object_path` present):

  * *<current directory>/$rts_path*

  * *<default-search-dir>/$rts_path*

  * *<default-search-dir>/rts-$rts_path*

  * The selected path is handled like a normal RTS path.


.. _Mode_Switches_for_gnatmake:

Mode Switches for ``gnatmake``
------------------------------

The mode switches (referred to as ``mode_switches``) allow the
inclusion of switches that are to be passed to the compiler itself, the
binder or the linker. The effect of a mode switch is to cause all
subsequent switches up to the end of the switch list, or up to the next
mode switch, to be interpreted as switches to be passed on to the
designated component of GNAT.

.. index:: -cargs  (gnatmake)

:switch:`-cargs {switches}`
  Compiler switches. Here ``switches`` is a list of switches
  that are valid switches for ``gcc``. They will be passed on to
  all compile steps performed by ``gnatmake``.


.. index:: -bargs  (gnatmake)

:switch:`-bargs {switches}`
  Binder switches. Here ``switches`` is a list of switches
  that are valid switches for ``gnatbind``. They will be passed on to
  all bind steps performed by ``gnatmake``.


.. index:: -largs  (gnatmake)

:switch:`-largs {switches}`
  Linker switches. Here ``switches`` is a list of switches
  that are valid switches for ``gnatlink``. They will be passed on to
  all link steps performed by ``gnatmake``.


.. index:: -margs  (gnatmake)

:switch:`-margs {switches}`
  Make switches. The switches are directly interpreted by ``gnatmake``,
  regardless of any previous occurrence of :switch:`-cargs`, :switch:`-bargs`
  or :switch:`-largs`.


.. _Notes_on_the_Command_Line:

Notes on the Command Line
-------------------------

This section contains some additional useful notes on the operation
of the ``gnatmake`` command.

.. index:: Recompilation (by gnatmake)

* If ``gnatmake`` finds no ALI files, it recompiles the main program
  and all other units required by the main program.
  This means that ``gnatmake``
  can be used for the initial compile, as well as during subsequent steps of
  the development cycle.

* If you enter ``gnatmake foo.adb``, where ``foo``
  is a subunit or body of a generic unit, ``gnatmake`` recompiles
  :file:`foo.adb` (because it finds no ALI) and stops, issuing a
  warning.

* In ``gnatmake`` the switch :switch:`-I`
  is used to specify both source and
  library file paths. Use :switch:`-aI`
  instead if you just want to specify
  source paths only and :switch:`-aO`
  if you want to specify library paths
  only.

* ``gnatmake`` will ignore any files whose ALI file is write-protected.
  This may conveniently be used to exclude standard libraries from
  consideration and in particular it means that the use of the
  :switch:`-f` switch will not recompile these files
  unless :switch:`-a` is also specified.

* ``gnatmake`` has been designed to make the use of Ada libraries
  particularly convenient. Assume you have an Ada library organized
  as follows: *obj-dir* contains the objects and ALI files for
  of your Ada compilation units,
  whereas *include-dir* contains the
  specs of these units, but no bodies. Then to compile a unit
  stored in ``main.adb``, which uses this Ada library you would just type:

  .. code-block:: sh

      $ gnatmake -aI`include-dir`  -aL`obj-dir`  main

* Using ``gnatmake`` along with the :switch:`-m (minimal recompilation)`
  switch provides a mechanism for avoiding unnecessary recompilations. Using
  this switch,
  you can update the comments/format of your
  source files without having to recompile everything. Note, however, that
  adding or deleting lines in a source files may render its debugging
  info obsolete. If the file in question is a spec, the impact is rather
  limited, as that debugging info will only be useful during the
  elaboration phase of your program. For bodies the impact can be more
  significant. In all events, your debugger will warn you if a source file
  is more recent than the corresponding object, and alert you to the fact
  that the debugging information may be out of date.


.. _How_gnatmake_Works:

How ``gnatmake`` Works
----------------------

Generally ``gnatmake`` automatically performs all necessary
recompilations and you don't need to worry about how it works. However,
it may be useful to have some basic understanding of the ``gnatmake``
approach and in particular to understand how it uses the results of
previous compilations without incorrectly depending on them.

First a definition: an object file is considered *up to date* if the
corresponding ALI file exists and if all the source files listed in the
dependency section of this ALI file have time stamps matching those in
the ALI file. This means that neither the source file itself nor any
files that it depends on have been modified, and hence there is no need
to recompile this file.

``gnatmake`` works by first checking if the specified main unit is up
to date. If so, no compilations are required for the main unit. If not,
``gnatmake`` compiles the main program to build a new ALI file that
reflects the latest sources. Then the ALI file of the main unit is
examined to find all the source files on which the main program depends,
and ``gnatmake`` recursively applies the above procedure on all these
files.

This process ensures that ``gnatmake`` only trusts the dependencies
in an existing ALI file if they are known to be correct. Otherwise it
always recompiles to determine a new, guaranteed accurate set of
dependencies. As a result the program is compiled 'upside down' from what may
be more familiar as the required order of compilation in some other Ada
systems. In particular, clients are compiled before the units on which
they depend. The ability of GNAT to compile in any order is critical in
allowing an order of compilation to be chosen that guarantees that
``gnatmake`` will recompute a correct set of new dependencies if
necessary.

When invoking ``gnatmake`` with several ``file_names``, if a unit is
imported by several of the executables, it will be recompiled at most once.

Note: when using non-standard naming conventions
(:ref:`Using_Other_File_Names`), changing through a configuration pragmas
file the version of a source and invoking ``gnatmake`` to recompile may
have no effect, if the previous version of the source is still accessible
by ``gnatmake``. It may be necessary to use the switch
-f.


.. _Examples_of_gnatmake_Usage:

Examples of ``gnatmake`` Usage
------------------------------

*gnatmake hello.adb*
  Compile all files necessary to bind and link the main program
  :file:`hello.adb` (containing unit ``Hello``) and bind and link the
  resulting object files to generate an executable file :file:`hello`.

*gnatmake main1 main2 main3*
  Compile all files necessary to bind and link the main programs
  :file:`main1.adb` (containing unit ``Main1``), :file:`main2.adb`
  (containing unit ``Main2``) and :file:`main3.adb`
  (containing unit ``Main3``) and bind and link the resulting object files
  to generate three executable files :file:`main1`,
  :file:`main2`  and :file:`main3`.

*gnatmake -q Main_Unit -cargs -O2 -bargs -l*
  Compile all files necessary to bind and link the main program unit
  ``Main_Unit`` (from file :file:`main_unit.adb`). All compilations will
  be done with optimization level 2 and the order of elaboration will be
  listed by the binder. ``gnatmake`` will operate in quiet mode, not
  displaying commands it is executing.


.. _Compiling_with_gcc:

Compiling with ``gcc``
======================

This section discusses how to compile Ada programs using the ``gcc``
command. It also describes the set of switches
that can be used to control the behavior of the compiler.

.. _Compiling_Programs:

Compiling Programs
------------------

The first step in creating an executable program is to compile the units
of the program using the ``gcc`` command. You must compile the
following files:

* the body file (:file:`.adb`) for a library level subprogram or generic
  subprogram

* the spec file (:file:`.ads`) for a library level package or generic
  package that has no body

* the body file (:file:`.adb`) for a library level package
  or generic package that has a body

You need *not* compile the following files

* the spec of a library unit which has a body

* subunits

because they are compiled as part of compiling related units. GNAT
package specs
when the corresponding body is compiled, and subunits when the parent is
compiled.

.. index:: cannot generate code

If you attempt to compile any of these files, you will get one of the
following error messages (where ``fff`` is the name of the file you
compiled):

  ::

    cannot generate code for file ``fff`` (package spec)
    to check package spec, use -gnatc

    cannot generate code for file ``fff`` (missing subunits)
    to check parent unit, use -gnatc

    cannot generate code for file ``fff`` (subprogram spec)
    to check subprogram spec, use -gnatc

    cannot generate code for file ``fff`` (subunit)
    to check subunit, use -gnatc


As indicated by the above error messages, if you want to submit
one of these files to the compiler to check for correct semantics
without generating code, then use the :switch:`-gnatc` switch.

The basic command for compiling a file containing an Ada unit is:

.. code-block:: sh

  $ gcc -c [switches] <file name>

where ``file name`` is the name of the Ada file (usually
having an extension :file:`.ads` for a spec or :file:`.adb` for a body).
You specify the
:switch:`-c` switch to tell ``gcc`` to compile, but not link, the file.
The result of a successful compilation is an object file, which has the
same name as the source file but an extension of :file:`.o` and an Ada
Library Information (ALI) file, which also has the same name as the
source file, but with :file:`.ali` as the extension. GNAT creates these
two output files in the current directory, but you may specify a source
file in any directory using an absolute or relative path specification
containing the directory information.

TESTING: the :switch:`--foobar{NN}` switch

.. index::  gnat1

``gcc`` is actually a driver program that looks at the extensions of
the file arguments and loads the appropriate compiler. For example, the
GNU C compiler is :file:`cc1`, and the Ada compiler is :file:`gnat1`.
These programs are in directories known to the driver program (in some
configurations via environment variables you set), but need not be in
your path. The ``gcc`` driver also calls the assembler and any other
utilities needed to complete the generation of the required object
files.

It is possible to supply several file names on the same ``gcc``
command. This causes ``gcc`` to call the appropriate compiler for
each file. For example, the following command lists two separate
files to be compiled:

.. code-block:: sh

  $ gcc -c x.adb y.adb


calls ``gnat1`` (the Ada compiler) twice to compile :file:`x.adb` and
:file:`y.adb`.
The compiler generates two object files :file:`x.o` and :file:`y.o`
and the two ALI files :file:`x.ali` and :file:`y.ali`.

Any switches apply to all the files listed, see :ref:`Switches_for_gcc` for a
list of available ``gcc`` switches.

.. _Search_Paths_and_the_Run-Time_Library_RTL:

Search Paths and the Run-Time Library (RTL)
-------------------------------------------

With the GNAT source-based library system, the compiler must be able to
find source files for units that are needed by the unit being compiled.
Search paths are used to guide this process.

The compiler compiles one source file whose name must be given
explicitly on the command line. In other words, no searching is done
for this file. To find all other source files that are needed (the most
common being the specs of units), the compiler examines the following
directories, in the following order:

* The directory containing the source file of the main unit being compiled
  (the file name on the command line).

* Each directory named by an :switch:`-I` switch given on the ``gcc``
  command line, in the order given.

  .. index:: ADA_PRJ_INCLUDE_FILE

* Each of the directories listed in the text file whose name is given
  by the :envvar:`ADA_PRJ_INCLUDE_FILE` environment variable.
  :envvar:`ADA_PRJ_INCLUDE_FILE` is normally set by gnatmake or by the gnat
  driver when project files are used. It should not normally be set
  by other means.

  .. index:: ADA_INCLUDE_PATH

* Each of the directories listed in the value of the
  :envvar:`ADA_INCLUDE_PATH` environment variable.
  Construct this value
  exactly as the :envvar:`PATH` environment variable: a list of directory
  names separated by colons (semicolons when working with the NT version).

* The content of the :file:`ada_source_path` file which is part of the GNAT
  installation tree and is used to store standard libraries such as the
  GNAT Run Time Library (RTL) source files.
  :ref:`Installing_a_library`

Specifying the switch :switch:`-I-`
inhibits the use of the directory
containing the source file named in the command line. You can still
have this directory on your search path, but in this case it must be
explicitly requested with a :switch:`-I` switch.

Specifying the switch :switch:`-nostdinc`
inhibits the search of the default location for the GNAT Run Time
Library (RTL) source files.

The compiler outputs its object files and ALI files in the current
working directory.
Caution: The object file can be redirected with the :switch:`-o` switch;
however, ``gcc`` and ``gnat1`` have not been coordinated on this
so the :file:`ALI` file will not go to the right place. Therefore, you should
avoid using the :switch:`-o` switch.

.. index:: System.IO

The packages ``Ada``, ``System``, and ``Interfaces`` and their
children make up the GNAT RTL, together with the simple ``System.IO``
package used in the ``"Hello World"`` example. The sources for these units
are needed by the compiler and are kept together in one directory. Not
all of the bodies are needed, but all of the sources are kept together
anyway. In a normal installation, you need not specify these directory
names when compiling or binding. Either the environment variables or
the built-in defaults cause these files to be found.

In addition to the language-defined hierarchies (``System``, ``Ada`` and
``Interfaces``), the GNAT distribution provides a fourth hierarchy,
consisting of child units of ``GNAT``. This is a collection of generally
useful types, subprograms, etc. See the :title:`GNAT_Reference_Manual`
for further details.

Besides simplifying access to the RTL, a major use of search paths is
in compiling sources from multiple directories. This can make
development environments much more flexible.

.. _Order_of_Compilation_Issues:

Order of Compilation Issues
---------------------------

If, in our earlier example, there was a spec for the ``hello``
procedure, it would be contained in the file :file:`hello.ads`; yet this
file would not have to be explicitly compiled. This is the result of the
model we chose to implement library management. Some of the consequences
of this model are as follows:

* There is no point in compiling specs (except for package
  specs with no bodies) because these are compiled as needed by clients. If
  you attempt a useless compilation, you will receive an error message.
  It is also useless to compile subunits because they are compiled as needed
  by the parent.

* There are no order of compilation requirements: performing a
  compilation never obsoletes anything. The only way you can obsolete
  something and require recompilations is to modify one of the
  source files on which it depends.

* There is no library as such, apart from the ALI files
  (:ref:`The_Ada_Library_Information_Files`, for information on the format
  of these files). For now we find it convenient to create separate ALI files,
  but eventually the information therein may be incorporated into the object
  file directly.

* When you compile a unit, the source files for the specs of all units
  that it |withs|, all its subunits, and the bodies of any generics it
  instantiates must be available (reachable by the search-paths mechanism
  described above), or you will receive a fatal error message.

.. _Examples:

Examples
--------

The following are some typical Ada compilation command line examples:

.. code-block:: sh

    $ gcc -c xyz.adb

Compile body in file :file:`xyz.adb` with all default options.

.. code-block:: sh

    $ gcc -c -O2 -gnata xyz-def.adb

Compile the child unit package in file :file:`xyz-def.adb` with extensive
optimizations, and pragma ``Assert``/`Debug` statements
enabled.

.. code-block:: sh

    $ gcc -c -gnatc abc-def.adb

Compile the subunit in file :file:`abc-def.adb` in semantic-checking-only
mode.


.. _Switches_for_gcc:

Compiler Switches
=================

The ``gcc`` command accepts switches that control the
compilation process. These switches are fully described in this section:
first an alphabetical listing of all switches with a brief description,
and then functionally grouped sets of switches with more detailed
information.

More switches exist for GCC than those documented here, especially
for specific targets. However, their use is not recommended as
they may change code generation in ways that are incompatible with
the Ada run-time library, or can cause inconsistencies between
compilation units.

.. _Alphabetical_List_of_All_Switches:

Alphabetical List of All Switches
---------------------------------

.. index:: -b  (gcc)

:switch:`-b {target}`
  Compile your program to run on ``target``, which is the name of a
  system configuration. You must have a GNAT cross-compiler built if
  ``target`` is not the same as your host system.


.. index:: -B  (gcc)

:switch:`-B{dir}`
  Load compiler executables (for example, ``gnat1``, the Ada compiler)
  from ``dir`` instead of the default location. Only use this switch
  when multiple versions of the GNAT compiler are available.
  See the "Options for Directory Search" section in the
  :title:`Using the GNU Compiler Collection (GCC)` manual for further details.
  You would normally use the :switch:`-b` or :switch:`-V` switch instead.

.. index:: -c  (gcc)

:switch:`-c`
  Compile. Always use this switch when compiling Ada programs.

  Note: for some other languages when using ``gcc``, notably in
  the case of C and C++, it is possible to use
  use ``gcc`` without a :switch:`-c` switch to
  compile and link in one step. In the case of GNAT, you
  cannot use this approach, because the binder must be run
  and ``gcc`` cannot be used to run the GNAT binder.


.. index:: -fcallgraph-info  (gcc)

:switch:`-fcallgraph-info[=su,da]`
  Makes the compiler output callgraph information for the program, on a
  per-file basis. The information is generated in the VCG format.  It can
  be decorated with additional, per-node and/or per-edge information, if a
  list of comma-separated markers is additionally specified. When the
  ``su`` marker is specified, the callgraph is decorated with stack usage
  information; it is equivalent to :switch:`-fstack-usage`. When the ``da``
  marker is specified, the callgraph is decorated with information about
  dynamically allocated objects.

.. index:: -fdiagnostics-format   (gcc)

:switch:`-fdiagnostics-format=json`
  Makes GNAT emit warning and error messages as JSON. Inhibits printing of
  text warning and errors messages except if :switch:`-gnatv` or
  :switch:`-gnatl` are present.


.. index:: -fdump-scos  (gcc)

:switch:`-fdump-scos`
  Generates SCO (Source Coverage Obligation) information in the ALI file.
  This information is used by advanced coverage tools. See unit :file:`SCOs`
  in the compiler sources for details in files :file:`scos.ads` and
  :file:`scos.adb`.


.. index:: -fgnat-encodings  (gcc)

:switch:`-fgnat-encodings=[all|gdb|minimal]`
  This switch controls the balance between GNAT encodings and standard DWARF
  emitted in the debug information.


.. index:: -flto  (gcc)

:switch:`-flto[={n}]`
  Enables Link Time Optimization. This switch must be used in conjunction
  with the :switch:`-Ox` switches (but not with the :switch:`-gnatn` switch
  since it is a full replacement for the latter) and instructs the compiler
  to defer most optimizations until the link stage. The advantage of this
  approach is that the compiler can do a whole-program analysis and choose
  the best interprocedural optimization strategy based on a complete view
  of the program, instead of a fragmentary view with the usual approach.
  This can also speed up the compilation of big programs and reduce the
  size of the executable, compared with a traditional per-unit compilation
  with inlining across units enabled by the :switch:`-gnatn` switch.
  The drawback of this approach is that it may require more memory and that
  the debugging information generated by -g with it might be hardly usable.
  The switch, as well as the accompanying :switch:`-Ox` switches, must be
  specified both for the compilation and the link phases.
  If the ``n`` parameter is specified, the optimization and final code
  generation at link time are executed using ``n`` parallel jobs by
  means of an installed ``make`` program.


.. index:: -fno-inline  (gcc)

:switch:`-fno-inline`
  Suppresses all inlining, unless requested with pragma ``Inline_Always``. The
  effect is enforced regardless of other optimization or inlining switches.
  Note that inlining can also be suppressed on a finer-grained basis with
  pragma ``No_Inline``.


.. index:: -fno-inline-functions  (gcc)

:switch:`-fno-inline-functions`
  Suppresses automatic inlining of subprograms, which is enabled
  if :switch:`-O3` is used.


.. index:: -fno-inline-small-functions  (gcc)

:switch:`-fno-inline-small-functions`
  Suppresses automatic inlining of small subprograms, which is enabled
  if :switch:`-O2` is used.


.. index:: -fno-inline-functions-called-once  (gcc)

:switch:`-fno-inline-functions-called-once`
  Suppresses inlining of subprograms local to the unit and called once
  from within it, which is enabled if :switch:`-O1` is used.


.. index:: -fno-ivopts  (gcc)

:switch:`-fno-ivopts`
  Suppresses high-level loop induction variable optimizations, which are
  enabled if :switch:`-O1` is used. These optimizations are generally
  profitable but, for some specific cases of loops with numerous uses
  of the iteration variable that follow a common pattern, they may end
  up destroying the regularity that could be exploited at a lower level
  and thus producing inferior code.


.. index:: -fno-strict-aliasing  (gcc)

:switch:`-fno-strict-aliasing`
  Causes the compiler to avoid assumptions regarding non-aliasing
  of objects of different types. See
  :ref:`Optimization_and_Strict_Aliasing` for details.


.. index:: -fno-strict-overflow  (gcc)

:switch:`-fno-strict-overflow`
  Causes the compiler to avoid assumptions regarding the rules of signed
  integer overflow. These rules specify that signed integer overflow will
  result in a Constraint_Error exception at run time and are enforced in
  default mode by the compiler, so this switch should not be necessary in
  normal operating mode. It might be useful in conjunction with :switch:`-gnato0`
  for very peculiar cases of low-level programming.


.. index:: -fstack-check  (gcc)

:switch:`-fstack-check`
  Activates stack checking.
  See :ref:`Stack_Overflow_Checking` for details.


.. index:: -fstack-usage  (gcc)

:switch:`-fstack-usage`
  Makes the compiler output stack usage information for the program, on a
  per-subprogram basis. See :ref:`Static_Stack_Usage_Analysis` for details.


.. index:: -g  (gcc)

:switch:`-g`
  Generate debugging information. This information is stored in the object
  file and copied from there to the final executable file by the linker,
  where it can be read by the debugger. You must use the
  :switch:`-g` switch if you plan on using the debugger.


.. index:: -gnat05  (gcc)

:switch:`-gnat05`
  Allow full Ada 2005 features.


.. index:: -gnat12  (gcc)

:switch:`-gnat12`
  Allow full Ada 2012 features.

.. index:: -gnat83  (gcc)

.. index:: -gnat2005  (gcc)

:switch:`-gnat2005`
  Allow full Ada 2005 features (same as :switch:`-gnat05`)


.. index:: -gnat2012  (gcc)

:switch:`-gnat2012`
  Allow full Ada 2012 features (same as :switch:`-gnat12`)


.. index:: -gnat2022  (gcc)

:switch:`-gnat2022`
  Allow full Ada 2022 features


:switch:`-gnat83`
  Enforce Ada 83 restrictions.


.. index:: -gnat95  (gcc)

:switch:`-gnat95`
  Enforce Ada 95 restrictions.

  Note: for compatibility with some Ada 95 compilers which support only
  the ``overriding`` keyword of Ada 2005, the :switch:`-gnatd.D` switch can
  be used along with :switch:`-gnat95` to achieve a similar effect with GNAT.

  :switch:`-gnatd.D` instructs GNAT to consider ``overriding`` as a keyword
  and handle its associated semantic checks, even in Ada 95 mode.


.. index:: -gnata  (gcc)

:switch:`-gnata`
  Assertions enabled. ``Pragma Assert`` and ``pragma Debug`` to be
  activated. Note that these pragmas can also be controlled using the
  configuration pragmas ``Assertion_Policy`` and ``Debug_Policy``.
  It also activates pragmas ``Check``, ``Precondition``, and
  ``Postcondition``. Note that these pragmas can also be controlled
  using the configuration pragma ``Check_Policy``. In Ada 2012, it
  also activates all assertions defined in the RM as aspects: preconditions,
  postconditions, type invariants and (sub)type predicates. In all Ada modes,
  corresponding pragmas for type invariants and (sub)type predicates are
  also activated. The default is that all these assertions are disabled,
  and have no effect, other than being checked for syntactic validity, and
  in the case of subtype predicates, constructions such as membership tests
  still test predicates even if assertions are turned off.


.. index:: -gnatA  (gcc)

:switch:`-gnatA`
  Avoid processing :file:`gnat.adc`. If a :file:`gnat.adc` file is present,
  it will be ignored.


.. index:: -gnatb  (gcc)

:switch:`-gnatb`
  Generate brief messages to :file:`stderr` even if verbose mode set.


.. index:: -gnatB  (gcc)

:switch:`-gnatB`
  Assume no invalid (bad) values except for 'Valid attribute use
  (:ref:`Validity_Checking`).


.. index:: -gnatc  (gcc)

:switch:`-gnatc`
  Check syntax and semantics only (no code generation attempted). When the
  compiler is invoked by ``gnatmake``, if the switch :switch:`-gnatc` is
  only given to the compiler (after :switch:`-cargs` or in package Compiler of
  the project file, ``gnatmake`` will fail because it will not find the
  object file after compilation. If ``gnatmake`` is called with
  :switch:`-gnatc` as a builder switch (before :switch:`-cargs` or in package
  Builder of the project file) then ``gnatmake`` will not fail because
  it will not look for the object files after compilation, and it will not try
  to build and link.


.. index:: -gnatC  (gcc)

:switch:`-gnatC`
  Generate CodePeer intermediate format (no code generation attempted).
  This switch will generate an intermediate representation suitable for
  use by CodePeer (:file:`.scil` files). This switch is not compatible with
  code generation (it will, among other things, disable some switches such
  as -gnatn, and enable others such as -gnata).


.. index:: -gnatd  (gcc)

:switch:`-gnatd`
  Specify debug options for the compiler. The string of characters after
  the :switch:`-gnatd` specifies the specific debug options. The possible
  characters are 0-9, a-z, A-Z, optionally preceded by a dot or underscore.
  See compiler source file :file:`debug.adb` for details of the implemented
  debug options. Certain debug options are relevant to applications
  programmers, and these are documented at appropriate points in this
  users guide.


.. index:: -gnatD[nn]  (gcc)

:switch:`-gnatD`
  Create expanded source files for source level debugging. This switch
  also suppresses generation of cross-reference information
  (see :switch:`-gnatx`). Note that this switch is not allowed if a previous
  -gnatR switch has been given, since these two switches are not compatible.


.. index:: -gnateA  (gcc)

:switch:`-gnateA`
  Check that the actual parameters of a subprogram call are not aliases of one
  another. To qualify as aliasing, their memory locations must be identical or
  overlapping, at least one of the corresponding formal parameters must be of
  mode OUT or IN OUT, and at least one of the corresponding formal parameters
  must have its parameter passing mechanism not specified.


  .. code-block:: ada

      type Rec_Typ is record
         Data : Integer := 0;
      end record;

      function Self (Val : Rec_Typ) return Rec_Typ is
      begin
         return Val;
      end Self;

      procedure Detect_Aliasing (Val_1 : in out Rec_Typ; Val_2 : Rec_Typ) is
      begin
         null;
      end Detect_Aliasing;

      Obj : Rec_Typ;

      Detect_Aliasing (Obj, Obj);
      Detect_Aliasing (Obj, Self (Obj));


  In the example above, the first call to ``Detect_Aliasing`` fails with a
  ``Program_Error`` at run time because the actuals for ``Val_1`` and
  ``Val_2`` denote the same object. The second call executes without raising
  an exception because ``Self(Obj)`` produces an anonymous object which does
  not share the memory location of ``Obj``.

.. index:: -gnateb  (gcc)

:switch:`-gnateb`
  Store configuration files by their basename in ALI files. This switch is
  used for instance by gprbuild for distributed builds in order to prevent
  issues where machine-specific absolute paths could end up being stored in
  ALI files.

.. index:: -gnatec  (gcc)

:switch:`-gnatec={path}`
  Specify a configuration pragma file
  (the equal sign is optional)
  (:ref:`The_Configuration_Pragmas_Files`).


.. index:: -gnateC  (gcc)

:switch:`-gnateC`
  Generate CodePeer messages in a compiler-like format. This switch is only
  effective if :switch:`-gnatcC` is also specified and requires an installation
  of CodePeer.


.. index:: -gnated  (gcc)

:switch:`-gnated`
  Disable atomic synchronization


.. index:: -gnateD  (gcc)

:switch:`-gnateDsymbol[={value}]`
  Defines a symbol, associated with ``value``, for preprocessing.
  (:ref:`Integrated_Preprocessing`).


.. index:: -gnateE  (gcc)

:switch:`-gnateE`
  Generate extra information in exception messages. In particular, display
  extra column information and the value and range associated with index and
  range check failures, and extra column information for access checks.
  In cases where the compiler is able to determine at compile time that
  a check will fail, it gives a warning, and the extra information is not
  produced at run time.


.. index:: -gnatef  (gcc)

:switch:`-gnatef`
  Display full source path name in brief error messages.


.. index:: -gnateF  (gcc)

:switch:`-gnateF`
  Check for overflow on all floating-point operations, including those
  for unconstrained predefined types. See description of pragma
  ``Check_Float_Overflow`` in GNAT RM.


.. index:: -gnateg  (gcc)

:switch:`-gnateg`
:switch:`-gnatceg`

  The :switch:`-gnatc` switch must always be specified before this switch, e.g.
  :switch:`-gnatceg`. Generate a C header from the Ada input file. See
  :ref:`Generating_C_Headers_for_Ada_Specifications` for more
  information.


.. index:: -gnateG  (gcc)

:switch:`-gnateG`
  Save result of preprocessing in a text file.


.. index:: -gnatei  (gcc)

:switch:`-gnatei{nnn}`
  Set maximum number of instantiations during compilation of a single unit to
  ``nnn``. This may be useful in increasing the default maximum of 8000 for
  the rare case when a single unit legitimately exceeds this limit.


.. index:: -gnateI  (gcc)

:switch:`-gnateI{nnn}`
  Indicates that the source is a multi-unit source and that the index of the
  unit to compile is ``nnn``. ``nnn`` needs to be a positive number and need
  to be a valid index in the multi-unit source.


.. index:: -gnatel  (gcc)

:switch:`-gnatel`
  This switch can be used with the static elaboration model to issue info
  messages showing
  where implicit ``pragma Elaborate`` and ``pragma Elaborate_All``
  are generated. This is useful in diagnosing elaboration circularities
  caused by these implicit pragmas when using the static elaboration
  model. See See the section in this guide on elaboration checking for
  further details. These messages are not generated by default, and are
  intended only for temporary use when debugging circularity problems.


.. index:: -gnatel  (gcc)

:switch:`-gnateL`
  This switch turns off the info messages about implicit elaboration pragmas.


.. index:: -gnatem  (gcc)

:switch:`-gnatem={path}`
  Specify a mapping file
  (the equal sign is optional)
  (:ref:`Units_to_Sources_Mapping_Files`).


.. index:: -gnatep  (gcc)

:switch:`-gnatep={file}`
  Specify a preprocessing data file
  (the equal sign is optional)
  (:ref:`Integrated_Preprocessing`).


.. index:: -gnateP  (gcc)

:switch:`-gnateP`
  Turn categorization dependency errors into warnings.
  Ada requires that units that WITH one another have compatible categories, for
  example a Pure unit cannot WITH a Preelaborate unit. If this switch is used,
  these errors become warnings (which can be ignored, or suppressed in the usual
  manner). This can be useful in some specialized circumstances such as the
  temporary use of special test software.


.. index:: -gnateS  (gcc)

:switch:`-gnateS`
  Synonym of :switch:`-fdump-scos`, kept for backwards compatibility.


.. index:: -gnatet=file  (gcc)

:switch:`-gnatet={path}`
  Generate target dependent information. The format of the output file is
  described in the section about switch :switch:`-gnateT`.


.. index:: -gnateT  (gcc)

:switch:`-gnateT={path}`
  Read target dependent information, such as endianness or sizes and alignments
  of base type. If this switch is passed, the default target dependent
  information of the compiler is replaced by the one read from the input file.
  This is used by tools other than the compiler, e.g. to do
  semantic analysis of programs that will run on some other target than
  the machine on which the tool is run.

  The following target dependent values should be defined,
  where ``Nat`` denotes a natural integer value, ``Pos`` denotes a
  positive integer value, and fields marked with a question mark are
  boolean fields, where a value of 0 is False, and a value of 1 is True:


  ::

    Bits_BE                    : Nat; -- Bits stored big-endian?
    Bits_Per_Unit              : Pos; -- Bits in a storage unit
    Bits_Per_Word              : Pos; -- Bits in a word
    Bytes_BE                   : Nat; -- Bytes stored big-endian?
    Char_Size                  : Pos; -- Standard.Character'Size
    Double_Float_Alignment     : Nat; -- Alignment of double float
    Double_Scalar_Alignment    : Nat; -- Alignment of double length scalar
    Double_Size                : Pos; -- Standard.Long_Float'Size
    Float_Size                 : Pos; -- Standard.Float'Size
    Float_Words_BE             : Nat; -- Float words stored big-endian?
    Int_Size                   : Pos; -- Standard.Integer'Size
    Long_Double_Size           : Pos; -- Standard.Long_Long_Float'Size
    Long_Long_Size             : Pos; -- Standard.Long_Long_Integer'Size
    Long_Size                  : Pos; -- Standard.Long_Integer'Size
    Maximum_Alignment          : Pos; -- Maximum permitted alignment
    Max_Unaligned_Field        : Pos; -- Maximum size for unaligned bit field
    Pointer_Size               : Pos; -- System.Address'Size
    Short_Enums                : Nat; -- Foreign enums use short size?
    Short_Size                 : Pos; -- Standard.Short_Integer'Size
    Strict_Alignment           : Nat; -- Strict alignment?
    System_Allocator_Alignment : Nat; -- Alignment for malloc calls
    Wchar_T_Size               : Pos; -- Interfaces.C.wchar_t'Size
    Words_BE                   : Nat; -- Words stored big-endian?

  ``Bits_Per_Unit`` is the number of bits in a storage unit, the equivalent of
  GCC macro ``BITS_PER_UNIT`` documented as follows: `Define this macro to be
  the number of bits in an addressable storage unit (byte); normally 8.`

  ``Bits_Per_Word`` is the number of bits in a machine word, the equivalent of
  GCC macro ``BITS_PER_WORD`` documented as follows: `Number of bits in a word;
  normally 32.`

  ``Double_Float_Alignment``, if not zero, is the maximum alignment that the
  compiler can choose by default for a 64-bit floating-point type or object.

  ``Double_Scalar_Alignment``, if not zero, is the maximum alignment that the
  compiler can choose by default for a 64-bit or larger scalar type or object.

  ``Maximum_Alignment`` is the maximum alignment that the compiler can choose
  by default for a type or object, which is also the maximum alignment that can
  be specified in GNAT. It is computed for GCC backends as ``BIGGEST_ALIGNMENT
  / BITS_PER_UNIT`` where GCC macro ``BIGGEST_ALIGNMENT`` is documented as
  follows: `Biggest alignment that any data type can require on this machine,
  in bits.`

  ``Max_Unaligned_Field`` is the maximum size for unaligned bit field, which is
  64 for the majority of GCC targets (but can be different on some targets).

  ``Strict_Alignment`` is the equivalent of GCC macro ``STRICT_ALIGNMENT``
  documented as follows: `Define this macro to be the value 1 if instructions
  will fail to work if given data not on the nominal alignment. If instructions
  will merely go slower in that case, define this macro as 0.`

  ``System_Allocator_Alignment`` is the guaranteed alignment of data returned
  by calls to ``malloc``.


  The format of the input file is as follows. First come the values of
  the variables defined above, with one line per value:


  ::

    name  value

  where ``name`` is the name of the parameter, spelled out in full,
  and cased as in the above list, and ``value`` is an unsigned decimal
  integer. Two or more blanks separates the name from the value.

  All the variables must be present, in alphabetical order (i.e. the
  same order as the list above).

  Then there is a blank line to separate the two parts of the file. Then
  come the lines showing the floating-point types to be registered, with
  one line per registered mode:


  ::

    name  digs float_rep size alignment


  where ``name`` is the string name of the type (which can have
  single spaces embedded in the name (e.g. long double), ``digs`` is
  the number of digits for the floating-point type, ``float_rep`` is
  the float representation (I for IEEE-754-Binary, which is
  the only one supported at this time),
  ``size`` is the size in bits, ``alignment`` is the
  alignment in bits. The name is followed by at least two blanks, fields
  are separated by at least one blank, and a LF character immediately
  follows the alignment field.

  Here is an example of a target parameterization file:


  ::

    Bits_BE                       0
    Bits_Per_Unit                 8
    Bits_Per_Word                64
    Bytes_BE                      0
    Char_Size                     8
    Double_Float_Alignment        0
    Double_Scalar_Alignment       0
    Double_Size                  64
    Float_Size                   32
    Float_Words_BE                0
    Int_Size                     64
    Long_Double_Size            128
    Long_Long_Size               64
    Long_Size                    64
    Maximum_Alignment            16
    Max_Unaligned_Field          64
    Pointer_Size                 64
    Short_Size                   16
    Strict_Alignment              0
    System_Allocator_Alignment   16
    Wchar_T_Size                 32
    Words_BE                      0

    float         15  I  64  64
    double        15  I  64  64
    long double   18  I  80 128
    TF            33  I 128 128



.. index:: -gnateu  (gcc)

:switch:`-gnateu`
  Ignore unrecognized validity, warning, and style switches that
  appear after this switch is given. This may be useful when
  compiling sources developed on a later version of the compiler
  with an earlier version. Of course the earlier version must
  support this switch.


.. index:: -gnateV  (gcc)

:switch:`-gnateV`
  Check that all actual parameters of a subprogram call are valid according to
  the rules of validity checking (:ref:`Validity_Checking`).


.. index:: -gnateY  (gcc)

:switch:`-gnateY`
  Ignore all STYLE_CHECKS pragmas. Full legality checks
  are still carried out, but the pragmas have no effect
  on what style checks are active. This allows all style
  checking options to be controlled from the command line.


.. index:: -gnatE  (gcc)

:switch:`-gnatE`
  Dynamic elaboration checking mode enabled. For further details see
  :ref:`Elaboration_Order_Handling_in_GNAT`.


.. index:: -gnatf  (gcc)

:switch:`-gnatf`
  Full errors. Multiple errors per line, all undefined references, do not
  attempt to suppress cascaded errors.


.. index:: -gnatF  (gcc)

:switch:`-gnatF`
  Externals names are folded to all uppercase.


.. index:: -gnatg  (gcc)

:switch:`-gnatg`
  Internal GNAT implementation mode. This should not be used for applications
  programs, it is intended only for use by the compiler and its run-time
  library. For documentation, see the GNAT sources. Note that :switch:`-gnatg`
  implies :switch:`-gnatw.ge` and :switch:`-gnatyg` so that all standard
  warnings and all standard style options are turned on. All warnings and style
  messages are treated as errors.


.. index:: -gnatG[nn]  (gcc)

:switch:`-gnatG=nn`
  List generated expanded code in source form.


.. index:: -gnath  (gcc)

:switch:`-gnath`
  Output usage information. The output is written to :file:`stdout`.


.. index:: -gnatH  (gcc)

:switch:`-gnatH`
  Legacy elaboration-checking mode enabled. When this switch is in effect,
  the pre-18.x access-before-elaboration model becomes the de facto model.
  For further details see :ref:`Elaboration_Order_Handling_in_GNAT`.


.. index:: -gnati  (gcc)

:switch:`-gnati{c}`
  Identifier character set (``c`` = 1/2/3/4/5/9/p/8/f/n/w).
  For details of the possible selections for ``c``,
  see :ref:`Character_Set_Control`.


.. index:: -gnatI  (gcc)

:switch:`-gnatI`
  Ignore representation clauses. When this switch is used,
  representation clauses are treated as comments. This is useful
  when initially porting code where you want to ignore rep clause
  problems, and also for compiling foreign code (particularly
  for use with ASIS). The representation clauses that are ignored
  are: enumeration_representation_clause, record_representation_clause,
  and attribute_definition_clause for the following attributes:
  Address, Alignment, Bit_Order, Component_Size, Machine_Radix,
  Object_Size, Scalar_Storage_Order, Size, Small, Stream_Size,
  and Value_Size. Pragma Default_Scalar_Storage_Order is also ignored.
  Note that this option should be used only for compiling -- the
  code is likely to malfunction at run time.


.. index:: -gnatjnn  (gcc)

:switch:`-gnatj{nn}`
  Reformat error messages to fit on ``nn`` character lines


.. index:: -gnatJ  (gcc)

:switch:`-gnatJ`
  Permissive elaboration-checking mode enabled. When this switch is in effect,
  the post-18.x access-before-elaboration model ignores potential issues with:

  - Accept statements
  - Activations of tasks defined in instances
  - Assertion pragmas
  - Calls from within an instance to its enclosing context
  - Calls through generic formal parameters
  - Calls to subprograms defined in instances
  - Entry calls
  - Indirect calls using 'Access
  - Requeue statements
  - Select statements
  - Synchronous task suspension

  and does not emit compile-time diagnostics or run-time checks. For further
  details see :ref:`Elaboration_Order_Handling_in_GNAT`.


.. index:: -gnatk  (gcc)

:switch:`-gnatk={n}`
  Limit file names to ``n`` (1-999) characters (``k`` = krunch).


.. index:: -gnatl  (gcc)

:switch:`-gnatl`
  Output full source listing with embedded error messages.


.. index:: -gnatL  (gcc)

:switch:`-gnatL`
  Used in conjunction with -gnatG or -gnatD to intersperse original
  source lines (as comment lines with line numbers) in the expanded
  source output.


.. index:: -gnatm  (gcc)

:switch:`-gnatm={n}`
  Limit number of detected error or warning messages to ``n``
  where ``n`` is in the range 1..999999. The default setting if
  no switch is given is 9999. If the number of warnings reaches this
  limit, then a message is output and further warnings are suppressed,
  but the compilation is continued. If the number of error messages
  reaches this limit, then a message is output and the compilation
  is abandoned. The equal sign here is optional. A value of zero
  means that no limit applies.


.. index:: -gnatn  (gcc)

:switch:`-gnatn[12]`
  Activate inlining across units for subprograms for which pragma ``Inline``
  is specified. This inlining is performed by the GCC back-end. An optional
  digit sets the inlining level: 1 for moderate inlining across units
  or 2 for full inlining across units. If no inlining level is specified,
  the compiler will pick it based on the optimization level.


.. index:: -gnatN  (gcc)

:switch:`-gnatN`
  Activate front end inlining for subprograms for which
  pragma ``Inline`` is specified. This inlining is performed
  by the front end and will be visible in the
  :switch:`-gnatG` output.

  When using a gcc-based back end, then the use of
  :switch:`-gnatN` is deprecated, and the use of :switch:`-gnatn` is preferred.
  Historically front end inlining was more extensive than the gcc back end
  inlining, but that is no longer the case.


.. index:: -gnato0  (gcc)

:switch:`-gnato0`
  Suppresses overflow checking. This causes the behavior of the compiler to
  match the default for older versions where overflow checking was suppressed
  by default. This is equivalent to having
  ``pragma Suppress (Overflow_Check)`` in a configuration pragma file.


.. index:: -gnato??  (gcc)

:switch:`-gnato??`
  Set default mode for handling generation of code to avoid intermediate
  arithmetic overflow. Here ``??`` is two digits, a
  single digit, or nothing. Each digit is one of the digits ``1``
  through ``3``:

  ===== ===============================================================
  Digit Interpretation
  ----- ---------------------------------------------------------------
  *1*   All intermediate overflows checked against base type (``STRICT``)
  *2*   Minimize intermediate overflows (``MINIMIZED``)
  *3*   Eliminate intermediate overflows (``ELIMINATED``)
  ===== ===============================================================

  If only one digit appears, then it applies to all
  cases; if two digits are given, then the first applies outside
  assertions, pre/postconditions, and type invariants, and the second
  applies within assertions, pre/postconditions, and type invariants.

  If no digits follow the :switch:`-gnato`, then it is equivalent to
  :switch:`-gnato11`,
  causing all intermediate overflows to be handled in strict
  mode.

  This switch also causes arithmetic overflow checking to be performed
  (as though ``pragma Unsuppress (Overflow_Check)`` had been specified).

  The default if no option :switch:`-gnato` is given is that overflow handling
  is in ``STRICT`` mode (computations done using the base type), and that
  overflow checking is enabled.

  Note that division by zero is a separate check that is not
  controlled by this switch (divide-by-zero checking is on by default).

  See also :ref:`Specifying_the_Desired_Mode`.


.. index:: -gnatp  (gcc)

:switch:`-gnatp`
  Suppress all checks. See :ref:`Run-Time_Checks` for details. This switch
  has no effect if cancelled by a subsequent :switch:`-gnat-p` switch.


.. index:: -gnat-p  (gcc)

:switch:`-gnat-p`
  Cancel effect of previous :switch:`-gnatp` switch.


.. index:: -gnatq  (gcc)

:switch:`-gnatq`
  Don't quit. Try semantics, even if parse errors.


.. index:: -gnatQ  (gcc)

:switch:`-gnatQ`
  Don't quit. Generate :file:`ALI` and tree files even if illegalities.
  Note that code generation is still suppressed in the presence of any
  errors, so even with :switch:`-gnatQ` no object file is generated.


.. index:: -gnatr  (gcc)

:switch:`-gnatr`
  Treat pragma Restrictions as Restriction_Warnings.


.. index:: -gnatR  (gcc)

:switch:`-gnatR[0|1|2|3|4][e][j][m][s]`
  Output representation information for declared types, objects and
  subprograms. Note that this switch is not allowed if a previous
  :switch:`-gnatD` switch has been given, since these two switches
  are not compatible.


.. index:: -gnats  (gcc)

:switch:`-gnats`
  Syntax check only.


.. index:: -gnatS  (gcc)

:switch:`-gnatS`
  Print package Standard.


.. index:: -gnatT  (gcc)

:switch:`-gnatT{nnn}`
  All compiler tables start at ``nnn`` times usual starting size.


.. index:: -gnatu  (gcc)

:switch:`-gnatu`
  List units for this compilation.


.. index:: -gnatU  (gcc)

:switch:`-gnatU`
  Tag all error messages with the unique string 'error:'


.. index:: -gnatv  (gcc)

:switch:`-gnatv`
  Verbose mode. Full error output with source lines to :file:`stdout`.


.. index:: -gnatV  (gcc)

:switch:`-gnatV`
  Control level of validity checking (:ref:`Validity_Checking`).


.. index:: -gnatw  (gcc)

:switch:`-gnatw{xxx}`
  Warning mode where
  ``xxx`` is a string of option letters that denotes
  the exact warnings that
  are enabled or disabled (:ref:`Warning_Message_Control`).


.. index:: -gnatW  (gcc)

:switch:`-gnatW{e}`
  Wide character encoding method
  (``e``\ =n/h/u/s/e/8).


.. index:: -gnatx  (gcc)

:switch:`-gnatx`
  Suppress generation of cross-reference information.


.. index:: -gnatX  (gcc)

:switch:`-gnatX`
  Enable GNAT implementation extensions and latest Ada version.


.. index:: -gnaty  (gcc)

:switch:`-gnaty`
  Enable built-in style checks (:ref:`Style_Checking`).


.. index:: -gnatz  (gcc)

:switch:`-gnatz{m}`
  Distribution stub generation and compilation
  (``m``\ =r/c for receiver/caller stubs).


.. index:: -I  (gcc)

:switch:`-I{dir}`
  .. index:: RTL

  Direct GNAT to search the ``dir`` directory for source files needed by
  the current compilation
  (see :ref:`Search_Paths_and_the_Run-Time_Library_RTL`).


.. index:: -I-  (gcc)

:switch:`-I-`
  .. index:: RTL

  Except for the source file named in the command line, do not look for source
  files in the directory containing the source file named in the command line
  (see :ref:`Search_Paths_and_the_Run-Time_Library_RTL`).


.. index:: -o  (gcc)

:switch:`-o {file}`
  This switch is used in ``gcc`` to redirect the generated object file
  and its associated ALI file. Beware of this switch with GNAT, because it may
  cause the object file and ALI file to have different names which in turn
  may confuse the binder and the linker.


.. index:: -nostdinc  (gcc)

:switch:`-nostdinc`
  Inhibit the search of the default location for the GNAT Run Time
  Library (RTL) source files.


.. index:: -nostdlib  (gcc)

:switch:`-nostdlib`
  Inhibit the search of the default location for the GNAT Run Time
  Library (RTL) ALI files.


.. index:: -O  (gcc)

:switch:`-O[{n}]`
  ``n`` controls the optimization level:

  ======= ==================================================================
   *n*     Effect
  ------- ------------------------------------------------------------------
  *0*      No optimization, the default setting if no :switch:`-O` appears
  *1*      Normal optimization, the default if you specify :switch:`-O` without an
           operand. A good compromise between code quality and compilation
           time.
  *2*      Extensive optimization, may improve execution time, possibly at
           the cost of substantially increased compilation time.
  *3*      Same as :switch:`-O2`, and also includes inline expansion for small
           subprograms in the same unit.
  *s*      Optimize space usage
  ======= ==================================================================

  See also :ref:`Optimization_Levels`.


.. index:: -pass-exit-codes  (gcc)

:switch:`-pass-exit-codes`
  Catch exit codes from the compiler and use the most meaningful as
  exit status.


.. index:: --RTS  (gcc)

:switch:`--RTS={rts-path}`
  Specifies the default location of the run-time library. Same meaning as the
  equivalent ``gnatmake`` flag (:ref:`Switches_for_gnatmake`).


.. index:: -S  (gcc)

:switch:`-S`
  Used in place of :switch:`-c` to
  cause the assembler source file to be
  generated, using :file:`.s` as the extension,
  instead of the object file.
  This may be useful if you need to examine the generated assembly code.


.. index:: -fverbose-asm  (gcc)

:switch:`-fverbose-asm`
  Used in conjunction with :switch:`-S`
  to cause the generated assembly code file to be annotated with variable
  names, making it significantly easier to follow.


.. index:: -v  (gcc)

:switch:`-v`
  Show commands generated by the ``gcc`` driver. Normally used only for
  debugging purposes or if you need to be sure what version of the
  compiler you are executing.


.. index:: -V  (gcc)

:switch:`-V {ver}`
  Execute ``ver`` version of the compiler. This is the ``gcc``
  version, not the GNAT version.


.. index:: -w  (gcc)

:switch:`-w`
  Turn off warnings generated by the back end of the compiler. Use of
  this switch also causes the default for front end warnings to be set
  to suppress (as though :switch:`-gnatws` had appeared at the start of
  the options).


.. index:: Combining GNAT switches

You may combine a sequence of GNAT switches into a single switch. For
example, the combined switch

  ::

    -gnatofi3

is equivalent to specifying the following sequence of switches:

  ::

    -gnato -gnatf -gnati3

The following restrictions apply to the combination of switches
in this manner:

* The switch :switch:`-gnatc` if combined with other switches must come
  first in the string.

* The switch :switch:`-gnats` if combined with other switches must come
  first in the string.

* The switches
  :switch:`-gnatzc` and :switch:`-gnatzr` may not be combined with any other
  switches, and only one of them may appear in the command line.

* The switch :switch:`-gnat-p` may not be combined with any other switch.

* Once a 'y' appears in the string (that is a use of the :switch:`-gnaty`
  switch), then all further characters in the switch are interpreted
  as style modifiers (see description of :switch:`-gnaty`).

* Once a 'd' appears in the string (that is a use of the :switch:`-gnatd`
  switch), then all further characters in the switch are interpreted
  as debug flags (see description of :switch:`-gnatd`).

* Once a 'w' appears in the string (that is a use of the :switch:`-gnatw`
  switch), then all further characters in the switch are interpreted
  as warning mode modifiers (see description of :switch:`-gnatw`).

* Once a 'V' appears in the string (that is a use of the :switch:`-gnatV`
  switch), then all further characters in the switch are interpreted
  as validity checking options (:ref:`Validity_Checking`).

* Option 'em', 'ec', 'ep', 'l=' and 'R' must be the last options in
  a combined list of options.

.. _Output_and_Error_Message_Control:

Output and Error Message Control
--------------------------------

.. index:: stderr

The standard default format for error messages is called 'brief format'.
Brief format messages are written to :file:`stderr` (the standard error
file) and have the following form:

::

  e.adb:3:04: Incorrect spelling of keyword "function"
  e.adb:4:20: ";" should be "is"

The first integer after the file name is the line number in the file,
and the second integer is the column number within the line.
``GNAT Studio`` can parse the error messages
and point to the referenced character.
The following switches provide control over the error message
format:


.. index:: -gnatv  (gcc)

:switch:`-gnatv`
  The ``v`` stands for verbose.
  The effect of this setting is to write long-format error
  messages to :file:`stdout` (the standard output file.
  The same program compiled with the
  :switch:`-gnatv` switch would generate:

  ::

    3. funcion X (Q : Integer)
       |
    >>> Incorrect spelling of keyword "function"
    4. return Integer;
                     |
    >>> ";" should be "is"


  The vertical bar indicates the location of the error, and the ``>>>``
  prefix can be used to search for error messages. When this switch is
  used the only source lines output are those with errors.


.. index:: -gnatl  (gcc)

:switch:`-gnatl`
  The ``l`` stands for list.
  This switch causes a full listing of
  the file to be generated. In the case where a body is
  compiled, the corresponding spec is also listed, along
  with any subunits. Typical output from compiling a package
  body :file:`p.adb` might look like::

    Compiling: p.adb

         1. package body p is
         2.    procedure a;
         3.    procedure a is separate;
         4. begin
         5.    null
                   |
            >>> missing ";"

         6. end;

    Compiling: p.ads

         1. package p is
         2.    pragma Elaborate_Body
                                    |
            >>> missing ";"

         3. end p;

    Compiling: p-a.adb

         1. separate p
                    |
            >>> missing "("

         2. procedure a is
         3. begin
         4.    null
                   |
            >>> missing ";"

         5. end;


  When you specify the :switch:`-gnatv` or :switch:`-gnatl` switches and
  standard output is redirected, a brief summary is written to
  :file:`stderr` (standard error) giving the number of error messages and
  warning messages generated.


.. index:: -gnatl=fname  (gcc)

:switch:`-gnatl={fname}`
  This has the same effect as :switch:`-gnatl` except that the output is
  written to a file instead of to standard output. If the given name
  :file:`fname` does not start with a period, then it is the full name
  of the file to be written. If :file:`fname` is an extension, it is
  appended to the name of the file being compiled. For example, if
  file :file:`xyz.adb` is compiled with :switch:`-gnatl=.lst`,
  then the output is written to file xyz.adb.lst.


.. index:: -gnatU  (gcc)

:switch:`-gnatU`
  This switch forces all error messages to be preceded by the unique
  string 'error:'. This means that error messages take a few more
  characters in space, but allows easy searching for and identification
  of error messages.


.. index:: -gnatb  (gcc)

:switch:`-gnatb`
  The ``b`` stands for brief.
  This switch causes GNAT to generate the
  brief format error messages to :file:`stderr` (the standard error
  file) as well as the verbose
  format message or full listing (which as usual is written to
  :file:`stdout` (the standard output file).


.. index:: -gnatm  (gcc)

:switch:`-gnatm={n}`
  The ``m`` stands for maximum.
  ``n`` is a decimal integer in the
  range of 1 to 999999 and limits the number of error or warning
  messages to be generated. For example, using
  :switch:`-gnatm2` might yield

  ::

    e.adb:3:04: Incorrect spelling of keyword "function"
    e.adb:5:35: missing ".."
    fatal error: maximum number of errors detected
    compilation abandoned


  The default setting if
  no switch is given is 9999. If the number of warnings reaches this
  limit, then a message is output and further warnings are suppressed,
  but the compilation is continued. If the number of error messages
  reaches this limit, then a message is output and the compilation
  is abandoned. A value of zero means that no limit applies.

  Note that the equal sign is optional, so the switches
  :switch:`-gnatm2` and :switch:`-gnatm=2` are equivalent.


.. index:: -gnatf  (gcc)

:switch:`-gnatf`
  .. index:: Error messages, suppressing

  The ``f`` stands for full.
  Normally, the compiler suppresses error messages that are likely to be
  redundant. This switch causes all error
  messages to be generated. In particular, in the case of
  references to undefined variables. If a given variable is referenced
  several times, the normal format of messages is

  ::

    e.adb:7:07: "V" is undefined (more references follow)

  where the parenthetical comment warns that there are additional
  references to the variable ``V``. Compiling the same program with the
  :switch:`-gnatf` switch yields

  ::

    e.adb:7:07: "V" is undefined
    e.adb:8:07: "V" is undefined
    e.adb:8:12: "V" is undefined
    e.adb:8:16: "V" is undefined
    e.adb:9:07: "V" is undefined
    e.adb:9:12: "V" is undefined

  The :switch:`-gnatf` switch also generates additional information for
  some error messages.  Some examples are:

  * Details on possibly non-portable unchecked conversion

  * List possible interpretations for ambiguous calls

  * Additional details on incorrect parameters


.. index:: -gnatjnn  (gcc)

:switch:`-gnatjnn`
  In normal operation mode (or if :switch:`-gnatj0` is used), then error messages
  with continuation lines are treated as though the continuation lines were
  separate messages (and so a warning with two continuation lines counts as
  three warnings, and is listed as three separate messages).

  If the :switch:`-gnatjnn` switch is used with a positive value for nn, then
  messages are output in a different manner. A message and all its continuation
  lines are treated as a unit, and count as only one warning or message in the
  statistics totals. Furthermore, the message is reformatted so that no line
  is longer than nn characters.


.. index:: -gnatq  (gcc)

:switch:`-gnatq`
  The ``q`` stands for quit (really 'don't quit').
  In normal operation mode, the compiler first parses the program and
  determines if there are any syntax errors. If there are, appropriate
  error messages are generated and compilation is immediately terminated.
  This switch tells
  GNAT to continue with semantic analysis even if syntax errors have been
  found. This may enable the detection of more errors in a single run. On
  the other hand, the semantic analyzer is more likely to encounter some
  internal fatal error when given a syntactically invalid tree.


.. index:: -gnatQ  (gcc)

:switch:`-gnatQ`
  In normal operation mode, the :file:`ALI` file is not generated if any
  illegalities are detected in the program. The use of :switch:`-gnatQ` forces
  generation of the :file:`ALI` file. This file is marked as being in
  error, so it cannot be used for binding purposes, but it does contain
  reasonably complete cross-reference information, and thus may be useful
  for use by tools (e.g., semantic browsing tools or integrated development
  environments) that are driven from the :file:`ALI` file. This switch
  implies :switch:`-gnatq`, since the semantic phase must be run to get a
  meaningful ALI file.

  When :switch:`-gnatQ` is used and the generated :file:`ALI` file is marked as
  being in error, ``gnatmake`` will attempt to recompile the source when it
  finds such an :file:`ALI` file, including with switch :switch:`-gnatc`.

  Note that :switch:`-gnatQ` has no effect if :switch:`-gnats` is specified,
  since ALI files are never generated if :switch:`-gnats` is set.


.. _Warning_Message_Control:

Warning Message Control
-----------------------

.. index:: Warning messages

In addition to error messages, which correspond to illegalities as defined
in the Ada Reference Manual, the compiler detects two kinds of warning
situations.

First, the compiler considers some constructs suspicious and generates a
warning message to alert you to a possible error. Second, if the
compiler detects a situation that is sure to raise an exception at
run time, it generates a warning message. The following shows an example
of warning messages:

::

  e.adb:4:24: warning: creation of object may raise Storage_Error
  e.adb:10:17: warning: static value out of range
  e.adb:10:17: warning: "Constraint_Error" will be raised at run time


GNAT considers a large number of situations as appropriate
for the generation of warning messages. As always, warnings are not
definite indications of errors. For example, if you do an out-of-range
assignment with the deliberate intention of raising a
``Constraint_Error`` exception, then the warning that may be
issued does not indicate an error. Some of the situations for which GNAT
issues warnings (at least some of the time) are given in the following
list. This list is not complete, and new warnings are often added to
subsequent versions of GNAT. The list is intended to give a general idea
of the kinds of warnings that are generated.

* Possible infinitely recursive calls

* Out-of-range values being assigned

* Possible order of elaboration problems

* Size not a multiple of alignment for a record type

* Assertions (pragma Assert) that are sure to fail

* Unreachable code

* Address clauses with possibly unaligned values, or where an attempt is
  made to overlay a smaller variable with a larger one.

* Fixed-point type declarations with a null range

* Direct_IO or Sequential_IO instantiated with a type that has access values

* Variables that are never assigned a value

* Variables that are referenced before being initialized

* Task entries with no corresponding ``accept`` statement

* Duplicate accepts for the same task entry in a ``select``

* Objects that take too much storage

* Unchecked conversion between types of differing sizes

* Missing ``return`` statement along some execution path in a function

* Incorrect (unrecognized) pragmas

* Incorrect external names

* Allocation from empty storage pool

* Potentially blocking operation in protected type

* Suspicious parenthesization of expressions

* Mismatching bounds in an aggregate

* Attempt to return local value by reference

* Premature instantiation of a generic body

* Attempt to pack aliased components

* Out of bounds array subscripts

* Wrong length on string assignment

* Violations of style rules if style checking is enabled

* Unused |with| clauses

* ``Bit_Order`` usage that does not have any effect

* ``Standard.Duration`` used to resolve universal fixed expression

* Dereference of possibly null value

* Declaration that is likely to cause storage error

* Internal GNAT unit |withed| by application unit

* Values known to be out of range at compile time

* Unreferenced or unmodified variables. Note that a special
  exemption applies to variables which contain any of the substrings
  ``DISCARD, DUMMY, IGNORE, JUNK, UNUSED``, in any casing. Such variables
  are considered likely to be intentionally used in a situation where
  otherwise a warning would be given, so warnings of this kind are
  always suppressed for such variables.

* Address overlays that could clobber memory

* Unexpected initialization when address clause present

* Bad alignment for address clause

* Useless type conversions

* Redundant assignment statements and other redundant constructs

* Useless exception handlers

* Accidental hiding of name by child unit

* Access before elaboration detected at compile time

* A range in a ``for`` loop that is known to be null or might be null


The following section lists compiler switches that are available
to control the handling of warning messages. It is also possible
to exercise much finer control over what warnings are issued and
suppressed using the GNAT pragma Warnings (see the description
of the pragma in the :title:`GNAT_Reference_manual`).


.. index:: -gnatwa  (gcc)

:switch:`-gnatwa`
  *Activate most optional warnings.*

  This switch activates most optional warning messages. See the remaining list
  in this section for details on optional warning messages that can be
  individually controlled.  The warnings that are not turned on by this
  switch are:


  * :switch:`-gnatwd` (implicit dereferencing)

  * :switch:`-gnatw.d` (tag warnings with -gnatw switch)

  * :switch:`-gnatwh` (hiding)

  * :switch:`-gnatw.h` (holes in record layouts)

  * :switch:`-gnatw.j` (late primitives of tagged types)

  * :switch:`-gnatw.k` (redefinition of names in standard)

  * :switch:`-gnatwl` (elaboration warnings)

  * :switch:`-gnatw.l` (inherited aspects)

  * :switch:`-gnatw.n` (atomic synchronization)

  * :switch:`-gnatwo` (address clause overlay)

  * :switch:`-gnatw.o` (values set by out parameters ignored)

  * :switch:`-gnatw.q` (questionable layout of record types)

  * :switch:`-gnatw_r` (out-of-order record representation clauses)

  * :switch:`-gnatw.s` (overridden size clause)

  * :switch:`-gnatwt` (tracking of deleted conditional code)

  * :switch:`-gnatw.u` (unordered enumeration)

  * :switch:`-gnatw.w` (use of Warnings Off)

  * :switch:`-gnatw.y` (reasons for package needing body)

  All other optional warnings are turned on.


.. index:: -gnatwA  (gcc)

:switch:`-gnatwA`
  *Suppress all optional errors.*

  This switch suppresses all optional warning messages, see remaining list
  in this section for details on optional warning messages that can be
  individually controlled. Note that unlike switch :switch:`-gnatws`, the
  use of switch :switch:`-gnatwA` does not suppress warnings that are
  normally given unconditionally and cannot be individually controlled
  (for example, the warning about a missing exit path in a function).
  Also, again unlike switch :switch:`-gnatws`, warnings suppressed by
  the use of switch :switch:`-gnatwA` can be individually turned back
  on. For example the use of switch :switch:`-gnatwA` followed by
  switch :switch:`-gnatwd` will suppress all optional warnings except
  the warnings for implicit dereferencing.

.. index:: -gnatw.a  (gcc)

:switch:`-gnatw.a`
  *Activate warnings on failing assertions.*

  .. index:: Assert failures

  This switch activates warnings for assertions where the compiler can tell at
  compile time that the assertion will fail. Note that this warning is given
  even if assertions are disabled. The default is that such warnings are
  generated.


.. index:: -gnatw.A  (gcc)

:switch:`-gnatw.A`
  *Suppress warnings on failing assertions.*

  .. index:: Assert failures

  This switch suppresses warnings for assertions where the compiler can tell at
  compile time that the assertion will fail.


.. index:: -gnatw_a

:switch:`-gnatw_a`
  *Activate warnings on anonymous allocators.*

  .. index:: Anonymous allocators

  This switch activates warnings for allocators of anonymous access types,
  which can involve run-time accessibility checks and lead to unexpected
  accessibility violations. For more details on the rules involved, see
  RM 3.10.2 (14).


.. index:: -gnatw_A

:switch:`-gnatw_A`
  *Supress warnings on anonymous allocators.*

  .. index:: Anonymous allocators

  This switch suppresses warnings for anonymous access type allocators.


.. index:: -gnatwb  (gcc)

:switch:`-gnatwb`
  *Activate warnings on bad fixed values.*

  .. index:: Bad fixed values

  .. index:: Fixed-point Small value

  .. index:: Small value

  This switch activates warnings for static fixed-point expressions whose
  value is not an exact multiple of Small. Such values are implementation
  dependent, since an implementation is free to choose either of the multiples
  that surround the value. GNAT always chooses the closer one, but this is not
  required behavior, and it is better to specify a value that is an exact
  multiple, ensuring predictable execution. The default is that such warnings
  are not generated.


.. index:: -gnatwB  (gcc)

:switch:`-gnatwB`
  *Suppress warnings on bad fixed values.*

  This switch suppresses warnings for static fixed-point expressions whose
  value is not an exact multiple of Small.


.. index:: -gnatw.b  (gcc)

:switch:`-gnatw.b`
  *Activate warnings on biased representation.*

  .. index:: Biased representation

  This switch activates warnings when a size clause, value size clause, component
  clause, or component size clause forces the use of biased representation for an
  integer type (e.g. representing a range of 10..11 in a single bit by using 0/1
  to represent 10/11). The default is that such warnings are generated.


.. index:: -gnatwB  (gcc)

:switch:`-gnatw.B`
  *Suppress warnings on biased representation.*

  This switch suppresses warnings for representation clauses that force the use
  of biased representation.


.. index:: -gnatwc  (gcc)

:switch:`-gnatwc`
  *Activate warnings on conditionals.*

  .. index:: Conditionals, constant

  This switch activates warnings for conditional expressions used in
  tests that are known to be True or False at compile time. The default
  is that such warnings are not generated.
  Note that this warning does
  not get issued for the use of boolean variables or constants whose
  values are known at compile time, since this is a standard technique
  for conditional compilation in Ada, and this would generate too many
  false positive warnings.

  This warning option also activates a special test for comparisons using
  the operators '>=' and' <='.
  If the compiler can tell that only the equality condition is possible,
  then it will warn that the '>' or '<' part of the test
  is useless and that the operator could be replaced by '='.
  An example would be comparing a ``Natural`` variable <= 0.

  This warning option also generates warnings if
  one or both tests is optimized away in a membership test for integer
  values if the result can be determined at compile time. Range tests on
  enumeration types are not included, since it is common for such tests
  to include an end point.

  This warning can also be turned on using :switch:`-gnatwa`.


.. index:: -gnatwC  (gcc)

:switch:`-gnatwC`
  *Suppress warnings on conditionals.*

  This switch suppresses warnings for conditional expressions used in
  tests that are known to be True or False at compile time.


.. index:: -gnatw.c  (gcc)

:switch:`-gnatw.c`
  *Activate warnings on missing component clauses.*

  .. index:: Component clause, missing

  This switch activates warnings for record components where a record
  representation clause is present and has component clauses for the
  majority, but not all, of the components. A warning is given for each
  component for which no component clause is present.


.. index:: -gnatw.C  (gcc)

:switch:`-gnatw.C`
  *Suppress warnings on missing component clauses.*

  This switch suppresses warnings for record components that are
  missing a component clause in the situation described above.


.. index:: -gnatw_c  (gcc)

:switch:`-gnatw_c`
  *Activate warnings on unknown condition in Compile_Time_Warning.*

  .. index:: Compile_Time_Warning
  .. index:: Compile_Time_Error

  This switch activates warnings on a pragma Compile_Time_Warning
  or Compile_Time_Error whose condition has a value that is not
  known at compile time.
  The default is that such warnings are generated.


.. index:: -gnatw_C  (gcc)

:switch:`-gnatw_C`
  *Suppress warnings on unknown condition in Compile_Time_Warning.*

  This switch supresses warnings on a pragma Compile_Time_Warning
  or Compile_Time_Error whose condition has a value that is not
  known at compile time.


.. index:: -gnatwd  (gcc)

:switch:`-gnatwd`
  *Activate warnings on implicit dereferencing.*

  If this switch is set, then the use of a prefix of an access type
  in an indexed component, slice, or selected component without an
  explicit ``.all`` will generate a warning. With this warning
  enabled, access checks occur only at points where an explicit
  ``.all`` appears in the source code (assuming no warnings are
  generated as a result of this switch). The default is that such
  warnings are not generated.


.. index:: -gnatwD  (gcc)

:switch:`-gnatwD`
  *Suppress warnings on implicit dereferencing.*

  .. index:: Implicit dereferencing

  .. index:: Dereferencing, implicit

  This switch suppresses warnings for implicit dereferences in
  indexed components, slices, and selected components.


.. index:: -gnatw.d  (gcc)

:switch:`-gnatw.d`
  *Activate tagging of warning and info messages.*

  If this switch is set, then warning messages are tagged, with one of the
  following strings:

    - *[-gnatw?]*
      Used to tag warnings controlled by the switch :switch:`-gnatwx` where x
      is a letter a-z.


    - *[-gnatw.?]*
      Used to tag warnings controlled by the switch :switch:`-gnatw.x` where x
      is a letter a-z.


    - *[-gnatel]*
      Used to tag elaboration information (info) messages generated when the
      static model of elaboration is used and the :switch:`-gnatel` switch is set.


    - *[restriction warning]*
      Used to tag warning messages for restriction violations, activated by use
      of the pragma ``Restriction_Warnings``.


    - *[warning-as-error]*
      Used to tag warning messages that have been converted to error messages by
      use of the pragma Warning_As_Error. Note that such warnings are prefixed by
      the string "error: " rather than "warning: ".


    - *[enabled by default]*
      Used to tag all other warnings that are always given by default, unless
      warnings are completely suppressed using pragma *Warnings(Off)* or
      the switch :switch:`-gnatws`.



.. index:: -gnatw.d  (gcc)

:switch:`-gnatw.D`
  *Deactivate tagging of warning and info messages messages.*

  If this switch is set, then warning messages return to the default
  mode in which warnings and info messages are not tagged as described above for
  :switch:`-gnatw.d`.


.. index:: -gnatwe  (gcc)
.. index:: Warnings, treat as error

:switch:`-gnatwe`
  *Treat warnings and style checks as errors.*

  This switch causes warning messages and style check messages to be
  treated as errors.
  The warning string still appears, but the warning messages are counted
  as errors, and prevent the generation of an object file. Note that this
  is the only -gnatw switch that affects the handling of style check messages.
  Note also that this switch has no effect on info (information) messages, which
  are not treated as errors if this switch is present.


.. index:: -gnatw.e  (gcc)

:switch:`-gnatw.e`
  *Activate every optional warning.*

  .. index:: Warnings, activate every optional warning

  This switch activates all optional warnings, including those which
  are not activated by :switch:`-gnatwa`. The use of this switch is not
  recommended for normal use. If you turn this switch on, it is almost
  certain that you will get large numbers of useless warnings. The
  warnings that are excluded from :switch:`-gnatwa` are typically highly
  specialized warnings that are suitable for use only in code that has
  been specifically designed according to specialized coding rules.


.. index:: -gnatwE  (gcc)
.. index:: Warnings, treat as error

:switch:`-gnatwE`
  *Treat all run-time exception warnings as errors.*

  This switch causes warning messages regarding errors that will be raised
  during run-time execution to be treated as errors.


.. index:: -gnatwf  (gcc)

:switch:`-gnatwf`
  *Activate warnings on unreferenced formals.*

  .. index:: Formals, unreferenced

  This switch causes a warning to be generated if a formal parameter
  is not referenced in the body of the subprogram. This warning can
  also be turned on using :switch:`-gnatwu`. The
  default is that these warnings are not generated.


.. index:: -gnatwF  (gcc)

:switch:`-gnatwF`
  *Suppress warnings on unreferenced formals.*

  This switch suppresses warnings for unreferenced formal
  parameters. Note that the
  combination :switch:`-gnatwu` followed by :switch:`-gnatwF` has the
  effect of warning on unreferenced entities other than subprogram
  formals.


.. index:: -gnatwg  (gcc)

:switch:`-gnatwg`
  *Activate warnings on unrecognized pragmas.*

  .. index:: Pragmas, unrecognized

  This switch causes a warning to be generated if an unrecognized
  pragma is encountered. Apart from issuing this warning, the
  pragma is ignored and has no effect. The default
  is that such warnings are issued (satisfying the Ada Reference
  Manual requirement that such warnings appear).


.. index:: -gnatwG  (gcc)

:switch:`-gnatwG`
  *Suppress warnings on unrecognized pragmas.*

  This switch suppresses warnings for unrecognized pragmas.


.. index:: -gnatw.g  (gcc)

:switch:`-gnatw.g`
  *Warnings used for GNAT sources.*

  This switch sets the warning categories that are used by the standard
  GNAT style. Currently this is equivalent to
  :switch:`-gnatwAao.q.s.CI.V.X.Z`
  but more warnings may be added in the future without advanced notice.


.. index:: -gnatwh  (gcc)

:switch:`-gnatwh`
  *Activate warnings on hiding.*

  .. index:: Hiding of Declarations

  This switch activates warnings on hiding declarations that are considered
  potentially confusing. Not all cases of hiding cause warnings; for example an
  overriding declaration hides an implicit declaration, which is just normal
  code. The default is that warnings on hiding are not generated.


.. index:: -gnatwH  (gcc)

:switch:`-gnatwH`
  *Suppress warnings on hiding.*

  This switch suppresses warnings on hiding declarations.


.. index:: -gnatw.h  (gcc)

:switch:`-gnatw.h`
  *Activate warnings on holes/gaps in records.*

  .. index:: Record Representation (gaps)

  This switch activates warnings on component clauses in record
  representation clauses that leave holes (gaps) in the record layout.
  If this warning option is active, then record representation clauses
  should specify a contiguous layout, adding unused fill fields if needed.


.. index:: -gnatw.H  (gcc)

:switch:`-gnatw.H`
  *Suppress warnings on holes/gaps in records.*

  This switch suppresses warnings on component clauses in record
  representation clauses that leave holes (haps) in the record layout.


.. index:: -gnatwi  (gcc)

:switch:`-gnatwi`
  *Activate warnings on implementation units.*

  This switch activates warnings for a |with| of an internal GNAT
  implementation unit, defined as any unit from the ``Ada``,
  ``Interfaces``, ``GNAT``,
  or ``System``
  hierarchies that is not
  documented in either the Ada Reference Manual or the GNAT
  Programmer's Reference Manual. Such units are intended only
  for internal implementation purposes and should not be |withed|
  by user programs. The default is that such warnings are generated


.. index:: -gnatwI  (gcc)

:switch:`-gnatwI`
  *Disable warnings on implementation units.*

  This switch disables warnings for a |with| of an internal GNAT
  implementation unit.


.. index:: -gnatw.i  (gcc)

:switch:`-gnatw.i`
  *Activate warnings on overlapping actuals.*

  This switch enables a warning on statically detectable overlapping actuals in
  a subprogram call, when one of the actuals is an in-out parameter, and the
  types of the actuals are not by-copy types. This warning is off by default.


.. index:: -gnatw.I  (gcc)

:switch:`-gnatw.I`
  *Disable warnings on overlapping actuals.*

  This switch disables warnings on overlapping actuals in a call.


.. index:: -gnatwj  (gcc)

:switch:`-gnatwj`
  *Activate warnings on obsolescent features (Annex J).*

  .. index:: Features, obsolescent

  .. index:: Obsolescent features

  If this warning option is activated, then warnings are generated for
  calls to subprograms marked with ``pragma Obsolescent`` and
  for use of features in Annex J of the Ada Reference Manual. In the
  case of Annex J, not all features are flagged. In particular use
  of the renamed packages (like ``Text_IO``) and use of package
  ``ASCII`` are not flagged, since these are very common and
  would generate many annoying positive warnings. The default is that
  such warnings are not generated.

  In addition to the above cases, warnings are also generated for
  GNAT features that have been provided in past versions but which
  have been superseded (typically by features in the new Ada standard).
  For example, ``pragma Ravenscar`` will be flagged since its
  function is replaced by ``pragma Profile(Ravenscar)``, and
  ``pragma Interface_Name`` will be flagged since its function
  is replaced by ``pragma Import``.

  Note that this warning option functions differently from the
  restriction ``No_Obsolescent_Features`` in two respects.
  First, the restriction applies only to annex J features.
  Second, the restriction does flag uses of package ``ASCII``.


.. index:: -gnatwJ  (gcc)

:switch:`-gnatwJ`
  *Suppress warnings on obsolescent features (Annex J).*

  This switch disables warnings on use of obsolescent features.


.. index:: -gnatw.j  (gcc)

:switch:`-gnatw.j`
  *Activate warnings on late declarations of tagged type primitives.*

  This switch activates warnings on visible primitives added to a
  tagged type after deriving a private extension from it.


.. index:: -gnatw.J  (gcc)

:switch:`-gnatw.J`
  *Suppress warnings on late declarations of tagged type primitives.*

  This switch suppresses warnings on visible primitives added to a
  tagged type after deriving a private extension from it.


.. index:: -gnatwk  (gcc)

:switch:`-gnatwk`
  *Activate warnings on variables that could be constants.*

  This switch activates warnings for variables that are initialized but
  never modified, and then could be declared constants. The default is that
  such warnings are not given.


.. index:: -gnatwK  (gcc)

:switch:`-gnatwK`
  *Suppress warnings on variables that could be constants.*

  This switch disables warnings on variables that could be declared constants.


.. index:: -gnatw.k  (gcc)

:switch:`-gnatw.k`
  *Activate warnings on redefinition of names in standard.*

  This switch activates warnings for declarations that declare a name that
  is defined in package Standard. Such declarations can be confusing,
  especially since the names in package Standard continue to be directly
  visible, meaning that use visibiliy on such redeclared names does not
  work as expected. Names of discriminants and components in records are
  not included in this check.


.. index:: -gnatwK  (gcc)

:switch:`-gnatw.K`
  *Suppress warnings on redefinition of names in standard.*

  This switch disables warnings for declarations that declare a name that
  is defined in package Standard.


.. index:: -gnatwl  (gcc)

:switch:`-gnatwl`
  *Activate warnings for elaboration pragmas.*

  .. index:: Elaboration, warnings

  This switch activates warnings for possible elaboration problems,
  including suspicious use
  of ``Elaborate`` pragmas, when using the static elaboration model, and
  possible situations that may raise ``Program_Error`` when using the
  dynamic elaboration model.
  See the section in this guide on elaboration checking for further details.
  The default is that such warnings
  are not generated.


.. index:: -gnatwL  (gcc)

:switch:`-gnatwL`
  *Suppress warnings for elaboration pragmas.*

  This switch suppresses warnings for possible elaboration problems.


.. index:: -gnatw.l  (gcc)

:switch:`-gnatw.l`
  *List inherited aspects.*

  This switch causes the compiler to list inherited invariants,
  preconditions, and postconditions from Type_Invariant'Class, Invariant'Class,
  Pre'Class, and Post'Class aspects. Also list inherited subtype predicates.


.. index:: -gnatw.L  (gcc)

:switch:`-gnatw.L`
  *Suppress listing of inherited aspects.*

  This switch suppresses listing of inherited aspects.


.. index:: -gnatwm  (gcc)

:switch:`-gnatwm`
  *Activate warnings on modified but unreferenced variables.*

  This switch activates warnings for variables that are assigned (using
  an initialization value or with one or more assignment statements) but
  whose value is never read. The warning is suppressed for volatile
  variables and also for variables that are renamings of other variables
  or for which an address clause is given.
  The default is that these warnings are not given.


.. index:: -gnatwM  (gcc)

:switch:`-gnatwM`
  *Disable warnings on modified but unreferenced variables.*

  This switch disables warnings for variables that are assigned or
  initialized, but never read.


.. index:: -gnatw.m  (gcc)

:switch:`-gnatw.m`
  *Activate warnings on suspicious modulus values.*

  This switch activates warnings for modulus values that seem suspicious.
  The cases caught are where the size is the same as the modulus (e.g.
  a modulus of 7 with a size of 7 bits), and modulus values of 32 or 64
  with no size clause. The guess in both cases is that 2**x was intended
  rather than x. In addition expressions of the form 2*x for small x
  generate a warning (the almost certainly accurate guess being that
  2**x was intended). This switch also activates warnings for negative
  literal values of a modular type, which are interpreted as large positive
  integers after wrap-around. The default is that these warnings are given.



.. index:: -gnatw.M  (gcc)

:switch:`-gnatw.M`
  *Disable warnings on suspicious modulus values.*

  This switch disables warnings for suspicious modulus values.


.. index:: -gnatwn  (gcc)

:switch:`-gnatwn`
  *Set normal warnings mode.*

  This switch sets normal warning mode, in which enabled warnings are
  issued and treated as warnings rather than errors. This is the default
  mode. the switch :switch:`-gnatwn` can be used to cancel the effect of
  an explicit :switch:`-gnatws` or
  :switch:`-gnatwe`. It also cancels the effect of the
  implicit :switch:`-gnatwe` that is activated by the
  use of :switch:`-gnatg`.


.. index:: -gnatw.n  (gcc)
.. index:: Atomic Synchronization, warnings

:switch:`-gnatw.n`
  *Activate warnings on atomic synchronization.*

  This switch actives warnings when an access to an atomic variable
  requires the generation of atomic synchronization code. These
  warnings are off by default.

.. index:: -gnatw.N  (gcc)

:switch:`-gnatw.N`
  *Suppress warnings on atomic synchronization.*

  .. index:: Atomic Synchronization, warnings

  This switch suppresses warnings when an access to an atomic variable
  requires the generation of atomic synchronization code.


.. index:: -gnatwo  (gcc)
.. index:: Address Clauses, warnings

:switch:`-gnatwo`
  *Activate warnings on address clause overlays.*

  This switch activates warnings for possibly unintended initialization
  effects of defining address clauses that cause one variable to overlap
  another. The default is that such warnings are generated.


.. index:: -gnatwO  (gcc)

:switch:`-gnatwO`
  *Suppress warnings on address clause overlays.*

  This switch suppresses warnings on possibly unintended initialization
  effects of defining address clauses that cause one variable to overlap
  another.


.. index:: -gnatw.o  (gcc)

:switch:`-gnatw.o`
  *Activate warnings on modified but unreferenced out parameters.*

  This switch activates warnings for variables that are modified by using
  them as actuals for a call to a procedure with an out mode formal, where
  the resulting assigned value is never read. It is applicable in the case
  where there is more than one out mode formal. If there is only one out
  mode formal, the warning is issued by default (controlled by -gnatwu).
  The warning is suppressed for volatile
  variables and also for variables that are renamings of other variables
  or for which an address clause is given.
  The default is that these warnings are not given.


.. index:: -gnatw.O  (gcc)

:switch:`-gnatw.O`
  *Disable warnings on modified but unreferenced out parameters.*

  This switch suppresses warnings for variables that are modified by using
  them as actuals for a call to a procedure with an out mode formal, where
  the resulting assigned value is never read.


.. index:: -gnatwp  (gcc)
.. index:: Inlining, warnings

:switch:`-gnatwp`
  *Activate warnings on ineffective pragma Inlines.*

  This switch activates warnings for failure of front end inlining
  (activated by :switch:`-gnatN`) to inline a particular call. There are
  many reasons for not being able to inline a call, including most
  commonly that the call is too complex to inline. The default is
  that such warnings are not given.
  Warnings on ineffective inlining by the gcc back-end can be activated
  separately, using the gcc switch -Winline.


.. index:: -gnatwP  (gcc)

:switch:`-gnatwP`
  *Suppress warnings on ineffective pragma Inlines.*

  This switch suppresses warnings on ineffective pragma Inlines. If the
  inlining mechanism cannot inline a call, it will simply ignore the
  request silently.


.. index:: -gnatw.p  (gcc)
.. index:: Parameter order, warnings

:switch:`-gnatw.p`
  *Activate warnings on parameter ordering.*

  This switch activates warnings for cases of suspicious parameter
  ordering when the list of arguments are all simple identifiers that
  match the names of the formals, but are in a different order. The
  warning is suppressed if any use of named parameter notation is used,
  so this is the appropriate way to suppress a false positive (and
  serves to emphasize that the "misordering" is deliberate). The
  default is that such warnings are not given.


.. index:: -gnatw.P  (gcc)

:switch:`-gnatw.P`
  *Suppress warnings on parameter ordering.*

  This switch suppresses warnings on cases of suspicious parameter
  ordering.


.. index:: -gnatw_p  (gcc)

:switch:`-gnatw_p`
  *Activate warnings for pedantic checks.*

  This switch activates warnings for the failure of certain pedantic checks.
  The only case currently supported is a check that the subtype_marks given
  for corresponding formal parameter and function results in a subprogram
  declaration and its body denote the same subtype declaration. The default
  is that such warnings are not given.

.. index:: -gnatw_P  (gcc)

:switch:`-gnatw_P`
  *Suppress warnings for pedantic checks.*

  This switch suppresses warnings on violations of pedantic checks.


.. index:: -gnatwq  (gcc)
.. index:: Parentheses, warnings

:switch:`-gnatwq`
  *Activate warnings on questionable missing parentheses.*

  This switch activates warnings for cases where parentheses are not used and
  the result is potential ambiguity from a readers point of view. For example
  (not a > b) when a and b are modular means ((not a) > b) and very likely the
  programmer intended (not (a > b)). Similarly (-x mod 5) means (-(x mod 5)) and
  quite likely ((-x) mod 5) was intended. In such situations it seems best to
  follow the rule of always parenthesizing to make the association clear, and
  this warning switch warns if such parentheses are not present. The default
  is that these warnings are given.


.. index:: -gnatwQ  (gcc)

:switch:`-gnatwQ`
  *Suppress warnings on questionable missing parentheses.*

  This switch suppresses warnings for cases where the association is not
  clear and the use of parentheses is preferred.


.. index:: -gnatw.q  (gcc)
.. index:: Layout, warnings

:switch:`-gnatw.q`
  *Activate warnings on questionable layout of record types.*

  This switch activates warnings for cases where the default layout of
  a record type, that is to say the layout of its components in textual
  order of the source code, would very likely cause inefficiencies in
  the code generated by the compiler, both in terms of space and speed
  during execution. One warning is issued for each problematic component
  without representation clause in the nonvariant part and then in each
  variant recursively, if any.

  The purpose of these warnings is neither to prescribe an optimal layout
  nor to force the use of representation clauses, but rather to get rid of
  the most blatant inefficiencies in the layout. Therefore, the default
  layout is matched against the following synthetic ordered layout and
  the deviations are flagged on a component-by-component basis:

  * first all components or groups of components whose length is fixed
    and a multiple of the storage unit,

  * then the remaining components whose length is fixed and not a multiple
    of the storage unit,

  * then the remaining components whose length doesn't depend on discriminants
    (that is to say, with variable but uniform length for all objects),

  * then all components whose length depends on discriminants,

  * finally the variant part (if any),

  for the nonvariant part and for each variant recursively, if any.

  The exact wording of the warning depends on whether the compiler is allowed
  to reorder the components in the record type or precluded from doing it by
  means of pragma ``No_Component_Reordering``.

  The default is that these warnings are not given.

.. index:: -gnatw.Q  (gcc)

:switch:`-gnatw.Q`
  *Suppress warnings on questionable layout of record types.*

  This switch suppresses warnings for cases where the default layout of
  a record type would very likely cause inefficiencies.


.. index:: -gnatwr  (gcc)

:switch:`-gnatwr`
  *Activate warnings on redundant constructs.*

  This switch activates warnings for redundant constructs. The following
  is the current list of constructs regarded as redundant:

  * Assignment of an item to itself.

  * Type conversion that converts an expression to its own type.

  * Use of the attribute ``Base`` where ``typ'Base`` is the same
    as ``typ``.

  * Use of pragma ``Pack`` when all components are placed by a record
    representation clause.

  * Exception handler containing only a reraise statement (raise with no
    operand) which has no effect.

  * Use of the operator abs on an operand that is known at compile time
    to be non-negative

  * Comparison of an object or (unary or binary) operation of boolean type to
    an explicit True value.

  The default is that warnings for redundant constructs are not given.


.. index:: -gnatwR  (gcc)

:switch:`-gnatwR`
  *Suppress warnings on redundant constructs.*

  This switch suppresses warnings for redundant constructs.


.. index:: -gnatw.r  (gcc)

:switch:`-gnatw.r`
  *Activate warnings for object renaming function.*

  This switch activates warnings for an object renaming that renames a
  function call, which is equivalent to a constant declaration (as
  opposed to renaming the function itself).  The default is that these
  warnings are given.


.. index:: -gnatw.R  (gcc)

:switch:`-gnatw.R`
  *Suppress warnings for object renaming function.*

  This switch suppresses warnings for object renaming function.


.. index:: -gnatw_r  (gcc)

:switch:`-gnatw_r`
  *Activate warnings for out-of-order record representation clauses.*

  This switch activates warnings for record representation clauses,
  if the order of component declarations, component clauses,
  and bit-level layout do not all agree.
  The default is that these warnings are not given.


.. index:: -gnatw_R  (gcc)

:switch:`-gnatw_R`
  *Suppress warnings for out-of-order record representation clauses.*


.. index:: -gnatws  (gcc)

:switch:`-gnatws`
  *Suppress all warnings.*

  This switch completely suppresses the
  output of all warning messages from the GNAT front end, including
  both warnings that can be controlled by switches described in this
  section, and those that are normally given unconditionally. The
  effect of this suppress action can only be cancelled by a subsequent
  use of the switch :switch:`-gnatwn`.

  Note that switch :switch:`-gnatws` does not suppress
  warnings from the ``gcc`` back end.
  To suppress these back end warnings as well, use the switch :switch:`-w`
  in addition to :switch:`-gnatws`. Also this switch has no effect on the
  handling of style check messages.


.. index:: -gnatw.s  (gcc)
.. index:: Record Representation (component sizes)

:switch:`-gnatw.s`
  *Activate warnings on overridden size clauses.*

  This switch activates warnings on component clauses in record
  representation clauses where the length given overrides that
  specified by an explicit size clause for the component type. A
  warning is similarly given in the array case if a specified
  component size overrides an explicit size clause for the array
  component type.


.. index:: -gnatw.S  (gcc)

:switch:`-gnatw.S`
  *Suppress warnings on overridden size clauses.*

  This switch suppresses warnings on component clauses in record
  representation clauses that override size clauses, and similar
  warnings when an array component size overrides a size clause.


.. index:: -gnatwt  (gcc)
.. index:: Deactivated code, warnings
.. index:: Deleted code, warnings

:switch:`-gnatwt`
  *Activate warnings for tracking of deleted conditional code.*

  This switch activates warnings for tracking of code in conditionals (IF and
  CASE statements) that is detected to be dead code which cannot be executed, and
  which is removed by the front end. This warning is off by default. This may be
  useful for detecting deactivated code in certified applications.


.. index:: -gnatwT  (gcc)

:switch:`-gnatwT`
  *Suppress warnings for tracking of deleted conditional code.*

  This switch suppresses warnings for tracking of deleted conditional code.


.. index:: -gnatw.t  (gcc)

:switch:`-gnatw.t`
  *Activate warnings on suspicious contracts.*

  This switch activates warnings on suspicious contracts. This includes
  warnings on suspicious postconditions (whether a pragma ``Postcondition`` or a
  ``Post`` aspect in Ada 2012) and suspicious contract cases (pragma or aspect
  ``Contract_Cases``). A function postcondition or contract case is suspicious
  when no postcondition or contract case for this function mentions the result
  of the function.  A procedure postcondition or contract case is suspicious
  when it only refers to the pre-state of the procedure, because in that case
  it should rather be expressed as a precondition. This switch also controls
  warnings on suspicious cases of expressions typically found in contracts like
  quantified expressions and uses of Update attribute. The default is that such
  warnings are generated.


.. index:: -gnatw.T  (gcc)

:switch:`-gnatw.T`
  *Suppress warnings on suspicious contracts.*

  This switch suppresses warnings on suspicious contracts.


.. index:: -gnatwu  (gcc)

:switch:`-gnatwu`
  *Activate warnings on unused entities.*

  This switch activates warnings to be generated for entities that
  are declared but not referenced, and for units that are |withed|
  and not
  referenced. In the case of packages, a warning is also generated if
  no entities in the package are referenced. This means that if a with'ed
  package is referenced but the only references are in ``use``
  clauses or ``renames``
  declarations, a warning is still generated. A warning is also generated
  for a generic package that is |withed| but never instantiated.
  In the case where a package or subprogram body is compiled, and there
  is a |with| on the corresponding spec
  that is only referenced in the body,
  a warning is also generated, noting that the
  |with| can be moved to the body. The default is that
  such warnings are not generated.
  This switch also activates warnings on unreferenced formals
  (it includes the effect of :switch:`-gnatwf`).


.. index:: -gnatwU  (gcc)

:switch:`-gnatwU`
  *Suppress warnings on unused entities.*

  This switch suppresses warnings for unused entities and packages.
  It also turns off warnings on unreferenced formals (and thus includes
  the effect of :switch:`-gnatwF`).


.. index:: -gnatw.u  (gcc)

:switch:`-gnatw.u`
  *Activate warnings on unordered enumeration types.*

  This switch causes enumeration types to be considered as conceptually
  unordered, unless an explicit pragma ``Ordered`` is given for the type.
  The effect is to generate warnings in clients that use explicit comparisons
  or subranges, since these constructs both treat objects of the type as
  ordered. (A *client* is defined as a unit that is other than the unit in
  which the type is declared, or its body or subunits.) Please refer to
  the description of pragma ``Ordered`` in the
  :title:`GNAT Reference Manual` for further details.
  The default is that such warnings are not generated.


.. index:: -gnatw.U  (gcc)

:switch:`-gnatw.U`
  *Deactivate warnings on unordered enumeration types.*

  This switch causes all enumeration types to be considered as ordered, so
  that no warnings are given for comparisons or subranges for any type.


.. index:: -gnatwv  (gcc)
.. index:: Unassigned variable warnings

:switch:`-gnatwv`
  *Activate warnings on unassigned variables.*

  This switch activates warnings for access to variables which
  may not be properly initialized. The default is that
  such warnings are generated. This switch will also be emitted when
  initializing an array or record object via the following aggregate:

  .. code-block:: ada

       Array_Or_Record : XXX := (others => <>);

  unless the relevant type fully initializes all components.

.. index:: -gnatwV  (gcc)

:switch:`-gnatwV`
  *Suppress warnings on unassigned variables.*

  This switch suppresses warnings for access to variables which
  may not be properly initialized.


.. index:: -gnatw.v  (gcc)
.. index:: bit order warnings

:switch:`-gnatw.v`
  *Activate info messages for non-default bit order.*

  This switch activates messages (labeled "info", they are not warnings,
  just informational messages) about the effects of non-default bit-order
  on records to which a component clause is applied. The effect of specifying
  non-default bit ordering is a bit subtle (and changed with Ada 2005), so
  these messages, which are given by default, are useful in understanding the
  exact consequences of using this feature.


.. index:: -gnatw.V  (gcc)

:switch:`-gnatw.V`
  *Suppress info messages for non-default bit order.*

  This switch suppresses information messages for the effects of specifying
  non-default bit order on record components with component clauses.


.. index:: -gnatww  (gcc)
.. index:: String indexing warnings

:switch:`-gnatww`
  *Activate warnings on wrong low bound assumption.*

  This switch activates warnings for indexing an unconstrained string parameter
  with a literal or S'Length. This is a case where the code is assuming that the
  low bound is one, which is in general not true (for example when a slice is
  passed). The default is that such warnings are generated.


.. index:: -gnatwW  (gcc)

:switch:`-gnatwW`
  *Suppress warnings on wrong low bound assumption.*

  This switch suppresses warnings for indexing an unconstrained string parameter
  with a literal or S'Length. Note that this warning can also be suppressed
  in a particular case by adding an assertion that the lower bound is 1,
  as shown in the following example:

  .. code-block:: ada

       procedure K (S : String) is
          pragma Assert (S'First = 1);
          ...


.. index:: -gnatw.w  (gcc)
.. index:: Warnings Off control

:switch:`-gnatw.w`
  *Activate warnings on Warnings Off pragmas.*

  This switch activates warnings for use of ``pragma Warnings (Off, entity)``
  where either the pragma is entirely useless (because it suppresses no
  warnings), or it could be replaced by ``pragma Unreferenced`` or
  ``pragma Unmodified``.
  Also activates warnings for the case of
  Warnings (Off, String), where either there is no matching
  Warnings (On, String), or the Warnings (Off) did not suppress any warning.
  The default is that these warnings are not given.


.. index:: -gnatw.W  (gcc)

:switch:`-gnatw.W`
  *Suppress warnings on unnecessary Warnings Off pragmas.*

  This switch suppresses warnings for use of ``pragma Warnings (Off, ...)``.


.. index:: -gnatwx  (gcc)
.. index:: Export/Import pragma warnings

:switch:`-gnatwx`
  *Activate warnings on Export/Import pragmas.*

  This switch activates warnings on Export/Import pragmas when
  the compiler detects a possible conflict between the Ada and
  foreign language calling sequences. For example, the use of
  default parameters in a convention C procedure is dubious
  because the C compiler cannot supply the proper default, so
  a warning is issued. The default is that such warnings are
  generated.


.. index:: -gnatwX  (gcc)

:switch:`-gnatwX`
  *Suppress warnings on Export/Import pragmas.*

  This switch suppresses warnings on Export/Import pragmas.
  The sense of this is that you are telling the compiler that
  you know what you are doing in writing the pragma, and it
  should not complain at you.


.. index:: -gnatwm  (gcc)

:switch:`-gnatw.x`
  *Activate warnings for No_Exception_Propagation mode.*

  This switch activates warnings for exception usage when pragma Restrictions
  (No_Exception_Propagation) is in effect. Warnings are given for implicit or
  explicit exception raises which are not covered by a local handler, and for
  exception handlers which do not cover a local raise. The default is that
  these warnings are given for units that contain exception handlers.


:switch:`-gnatw.X`
  *Disable warnings for No_Exception_Propagation mode.*

  This switch disables warnings for exception usage when pragma Restrictions
  (No_Exception_Propagation) is in effect.


.. index:: -gnatwy  (gcc)
.. index:: Ada compatibility issues warnings

:switch:`-gnatwy`
  *Activate warnings for Ada compatibility issues.*

  For the most part, newer versions of Ada are upwards compatible
  with older versions. For example, Ada 2005 programs will almost
  always work when compiled as Ada 2012.
  However there are some exceptions (for example the fact that
  ``some`` is now a reserved word in Ada 2012). This
  switch activates several warnings to help in identifying
  and correcting such incompatibilities. The default is that
  these warnings are generated. Note that at one point Ada 2005
  was called Ada 0Y, hence the choice of character.


.. index:: -gnatwY  (gcc)
.. index:: Ada compatibility issues warnings

:switch:`-gnatwY`
  *Disable warnings for Ada compatibility issues.*

  This switch suppresses the warnings intended to help in identifying
  incompatibilities between Ada language versions.


.. index:: -gnatw.y  (gcc)
.. index:: Package spec needing body

:switch:`-gnatw.y`
  *Activate information messages for why package spec needs body.*

  There are a number of cases in which a package spec needs a body.
  For example, the use of pragma Elaborate_Body, or the declaration
  of a procedure specification requiring a completion. This switch
  causes information messages to be output showing why a package
  specification requires a body. This can be useful in the case of
  a large package specification which is unexpectedly requiring a
  body. The default is that such information messages are not output.


.. index:: -gnatw.Y  (gcc)
.. index:: No information messages for why package spec needs body

:switch:`-gnatw.Y`
  *Disable information messages for why package spec needs body.*

  This switch suppresses the output of information messages showing why
  a package specification needs a body.


.. index:: -gnatwz  (gcc)
.. index:: Unchecked_Conversion warnings

:switch:`-gnatwz`
  *Activate warnings on unchecked conversions.*

  This switch activates warnings for unchecked conversions
  where the types are known at compile time to have different
  sizes. The default is that such warnings are generated. Warnings are also
  generated for subprogram pointers with different conventions.


.. index:: -gnatwZ  (gcc)

:switch:`-gnatwZ`
  *Suppress warnings on unchecked conversions.*

  This switch suppresses warnings for unchecked conversions
  where the types are known at compile time to have different
  sizes or conventions.


.. index:: -gnatw.z  (gcc)
.. index:: Size/Alignment warnings

:switch:`-gnatw.z`
  *Activate warnings for size not a multiple of alignment.*

  This switch activates warnings for cases of array and record types
  with specified ``Size`` and ``Alignment`` attributes where the
  size is not a multiple of the alignment, resulting in an object
  size that is greater than the specified size. The default
  is that such warnings are generated.


.. index:: -gnatw.Z  (gcc)
.. index:: Size/Alignment warnings

:switch:`-gnatw.Z`
  *Suppress warnings for size not a multiple of alignment.*

  This switch suppresses warnings for cases of array and record types
  with specified ``Size`` and ``Alignment`` attributes where the
  size is not a multiple of the alignment, resulting in an object
  size that is greater than the specified size. The warning can also
  be suppressed by giving an explicit ``Object_Size`` value.


.. index:: -Wunused (gcc)

:switch:`-Wunused`
  The warnings controlled by the :switch:`-gnatw` switch are generated by
  the front end of the compiler. The GCC back end can provide
  additional warnings and they are controlled by the :switch:`-W` switch.
  For example, :switch:`-Wunused` activates back end
  warnings for entities that are declared but not referenced.


.. index:: -Wuninitialized (gcc)

:switch:`-Wuninitialized`
  Similarly, :switch:`-Wuninitialized` activates
  the back end warning for uninitialized variables. This switch must be
  used in conjunction with an optimization level greater than zero.


.. index:: -Wstack-usage (gcc)

:switch:`-Wstack-usage={len}`
  Warn if the stack usage of a subprogram might be larger than ``len`` bytes.
  See :ref:`Static_Stack_Usage_Analysis` for details.


.. index:: -Wall (gcc)

:switch:`-Wall`
  This switch enables most warnings from the GCC back end.
  The code generator detects a number of warning situations that are missed
  by the GNAT front end, and this switch can be used to activate them.
  The use of this switch also sets the default front-end warning mode to
  :switch:`-gnatwa`, that is, most front-end warnings are activated as well.


.. index:: -w (gcc)

:switch:`-w`
  Conversely, this switch suppresses warnings from the GCC back end.
  The use of this switch also sets the default front-end warning mode to
  :switch:`-gnatws`, that is, front-end warnings are suppressed as well.


.. index:: -Werror (gcc)

:switch:`-Werror`
  This switch causes warnings from the GCC back end to be treated as
  errors.  The warning string still appears, but the warning messages are
  counted as errors, and prevent the generation of an object file.
  The use of this switch also sets the default front-end warning mode to
  :switch:`-gnatwe`, that is, front-end warning messages and style check
  messages are treated as errors as well.


A string of warning parameters can be used in the same parameter. For example::

  -gnatwaGe


will turn on all optional warnings except for unrecognized pragma warnings,
and also specify that warnings should be treated as errors.

When no switch :switch:`-gnatw` is used, this is equivalent to:

  * :switch:`-gnatw.a`

  * :switch:`-gnatwB`

  * :switch:`-gnatw.b`

  * :switch:`-gnatwC`

  * :switch:`-gnatw.C`

  * :switch:`-gnatwD`

  * :switch:`-gnatw.D`

  * :switch:`-gnatwF`

  * :switch:`-gnatw.F`

  * :switch:`-gnatwg`

  * :switch:`-gnatwH`

  * :switch:`-gnatw.H`

  * :switch:`-gnatwi`

  * :switch:`-gnatwJ`

  * :switch:`-gnatw.J`

  * :switch:`-gnatwK`

  * :switch:`-gnatw.K`

  * :switch:`-gnatwL`

  * :switch:`-gnatw.L`

  * :switch:`-gnatwM`

  * :switch:`-gnatw.m`

  * :switch:`-gnatwn`

  * :switch:`-gnatw.N`

  * :switch:`-gnatwo`

  * :switch:`-gnatw.O`

  * :switch:`-gnatwP`

  * :switch:`-gnatw.P`

  * :switch:`-gnatwq`

  * :switch:`-gnatw.Q`

  * :switch:`-gnatwR`

  * :switch:`-gnatw.R`

  * :switch:`-gnatw.S`

  * :switch:`-gnatwT`

  * :switch:`-gnatw.t`

  * :switch:`-gnatwU`

  * :switch:`-gnatw.U`

  * :switch:`-gnatwv`

  * :switch:`-gnatw.v`

  * :switch:`-gnatww`

  * :switch:`-gnatw.W`

  * :switch:`-gnatwx`

  * :switch:`-gnatw.X`

  * :switch:`-gnatwy`

  * :switch:`-gnatw.Y`

  * :switch:`-gnatwz`

  * :switch:`-gnatw.z`

.. _Debugging_and_Assertion_Control:

Debugging and Assertion Control
-------------------------------



.. index:: -gnata  (gcc)

:switch:`-gnata`
  .. index:: Assert
  .. index:: Debug
  .. index:: Assertions
  .. index:: Precondition
  .. index:: Postcondition
  .. index:: Type invariants
  .. index:: Subtype predicates

  The :switch:`-gnata` option is equivalent to the following ``Assertion_Policy`` pragma::

       pragma Assertion_Policy (Check);

  Which is a shorthand for::

       pragma Assertion_Policy
         (Assert               => Check,
          Static_Predicate     => Check,
          Dynamic_Predicate    => Check,
          Pre                  => Check,
          Pre'Class            => Check,
          Post                 => Check,
          Post'Class           => Check,
          Type_Invariant       => Check,
          Type_Invariant'Class => Check);

  The pragmas ``Assert`` and ``Debug`` normally have no effect and
  are ignored. This switch, where ``a`` stands for 'assert', causes
  pragmas ``Assert`` and ``Debug`` to be activated. This switch also
  causes preconditions, postconditions, subtype predicates, and
  type invariants to be activated.

  The pragmas have the form::

       pragma Assert (<Boolean-expression> [, <static-string-expression>])
       pragma Debug (<procedure call>)
       pragma Type_Invariant (<type-local-name>, <Boolean-expression>)
       pragma Predicate (<type-local-name>, <Boolean-expression>)
       pragma Precondition (<Boolean-expression>, <string-expression>)
       pragma Postcondition (<Boolean-expression>, <string-expression>)

  The aspects have the form::

       with [Pre|Post|Type_Invariant|Dynamic_Predicate|Static_Predicate]
         => <Boolean-expression>;

  The ``Assert`` pragma causes ``Boolean-expression`` to be tested.
  If the result is ``True``, the pragma has no effect (other than
  possible side effects from evaluating the expression). If the result is
  ``False``, the exception ``Assert_Failure`` declared in the package
  ``System.Assertions`` is raised (passing ``static-string-expression``, if
  present, as the message associated with the exception). If no string
  expression is given, the default is a string containing the file name and
  line number of the pragma.

  The ``Debug`` pragma causes ``procedure`` to be called. Note that
  ``pragma Debug`` may appear within a declaration sequence, allowing
  debugging procedures to be called between declarations.

  For the aspect specification, the ``Boolean-expression`` is evaluated.
  If the result is ``True``, the aspect has no effect. If the result
  is ``False``, the exception ``Assert_Failure`` is raised.

.. _Validity_Checking:

Validity Checking
-----------------

.. index:: Validity Checking

The Ada Reference Manual defines the concept of invalid values (see
RM 13.9.1). The primary source of invalid values is uninitialized
variables. A scalar variable that is left uninitialized may contain
an invalid value; the concept of invalid does not apply to access or
composite types.

It is an error to read an invalid value, but the RM does not require
run-time checks to detect such errors, except for some minimal
checking to prevent erroneous execution (i.e. unpredictable
behavior). This corresponds to the :switch:`-gnatVd` switch below,
which is the default. For example, by default, if the expression of a
case statement is invalid, it will raise Constraint_Error rather than
causing a wild jump, and if an array index on the left-hand side of an
assignment is invalid, it will raise Constraint_Error rather than
overwriting an arbitrary memory location.

The :switch:`-gnatVa` may be used to enable additional validity checks,
which are not required by the RM. These checks are often very
expensive (which is why the RM does not require them). These checks
are useful in tracking down uninitialized variables, but they are
not usually recommended for production builds, and in particular
we do not recommend using these extra validity checking options in
combination with optimization, since this can confuse the optimizer.
If performance is a consideration, leading to the need to optimize,
then the validity checking options should not be used.

The other :switch:`-gnatV{x}` switches below allow finer-grained
control; you can enable whichever validity checks you desire. However,
for most debugging purposes, :switch:`-gnatVa` is sufficient, and the
default :switch:`-gnatVd` (i.e. standard Ada behavior) is usually
sufficient for non-debugging use.

The :switch:`-gnatB` switch tells the compiler to assume that all
values are valid (that is, within their declared subtype range)
except in the context of a use of the Valid attribute. This means
the compiler can generate more efficient code, since the range
of values is better known at compile time. However, an uninitialized
variable can cause wild jumps and memory corruption in this mode.

The :switch:`-gnatV{x}` switch allows control over the validity
checking mode as described below.
The ``x`` argument is a string of letters that
indicate validity checks that are performed or not performed in addition
to the default checks required by Ada as described above.


.. index:: -gnatVa  (gcc)

:switch:`-gnatVa`
  *All validity checks.*

  All validity checks are turned on.
  That is, :switch:`-gnatVa` is
  equivalent to ``gnatVcdfimoprst``.


.. index:: -gnatVc  (gcc)

:switch:`-gnatVc`
  *Validity checks for copies.*

  The right hand side of assignments, and the initializing values of
  object declarations are validity checked.


.. index:: -gnatVd  (gcc)

:switch:`-gnatVd`
  *Default (RM) validity checks.*

  Some validity checks are done by default following normal Ada semantics
  (RM 13.9.1 (9-11)).
  A check is done in case statements that the expression is within the range
  of the subtype. If it is not, Constraint_Error is raised.
  For assignments to array components, a check is done that the expression used
  as index is within the range. If it is not, Constraint_Error is raised.
  Both these validity checks may be turned off using switch :switch:`-gnatVD`.
  They are turned on by default. If :switch:`-gnatVD` is specified, a subsequent
  switch :switch:`-gnatVd` will leave the checks turned on.
  Switch :switch:`-gnatVD` should be used only if you are sure that all such
  expressions have valid values. If you use this switch and invalid values
  are present, then the program is erroneous, and wild jumps or memory
  overwriting may occur.


.. index:: -gnatVe  (gcc)

:switch:`-gnatVe`
  *Validity checks for elementary components.*

  In the absence of this switch, assignments to record or array components are
  not validity checked, even if validity checks for assignments generally
  (:switch:`-gnatVc`) are turned on. In Ada, assignment of composite values do not
  require valid data, but assignment of individual components does. So for
  example, there is a difference between copying the elements of an array with a
  slice assignment, compared to assigning element by element in a loop. This
  switch allows you to turn off validity checking for components, even when they
  are assigned component by component.


.. index:: -gnatVf  (gcc)

:switch:`-gnatVf`
  *Validity checks for floating-point values.*

  In the absence of this switch, validity checking occurs only for discrete
  values. If :switch:`-gnatVf` is specified, then validity checking also applies
  for floating-point values, and NaNs and infinities are considered invalid,
  as well as out of range values for constrained types. Note that this means
  that standard IEEE infinity mode is not allowed. The exact contexts
  in which floating-point values are checked depends on the setting of other
  options. For example, :switch:`-gnatVif` or :switch:`-gnatVfi`
  (the order does not matter) specifies that floating-point parameters of mode
  ``in`` should be validity checked.


.. index:: -gnatVi  (gcc)

:switch:`-gnatVi`
  *Validity checks for ``in`` mode parameters.*

  Arguments for parameters of mode ``in`` are validity checked in function
  and procedure calls at the point of call.


.. index:: -gnatVm  (gcc)

:switch:`-gnatVm`
  *Validity checks for ``in out`` mode parameters.*

  Arguments for parameters of mode ``in out`` are validity checked in
  procedure calls at the point of call. The ``'m'`` here stands for
  modify, since this concerns parameters that can be modified by the call.
  Note that there is no specific option to test ``out`` parameters,
  but any reference within the subprogram will be tested in the usual
  manner, and if an invalid value is copied back, any reference to it
  will be subject to validity checking.


.. index:: -gnatVn  (gcc)

:switch:`-gnatVn`
  *No validity checks.*

  This switch turns off all validity checking, including the default checking
  for case statements and left hand side subscripts. Note that the use of
  the switch :switch:`-gnatp` suppresses all run-time checks, including
  validity checks, and thus implies :switch:`-gnatVn`. When this switch
  is used, it cancels any other :switch:`-gnatV` previously issued.


.. index:: -gnatVo  (gcc)

:switch:`-gnatVo`
  *Validity checks for operator and attribute operands.*

  Arguments for predefined operators and attributes are validity checked.
  This includes all operators in package ``Standard``,
  the shift operators defined as intrinsic in package ``Interfaces``
  and operands for attributes such as ``Pos``. Checks are also made
  on individual component values for composite comparisons, and on the
  expressions in type conversions and qualified expressions. Checks are
  also made on explicit ranges using :samp:`..` (e.g., slices, loops etc).


.. index:: -gnatVp  (gcc)

:switch:`-gnatVp`
  *Validity checks for parameters.*

  This controls the treatment of parameters within a subprogram (as opposed
  to :switch:`-gnatVi` and :switch:`-gnatVm` which control validity testing
  of parameters on a call. If either of these call options is used, then
  normally an assumption is made within a subprogram that the input arguments
  have been validity checking at the point of call, and do not need checking
  again within a subprogram). If :switch:`-gnatVp` is set, then this assumption
  is not made, and parameters are not assumed to be valid, so their validity
  will be checked (or rechecked) within the subprogram.


.. index:: -gnatVr  (gcc)

:switch:`-gnatVr`
  *Validity checks for function returns.*

  The expression in ``return`` statements in functions is validity
  checked.


.. index:: -gnatVs  (gcc)

:switch:`-gnatVs`
  *Validity checks for subscripts.*

  All subscripts expressions are checked for validity, whether they appear
  on the right side or left side (in default mode only left side subscripts
  are validity checked).


.. index:: -gnatVt  (gcc)

:switch:`-gnatVt`
  *Validity checks for tests.*

  Expressions used as conditions in ``if``, ``while`` or ``exit``
  statements are checked, as well as guard expressions in entry calls.


The :switch:`-gnatV` switch may be followed by a string of letters
to turn on a series of validity checking options.
For example, :switch:`-gnatVcr`
specifies that in addition to the default validity checking, copies and
function return expressions are to be validity checked.
In order to make it easier to specify the desired combination of effects,
the upper case letters ``CDFIMORST`` may
be used to turn off the corresponding lower case option.
Thus :switch:`-gnatVaM` turns on all validity checking options except for
checking of ``in out`` parameters.

The specification of additional validity checking generates extra code (and
in the case of :switch:`-gnatVa` the code expansion can be substantial).
However, these additional checks can be very useful in detecting
uninitialized variables, incorrect use of unchecked conversion, and other
errors leading to invalid values. The use of pragma ``Initialize_Scalars``
is useful in conjunction with the extra validity checking, since this
ensures that wherever possible uninitialized variables have invalid values.

See also the pragma ``Validity_Checks`` which allows modification of
the validity checking mode at the program source level, and also allows for
temporary disabling of validity checks.

.. _Style_Checking:

Style Checking
--------------

.. index:: Style checking

.. index:: -gnaty  (gcc)

The :switch:`-gnatyx` switch causes the compiler to
enforce specified style rules. A limited set of style rules has been used
in writing the GNAT sources themselves. This switch allows user programs
to activate all or some of these checks. If the source program fails a
specified style check, an appropriate message is given, preceded by
the character sequence '(style)'. This message does not prevent
successful compilation (unless the :switch:`-gnatwe` switch is used).

Note that this is by no means intended to be a general facility for
checking arbitrary coding standards. It is simply an embedding of the
style rules we have chosen for the GNAT sources. If you are starting
a project which does not have established style standards, you may
find it useful to adopt the entire set of GNAT coding standards, or
some subset of them.

.. only:: PRO or GPL

  If you already have an established set of coding
  standards, then the selected style checking options may
  indeed correspond to choices you have made, but for general checking
  of an existing set of coding rules, you should look to the gnatcheck
  tool, which is designed for that purpose.

The string ``x`` is a sequence of letters or digits
indicating the particular style
checks to be performed. The following checks are defined:


.. index:: -gnaty[0-9]   (gcc)

:switch:`-gnaty0`
  *Specify indentation level.*

  If a digit from 1-9 appears
  in the string after :switch:`-gnaty`
  then proper indentation is checked, with the digit indicating the
  indentation level required. A value of zero turns off this style check.
  The rule checks that the following constructs start on a column that is
  a multiple of the alignment level:

  * beginnings of declarations (except record component declarations)
    and statements;

  * beginnings of the structural components of compound statements;

  * ``end`` keyword that completes the declaration of a program unit declaration
    or body or that completes a compound statement.

  Full line comments must be
  aligned with the ``--`` starting on a column that is a multiple of
  the alignment level, or they may be aligned the same way as the following
  non-blank line (this is useful when full line comments appear in the middle
  of a statement, or they may be aligned with the source line on the previous
  non-blank line.

.. index:: -gnatya   (gcc)

:switch:`-gnatya`
  *Check attribute casing.*

  Attribute names, including the case of keywords such as ``digits``
  used as attributes names, must be written in mixed case, that is, the
  initial letter and any letter following an underscore must be uppercase.
  All other letters must be lowercase.


.. index:: -gnatyA (gcc)

:switch:`-gnatyA`
  *Use of array index numbers in array attributes.*

  When using the array attributes First, Last, Range,
  or Length, the index number must be omitted for one-dimensional arrays
  and is required for multi-dimensional arrays.


.. index:: -gnatyb (gcc)

:switch:`-gnatyb`
  *Blanks not allowed at statement end.*

  Trailing blanks are not allowed at the end of statements. The purpose of this
  rule, together with h (no horizontal tabs), is to enforce a canonical format
  for the use of blanks to separate source tokens.


.. index:: -gnatyB (gcc)

:switch:`-gnatyB`
  *Check Boolean operators.*

  The use of AND/OR operators is not permitted except in the cases of modular
  operands, array operands, and simple stand-alone boolean variables or
  boolean constants. In all other cases ``and then``/`or else` are
  required.


.. index:: -gnatyc (gcc)

:switch:`-gnatyc`
  *Check comments, double space.*

  Comments must meet the following set of rules:

  * The ``--`` that starts the column must either start in column one,
    or else at least one blank must precede this sequence.

  * Comments that follow other tokens on a line must have at least one blank
    following the ``--`` at the start of the comment.

  * Full line comments must have at least two blanks following the
    ``--`` that starts the comment, with the following exceptions.

  * A line consisting only of the ``--`` characters, possibly preceded
    by blanks is permitted.

  * A comment starting with ``--x`` where ``x`` is a special character
    is permitted.
    This allows proper processing of the output from specialized tools
    such as ``gnatprep`` (where ``--!`` is used) and in earlier versions of the SPARK
    annotation
    language (where ``--#`` is used). For the purposes of this rule, a
    special character is defined as being in one of the ASCII ranges
    ``16#21#...16#2F#`` or ``16#3A#...16#3F#``.
    Note that this usage is not permitted
    in GNAT implementation units (i.e., when :switch:`-gnatg` is used).

  * A line consisting entirely of minus signs, possibly preceded by blanks, is
    permitted. This allows the construction of box comments where lines of minus
    signs are used to form the top and bottom of the box.

  * A comment that starts and ends with ``--`` is permitted as long as at
    least one blank follows the initial ``--``. Together with the preceding
    rule, this allows the construction of box comments, as shown in the following
    example:

    .. code-block:: ada

       ---------------------------
       -- This is a box comment --
       -- with two text lines.  --
       ---------------------------


.. index:: -gnatyC (gcc)

:switch:`-gnatyC`
  *Check comments, single space.*

  This is identical to ``c`` except that only one space
  is required following the ``--`` of a comment instead of two.


.. index:: -gnatyd (gcc)

:switch:`-gnatyd`
  *Check no DOS line terminators present.*

  All lines must be terminated by a single ASCII.LF
  character (in particular the DOS line terminator sequence CR/LF is not
  allowed).


.. index:: -gnatyD (gcc)

:switch:`-gnatyD`
  *Check declared identifiers in mixed case.*

  Declared identifiers must be in mixed case, as in
  This_Is_An_Identifier. Use -gnatyr in addition to ensure
  that references match declarations.


.. index:: -gnatye (gcc)

:switch:`-gnatye`
  *Check end/exit labels.*

  Optional labels on ``end`` statements ending subprograms and on
  ``exit`` statements exiting named loops, are required to be present.


.. index:: -gnatyf (gcc)

:switch:`-gnatyf`
  *No form feeds or vertical tabs.*

  Neither form feeds nor vertical tab characters are permitted
  in the source text.


.. index:: -gnatyg (gcc)

:switch:`-gnatyg`
  *GNAT style mode.*

  The set of style check switches is set to match that used by the GNAT sources.
  This may be useful when developing code that is eventually intended to be
  incorporated into GNAT. Currently this is equivalent to :switch:`-gnatyydISux`)
  but additional style switches may be added to this set in the future without
  advance notice.


.. index:: -gnatyh (gcc)

:switch:`-gnatyh`
  *No horizontal tabs.*

  Horizontal tab characters are not permitted in the source text.
  Together with the b (no blanks at end of line) check, this
  enforces a canonical form for the use of blanks to separate
  source tokens.


.. index:: -gnatyi (gcc)

:switch:`-gnatyi`
  *Check if-then layout.*

  The keyword ``then`` must appear either on the same
  line as corresponding ``if``, or on a line on its own, lined
  up under the ``if``.


.. index:: -gnatyI (gcc)

:switch:`-gnatyI`
  *check mode IN keywords.*

  Mode ``in`` (the default mode) is not
  allowed to be given explicitly. ``in out`` is fine,
  but not ``in`` on its own.


.. index:: -gnatyk (gcc)

:switch:`-gnatyk`
  *Check keyword casing.*

  All keywords must be in lower case (with the exception of keywords
  such as ``digits`` used as attribute names to which this check
  does not apply). A single error is reported for each line breaking
  this rule even if multiple casing issues exist on a same line.


.. index:: -gnatyl (gcc)

:switch:`-gnatyl`
  *Check layout.*

  Layout of statement and declaration constructs must follow the
  recommendations in the Ada Reference Manual, as indicated by the
  form of the syntax rules. For example an ``else`` keyword must
  be lined up with the corresponding ``if`` keyword.

  There are two respects in which the style rule enforced by this check
  option are more liberal than those in the Ada Reference Manual. First
  in the case of record declarations, it is permissible to put the
  ``record`` keyword on the same line as the ``type`` keyword, and
  then the ``end`` in ``end record`` must line up under ``type``.
  This is also permitted when the type declaration is split on two lines.
  For example, any of the following three layouts is acceptable:

  .. code-block:: ada

    type q is record
       a : integer;
       b : integer;
    end record;

    type q is
       record
          a : integer;
          b : integer;
       end record;

    type q is
       record
          a : integer;
          b : integer;
    end record;

  Second, in the case of a block statement, a permitted alternative
  is to put the block label on the same line as the ``declare`` or
  ``begin`` keyword, and then line the ``end`` keyword up under
  the block label. For example both the following are permitted:

  .. code-block:: ada

    Block : declare
       A : Integer := 3;
    begin
       Proc (A, A);
    end Block;

    Block :
       declare
          A : Integer := 3;
       begin
          Proc (A, A);
       end Block;

  The same alternative format is allowed for loops. For example, both of
  the following are permitted:

  .. code-block:: ada

    Clear : while J < 10 loop
       A (J) := 0;
    end loop Clear;

    Clear :
       while J < 10 loop
          A (J) := 0;
       end loop Clear;


.. index:: -gnatyLnnn (gcc)

:switch:`-gnatyL`
  *Set maximum nesting level.*

  The maximum level of nesting of constructs (including subprograms, loops,
  blocks, packages, and conditionals) may not exceed the given value
  *nnn*. A value of zero disconnects this style check.


.. index:: -gnatym (gcc)

:switch:`-gnatym`
  *Check maximum line length.*

  The length of source lines must not exceed 79 characters, including
  any trailing blanks. The value of 79 allows convenient display on an
  80 character wide device or window, allowing for possible special
  treatment of 80 character lines. Note that this count is of
  characters in the source text. This means that a tab character counts
  as one character in this count and a wide character sequence counts as
  a single character (however many bytes are needed in the encoding).


.. index:: -gnatyMnnn (gcc)

:switch:`-gnatyM`
  *Set maximum line length.*

  The length of lines must not exceed the
  given value *nnn*. The maximum value that can be specified is 32767.
  If neither style option for setting the line length is used, then the
  default is 255. This also controls the maximum length of lexical elements,
  where the only restriction is that they must fit on a single line.


.. index:: -gnatyn (gcc)

:switch:`-gnatyn`
  *Check casing of entities in Standard.*

  Any identifier from Standard must be cased
  to match the presentation in the Ada Reference Manual (for example,
  ``Integer`` and ``ASCII.NUL``).


.. index:: -gnatyN (gcc)

:switch:`-gnatyN`
  *Turn off all style checks.*

  All style check options are turned off.


.. index:: -gnatyo (gcc)

:switch:`-gnatyo`
  *Check order of subprogram bodies.*

  All subprogram bodies in a given scope
  (e.g., a package body) must be in alphabetical order. The ordering
  rule uses normal Ada rules for comparing strings, ignoring casing
  of letters, except that if there is a trailing numeric suffix, then
  the value of this suffix is used in the ordering (e.g., Junk2 comes
  before Junk10).


.. index:: -gnatyO (gcc)

:switch:`-gnatyO`
  *Check that overriding subprograms are explicitly marked as such.*

  This applies to all subprograms of a derived type that override a primitive
  operation of the type, for both tagged and untagged types. In particular,
  the declaration of a primitive operation of a type extension that overrides
  an inherited operation must carry an overriding indicator. Another case is
  the declaration of a function that overrides a predefined operator (such
  as an equality operator).


.. index:: -gnatyp (gcc)

:switch:`-gnatyp`
  *Check pragma casing.*

  Pragma names must be written in mixed case, that is, the
  initial letter and any letter following an underscore must be uppercase.
  All other letters must be lowercase. An exception is that SPARK_Mode is
  allowed as an alternative for Spark_Mode.


.. index:: -gnatyr (gcc)

:switch:`-gnatyr`
  *Check references.*

  All identifier references must be cased in the same way as the
  corresponding declaration. No specific casing style is imposed on
  identifiers. The only requirement is for consistency of references
  with declarations.


.. index:: -gnatys (gcc)

:switch:`-gnatys`
  *Check separate specs.*

  Separate declarations ('specs') are required for subprograms (a
  body is not allowed to serve as its own declaration). The only
  exception is that parameterless library level procedures are
  not required to have a separate declaration. This exception covers
  the most frequent form of main program procedures.


.. index:: -gnatyS (gcc)

:switch:`-gnatyS`
  *Check no statements after then/else.*

  No statements are allowed
  on the same line as a ``then`` or ``else`` keyword following the
  keyword in an ``if`` statement. ``or else`` and ``and then`` are not
  affected, and a special exception allows a pragma to appear after ``else``.


.. index:: -gnatyt (gcc)

:switch:`-gnatyt`
  *Check token spacing.*

  The following token spacing rules are enforced:

  * The keywords ``abs`` and ``not`` must be followed by a space.

  * The token ``=>`` must be surrounded by spaces.

  * The token ``<>`` must be preceded by a space or a left parenthesis.

  * Binary operators other than ``**`` must be surrounded by spaces.
    There is no restriction on the layout of the ``**`` binary operator.

  * Colon must be surrounded by spaces.

  * Colon-equal (assignment, initialization) must be surrounded by spaces.

  * Comma must be the first non-blank character on the line, or be
    immediately preceded by a non-blank character, and must be followed
    by a space.

  * If the token preceding a left parenthesis ends with a letter or digit, then
    a space must separate the two tokens.

  * If the token following a right parenthesis starts with a letter or digit, then
    a space must separate the two tokens.

  * A right parenthesis must either be the first non-blank character on
    a line, or it must be preceded by a non-blank character.

  * A semicolon must not be preceded by a space, and must not be followed by
    a non-blank character.

  * A unary plus or minus may not be followed by a space.

  * A vertical bar must be surrounded by spaces.

  Exactly one blank (and no other white space) must appear between
  a ``not`` token and a following ``in`` token.


.. index:: -gnatyu (gcc)

:switch:`-gnatyu`
  *Check unnecessary blank lines.*

  Unnecessary blank lines are not allowed. A blank line is considered
  unnecessary if it appears at the end of the file, or if more than
  one blank line occurs in sequence.


.. index:: -gnatyx (gcc)

:switch:`-gnatyx`
  *Check extra parentheses.*

  Unnecessary extra level of parentheses (C-style) are not allowed
  around conditions in ``if`` statements, ``while`` statements and
  ``exit`` statements.


.. index:: -gnatyy (gcc)

:switch:`-gnatyy`
  *Set all standard style check options.*

  This is equivalent to ``gnaty3aAbcefhiklmnprst``, that is all checking
  options enabled with the exception of :switch:`-gnatyB`, :switch:`-gnatyd`,
  :switch:`-gnatyI`, :switch:`-gnatyLnnn`, :switch:`-gnatyo`, :switch:`-gnatyO`,
  :switch:`-gnatyS`, :switch:`-gnatyu`, and :switch:`-gnatyx`.


.. index:: -gnaty- (gcc)

:switch:`-gnaty-`
  *Remove style check options.*

  This causes any subsequent options in the string to act as canceling the
  corresponding style check option. To cancel maximum nesting level control,
  use the ``L`` parameter without any integer value after that, because any
  digit following *-* in the parameter string of the :switch:`-gnaty`
  option will be treated as canceling the indentation check. The same is true
  for the ``M`` parameter. ``y`` and ``N`` parameters are not
  allowed after *-*.


.. index:: -gnaty+ (gcc)

:switch:`-gnaty+`
  *Enable style check options.*

  This causes any subsequent options in the string to enable the corresponding
  style check option. That is, it cancels the effect of a previous -,
  if any.


.. end of switch description (leave this comment to ease automatic parsing for
.. GNAT Studio

In the above rules, appearing in column one is always permitted, that is,
counts as meeting either a requirement for a required preceding space,
or as meeting a requirement for no preceding space.

Appearing at the end of a line is also always permitted, that is, counts
as meeting either a requirement for a following space, or as meeting
a requirement for no following space.

If any of these style rules is violated, a message is generated giving
details on the violation. The initial characters of such messages are
always '`(style)`'. Note that these messages are treated as warning
messages, so they normally do not prevent the generation of an object
file. The :switch:`-gnatwe` switch can be used to treat warning messages,
including style messages, as fatal errors.

The switch :switch:`-gnaty` on its own (that is not
followed by any letters or digits) is equivalent
to the use of :switch:`-gnatyy` as described above, that is all
built-in standard style check options are enabled.

The switch :switch:`-gnatyN` clears any previously set style checks.

.. _Run-Time_Checks:

Run-Time Checks
---------------

.. index:: Division by zero

.. index:: Access before elaboration

.. index:: Checks, division by zero

.. index:: Checks, access before elaboration

.. index:: Checks, stack overflow checking

By default, the following checks are suppressed: stack overflow
checks, and checks for access before elaboration on subprogram
calls. All other checks, including overflow checks, range checks and
array bounds checks, are turned on by default. The following ``gcc``
switches refine this default behavior.

.. index:: -gnatp  (gcc)

:switch:`-gnatp`
  .. index:: Suppressing checks

  .. index:: Checks, suppressing

  This switch causes the unit to be compiled
  as though ``pragma Suppress (All_checks)``
  had been present in the source. Validity checks are also eliminated (in
  other words :switch:`-gnatp` also implies :switch:`-gnatVn`.
  Use this switch to improve the performance
  of the code at the expense of safety in the presence of invalid data or
  program bugs.

  Note that when checks are suppressed, the compiler is allowed, but not
  required, to omit the checking code. If the run-time cost of the
  checking code is zero or near-zero, the compiler will generate it even
  if checks are suppressed. In particular, if the compiler can prove
  that a certain check will necessarily fail, it will generate code to
  do an unconditional 'raise', even if checks are suppressed. The
  compiler warns in this case. Another case in which checks may not be
  eliminated is when they are embedded in certain run-time routines such
  as math library routines.

  Of course, run-time checks are omitted whenever the compiler can prove
  that they will not fail, whether or not checks are suppressed.

  Note that if you suppress a check that would have failed, program
  execution is erroneous, which means the behavior is totally
  unpredictable. The program might crash, or print wrong answers, or
  do anything else. It might even do exactly what you wanted it to do
  (and then it might start failing mysteriously next week or next
  year). The compiler will generate code based on the assumption that
  the condition being checked is true, which can result in erroneous
  execution if that assumption is wrong.

  The checks subject to suppression include all the checks defined by the Ada
  standard, the additional implementation defined checks ``Alignment_Check``,
  ``Duplicated_Tag_Check``, ``Predicate_Check``, ``Container_Checks``, ``Tampering_Check``,
  and ``Validity_Check``, as well as any checks introduced using ``pragma Check_Name``.
  Note that ``Atomic_Synchronization`` is not automatically suppressed by use of this option.

  If the code depends on certain checks being active, you can use
  pragma ``Unsuppress`` either as a configuration pragma or as
  a local pragma to make sure that a specified check is performed
  even if ``gnatp`` is specified.

  The :switch:`-gnatp` switch has no effect if a subsequent
  :switch:`-gnat-p` switch appears.


.. index:: -gnat-p  (gcc)
.. index:: Suppressing checks
.. index:: Checks, suppressing
.. index:: Suppress

:switch:`-gnat-p`
  This switch cancels the effect of a previous ``gnatp`` switch.


.. index:: -gnato??  (gcc)
.. index:: Overflow checks
.. index:: Overflow mode
.. index:: Check, overflow

:switch:`-gnato??`
  This switch controls the mode used for computing intermediate
  arithmetic integer operations, and also enables overflow checking.
  For a full description of overflow mode and checking control, see
  the 'Overflow Check Handling in GNAT' appendix in this
  User's Guide.

  Overflow checks are always enabled by this switch. The argument
  controls the mode, using the codes


  *1 = STRICT*
    In STRICT mode, intermediate operations are always done using the
    base type, and overflow checking ensures that the result is within
    the base type range.


  *2 = MINIMIZED*
    In MINIMIZED mode, overflows in intermediate operations are avoided
    where possible by using a larger integer type for the computation
    (typically ``Long_Long_Integer``). Overflow checking ensures that
    the result fits in this larger integer type.


  *3 = ELIMINATED*
    In ELIMINATED mode, overflows in intermediate operations are avoided
    by using multi-precision arithmetic. In this case, overflow checking
    has no effect on intermediate operations (since overflow is impossible).

  If two digits are present after :switch:`-gnato` then the first digit
  sets the mode for expressions outside assertions, and the second digit
  sets the mode for expressions within assertions. Here assertions is used
  in the technical sense (which includes for example precondition and
  postcondition expressions).

  If one digit is present, the corresponding mode is applicable to both
  expressions within and outside assertion expressions.

  If no digits are present, the default is to enable overflow checks
  and set STRICT mode for both kinds of expressions. This is compatible
  with the use of :switch:`-gnato` in previous versions of GNAT.

  .. index:: Machine_Overflows

  Note that the :switch:`-gnato??` switch does not affect the code generated
  for any floating-point operations; it applies only to integer semantics.
  For floating-point, GNAT has the ``Machine_Overflows``
  attribute set to ``False`` and the normal mode of operation is to
  generate IEEE NaN and infinite values on overflow or invalid operations
  (such as dividing 0.0 by 0.0).

  The reason that we distinguish overflow checking from other kinds of
  range constraint checking is that a failure of an overflow check, unlike
  for example the failure of a range check, can result in an incorrect
  value, but cannot cause random memory destruction (like an out of range
  subscript), or a wild jump (from an out of range case value). Overflow
  checking is also quite expensive in time and space, since in general it
  requires the use of double length arithmetic.

  Note again that the default is :switch:`-gnato11` (equivalent to :switch:`-gnato1`),
  so overflow checking is performed in STRICT mode by default.


.. index:: -gnatE  (gcc)
.. index:: Elaboration checks
.. index:: Check, elaboration

:switch:`-gnatE`
  Enables dynamic checks for access-before-elaboration
  on subprogram calls and generic instantiations.
  Note that :switch:`-gnatE` is not necessary for safety, because in the
  default mode, GNAT ensures statically that the checks would not fail.
  For full details of the effect and use of this switch,
  :ref:`Compiling_with_gcc`.


.. index:: -fstack-check  (gcc)
.. index:: Stack Overflow Checking
.. index:: Checks, stack overflow checking

:switch:`-fstack-check`
  Activates stack overflow checking. For full details of the effect and use of
  this switch see :ref:`Stack_Overflow_Checking`.

.. index:: Unsuppress

The setting of these switches only controls the default setting of the
checks. You may modify them using either ``Suppress`` (to remove
checks) or ``Unsuppress`` (to add back suppressed checks) pragmas in
the program source.


.. _Using_gcc_for_Syntax_Checking:

Using ``gcc`` for Syntax Checking
---------------------------------

.. index:: -gnats  (gcc)

:switch:`-gnats`
  The ``s`` stands for 'syntax'.

  Run GNAT in syntax checking only mode. For
  example, the command

  ::

    $ gcc -c -gnats x.adb

  compiles file :file:`x.adb` in syntax-check-only mode. You can check a
  series of files in a single command
  , and can use wildcards to specify such a group of files.
  Note that you must specify the :switch:`-c` (compile
  only) flag in addition to the :switch:`-gnats` flag.

  You may use other switches in conjunction with :switch:`-gnats`. In
  particular, :switch:`-gnatl` and :switch:`-gnatv` are useful to control the
  format of any generated error messages.

  When the source file is empty or contains only empty lines and/or comments,
  the output is a warning:


  ::

    $ gcc -c -gnats -x ada toto.txt
    toto.txt:1:01: warning: empty file, contains no compilation units
    $


  Otherwise, the output is simply the error messages, if any. No object file or
  ALI file is generated by a syntax-only compilation. Also, no units other
  than the one specified are accessed. For example, if a unit ``X``
  |withs| a unit ``Y``, compiling unit ``X`` in syntax
  check only mode does not access the source file containing unit
  ``Y``.

  .. index:: Multiple units, syntax checking

  Normally, GNAT allows only a single unit in a source file. However, this
  restriction does not apply in syntax-check-only mode, and it is possible
  to check a file containing multiple compilation units concatenated
  together. This is primarily used by the ``gnatchop`` utility
  (:ref:`Renaming_Files_with_gnatchop`).

.. _Using_gcc_for_Semantic_Checking:

Using ``gcc`` for Semantic Checking
-----------------------------------



.. index:: -gnatc  (gcc)

:switch:`-gnatc`
  The ``c`` stands for 'check'.
  Causes the compiler to operate in semantic check mode,
  with full checking for all illegalities specified in the
  Ada Reference Manual, but without generation of any object code
  (no object file is generated).

  Because dependent files must be accessed, you must follow the GNAT
  semantic restrictions on file structuring to operate in this mode:

  * The needed source files must be accessible
    (see :ref:`Search_Paths_and_the_Run-Time_Library_RTL`).

  * Each file must contain only one compilation unit.

  * The file name and unit name must match (:ref:`File_Naming_Rules`).

  The output consists of error messages as appropriate. No object file is
  generated. An :file:`ALI` file is generated for use in the context of
  cross-reference tools, but this file is marked as not being suitable
  for binding (since no object file is generated).
  The checking corresponds exactly to the notion of
  legality in the Ada Reference Manual.

  Any unit can be compiled in semantics-checking-only mode, including
  units that would not normally be compiled (subunits,
  and specifications where a separate body is present).

.. _Compiling_Different_Versions_of_Ada:

Compiling Different Versions of Ada
-----------------------------------

The switches described in this section allow you to explicitly specify
the version of the Ada language that your programs are written in.
The default mode is Ada 2012,
but you can also specify Ada 95, Ada 2005 mode, or
indicate Ada 83 compatibility mode.


.. index:: Compatibility with Ada 83
.. index:: -gnat83  (gcc)
.. index:: ACVC, Ada 83 tests
.. index:: Ada 83 mode

:switch:`-gnat83` (Ada 83 Compatibility Mode)
  Although GNAT is primarily an Ada 95 / Ada 2005 compiler, this switch
  specifies that the program is to be compiled in Ada 83 mode. With
  :switch:`-gnat83`, GNAT rejects most post-Ada 83 extensions and applies Ada 83
  semantics where this can be done easily.
  It is not possible to guarantee this switch does a perfect
  job; some subtle tests, such as are
  found in earlier ACVC tests (and that have been removed from the ACATS suite
  for Ada 95), might not compile correctly.
  Nevertheless, this switch may be useful in some circumstances, for example
  where, due to contractual reasons, existing code needs to be maintained
  using only Ada 83 features.

  With few exceptions (most notably the need to use ``<>`` on
  unconstrained :index:`generic formal parameters <Generic formal parameters>`,
  the use of the new Ada 95 / Ada 2005
  reserved words, and the use of packages
  with optional bodies), it is not necessary to specify the
  :switch:`-gnat83` switch when compiling Ada 83 programs, because, with rare
  exceptions, Ada 95 and Ada 2005 are upwardly compatible with Ada 83. Thus
  a correct Ada 83 program is usually also a correct program
  in these later versions of the language standard. For further information
  please refer to the *Compatibility and Porting Guide* chapter in the
  :title:`GNAT Reference Manual`.


.. index:: -gnat95  (gcc)
.. index:: Ada 95 mode

:switch:`-gnat95` (Ada 95 mode)
  This switch directs the compiler to implement the Ada 95 version of the
  language.
  Since Ada 95 is almost completely upwards
  compatible with Ada 83, Ada 83 programs may generally be compiled using
  this switch (see the description of the :switch:`-gnat83` switch for further
  information about Ada 83 mode).
  If an Ada 2005 program is compiled in Ada 95 mode,
  uses of the new Ada 2005 features will cause error
  messages or warnings.

  This switch also can be used to cancel the effect of a previous
  :switch:`-gnat83`, :switch:`-gnat05/2005`, or :switch:`-gnat12/2012`
  switch earlier in the command line.


.. index:: -gnat05  (gcc)
.. index:: -gnat2005  (gcc)
.. index:: Ada 2005 mode

:switch:`-gnat05` or :switch:`-gnat2005` (Ada 2005 mode)
  This switch directs the compiler to implement the Ada 2005 version of the
  language, as documented in the official Ada standards document.
  Since Ada 2005 is almost completely upwards
  compatible with Ada 95 (and thus also with Ada 83), Ada 83 and Ada 95 programs
  may generally be compiled using this switch (see the description of the
  :switch:`-gnat83` and :switch:`-gnat95` switches for further
  information).


.. index:: -gnat12  (gcc)
.. index:: -gnat2012  (gcc)
.. index:: Ada 2012 mode

:switch:`-gnat12` or :switch:`-gnat2012` (Ada 2012 mode)
  This switch directs the compiler to implement the Ada 2012 version of the
  language (also the default).
  Since Ada 2012 is almost completely upwards
  compatible with Ada 2005 (and thus also with Ada 83, and Ada 95),
  Ada 83 and Ada 95 programs
  may generally be compiled using this switch (see the description of the
  :switch:`-gnat83`, :switch:`-gnat95`, and :switch:`-gnat05/2005` switches
  for further information).


.. index:: -gnat2022  (gcc)
.. index:: Ada 2022 mode

:switch:`-gnat2022` (Ada 2022 mode)
  This switch directs the compiler to implement the Ada 2022 version of the
  language.


.. index:: -gnatX  (gcc)
.. index:: Ada language extensions
.. index:: GNAT extensions

:switch:`-gnatX` (Enable GNAT Extensions)
  This switch directs the compiler to implement the latest version of the
  language (currently Ada 2022) and also to enable certain GNAT implementation
  extensions that are not part of any Ada standard. For a full list of these
  extensions, see the GNAT reference manual, ``Pragma Extensions_Allowed``.


.. _Character_Set_Control:

Character Set Control
---------------------

.. index:: -gnati  (gcc)

:switch:`-gnati{c}`
  Normally GNAT recognizes the Latin-1 character set in source program
  identifiers, as described in the Ada Reference Manual.
  This switch causes
  GNAT to recognize alternate character sets in identifiers. ``c`` is a
  single character  indicating the character set, as follows:

  ========== ======================================================
  *1*         ISO 8859-1 (Latin-1) identifiers
  *2*         ISO 8859-2 (Latin-2) letters allowed in identifiers
  *3*         ISO 8859-3 (Latin-3) letters allowed in identifiers
  *4*         ISO 8859-4 (Latin-4) letters allowed in identifiers
  *5*         ISO 8859-5 (Cyrillic) letters allowed in identifiers
  *9*         ISO 8859-15 (Latin-9) letters allowed in identifiers
  *p*         IBM PC letters (code page 437) allowed in identifiers
  *8*         IBM PC letters (code page 850) allowed in identifiers
  *f*         Full upper-half codes allowed in identifiers
  *n*         No upper-half codes allowed in identifiers
  *w*         Wide-character codes (that is, codes greater than 255)
              allowed in identifiers
  ========== ======================================================

  See :ref:`Foreign_Language_Representation` for full details on the
  implementation of these character sets.


.. index:: -gnatW  (gcc)

:switch:`-gnatW{e}`
  Specify the method of encoding for wide characters.
  ``e`` is one of the following:

  ========== ======================================================
  *h*        Hex encoding (brackets coding also recognized)
  *u*        Upper half encoding (brackets encoding also recognized)
  *s*        Shift/JIS encoding (brackets encoding also recognized)
  *e*        EUC encoding (brackets encoding also recognized)
  *8*        UTF-8 encoding (brackets encoding also recognized)
  *b*        Brackets encoding only (default value)
  ========== ======================================================

  For full details on these encoding
  methods see :ref:`Wide_Character_Encodings`.
  Note that brackets coding is always accepted, even if one of the other
  options is specified, so for example :switch:`-gnatW8` specifies that both
  brackets and UTF-8 encodings will be recognized. The units that are
  with'ed directly or indirectly will be scanned using the specified
  representation scheme, and so if one of the non-brackets scheme is
  used, it must be used consistently throughout the program. However,
  since brackets encoding is always recognized, it may be conveniently
  used in standard libraries, allowing these libraries to be used with
  any of the available coding schemes.

  Note that brackets encoding only applies to program text. Within comments,
  brackets are considered to be normal graphic characters, and bracket sequences
  are never recognized as wide characters.

  If no :switch:`-gnatW?` parameter is present, then the default
  representation is normally Brackets encoding only. However, if the
  first three characters of the file are 16#EF# 16#BB# 16#BF# (the standard
  byte order mark or BOM for UTF-8), then these three characters are
  skipped and the default representation for the file is set to UTF-8.

  Note that the wide character representation that is specified (explicitly
  or by default) for the main program also acts as the default encoding used
  for Wide_Text_IO files if not specifically overridden by a WCEM form
  parameter.


When no :switch:`-gnatW?` is specified, then characters (other than wide
characters represented using brackets notation) are treated as 8-bit
Latin-1 codes. The codes recognized are the Latin-1 graphic characters,
and ASCII format effectors (CR, LF, HT, VT). Other lower half control
characters in the range 16#00#..16#1F# are not accepted in program text
or in comments. Upper half control characters (16#80#..16#9F#) are rejected
in program text, but allowed and ignored in comments. Note in particular
that the Next Line (NEL) character whose encoding is 16#85# is not recognized
as an end of line in this default mode. If your source program contains
instances of the NEL character used as a line terminator,
you must use UTF-8 encoding for the whole
source program. In default mode, all lines must be ended by a standard
end of line sequence (CR, CR/LF, or LF).

Note that the convention of simply accepting all upper half characters in
comments means that programs that use standard ASCII for program text, but
UTF-8 encoding for comments are accepted in default mode, providing that the
comments are ended by an appropriate (CR, or CR/LF, or LF) line terminator.
This is a common mode for many programs with foreign language comments.

.. _File_Naming_Control:

File Naming Control
-------------------

.. index:: -gnatk  (gcc)

:switch:`-gnatk{n}`
  Activates file name 'krunching'. ``n``, a decimal integer in the range
  1-999, indicates the maximum allowable length of a file name (not
  including the :file:`.ads` or :file:`.adb` extension). The default is not
  to enable file name krunching.

  For the source file naming rules, :ref:`File_Naming_Rules`.

.. _Subprogram_Inlining_Control:

Subprogram Inlining Control
---------------------------

.. index:: -gnatn  (gcc)

:switch:`-gnatn[12]`
  The ``n`` here is intended to suggest the first syllable of the word 'inline'.
  GNAT recognizes and processes ``Inline`` pragmas. However, for inlining to
  actually occur, optimization must be enabled and, by default, inlining of
  subprograms across units is not performed. If you want to additionally
  enable inlining of subprograms specified by pragma ``Inline`` across units,
  you must also specify this switch.

  In the absence of this switch, GNAT does not attempt inlining across units
  and does not access the bodies of subprograms for which ``pragma Inline`` is
  specified if they are not in the current unit.

  You can optionally specify the inlining level: 1 for moderate inlining across
  units, which is a good compromise between compilation times and performances
  at run time, or 2 for full inlining across units, which may bring about
  longer compilation times. If no inlining level is specified, the compiler will
  pick it based on the optimization level: 1 for :switch:`-O1`, :switch:`-O2` or
  :switch:`-Os` and 2 for :switch:`-O3`.

  If you specify this switch the compiler will access these bodies,
  creating an extra source dependency for the resulting object file, and
  where possible, the call will be inlined.
  For further details on when inlining is possible
  see :ref:`Inlining_of_Subprograms`.


.. index:: -gnatN  (gcc)

:switch:`-gnatN`
  This switch activates front-end inlining which also
  generates additional dependencies.

  When using a gcc-based back end, then the use of
  :switch:`-gnatN` is deprecated, and the use of :switch:`-gnatn` is preferred.
  Historically front end inlining was more extensive than the gcc back end
  inlining, but that is no longer the case.

.. _Auxiliary_Output_Control:

Auxiliary Output Control
------------------------

.. index:: -gnatu  (gcc)

:switch:`-gnatu`
  Print a list of units required by this compilation on :file:`stdout`.
  The listing includes all units on which the unit being compiled depends
  either directly or indirectly.


.. index:: -pass-exit-codes  (gcc)

:switch:`-pass-exit-codes`
  If this switch is not used, the exit code returned by ``gcc`` when
  compiling multiple files indicates whether all source files have
  been successfully used to generate object files or not.

  When :switch:`-pass-exit-codes` is used, ``gcc`` exits with an extended
  exit status and allows an integrated development environment to better
  react to a compilation failure. Those exit status are:

  ========== ======================================================
  *5*        There was an error in at least one source file.
  *3*        At least one source file did not generate an object file.
  *2*        The compiler died unexpectedly (internal error for example).
  *0*        An object file has been generated for every source file.
  ========== ======================================================

.. _Debugging_Control:

Debugging Control
-----------------

  .. index:: Debugging options


.. index:: -gnatd  (gcc)

:switch:`-gnatd{x}`
  Activate internal debugging switches. ``x`` is a letter or digit, or
  string of letters or digits, which specifies the type of debugging
  outputs desired. Normally these are used only for internal development
  or system debugging purposes. You can find full documentation for these
  switches in the body of the ``Debug`` unit in the compiler source
  file :file:`debug.adb`.


.. index:: -gnatG  (gcc)

:switch:`-gnatG[={nn}]`
  This switch causes the compiler to generate auxiliary output containing
  a pseudo-source listing of the generated expanded code. Like most Ada
  compilers, GNAT works by first transforming the high level Ada code into
  lower level constructs. For example, tasking operations are transformed
  into calls to the tasking run-time routines. A unique capability of GNAT
  is to list this expanded code in a form very close to normal Ada source.
  This is very useful in understanding the implications of various Ada
  usage on the efficiency of the generated code. There are many cases in
  Ada (e.g., the use of controlled types), where simple Ada statements can
  generate a lot of run-time code. By using :switch:`-gnatG` you can identify
  these cases, and consider whether it may be desirable to modify the coding
  approach to improve efficiency.

  The optional parameter ``nn`` if present after -gnatG specifies an
  alternative maximum line length that overrides the normal default of 72.
  This value is in the range 40-999999, values less than 40 being silently
  reset to 40. The equal sign is optional.

  The format of the output is very similar to standard Ada source, and is
  easily understood by an Ada programmer. The following special syntactic
  additions correspond to low level features used in the generated code that
  do not have any exact analogies in pure Ada source form. The following
  is a partial list of these special constructions. See the spec
  of package ``Sprint`` in file :file:`sprint.ads` for a full list.

  .. index:: -gnatL  (gcc)

  If the switch :switch:`-gnatL` is used in conjunction with
  :switch:`-gnatG`, then the original source lines are interspersed
  in the expanded source (as comment lines with the original line number).

  :samp:`new {xxx} [storage_pool = {yyy}]`
    Shows the storage pool being used for an allocator.


  :samp:`at end {procedure-name};`
    Shows the finalization (cleanup) procedure for a scope.


  :samp:`(if {expr} then {expr} else {expr})`
    Conditional expression equivalent to the ``x?y:z`` construction in C.


  :samp:`{target}^({source})`
    A conversion with floating-point truncation instead of rounding.


  :samp:`{target}?({source})`
    A conversion that bypasses normal Ada semantic checking. In particular
    enumeration types and fixed-point types are treated simply as integers.


  :samp:`{target}?^({source})`
    Combines the above two cases.


  :samp:`{x} #/ {y}`

  :samp:`{x} #mod {y}`

  :samp:`{x} # {y}`

  :samp:`{x} #rem {y}`
    A division or multiplication of fixed-point values which are treated as
    integers without any kind of scaling.


  :samp:`free {expr} [storage_pool = {xxx}]`
    Shows the storage pool associated with a ``free`` statement.


  :samp:`[subtype or type declaration]`
    Used to list an equivalent declaration for an internally generated
    type that is referenced elsewhere in the listing.


  :samp:`freeze {type-name} [{actions}]`
    Shows the point at which ``type-name`` is frozen, with possible
    associated actions to be performed at the freeze point.


  :samp:`reference {itype}`
    Reference (and hence definition) to internal type ``itype``.


  :samp:`{function-name}! ({arg}, {arg}, {arg})`
    Intrinsic function call.


  :samp:`{label-name} : label`
    Declaration of label ``labelname``.


  :samp:`#$ {subprogram-name}`
    An implicit call to a run-time support routine
    (to meet the requirement of H.3.1(9) in a
    convenient manner).


  :samp:`{expr} && {expr} && {expr} ... && {expr}`
    A multiple concatenation (same effect as ``expr`` & ``expr`` &
    ``expr``, but handled more efficiently).


  :samp:`[constraint_error]`
    Raise the ``Constraint_Error`` exception.


  :samp:`{expression}'reference`
    A pointer to the result of evaluating {expression}.


  :samp:`{target-type}!({source-expression})`
    An unchecked conversion of ``source-expression`` to ``target-type``.


  :samp:`[{numerator}/{denominator}]`
    Used to represent internal real literals (that) have no exact
    representation in base 2-16 (for example, the result of compile time
    evaluation of the expression 1.0/27.0).


.. index:: -gnatD  (gcc)

:switch:`-gnatD[=nn]`
  When used in conjunction with :switch:`-gnatG`, this switch causes
  the expanded source, as described above for
  :switch:`-gnatG` to be written to files with names
  :file:`xxx.dg`, where :file:`xxx` is the normal file name,
  instead of to the standard output file. For
  example, if the source file name is :file:`hello.adb`, then a file
  :file:`hello.adb.dg` will be written.  The debugging
  information generated by the ``gcc`` :switch:`-g` switch
  will refer to the generated :file:`xxx.dg` file. This allows
  you to do source level debugging using the generated code which is
  sometimes useful for complex code, for example to find out exactly
  which part of a complex construction raised an exception. This switch
  also suppresses generation of cross-reference information (see
  :switch:`-gnatx`) since otherwise the cross-reference information
  would refer to the :file:`.dg` file, which would cause
  confusion since this is not the original source file.

  Note that :switch:`-gnatD` actually implies :switch:`-gnatG`
  automatically, so it is not necessary to give both options.
  In other words :switch:`-gnatD` is equivalent to :switch:`-gnatDG`).

  .. index:: -gnatL  (gcc)

  If the switch :switch:`-gnatL` is used in conjunction with
  :switch:`-gnatDG`, then the original source lines are interspersed
  in the expanded source (as comment lines with the original line number).

  The optional parameter ``nn`` if present after -gnatD specifies an
  alternative maximum line length that overrides the normal default of 72.
  This value is in the range 40-999999, values less than 40 being silently
  reset to 40. The equal sign is optional.


.. index:: -gnatr  (gcc)
.. index:: pragma Restrictions

:switch:`-gnatr`
  This switch causes pragma Restrictions to be treated as Restriction_Warnings
  so that violation of restrictions causes warnings rather than illegalities.
  This is useful during the development process when new restrictions are added
  or investigated. The switch also causes pragma Profile to be treated as
  Profile_Warnings, and pragma Restricted_Run_Time and pragma Ravenscar set
  restriction warnings rather than restrictions.


.. index:: -gnatR  (gcc)

:switch:`-gnatR[0|1|2|3|4][e][j][m][s]`
  This switch controls output from the compiler of a listing showing
  representation information for declared types, objects and subprograms.
  For :switch:`-gnatR0`, no information is output (equivalent to omitting
  the :switch:`-gnatR` switch). For :switch:`-gnatR1` (which is the default,
  so :switch:`-gnatR` with no parameter has the same effect), size and
  alignment information is listed for declared array and record types.

  For :switch:`-gnatR2`, size and alignment information is listed for all
  declared types and objects. The ``Linker_Section`` is also listed for any
  entity for which the ``Linker_Section`` is set explicitly or implicitly (the
  latter case occurs for objects of a type for which a ``Linker_Section``
  is set).

  For :switch:`-gnatR3`, symbolic expressions for values that are computed
  at run time for records are included. These symbolic expressions have
  a mostly obvious format with #n being used to represent the value of the
  n'th discriminant. See source files :file:`repinfo.ads/adb` in the
  GNAT sources for full details on the format of :switch:`-gnatR3` output.

  For :switch:`-gnatR4`, information for relevant compiler-generated types
  is also listed, i.e. when they are structurally part of other declared
  types and objects.

  If the switch is followed by an ``e`` (e.g. :switch:`-gnatR2e`), then
  extended representation information for record sub-components of records
  is included.

  If the switch is followed by an ``m`` (e.g. :switch:`-gnatRm`), then
  subprogram conventions and parameter passing mechanisms for all the
  subprograms are included.

  If the switch is followed by a ``j`` (e.g., :switch:`-gnatRj`), then
  the output is in the JSON data interchange format specified by the
  ECMA-404 standard. The semantic description of this JSON output is
  available in the specification of the Repinfo unit present in the
  compiler sources.

  If the switch is followed by an ``s`` (e.g., :switch:`-gnatR3s`), then
  the output is to a file with the name :file:`file.rep` where ``file`` is
  the name of the corresponding source file, except if ``j`` is also
  specified, in which case the file name is :file:`file.json`.

  Note that it is possible for record components to have zero size. In
  this case, the component clause uses an obvious extension of permitted
  Ada syntax, for example ``at 0 range 0 .. -1``.


.. index:: -gnatS  (gcc)

:switch:`-gnatS`
  The use of the switch :switch:`-gnatS` for an
  Ada compilation will cause the compiler to output a
  representation of package Standard in a form very
  close to standard Ada. It is not quite possible to
  do this entirely in standard Ada (since new
  numeric base types cannot be created in standard
  Ada), but the output is easily
  readable to any Ada programmer, and is useful to
  determine the characteristics of target dependent
  types in package Standard.


.. index:: -gnatx  (gcc)

:switch:`-gnatx`
  Normally the compiler generates full cross-referencing information in
  the :file:`ALI` file. This information is used by a number of tools,
  including ``gnatfind`` and ``gnatxref``. The :switch:`-gnatx` switch
  suppresses this information. This saves some space and may slightly
  speed up compilation, but means that these tools cannot be used.


.. index:: -fgnat-encodings  (gcc)

:switch:`-fgnat-encodings=[all|gdb|minimal]`
  This switch controls the balance between GNAT encodings and standard DWARF
  emitted in the debug information.

  Historically, old debug formats like stabs were not powerful enough to
  express some Ada types (for instance, variant records or fixed-point types).
  To work around this, GNAT introduced proprietary encodings that embed the
  missing information ("GNAT encodings").

  Recent versions of the DWARF debug information format are now able to
  correctly describe most of these Ada constructs ("standard DWARF"). As
  third-party tools started to use this format, GNAT has been enhanced to
  generate it. However, most tools (including GDB) are still relying on GNAT
  encodings.

  To support all tools, GNAT needs to be versatile about the balance between
  generation of GNAT encodings and standard DWARF. This is what
  :switch:`-fgnat-encodings` is about.

  * ``=all``: Emit all GNAT encodings, and then emit as much standard DWARF as
    possible so it does not conflict with GNAT encodings.
  * ``=gdb``: Emit as much standard DWARF as possible as long as the current
    GDB handles it. Emit GNAT encodings for the rest.
  * ``=minimal``: Emit as much standard DWARF as possible and emit GNAT
    encodings for the rest.


.. _Exception_Handling_Control:

Exception Handling Control
--------------------------

GNAT uses two methods for handling exceptions at run time. The
``setjmp/longjmp`` method saves the context when entering
a frame with an exception handler. Then when an exception is
raised, the context can be restored immediately, without the
need for tracing stack frames. This method provides very fast
exception propagation, but introduces significant overhead for
the use of exception handlers, even if no exception is raised.

The other approach is called 'zero cost' exception handling.
With this method, the compiler builds static tables to describe
the exception ranges. No dynamic code is required when entering
a frame containing an exception handler. When an exception is
raised, the tables are used to control a back trace of the
subprogram invocation stack to locate the required exception
handler. This method has considerably poorer performance for
the propagation of exceptions, but there is no overhead for
exception handlers if no exception is raised. Note that in this
mode and in the context of mixed Ada and C/C++ programming,
to propagate an exception through a C/C++ code, the C/C++ code
must be compiled with the :switch:`-funwind-tables` GCC's
option.

The following switches may be used to control which of the
two exception handling methods is used.



.. index:: --RTS=sjlj  (gnatmake)

:switch:`--RTS=sjlj`
  This switch causes the setjmp/longjmp run-time (when available) to be used
  for exception handling. If the default
  mechanism for the target is zero cost exceptions, then
  this switch can be used to modify this default, and must be
  used for all units in the partition.
  This option is rarely used. One case in which it may be
  advantageous is if you have an application where exception
  raising is common and the overall performance of the
  application is improved by favoring exception propagation.


.. index:: --RTS=zcx  (gnatmake)
.. index:: Zero Cost Exceptions

:switch:`--RTS=zcx`
  This switch causes the zero cost approach to be used
  for exception handling. If this is the default mechanism for the
  target (see below), then this switch is unneeded. If the default
  mechanism for the target is setjmp/longjmp exceptions, then
  this switch can be used to modify this default, and must be
  used for all units in the partition.
  This option can only be used if the zero cost approach
  is available for the target in use, otherwise it will generate an error.

The same option :switch:`--RTS` must be used both for ``gcc``
and ``gnatbind``. Passing this option to ``gnatmake``
(:ref:`Switches_for_gnatmake`) will ensure the required consistency
through the compilation and binding steps.

.. _Units_to_Sources_Mapping_Files:

Units to Sources Mapping Files
------------------------------



.. index:: -gnatem  (gcc)

:switch:`-gnatem={path}`
  A mapping file is a way to communicate to the compiler two mappings:
  from unit names to file names (without any directory information) and from
  file names to path names (with full directory information). These mappings
  are used by the compiler to short-circuit the path search.

  The use of mapping files is not required for correct operation of the
  compiler, but mapping files can improve efficiency, particularly when
  sources are read over a slow network connection. In normal operation,
  you need not be concerned with the format or use of mapping files,
  and the :switch:`-gnatem` switch is not a switch that you would use
  explicitly. It is intended primarily for use by automatic tools such as
  ``gnatmake`` running under the project file facility. The
  description here of the format of mapping files is provided
  for completeness and for possible use by other tools.

  A mapping file is a sequence of sets of three lines. In each set, the
  first line is the unit name, in lower case, with ``%s`` appended
  for specs and ``%b`` appended for bodies; the second line is the
  file name; and the third line is the path name.

  Example::

       main%b
       main.2.ada
       /gnat/project1/sources/main.2.ada


  When the switch :switch:`-gnatem` is specified, the compiler will
  create in memory the two mappings from the specified file. If there is
  any problem (nonexistent file, truncated file or duplicate entries),
  no mapping will be created.

  Several :switch:`-gnatem` switches may be specified; however, only the
  last one on the command line will be taken into account.

  When using a project file, ``gnatmake`` creates a temporary
  mapping file and communicates it to the compiler using this switch.


.. _Code_Generation_Control:

Code Generation Control
-----------------------

The GCC technology provides a wide range of target dependent
:switch:`-m` switches for controlling
details of code generation with respect to different versions of
architectures. This includes variations in instruction sets (e.g.,
different members of the power pc family), and different requirements
for optimal arrangement of instructions (e.g., different members of
the x86 family). The list of available :switch:`-m` switches may be
found in the GCC documentation.

Use of these :switch:`-m` switches may in some cases result in improved
code performance.

The GNAT technology is tested and qualified without any
:switch:`-m` switches,
so generally the most reliable approach is to avoid the use of these
switches. However, we generally expect most of these switches to work
successfully with GNAT, and many customers have reported successful
use of these options.

Our general advice is to avoid the use of :switch:`-m` switches unless
special needs lead to requirements in this area. In particular,
there is no point in using :switch:`-m` switches to improve performance
unless you actually see a performance improvement.


.. _Linker_Switches:

Linker Switches
===============

Linker switches can be specified after :switch:`-largs` builder switch.

.. index:: -fuse-ld=name

:switch:`-fuse-ld={name}`
  Linker to be used. The default is ``bfd`` for :file:`ld.bfd`,
  the alternative being ``gold`` for :file:`ld.gold`. The later is
  a more recent and faster linker, but only available on GNU/Linux
  platforms.

.. _Binding_with_gnatbind:

Binding with ``gnatbind``
=========================

.. index:: ! gnatbind

This chapter describes the GNAT binder, ``gnatbind``, which is used
to bind compiled GNAT objects.

The ``gnatbind`` program performs four separate functions:

* Checks that a program is consistent, in accordance with the rules in
  Chapter 10 of the Ada Reference Manual. In particular, error
  messages are generated if a program uses inconsistent versions of a
  given unit.

* Checks that an acceptable order of elaboration exists for the program
  and issues an error message if it cannot find an order of elaboration
  that satisfies the rules in Chapter 10 of the Ada Language Manual.

* Generates a main program incorporating the given elaboration order.
  This program is a small Ada package (body and spec) that
  must be subsequently compiled
  using the GNAT compiler. The necessary compilation step is usually
  performed automatically by ``gnatlink``. The two most important
  functions of this program
  are to call the elaboration routines of units in an appropriate order
  and to call the main program.

* Determines the set of object files required by the given main program.
  This information is output in the forms of comments in the generated program,
  to be read by the ``gnatlink`` utility used to link the Ada application.

.. _Running_gnatbind:

Running ``gnatbind``
--------------------

The form of the ``gnatbind`` command is

.. code-block:: sh

  $ gnatbind [ switches ] mainprog[.ali] [ switches ]


where :file:`mainprog.adb` is the Ada file containing the main program
unit body. ``gnatbind`` constructs an Ada
package in two files whose names are
:file:`b~mainprog.ads`, and :file:`b~mainprog.adb`.
For example, if given the
parameter :file:`hello.ali`, for a main program contained in file
:file:`hello.adb`, the binder output files would be :file:`b~hello.ads`
and :file:`b~hello.adb`.

When doing consistency checking, the binder takes into consideration
any source files it can locate. For example, if the binder determines
that the given main program requires the package ``Pack``, whose
:file:`.ALI`
file is :file:`pack.ali` and whose corresponding source spec file is
:file:`pack.ads`, it attempts to locate the source file :file:`pack.ads`
(using the same search path conventions as previously described for the
``gcc`` command). If it can locate this source file, it checks that
the time stamps
or source checksums of the source and its references to in :file:`ALI` files
match. In other words, any :file:`ALI` files that mentions this spec must have
resulted from compiling this version of the source file (or in the case
where the source checksums match, a version close enough that the
difference does not matter).

.. index:: Source files, use by binder

The effect of this consistency checking, which includes source files, is
that the binder ensures that the program is consistent with the latest
version of the source files that can be located at bind time. Editing a
source file without compiling files that depend on the source file cause
error messages to be generated by the binder.

For example, suppose you have a main program :file:`hello.adb` and a
package ``P``, from file :file:`p.ads` and you perform the following
steps:

* Enter ``gcc -c hello.adb`` to compile the main program.

* Enter ``gcc -c p.ads`` to compile package ``P``.

* Edit file :file:`p.ads`.

* Enter ``gnatbind hello``.

At this point, the file :file:`p.ali` contains an out-of-date time stamp
because the file :file:`p.ads` has been edited. The attempt at binding
fails, and the binder generates the following error messages:


::

  error: "hello.adb" must be recompiled ("p.ads" has been modified)
  error: "p.ads" has been modified and must be recompiled


Now both files must be recompiled as indicated, and then the bind can
succeed, generating a main program. You need not normally be concerned
with the contents of this file, but for reference purposes a sample
binder output file is given in :ref:`Example_of_Binder_Output_File`.

In most normal usage, the default mode of ``gnatbind`` which is to
generate the main package in Ada, as described in the previous section.
In particular, this means that any Ada programmer can read and understand
the generated main program. It can also be debugged just like any other
Ada code provided the :switch:`-g` switch is used for
``gnatbind`` and ``gnatlink``.

.. _Switches_for_gnatbind:

Switches for ``gnatbind``
-------------------------

The following switches are available with ``gnatbind``; details will
be presented in subsequent sections.


.. index:: --version  (gnatbind)

:switch:`--version`
  Display Copyright and version, then exit disregarding all other options.


.. index:: --help  (gnatbind)

:switch:`--help`
  If :switch:`--version` was not used, display usage, then exit disregarding
  all other options.


.. index:: -a  (gnatbind)

:switch:`-a`
  Indicates that, if supported by the platform, the adainit procedure should
  be treated as an initialisation routine by the linker (a constructor). This
  is intended to be used by the Project Manager to automatically initialize
  shared Stand-Alone Libraries.


.. index:: -aO  (gnatbind)

:switch:`-aO`
  Specify directory to be searched for ALI files.


.. index:: -aI  (gnatbind)

:switch:`-aI`
  Specify directory to be searched for source file.


.. index:: -A  (gnatbind)

:switch:`-A[={filename}]`
  Output ALI list (to standard output or to the named file).


.. index:: -b  (gnatbind)

:switch:`-b`
  Generate brief messages to :file:`stderr` even if verbose mode set.


.. index:: -c  (gnatbind)

:switch:`-c`
  Check only, no generation of binder output file.


.. index:: -dnn[k|m] (gnatbind)

:switch:`-d{nn}[k|m]`
  This switch can be used to change the default task stack size value
  to a specified size ``nn``, which is expressed in bytes by default, or
  in kilobytes when suffixed with ``k`` or in megabytes when suffixed
  with ``m``.
  In the absence of a :samp:`[k|m]` suffix, this switch is equivalent,
  in effect, to completing all task specs with

  .. code-block:: ada

       pragma Storage_Size (nn);

  When they do not already have such a pragma.


.. index:: -D  (gnatbind)

:switch:`-D{nn}[k|m]`
  Set the default secondary stack size to ``nn``. The suffix indicates whether
  the size is in bytes (no suffix), kilobytes (``k`` suffix) or megabytes
  (``m`` suffix).

  The secondary stack holds objects of unconstrained types that are returned by
  functions, for example unconstrained Strings. The size of the secondary stack
  can be dynamic or fixed depending on the target.

  For most targets, the secondary stack grows on demand and is implemented as
  a chain of blocks in the heap. In this case, the default secondary stack size
  determines the initial size of the secondary stack for each task and the
  smallest amount the secondary stack can grow by.

  For Ravenscar, ZFP, and Cert run-times the size of the secondary stack is
  fixed. This switch can be used to change the default size of these stacks.
  The default secondary stack size can be overridden on a per-task basis if
  individual tasks have different secondary stack requirements. This is
  achieved through the Secondary_Stack_Size aspect that takes the size of the
  secondary stack in bytes.

.. index:: -e  (gnatbind)

:switch:`-e`
  Output complete list of elaboration-order dependencies.


.. index:: -Ea  (gnatbind)

:switch:`-Ea`
  Store tracebacks in exception occurrences when the target supports it.
  The "a" is for "address"; tracebacks will contain hexadecimal addresses,
  unless symbolic tracebacks are enabled.

  See also the packages ``GNAT.Traceback`` and
  ``GNAT.Traceback.Symbolic`` for more information.
  Note that on x86 ports, you must not use :switch:`-fomit-frame-pointer`
  ``gcc`` option.


.. index:: -Es  (gnatbind)

:switch:`-Es`
  Store tracebacks in exception occurrences when the target supports it.
  The "s" is for "symbolic"; symbolic tracebacks are enabled.


.. index:: -E  (gnatbind)

:switch:`-E`
  Currently the same as ``-Ea``.


.. index:: -f  (gnatbind)

:switch:`-f{elab-order}`
  Force elaboration order. For further details see :ref:`Elaboration_Control`
  and :ref:`Elaboration_Order_Handling_in_GNAT`.


.. index:: -F  (gnatbind)

:switch:`-F`
  Force the checks of elaboration flags. ``gnatbind`` does not normally
  generate checks of elaboration flags for the main executable, except when
  a Stand-Alone Library is used. However, there are cases when this cannot be
  detected by gnatbind. An example is importing an interface of a Stand-Alone
  Library through a pragma Import and only specifying through a linker switch
  this Stand-Alone Library. This switch is used to guarantee that elaboration
  flag checks are generated.


.. index:: -h  (gnatbind)

:switch:`-h`
  Output usage (help) information.


.. index:: -H  (gnatbind)

:switch:`-H`
  Legacy elaboration order model enabled. For further details see
  :ref:`Elaboration_Order_Handling_in_GNAT`.


.. index:: -H32  (gnatbind)

:switch:`-H32`
  Use 32-bit allocations for ``__gnat_malloc`` (and thus for access types).
  For further details see :ref:`Dynamic_Allocation_Control`.


.. index:: -H64  (gnatbind)
.. index:: __gnat_malloc

:switch:`-H64`
  Use 64-bit allocations for ``__gnat_malloc`` (and thus for access types).
  For further details see :ref:`Dynamic_Allocation_Control`.


  .. index:: -I  (gnatbind)

:switch:`-I`
  Specify directory to be searched for source and ALI files.


  .. index:: -I-  (gnatbind)

:switch:`-I-`
  Do not look for sources in the current directory where ``gnatbind`` was
  invoked, and do not look for ALI files in the directory containing the
  ALI file named in the ``gnatbind`` command line.


  .. index:: -l  (gnatbind)

:switch:`-l`
  Output chosen elaboration order.


  .. index:: -L  (gnatbind)

:switch:`-L{xxx}`
  Bind the units for library building. In this case the ``adainit`` and
  ``adafinal`` procedures (:ref:`Binding_with_Non-Ada_Main_Programs`)
  are renamed to :samp:`{xxx}init` and
  :samp:`{xxx}final`.
  Implies -n.
  (:ref:`GNAT_and_Libraries`, for more details.)


  .. index:: -M  (gnatbind)

:switch:`-M{xyz}`
  Rename generated main program from main to xyz. This option is
  supported on cross environments only.

  .. index:: -m  (gnatbind)

:switch:`-m{n}`
  Limit number of detected errors or warnings to ``n``, where ``n`` is
  in the range 1..999999. The default value if no switch is
  given is 9999. If the number of warnings reaches this limit, then a
  message is output and further warnings are suppressed, the bind
  continues in this case. If the number of errors reaches this
  limit, then a message is output and the bind is abandoned.
  A value of zero means that no limit is enforced. The equal
  sign is optional.

  .. index:: -minimal  (gnatbind)

:switch:`-minimal`
  Generate a binder file suitable for space-constrained applications. When
  active, binder-generated objects not required for program operation are no
  longer generated. **Warning:** this option comes with the following
  limitations:

  * Starting the program's execution in the debugger will cause it to
    stop at the start of the ``main`` function instead of the main subprogram.
    This can be worked around by manually inserting a breakpoint on that
    subprogram and resuming the program's execution until reaching that breakpoint.
  * Programs using GNAT.Compiler_Version will not link.

  .. index:: -n  (gnatbind)

:switch:`-n`
  No main program.


  .. index:: -nostdinc  (gnatbind)

:switch:`-nostdinc`
  Do not look for sources in the system default directory.


  .. index:: -nostdlib  (gnatbind)

:switch:`-nostdlib`
  Do not look for library files in the system default directory.


  .. index:: --RTS  (gnatbind)

:switch:`--RTS={rts-path}`
  Specifies the default location of the run-time library. Same meaning as the
  equivalent ``gnatmake`` flag (:ref:`Switches_for_gnatmake`).

  .. index:: -o   (gnatbind)

:switch:`-o {file}`
  Name the output file ``file`` (default is :file:`b~`xxx`.adb`).
  Note that if this option is used, then linking must be done manually,
  gnatlink cannot be used.


  .. index:: -O  (gnatbind)

:switch:`-O[={filename}]`
  Output object list (to standard output or to the named file).


  .. index:: -p  (gnatbind)

:switch:`-p`
  Pessimistic (worst-case) elaboration order.


  .. index:: -P  (gnatbind)

:switch:`-P`
  Generate binder file suitable for CodePeer.


  .. index:: -R  (gnatbind)

:switch:`-R`
  Output closure source list, which includes all non-run-time units that are
  included in the bind.


  .. index:: -Ra  (gnatbind)

:switch:`-Ra`
  Like :switch:`-R` but the list includes run-time units.


  .. index:: -s  (gnatbind)

:switch:`-s`
  Require all source files to be present.


  .. index:: -S  (gnatbind)

:switch:`-S{xxx}`
  Specifies the value to be used when detecting uninitialized scalar
  objects with pragma Initialize_Scalars.
  The ``xxx`` string specified with the switch is one of:

  * ``in`` for an invalid value.

    If zero is invalid for the discrete type in question,
    then the scalar value is set to all zero bits.
    For signed discrete types, the largest possible negative value of
    the underlying scalar is set (i.e. a one bit followed by all zero bits).
    For unsigned discrete types, the underlying scalar value is set to all
    one bits. For floating-point types, a NaN value is set
    (see body of package System.Scalar_Values for exact values).

  * ``lo`` for low value.

    If zero is invalid for the discrete type in question,
    then the scalar value is set to all zero bits.
    For signed discrete types, the largest possible negative value of
    the underlying scalar is set (i.e. a one bit followed by all zero bits).
    For unsigned discrete types, the underlying scalar value is set to all
    zero bits. For floating-point, a small value is set
    (see body of package System.Scalar_Values for exact values).

  * ``hi`` for high value.

    If zero is invalid for the discrete type in question,
    then the scalar value is set to all one bits.
    For signed discrete types, the largest possible positive value of
    the underlying scalar is set (i.e. a zero bit followed by all one bits).
    For unsigned discrete types, the underlying scalar value is set to all
    one bits. For floating-point, a large value is set
    (see body of package System.Scalar_Values for exact values).

  * ``xx`` for hex value (two hex digits).

    The underlying scalar is set to a value consisting of repeated bytes, whose
    value corresponds to the given value. For example if ``BF`` is given,
    then a 32-bit scalar value will be set to the bit patterm ``16#BFBFBFBF#``.

  .. index:: GNAT_INIT_SCALARS

  In addition, you can specify :switch:`-Sev` to indicate that the value is
  to be set at run time. In this case, the program will look for an environment
  variable of the form :samp:`GNAT_INIT_SCALARS={yy}`, where ``yy`` is one
  of :samp:`in/lo/hi/{xx}` with the same meanings as above.
  If no environment variable is found, or if it does not have a valid value,
  then the default is ``in`` (invalid values).

.. index:: -static  (gnatbind)

:switch:`-static`
  Link against a static GNAT run-time.


  .. index:: -shared  (gnatbind)

:switch:`-shared`
  Link against a shared GNAT run-time when available.


  .. index:: -t  (gnatbind)

:switch:`-t`
  Tolerate time stamp and other consistency errors.


  .. index:: -T  (gnatbind)

:switch:`-T{n}`
  Set the time slice value to ``n`` milliseconds. If the system supports
  the specification of a specific time slice value, then the indicated value
  is used. If the system does not support specific time slice values, but
  does support some general notion of round-robin scheduling, then any
  nonzero value will activate round-robin scheduling.

  A value of zero is treated specially. It turns off time
  slicing, and in addition, indicates to the tasking run-time that the
  semantics should match as closely as possible the Annex D
  requirements of the Ada RM, and in particular sets the default
  scheduling policy to ``FIFO_Within_Priorities``.


  .. index:: -u  (gnatbind)

:switch:`-u{n}`
  Enable dynamic stack usage, with ``n`` results stored and displayed
  at program termination. A result is generated when a task
  terminates. Results that can't be stored are displayed on the fly, at
  task termination. This option is currently not supported on Itanium
  platforms. (See :ref:`Dynamic_Stack_Usage_Analysis` for details.)


  .. index:: -v  (gnatbind)

:switch:`-v`
  Verbose mode. Write error messages, header, summary output to
  :file:`stdout`.


  .. index:: -V  (gnatbind)

:switch:`-V{key}={value}`
  Store the given association of ``key`` to ``value`` in the bind environment.
  Values stored this way can be retrieved at run time using
  ``GNAT.Bind_Environment``.


  .. index:: -w  (gnatbind)

:switch:`-w{x}`
  Warning mode; ``x`` = s/e for suppress/treat as error.


  .. index:: -Wx  (gnatbind)

:switch:`-Wx{e}`
  Override default wide character encoding for standard Text_IO files.


  .. index:: -x  (gnatbind)

:switch:`-x`
  Exclude source files (check object consistency only).


  .. index:: -xdr  (gnatbind)

:switch:`-xdr`
  Use the target-independent XDR protocol for stream oriented attributes
  instead of the default implementation which is based on direct binary
  representations and is therefore target-and endianness-dependent.
  However it does not support 128-bit integer types and the exception
  ``Ada.IO_Exceptions.Device_Error`` is raised if any attempt is made
  at streaming 128-bit integer types with it.


  .. index:: -Xnnn  (gnatbind)

:switch:`-X{nnn}`
  Set default exit status value, normally 0 for POSIX compliance.


  .. index:: -y  (gnatbind)

:switch:`-y`
  Enable leap seconds support in ``Ada.Calendar`` and its children.


  .. index:: -z  (gnatbind)

:switch:`-z`
  No main subprogram.

You may obtain this listing of switches by running ``gnatbind`` with
no arguments.


.. _Consistency-Checking_Modes:

Consistency-Checking Modes
^^^^^^^^^^^^^^^^^^^^^^^^^^

As described earlier, by default ``gnatbind`` checks
that object files are consistent with one another and are consistent
with any source files it can locate. The following switches control binder
access to sources.


  .. index:: -s  (gnatbind)

:switch:`-s`
  Require source files to be present. In this mode, the binder must be
  able to locate all source files that are referenced, in order to check
  their consistency. In normal mode, if a source file cannot be located it
  is simply ignored. If you specify this switch, a missing source
  file is an error.


  .. index:: -Wx  (gnatbind)

:switch:`-Wx{e}`
  Override default wide character encoding for standard Text_IO files.
  Normally the default wide character encoding method used for standard
  [Wide\_[Wide\_]]Text_IO files is taken from the encoding specified for
  the main source input (see description of switch
  :switch:`-gnatWx` for the compiler). The
  use of this switch for the binder (which has the same set of
  possible arguments) overrides this default as specified.


  .. index:: -x  (gnatbind)

:switch:`-x`
  Exclude source files. In this mode, the binder only checks that ALI
  files are consistent with one another. Source files are not accessed.
  The binder runs faster in this mode, and there is still a guarantee that
  the resulting program is self-consistent.
  If a source file has been edited since it was last compiled, and you
  specify this switch, the binder will not detect that the object
  file is out of date with respect to the source file. Note that this is the
  mode that is automatically used by ``gnatmake`` because in this
  case the checking against sources has already been performed by
  ``gnatmake`` in the course of compilation (i.e., before binding).


.. _Binder_Error_Message_Control:

Binder Error Message Control
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The following switches provide control over the generation of error
messages from the binder:



  .. index:: -v  (gnatbind)

:switch:`-v`
  Verbose mode. In the normal mode, brief error messages are generated to
  :file:`stderr`. If this switch is present, a header is written
  to :file:`stdout` and any error messages are directed to :file:`stdout`.
  All that is written to :file:`stderr` is a brief summary message.


  .. index:: -b  (gnatbind)

:switch:`-b`
  Generate brief error messages to :file:`stderr` even if verbose mode is
  specified. This is relevant only when used with the
  :switch:`-v` switch.


  .. index:: -m  (gnatbind)

:switch:`-m{n}`
  Limits the number of error messages to ``n``, a decimal integer in the
  range 1-999. The binder terminates immediately if this limit is reached.


  .. index:: -M  (gnatbind)

:switch:`-M{xxx}`
  Renames the generated main program from ``main`` to ``xxx``.
  This is useful in the case of some cross-building environments, where
  the actual main program is separate from the one generated
  by ``gnatbind``.


  .. index:: -ws  (gnatbind)
  .. index:: Warnings

:switch:`-ws`
  Suppress all warning messages.


  .. index:: -we  (gnatbind)

:switch:`-we`
  Treat any warning messages as fatal errors.


  .. index:: -t  (gnatbind)
  .. index:: Time stamp checks, in binder
  .. index:: Binder consistency checks
  .. index:: Consistency checks, in binder

:switch:`-t`
  The binder performs a number of consistency checks including:


  * Check that time stamps of a given source unit are consistent

  * Check that checksums of a given source unit are consistent

  * Check that consistent versions of ``GNAT`` were used for compilation

  * Check consistency of configuration pragmas as required

  Normally failure of such checks, in accordance with the consistency
  requirements of the Ada Reference Manual, causes error messages to be
  generated which abort the binder and prevent the output of a binder
  file and subsequent link to obtain an executable.

  The :switch:`-t` switch converts these error messages
  into warnings, so that
  binding and linking can continue to completion even in the presence of such
  errors. The result may be a failed link (due to missing symbols), or a
  non-functional executable which has undefined semantics.

  .. note::

     This means that :switch:`-t` should be used only in unusual situations,
     with extreme care.

.. _Elaboration_Control:

Elaboration Control
^^^^^^^^^^^^^^^^^^^

The following switches provide additional control over the elaboration
order. For further details see :ref:`Elaboration_Order_Handling_in_GNAT`.


.. index:: -f  (gnatbind)

:switch:`-f{elab-order}`
  Force elaboration order.

  ``elab-order`` should be the name of a "forced elaboration order file", that
  is, a text file containing library item names, one per line. A name of the
  form "some.unit%s" or "some.unit (spec)" denotes the spec of Some.Unit. A
  name of the form "some.unit%b" or "some.unit (body)" denotes the body of
  Some.Unit. Each pair of lines is taken to mean that there is an elaboration
  dependence of the second line on the first. For example, if the file
  contains:

  .. code-block:: ada

      this (spec)
      this (body)
      that (spec)
      that (body)

  then the spec of This will be elaborated before the body of This, and the
  body of This will be elaborated before the spec of That, and the spec of That
  will be elaborated before the body of That. The first and last of these three
  dependences are already required by Ada rules, so this file is really just
  forcing the body of This to be elaborated before the spec of That.

  The given order must be consistent with Ada rules, or else ``gnatbind`` will
  give elaboration cycle errors. For example, if you say x (body) should be
  elaborated before x (spec), there will be a cycle, because Ada rules require
  x (spec) to be elaborated before x (body); you can't have the spec and body
  both elaborated before each other.

  If you later add "with That;" to the body of This, there will be a cycle, in
  which case you should erase either "this (body)" or "that (spec)" from the
  above forced elaboration order file.

  Blank lines and Ada-style comments are ignored. Unit names that do not exist
  in the program are ignored. Units in the GNAT predefined library are also
  ignored.


.. index:: -p  (gnatbind)

:switch:`-p`
  Pessimistic elaboration order

  This switch is only applicable to the pre-20.x legacy elaboration models.
  The post-20.x elaboration model uses a more informed approach of ordering
  the units.

  Normally the binder attempts to choose an elaboration order that is likely to
  minimize the likelihood of an elaboration order error resulting in raising a
  ``Program_Error`` exception. This switch reverses the action of the binder,
  and requests that it deliberately choose an order that is likely to maximize
  the likelihood of an elaboration error. This is useful in ensuring
  portability and avoiding dependence on accidental fortuitous elaboration
  ordering.

  Normally it only makes sense to use the :switch:`-p` switch if dynamic
  elaboration checking is used (:switch:`-gnatE` switch used for compilation).
  This is because in the default static elaboration mode, all necessary
  ``Elaborate`` and ``Elaborate_All`` pragmas are implicitly inserted.
  These implicit pragmas are still respected by the binder in :switch:`-p`
  mode, so a safe elaboration order is assured.

  Note that :switch:`-p` is not intended for production use; it is more for
  debugging/experimental use.

.. _Output_Control:

Output Control
^^^^^^^^^^^^^^

The following switches allow additional control over the output
generated by the binder.


  .. index:: -c  (gnatbind)

:switch:`-c`
  Check only. Do not generate the binder output file. In this mode the
  binder performs all error checks but does not generate an output file.


  .. index:: -e  (gnatbind)

:switch:`-e`
  Output complete list of elaboration-order dependencies, showing the
  reason for each dependency. This output can be rather extensive but may
  be useful in diagnosing problems with elaboration order. The output is
  written to :file:`stdout`.


  .. index:: -h  (gnatbind)

:switch:`-h`
  Output usage information. The output is written to :file:`stdout`.


  .. index:: -K  (gnatbind)

:switch:`-K`
  Output linker options to :file:`stdout`. Includes library search paths,
  contents of pragmas Ident and Linker_Options, and libraries added
  by ``gnatbind``.


  .. index:: -l  (gnatbind)

:switch:`-l`
  Output chosen elaboration order. The output is written to :file:`stdout`.


  .. index:: -O  (gnatbind)

:switch:`-O`
  Output full names of all the object files that must be linked to provide
  the Ada component of the program. The output is written to :file:`stdout`.
  This list includes the files explicitly supplied and referenced by the user
  as well as implicitly referenced run-time unit files. The latter are
  omitted if the corresponding units reside in shared libraries. The
  directory names for the run-time units depend on the system configuration.


  .. index:: -o  (gnatbind)

:switch:`-o {file}`
  Set name of output file to ``file`` instead of the normal
  :file:`b~`mainprog`.adb` default. Note that ``file`` denote the Ada
  binder generated body filename.
  Note that if this option is used, then linking must be done manually.
  It is not possible to use gnatlink in this case, since it cannot locate
  the binder file.


  .. index:: -r  (gnatbind)

:switch:`-r`
  Generate list of ``pragma Restrictions`` that could be applied to
  the current unit. This is useful for code audit purposes, and also may
  be used to improve code generation in some cases.


.. _Dynamic_Allocation_Control:

Dynamic Allocation Control
^^^^^^^^^^^^^^^^^^^^^^^^^^

The heap control switches -- :switch:`-H32` and :switch:`-H64` --
determine whether dynamic allocation uses 32-bit or 64-bit memory.
They only affect compiler-generated allocations via ``__gnat_malloc``;
explicit calls to ``malloc`` and related functions from the C
run-time library are unaffected.

:switch:`-H32`
  Allocate memory on 32-bit heap


:switch:`-H64`
  Allocate memory on 64-bit heap.  This is the default
  unless explicitly overridden by a ``'Size`` clause on the access type.

These switches are only effective on VMS platforms.


.. _Binding_with_Non-Ada_Main_Programs:

Binding with Non-Ada Main Programs
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The description so far has assumed that the main
program is in Ada, and that the task of the binder is to generate a
corresponding function ``main`` that invokes this Ada main
program. GNAT also supports the building of executable programs where
the main program is not in Ada, but some of the called routines are
written in Ada and compiled using GNAT (:ref:`Mixed_Language_Programming`).
The following switch is used in this situation:


  .. index:: -n  (gnatbind)

:switch:`-n`
  No main program. The main program is not in Ada.

In this case, most of the functions of the binder are still required,
but instead of generating a main program, the binder generates a file
containing the following callable routines:

  .. index:: adainit

  ``adainit``
    You must call this routine to initialize the Ada part of the program by
    calling the necessary elaboration routines. A call to ``adainit`` is
    required before the first call to an Ada subprogram.

    Note that it is assumed that the basic execution environment must be setup
    to be appropriate for Ada execution at the point where the first Ada
    subprogram is called. In particular, if the Ada code will do any
    floating-point operations, then the FPU must be setup in an appropriate
    manner. For the case of the x86, for example, full precision mode is
    required. The procedure GNAT.Float_Control.Reset may be used to ensure
    that the FPU is in the right state.

  .. index:: adafinal

  ``adafinal``
    You must call this routine to perform any library-level finalization
    required by the Ada subprograms. A call to ``adafinal`` is required
    after the last call to an Ada subprogram, and before the program
    terminates.

.. index:: -n  (gnatbind)
.. index:: Binder, multiple input files

If the :switch:`-n` switch
is given, more than one ALI file may appear on
the command line for ``gnatbind``. The normal ``closure``
calculation is performed for each of the specified units. Calculating
the closure means finding out the set of units involved by tracing
|with| references. The reason it is necessary to be able to
specify more than one ALI file is that a given program may invoke two or
more quite separate groups of Ada units.

The binder takes the name of its output file from the last specified ALI
file, unless overridden by the use of the :switch:`-o file`.

.. index:: -o  (gnatbind)

The output is an Ada unit in source form that can be compiled with GNAT.
This compilation occurs automatically as part of the ``gnatlink``
processing.

Currently the GNAT run-time requires a FPU using 80 bits mode
precision. Under targets where this is not the default it is required to
call GNAT.Float_Control.Reset before using floating point numbers (this
include float computation, float input and output) in the Ada code. A
side effect is that this could be the wrong mode for the foreign code
where floating point computation could be broken after this call.


.. _Binding_Programs_with_No_Main_Subprogram:

Binding Programs with No Main Subprogram
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

It is possible to have an Ada program which does not have a main
subprogram. This program will call the elaboration routines of all the
packages, then the finalization routines.

The following switch is used to bind programs organized in this manner:

  .. index:: -z  (gnatbind)

:switch:`-z`
  Normally the binder checks that the unit name given on the command line
  corresponds to a suitable main subprogram. When this switch is used,
  a list of ALI files can be given, and the execution of the program
  consists of elaboration of these units in an appropriate order. Note
  that the default wide character encoding method for standard Text_IO
  files is always set to Brackets if this switch is set (you can use
  the binder switch
  :switch:`-Wx` to override this default).


.. _Command-Line_Access:

Command-Line Access
-------------------

The package ``Ada.Command_Line`` provides access to the command-line
arguments and program name. In order for this interface to operate
correctly, the two variables

.. code-block:: c

     int gnat_argc;
     char **gnat_argv;

.. index:: gnat_argv
.. index:: gnat_argc

are declared in one of the GNAT library routines. These variables must
be set from the actual ``argc`` and ``argv`` values passed to the
main program. With no *n* present, ``gnatbind``
generates the C main program to automatically set these variables.
If the *n* switch is used, there is no automatic way to
set these variables. If they are not set, the procedures in
``Ada.Command_Line`` will not be available, and any attempt to use
them will raise ``Constraint_Error``. If command line access is
required, your main program must set ``gnat_argc`` and
``gnat_argv`` from the ``argc`` and ``argv`` values passed to
it.


.. _Search_Paths_for_gnatbind:

Search Paths for ``gnatbind``
-----------------------------

The binder takes the name of an ALI file as its argument and needs to
locate source files as well as other ALI files to verify object consistency.

For source files, it follows exactly the same search rules as ``gcc``
(see :ref:`Search_Paths_and_the_Run-Time_Library_RTL`). For ALI files the
directories searched are:

* The directory containing the ALI file named in the command line, unless
  the switch :switch:`-I-` is specified.

* All directories specified by :switch:`-I`
  switches on the ``gnatbind``
  command line, in the order given.

  .. index:: ADA_PRJ_OBJECTS_FILE

* Each of the directories listed in the text file whose name is given
  by the :envvar:`ADA_PRJ_OBJECTS_FILE` environment variable.

  :envvar:`ADA_PRJ_OBJECTS_FILE` is normally set by gnatmake or by the gnat
  driver when project files are used. It should not normally be set
  by other means.

  .. index:: ADA_OBJECTS_PATH

* Each of the directories listed in the value of the
  :envvar:`ADA_OBJECTS_PATH` environment variable.
  Construct this value
  exactly as the :envvar:`PATH` environment variable: a list of directory
  names separated by colons (semicolons when working with the NT version
  of GNAT).

* The content of the :file:`ada_object_path` file which is part of the GNAT
  installation tree and is used to store standard libraries such as the
  GNAT Run-Time Library (RTL) unless the switch :switch:`-nostdlib` is
  specified. See :ref:`Installing_a_library`

.. index:: -I  (gnatbind)
.. index:: -aI  (gnatbind)
.. index:: -aO  (gnatbind)

In the binder the switch :switch:`-I`
is used to specify both source and
library file paths. Use :switch:`-aI`
instead if you want to specify
source paths only, and :switch:`-aO`
if you want to specify library paths
only. This means that for the binder
:switch:`-I{dir}` is equivalent to
:switch:`-aI{dir}`
:switch:`-aO`{dir}`.
The binder generates the bind file (a C language source file) in the
current working directory.

.. index:: Ada
.. index:: System
.. index:: Interfaces
.. index:: GNAT

The packages ``Ada``, ``System``, and ``Interfaces`` and their
children make up the GNAT Run-Time Library, together with the package
GNAT and its children, which contain a set of useful additional
library functions provided by GNAT. The sources for these units are
needed by the compiler and are kept together in one directory. The ALI
files and object files generated by compiling the RTL are needed by the
binder and the linker and are kept together in one directory, typically
different from the directory containing the sources. In a normal
installation, you need not specify these directory names when compiling
or binding. Either the environment variables or the built-in defaults
cause these files to be found.

Besides simplifying access to the RTL, a major use of search paths is
in compiling sources from multiple directories. This can make
development environments much more flexible.


.. _Examples_of_gnatbind_Usage:

Examples of ``gnatbind`` Usage
------------------------------

Here are some examples of ``gnatbind`` invovations:

  ::

     gnatbind hello

  The main program ``Hello`` (source program in :file:`hello.adb`) is
  bound using the standard switch settings. The generated main program is
  :file:`b~hello.adb`. This is the normal, default use of the binder.

  ::

     gnatbind hello -o mainprog.adb

  The main program ``Hello`` (source program in :file:`hello.adb`) is
  bound using the standard switch settings. The generated main program is
  :file:`mainprog.adb` with the associated spec in
  :file:`mainprog.ads`. Note that you must specify the body here not the
  spec. Note that if this option is used, then linking must be done manually,
  since gnatlink will not be able to find the generated file.


.. _Linking_with_gnatlink:

Linking with ``gnatlink``
=========================

.. index:: ! gnatlink

This chapter discusses ``gnatlink``, a tool that links
an Ada program and builds an executable file. This utility
invokes the system linker (via the ``gcc`` command)
with a correct list of object files and library references.
``gnatlink`` automatically determines the list of files and
references for the Ada part of a program. It uses the binder file
generated by the ``gnatbind`` to determine this list.

.. _Running_gnatlink:

Running ``gnatlink``
--------------------

The form of the ``gnatlink`` command is


.. code-block:: sh

    $ gnatlink [ switches ] mainprog [.ali]
               [ non-Ada objects ] [ linker options ]



The arguments of ``gnatlink`` (switches, main ``ALI`` file,
non-Ada objects
or linker options) may be in any order, provided that no non-Ada object may
be mistaken for a main :file:`ALI` file.
Any file name :file:`F` without the :file:`.ali`
extension will be taken as the main :file:`ALI` file if a file exists
whose name is the concatenation of :file:`F` and :file:`.ali`.

:file:`mainprog.ali` references the ALI file of the main program.
The :file:`.ali` extension of this file can be omitted. From this
reference, ``gnatlink`` locates the corresponding binder file
:file:`b~mainprog.adb` and, using the information in this file along
with the list of non-Ada objects and linker options, constructs a
linker command file to create the executable.

The arguments other than the ``gnatlink`` switches and the main
:file:`ALI` file are passed to the linker uninterpreted.
They typically include the names of
object files for units written in other languages than Ada and any library
references required to resolve references in any of these foreign language
units, or in ``Import`` pragmas in any Ada units.

``linker options`` is an optional list of linker specific
switches.
The default linker called by gnatlink is ``gcc`` which in
turn calls the appropriate system linker.

One useful option for the linker is :switch:`-s`: it reduces the size of the
executable by removing all symbol table and relocation information from the
executable.

Standard options for the linker such as :switch:`-lmy_lib` or
:switch:`-Ldir` can be added as is.
For options that are not recognized by
``gcc`` as linker options, use the ``gcc`` switches
:switch:`-Xlinker` or :switch:`-Wl,`.

Refer to the GCC documentation for
details.

Here is an example showing how to generate a linker map:

.. code-block:: sh

     $ gnatlink my_prog -Wl,-Map,MAPFILE


Using ``linker options`` it is possible to set the program stack and
heap size.
See :ref:`Setting_Stack_Size_from_gnatlink` and
:ref:`Setting_Heap_Size_from_gnatlink`.

``gnatlink`` determines the list of objects required by the Ada
program and prepends them to the list of objects passed to the linker.
``gnatlink`` also gathers any arguments set by the use of
``pragma Linker_Options`` and adds them to the list of arguments
presented to the linker.


.. _Switches_for_gnatlink:

Switches for ``gnatlink``
-------------------------

The following switches are available with the ``gnatlink`` utility:

.. index:: --version  (gnatlink)

:switch:`--version`
  Display Copyright and version, then exit disregarding all other options.


.. index:: --help  (gnatlink)

:switch:`--help`
  If :switch:`--version` was not used, display usage, then exit disregarding
  all other options.


.. index:: Command line length
.. index:: -f  (gnatlink)

:switch:`-f`
  On some targets, the command line length is limited, and ``gnatlink``
  will generate a separate file for the linker if the list of object files
  is too long.
  The :switch:`-f` switch forces this file
  to be generated even if
  the limit is not exceeded. This is useful in some cases to deal with
  special situations where the command line length is exceeded.


.. index:: Debugging information, including
.. index:: -g  (gnatlink)

:switch:`-g`
  The option to include debugging information causes the Ada bind file (in
  other words, :file:`b~mainprog.adb`) to be compiled with :switch:`-g`.
  In addition, the binder does not delete the :file:`b~mainprog.adb`,
  :file:`b~mainprog.o` and :file:`b~mainprog.ali` files.
  Without :switch:`-g`, the binder removes these files by default.

.. index:: -n  (gnatlink)

:switch:`-n`
  Do not compile the file generated by the binder. This may be used when
  a link is rerun with different options, but there is no need to recompile
  the binder file.


.. index:: -v  (gnatlink)

:switch:`-v`
  Verbose mode. Causes additional information to be output, including a full
  list of the included object files.
  This switch option is most useful when you want
  to see what set of object files are being used in the link step.


.. index:: -v -v  (gnatlink)

:switch:`-v -v`
  Very verbose mode. Requests that the compiler operate in verbose mode when
  it compiles the binder file, and that the system linker run in verbose mode.


.. index:: -o  (gnatlink)

:switch:`-o {exec-name}`
  ``exec-name`` specifies an alternate name for the generated
  executable program. If this switch is omitted, the executable has the same
  name as the main unit. For example, ``gnatlink try.ali`` creates
  an executable called :file:`try`.


.. index:: -B  (gnatlink)

:switch:`-B{dir}`
  Load compiler executables (for example, ``gnat1``, the Ada compiler)
  from ``dir`` instead of the default location. Only use this switch
  when multiple versions of the GNAT compiler are available.
  See the ``Directory Options`` section in :title:`The_GNU_Compiler_Collection`
  for further details. You would normally use the :switch:`-b` or
  :switch:`-V` switch instead.


.. index:: -M  (gnatlink)

:switch:`-M`
  When linking an executable, create a map file. The name of the map file
  has the same name as the executable with extension ".map".


.. index:: -M=  (gnatlink)

:switch:`-M={mapfile}`
  When linking an executable, create a map file. The name of the map file is
  ``mapfile``.


.. index:: --GCC=compiler_name  (gnatlink)

:switch:`--GCC={compiler_name}`
  Program used for compiling the binder file. The default is
  ``gcc``. You need to use quotes around ``compiler_name`` if
  ``compiler_name`` contains spaces or other separator characters.
  As an example ``--GCC="foo -x -y"`` will instruct ``gnatlink`` to
  use ``foo -x -y`` as your compiler. Note that switch ``-c`` is always
  inserted after your command name. Thus in the above example the compiler
  command that will be used by ``gnatlink`` will be ``foo -c -x -y``.
  A limitation of this syntax is that the name and path name of the executable
  itself must not include any embedded spaces. If the compiler executable is
  different from the default one (gcc or <prefix>-gcc), then the back-end
  switches in the ALI file are not used to compile the binder generated source.
  For example, this is the case with ``--GCC="foo -x -y"``. But the back end
  switches will be used for ``--GCC="gcc -gnatv"``. If several
  ``--GCC=compiler_name`` are used, only the last ``compiler_name``
  is taken into account. However, all the additional switches are also taken
  into account. Thus,
  ``--GCC="foo -x -y" --GCC="bar -z -t"`` is equivalent to
  ``--GCC="bar -x -y -z -t"``.


.. index:: --LINK=  (gnatlink)

:switch:`--LINK={name}`
  ``name`` is the name of the linker to be invoked. This is especially
  useful in mixed language programs since languages such as C++ require
  their own linker to be used. When this switch is omitted, the default
  name for the linker is ``gcc``. When this switch is used, the
  specified linker is called instead of ``gcc`` with exactly the same
  parameters that would have been passed to ``gcc`` so if the desired
  linker requires different parameters it is necessary to use a wrapper
  script that massages the parameters before invoking the real linker. It
  may be useful to control the exact invocation by using the verbose
  switch.


.. _Using_the_GNU_make_Utility:

Using the GNU ``make`` Utility
==============================

.. index:: make (GNU), GNU make

This chapter offers some examples of makefiles that solve specific
problems. It does not explain how to write a makefile, nor does it try to replace the
``gnatmake`` utility (:ref:`The_GNAT_Make_Program_gnatmake`).

All the examples in this section are specific to the GNU version of
make. Although ``make`` is a standard utility, and the basic language
is the same, these examples use some advanced features found only in
``GNU make``.

.. _Using_gnatmake_in_a_Makefile:

Using gnatmake in a Makefile
----------------------------

.. index makefile (GNU make)

Complex project organizations can be handled in a very powerful way by
using GNU make combined with gnatmake. For instance, here is a Makefile
which allows you to build each subsystem of a big project into a separate
shared library. Such a makefile allows you to significantly reduce the link
time of very big applications while maintaining full coherence at
each step of the build process.

The list of dependencies are handled automatically by
``gnatmake``. The Makefile is simply used to call gnatmake in each of
the appropriate directories.

Note that you should also read the example on how to automatically
create the list of directories
(:ref:`Automatically_Creating_a_List_of_Directories`)
which might help you in case your project has a lot of subdirectories.


.. code-block:: makefile

  ## This Makefile is intended to be used with the following directory
  ## configuration:
  ##  - The sources are split into a series of csc (computer software components)
  ##    Each of these csc is put in its own directory.
  ##    Their name are referenced by the directory names.
  ##    They will be compiled into shared library (although this would also work
  ##    with static libraries
  ##  - The main program (and possibly other packages that do not belong to any
  ##    csc is put in the top level directory (where the Makefile is).
  ##       toplevel_dir __ first_csc  (sources) __ lib (will contain the library)
  ##                    \\_ second_csc (sources) __ lib (will contain the library)
  ##                    \\_ ...
  ## Although this Makefile is build for shared library, it is easy to modify
  ## to build partial link objects instead (modify the lines with -shared and
  ## gnatlink below)
  ##
  ## With this makefile, you can change any file in the system or add any new
  ## file, and everything will be recompiled correctly (only the relevant shared
  ## objects will be recompiled, and the main program will be re-linked).

  # The list of computer software component for your project. This might be
  # generated automatically.
  CSC_LIST=aa bb cc

  # Name of the main program (no extension)
  MAIN=main

  # If we need to build objects with -fPIC, uncomment the following line
  #NEED_FPIC=-fPIC

  # The following variable should give the directory containing libgnat.so
  # You can get this directory through 'gnatls -v'. This is usually the last
  # directory in the Object_Path.
  GLIB=...

  # The directories for the libraries
  # (This macro expands the list of CSC to the list of shared libraries, you
  # could simply use the expanded form:
  # LIB_DIR=aa/lib/libaa.so bb/lib/libbb.so cc/lib/libcc.so
  LIB_DIR=${foreach dir,${CSC_LIST},${dir}/lib/lib${dir}.so}

  ${MAIN}: objects ${LIB_DIR}
      gnatbind ${MAIN} ${CSC_LIST:%=-aO%/lib} -shared
      gnatlink ${MAIN} ${CSC_LIST:%=-l%}

  objects::
      # recompile the sources
      gnatmake -c -i ${MAIN}.adb ${NEED_FPIC} ${CSC_LIST:%=-I%}

  # Note: In a future version of GNAT, the following commands will be simplified
  # by a new tool, gnatmlib
  ${LIB_DIR}:
      mkdir -p ${dir $@ }
      cd ${dir $@ } && gcc -shared -o ${notdir $@ } ../*.o -L${GLIB} -lgnat
      cd ${dir $@ } && cp -f ../*.ali .

  # The dependencies for the modules
  # Note that we have to force the expansion of *.o, since in some cases
  # make won't be able to do it itself.
  aa/lib/libaa.so: ${wildcard aa/*.o}
  bb/lib/libbb.so: ${wildcard bb/*.o}
  cc/lib/libcc.so: ${wildcard cc/*.o}

  # Make sure all of the shared libraries are in the path before starting the
  # program
  run::
      LD_LIBRARY_PATH=`pwd`/aa/lib:`pwd`/bb/lib:`pwd`/cc/lib ./${MAIN}

  clean::
      ${RM} -rf ${CSC_LIST:%=%/lib}
      ${RM} ${CSC_LIST:%=%/*.ali}
      ${RM} ${CSC_LIST:%=%/*.o}
      ${RM} *.o *.ali ${MAIN}


.. _Automatically_Creating_a_List_of_Directories:

Automatically Creating a List of Directories
--------------------------------------------

In most makefiles, you will have to specify a list of directories, and
store it in a variable. For small projects, it is often easier to
specify each of them by hand, since you then have full control over what
is the proper order for these directories, which ones should be
included.

However, in larger projects, which might involve hundreds of
subdirectories, it might be more convenient to generate this list
automatically.

The example below presents two methods. The first one, although less
general, gives you more control over the list. It involves wildcard
characters, that are automatically expanded by ``make``. Its
shortcoming is that you need to explicitly specify some of the
organization of your project, such as for instance the directory tree
depth, whether some directories are found in a separate tree, etc.

The second method is the most general one. It requires an external
program, called ``find``, which is standard on all Unix systems. All
the directories found under a given root directory will be added to the
list.

.. code-block:: makefile

  # The examples below are based on the following directory hierarchy:
  # All the directories can contain any number of files
  # ROOT_DIRECTORY ->  a  ->  aa  ->  aaa
  #                       ->  ab
  #                       ->  ac
  #                ->  b  ->  ba  ->  baa
  #                       ->  bb
  #                       ->  bc
  # This Makefile creates a variable called DIRS, that can be reused any time
  # you need this list (see the other examples in this section)

  # The root of your project's directory hierarchy
  ROOT_DIRECTORY=.

  ####
  # First method: specify explicitly the list of directories
  # This allows you to specify any subset of all the directories you need.
  ####

  DIRS := a/aa/ a/ab/ b/ba/

  ####
  # Second method: use wildcards
  # Note that the argument(s) to wildcard below should end with a '/'.
  # Since wildcards also return file names, we have to filter them out
  # to avoid duplicate directory names.
  # We thus use make's ``dir`` and ``sort`` functions.
  # It sets DIRs to the following value (note that the directories aaa and baa
  # are not given, unless you change the arguments to wildcard).
  # DIRS= ./a/a/ ./b/ ./a/aa/ ./a/ab/ ./a/ac/ ./b/ba/ ./b/bb/ ./b/bc/
  ####

  DIRS := ${sort ${dir ${wildcard ${ROOT_DIRECTORY}/*/
                      ${ROOT_DIRECTORY}/*/*/}}}

  ####
  # Third method: use an external program
  # This command is much faster if run on local disks, avoiding NFS slowdowns.
  # This is the most complete command: it sets DIRs to the following value:
  # DIRS= ./a ./a/aa ./a/aa/aaa ./a/ab ./a/ac ./b ./b/ba ./b/ba/baa ./b/bb ./b/bc
  ####

  DIRS := ${shell find ${ROOT_DIRECTORY} -type d -print}



.. _Generating_the_Command_Line_Switches:

Generating the Command Line Switches
------------------------------------

Once you have created the list of directories as explained in the
previous section (:ref:`Automatically_Creating_a_List_of_Directories`),
you can easily generate the command line arguments to pass to gnatmake.

For the sake of completeness, this example assumes that the source path
is not the same as the object path, and that you have two separate lists
of directories.

.. code-block:: makefile

  # see "Automatically creating a list of directories" to create
  # these variables
  SOURCE_DIRS=
  OBJECT_DIRS=

  GNATMAKE_SWITCHES := ${patsubst %,-aI%,${SOURCE_DIRS}}
  GNATMAKE_SWITCHES += ${patsubst %,-aO%,${OBJECT_DIRS}}

  all:
          gnatmake ${GNATMAKE_SWITCHES} main_unit


.. _Overcoming_Command_Line_Length_Limits:

Overcoming Command Line Length Limits
-------------------------------------

One problem that might be encountered on big projects is that many
operating systems limit the length of the command line. It is thus hard to give
gnatmake the list of source and object directories.

This example shows how you can set up environment variables, which will
make ``gnatmake`` behave exactly as if the directories had been
specified on the command line, but have a much higher length limit (or
even none on most systems).

It assumes that you have created a list of directories in your Makefile,
using one of the methods presented in
:ref:`Automatically_Creating_a_List_of_Directories`.
For the sake of completeness, we assume that the object
path (where the ALI files are found) is different from the sources patch.

Note a small trick in the Makefile below: for efficiency reasons, we
create two temporary variables (SOURCE_LIST and OBJECT_LIST), that are
expanded immediately by ``make``. This way we overcome the standard
make behavior which is to expand the variables only when they are
actually used.

On Windows, if you are using the standard Windows command shell, you must
replace colons with semicolons in the assignments to these variables.

.. code-block:: makefile

  # In this example, we create both ADA_INCLUDE_PATH and ADA_OBJECTS_PATH.
  # This is the same thing as putting the -I arguments on the command line.
  # (the equivalent of using -aI on the command line would be to define
  #  only ADA_INCLUDE_PATH, the equivalent of -aO is ADA_OBJECTS_PATH).
  # You can of course have different values for these variables.
  #
  # Note also that we need to keep the previous values of these variables, since
  # they might have been set before running 'make' to specify where the GNAT
  # library is installed.

  # see "Automatically creating a list of directories" to create these
  # variables
  SOURCE_DIRS=
  OBJECT_DIRS=

  empty:=
  space:=${empty} ${empty}
  SOURCE_LIST := ${subst ${space},:,${SOURCE_DIRS}}
  OBJECT_LIST := ${subst ${space},:,${OBJECT_DIRS}}
  ADA_INCLUDE_PATH += ${SOURCE_LIST}
  ADA_OBJECTS_PATH += ${OBJECT_LIST}
  export ADA_INCLUDE_PATH
  export ADA_OBJECTS_PATH

  all:
          gnatmake main_unit
