summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorRod Kay2023-06-14 00:29:38 +1000
committerRod Kay2023-06-14 00:29:38 +1000
commitf74743d7a11b7787c7f616f40fa8706835366b2a (patch)
tree90089b707873d36eadd007e18b1cb1f6f040d083
parenta86f6d9c824e9c34153be44eae52c3fee22f2a82 (diff)
downloadaur-f74743d7a11b7787c7f616f40fa8706835366b2a.tar.gz
Update to version '24.0w'.
-rw-r--r--.SRCINFO4
-rw-r--r--PKGBUILD30
-rw-r--r--building_executable_programs_with_gnat.rst7791
-rw-r--r--gs_utils.patch11
4 files changed, 7829 insertions, 7 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 294cb34bd133..cecfc0b4bc55 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -23,11 +23,15 @@ pkgbase = gnatstudio
conflicts = gnatstudio-bin
source = https://github.com/charlie5/archlinux-gnatstudio-support/raw/main/gnatstudio-sources/gnatstudio-24.0w-20230428-16588-src.tar.gz
source = 0003-Honour-DESTDIR-in-installation-targets.patch
+ source = gs_utils.patch
source = patch-dap.gpr
+ source = building_executable_programs_with_gnat.rst
source = gps.desktop
sha256sums = ae17d963f063657fe665be243362eccb6b3f122fe846fe64dd1270775120fb52
sha256sums = 5607c451dbf63dba346eeb2ef602a86321d310bdfb6ef777870bb32761b596d5
+ sha256sums = 7f5196621ca8f1dfe15ada96af63b10d70a56727c103459864a0e3f6b510d182
sha256sums = b4701fa61cdd64f2fb689e68de06e209d2bb809fd5d98d81d9ccd7a77c6caff8
+ sha256sums = 6b128ae9c7c9253cb71debd162380d4a481ef748231bcb822f78b3c961e961da
sha256sums = e21894fc1a0fbc90c25b0c524969703d685f283adc09225744d9013de3b00533
pkgname = gnatstudio
diff --git a/PKGBUILD b/PKGBUILD
index 431d8d970671..830044a53d36 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -32,12 +32,16 @@ makedepends=(gprbuild
source=(https://github.com/charlie5/archlinux-gnatstudio-support/raw/main/gnatstudio-sources/$pkgname-$pkgver-20230428-16588-src.tar.gz
0003-Honour-DESTDIR-in-installation-targets.patch
+ gs_utils.patch
patch-dap.gpr
+ building_executable_programs_with_gnat.rst
gps.desktop)
sha256sums=(ae17d963f063657fe665be243362eccb6b3f122fe846fe64dd1270775120fb52
5607c451dbf63dba346eeb2ef602a86321d310bdfb6ef777870bb32761b596d5
+ 7f5196621ca8f1dfe15ada96af63b10d70a56727c103459864a0e3f6b510d182
b4701fa61cdd64f2fb689e68de06e209d2bb809fd5d98d81d9ccd7a77c6caff8
+ 6b128ae9c7c9253cb71debd162380d4a481ef748231bcb822f78b3c961e961da
e21894fc1a0fbc90c25b0c524969703d685f283adc09225744d9013de3b00533)
@@ -46,7 +50,10 @@ prepare()
cd $srcdir/$pkgname-$pkgver-20230428-16588-src
patch -p1 < $srcdir/0003-Honour-DESTDIR-in-installation-targets.patch
+ patch -p0 < $srcdir/gs_utils.patch
patch -p0 < $srcdir/patch-dap.gpr
+
+ cp $srcdir/building_executable_programs_with_gnat.rst gnat
}
@@ -56,11 +63,12 @@ build()
export OS=unix
export LC_ALL=C
+
./configure --prefix=/usr
# The release tarball contains a bunch of sphinx build artefacts.
+ #
make -C docs clean
- make -C gnatdoc/docs/users_guide clean
ADA_FLAGS="$CFLAGS"
ADA_FLAGS="${ADA_FLAGS//-Wformat}"
@@ -68,11 +76,15 @@ build()
# GPS uses a lot of Unchecked_Conversion (too many to patch), so we have to build with -fno-strict-aliasing.
# https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gnat_ugn/Optimization-and-Strict-Aliasing.html
-
- export BUILD=Production
- make -j32 OS=unix PROCESSORS=0 BUILD=Production PRJ_BUILD=Release LIBRARY_TYPE=relocatable GPRBUILD_FLAGS="-R -cargs $ADA_FLAGS -fno-strict-aliasing -largs $LDFLAGS -lpython3.11 -gargs"
-
-# make -C docs all ### Docs are currently broken.
+ #
+ make OS=unix \
+ PROCESSORS=0 \
+ BUILD=Production \
+ PRJ_BUILD=Release \
+ LIBRARY_TYPE=relocatable \
+ GPRBUILD_FLAGS="-R -cargs $ADA_FLAGS -fno-strict-aliasing -largs $LDFLAGS -lpython3.11 -gargs"
+
+ make -C docs all
}
@@ -81,7 +93,11 @@ package()
cd $srcdir/$pkgname-$pkgver-20230428-16588-src
export OS=unix
- make DESTDIR="$pkgdir/" install
+
+ make DESTDIR=$pkgdir install
+ make DESTDIR=$pkgdir -C docs install
+
+ ln -s /usr $pkgdir/usr/share/gnatstudio/python
# Add the desktop config.
#
diff --git a/building_executable_programs_with_gnat.rst b/building_executable_programs_with_gnat.rst
new file mode 100644
index 000000000000..82e992a50414
--- /dev/null
+++ b/building_executable_programs_with_gnat.rst
@@ -0,0 +1,7791 @@
+.. |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:: -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`)
+
+
+: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` specify the specific debug options. The possible
+ characters are 0-9, a-z, A-Z, optionally preceded by a dot. 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, the actuals must denote objects of a composite
+ type, their memory locations must be identical or overlapping, and at least one
+ of the corresponding formal parameters must be of mode OUT or IN OUT.
+
+
+ .. 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 like
+ AAMP).
+
+ ``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/V/A for IEEE-754-Binary, Vax_Native,
+ AAMP), ``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/8/9/p/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 (in practice this means using any version
+ of GNAT other than the JGNAT, .NET or GNAAMP versions), 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). 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:: -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 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 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.
+
+
+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 general style of required indentation is as specified by
+ the examples in the Ada Reference Manual. 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:: -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 2012) 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.
+
+
+.. _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 (in practice this means using any version
+ of GNAT other than the JGNAT, .NET or GNAAMP versions), 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
diff --git a/gs_utils.patch b/gs_utils.patch
new file mode 100644
index 000000000000..68a682791aa8
--- /dev/null
+++ b/gs_utils.patch
@@ -0,0 +1,11 @@
+--- share/support/core/gs_utils/__init__.py 2023-04-27 11:09:52.150229500 +1000
++++ share/support/core/gs_utils/__init__.py-new 2023-06-13 22:22:03.252988629 +1000
+@@ -2,7 +2,7 @@
+ # exported by GPS to make it easier to write plugins
+
+ from GPS import pwd, cd, Action, EditorBuffer, MDI
+-from collections import MutableMapping as DictMixin
++from collections.abc import MutableMapping as DictMixin
+ import types
+ import GPS
+ import GPS.Browsers