\input texinfo   @c -*-texinfo-*-
@c %**start of header
@setfilename gnat_ugn.info
@documentencoding UTF-8
@ifinfo
@*Generated by Sphinx 4.3.1.@*
@end ifinfo
@settitle GNAT User's Guide for Native Platforms
@defindex ge
@paragraphindent 0
@exampleindent 4
@finalout
@dircategory GNU Ada Tools 
@direntry
* gnat_ugn: (gnat_ugn.info). gnat_ugn
@end direntry

@definfoenclose strong,`,'
@definfoenclose emph,`,'
@c %**end of header

@copying
@quotation
GNAT User's Guide for Native Platforms , Jan 03, 2022

AdaCore

Copyright @copyright{} 2008-2022, Free Software Foundation
@end quotation

@end copying

@titlepage
@title GNAT User's Guide for Native Platforms
@insertcopying
@end titlepage
@contents

@c %** start of user preamble

@c %** end of user preamble

@ifnottex
@node Top
@top GNAT User's Guide for Native Platforms
@insertcopying
@end ifnottex

@c %**start of body
@anchor{gnat_ugn doc}@anchor{0}
@emph{GNAT, The GNU Ada Development Environment}


@include gcc-common.texi
GCC version @value{version-GCC}@*
AdaCore

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with the Front-Cover Texts being
“GNAT User’s Guide for Native Platforms”,
and with no Back-Cover Texts.  A copy of the license is
included in the section entitled @ref{1,,GNU Free Documentation License}.

@menu
* About This Guide:: 
* Getting Started with GNAT:: 
* The GNAT Compilation Model:: 
* Building Executable Programs with GNAT:: 
* GNAT Utility Programs:: 
* GNAT and Program Execution:: 
* Platform-Specific Information:: 
* Example of Binder Output File:: 
* Elaboration Order Handling in GNAT:: 
* Inline Assembler:: 
* GNU Free Documentation License:: 
* Index:: 

@detailmenu
 --- The Detailed Node Listing ---

About This Guide

* What This Guide Contains:: 
* What You Should Know before Reading This Guide:: 
* Related Information:: 
* Conventions:: 

Getting Started with GNAT

* System Requirements:: 
* Running GNAT:: 
* Running a Simple Ada Program:: 
* Running a Program with Multiple Units:: 

The GNAT Compilation Model

* Source Representation:: 
* Foreign Language Representation:: 
* File Naming Topics and Utilities:: 
* Configuration Pragmas:: 
* Generating Object Files:: 
* Source Dependencies:: 
* The Ada Library Information Files:: 
* Binding an Ada Program:: 
* GNAT and Libraries:: 
* Conditional Compilation:: 
* Mixed Language Programming:: 
* GNAT and Other Compilation Models:: 
* Using GNAT Files with External Tools:: 

Foreign Language Representation

* Latin-1:: 
* Other 8-Bit Codes:: 
* Wide_Character Encodings:: 
* Wide_Wide_Character Encodings:: 

File Naming Topics and Utilities

* File Naming Rules:: 
* Using Other File Names:: 
* Alternative File Naming Schemes:: 
* Handling Arbitrary File Naming Conventions with gnatname:: 
* File Name Krunching with gnatkr:: 
* Renaming Files with gnatchop:: 

Handling Arbitrary File Naming Conventions with gnatname

* Arbitrary File Naming Conventions:: 
* Running gnatname:: 
* Switches for gnatname:: 
* Examples of gnatname Usage:: 

File Name Krunching with gnatkr

* About gnatkr:: 
* Using gnatkr:: 
* Krunching Method:: 
* Examples of gnatkr Usage:: 

Renaming Files with gnatchop

* Handling Files with Multiple Units:: 
* Operating gnatchop in Compilation Mode:: 
* Command Line for gnatchop:: 
* Switches for gnatchop:: 
* Examples of gnatchop Usage:: 

Configuration Pragmas

* Handling of Configuration Pragmas:: 
* The Configuration Pragmas Files:: 

GNAT and Libraries

* Introduction to Libraries in GNAT:: 
* General Ada Libraries:: 
* Stand-alone Ada Libraries:: 
* Rebuilding the GNAT Run-Time Library:: 

General Ada Libraries

* Building a library:: 
* Installing a library:: 
* Using a library:: 

Stand-alone Ada Libraries

* Introduction to Stand-alone Libraries:: 
* Building a Stand-alone Library:: 
* Creating a Stand-alone Library to be used in a non-Ada context:: 
* Restrictions in Stand-alone Libraries:: 

Conditional Compilation

* Modeling Conditional Compilation in Ada:: 
* Preprocessing with gnatprep:: 
* Integrated Preprocessing:: 

Modeling Conditional Compilation in Ada

* Use of Boolean Constants:: 
* Debugging - A Special Case:: 
* Conditionalizing Declarations:: 
* Use of Alternative Implementations:: 
* Preprocessing:: 

Preprocessing with gnatprep

* Preprocessing Symbols:: 
* Using gnatprep:: 
* Switches for gnatprep:: 
* Form of Definitions File:: 
* Form of Input Text for gnatprep:: 

Mixed Language Programming

* Interfacing to C:: 
* Calling Conventions:: 
* Building Mixed Ada and C++ Programs:: 
* Generating Ada Bindings for C and C++ headers:: 
* Generating C Headers for Ada Specifications:: 

Building Mixed Ada and C++ Programs

* Interfacing to C++:: 
* Linking a Mixed C++ & Ada Program:: 
* A Simple Example:: 
* Interfacing with C++ constructors:: 
* Interfacing with C++ at the Class Level:: 

Generating Ada Bindings for C and C++ headers

* Running the Binding Generator:: 
* Generating Bindings for C++ Headers:: 
* Switches:: 

Generating C Headers for Ada Specifications

* Running the C Header Generator:: 

GNAT and Other Compilation Models

* Comparison between GNAT and C/C++ Compilation Models:: 
* Comparison between GNAT and Conventional Ada Library Models:: 

Using GNAT Files with External Tools

* Using Other Utility Programs with GNAT:: 
* The External Symbol Naming Scheme of GNAT:: 

Building Executable Programs with GNAT

* Building with gnatmake:: 
* Compiling with gcc:: 
* Compiler Switches:: 
* Linker Switches:: 
* Binding with gnatbind:: 
* Linking with gnatlink:: 
* Using the GNU make Utility:: 

Building with gnatmake

* Running gnatmake:: 
* Switches for gnatmake:: 
* Mode Switches for gnatmake:: 
* Notes on the Command Line:: 
* How gnatmake Works:: 
* Examples of gnatmake Usage:: 

Compiling with gcc

* Compiling Programs:: 
* Search Paths and the Run-Time Library (RTL): Search Paths and the Run-Time Library RTL. 
* Order of Compilation Issues:: 
* Examples:: 

Compiler Switches

* Alphabetical List of All Switches:: 
* Output and Error Message Control:: 
* Warning Message Control:: 
* Debugging and Assertion Control:: 
* Validity Checking:: 
* Style Checking:: 
* Run-Time Checks:: 
* Using gcc for Syntax Checking:: 
* Using gcc for Semantic Checking:: 
* Compiling Different Versions of Ada:: 
* Character Set Control:: 
* File Naming Control:: 
* Subprogram Inlining Control:: 
* Auxiliary Output Control:: 
* Debugging Control:: 
* Exception Handling Control:: 
* Units to Sources Mapping Files:: 
* Code Generation Control:: 

Binding with gnatbind

* Running gnatbind:: 
* Switches for gnatbind:: 
* Command-Line Access:: 
* Search Paths for gnatbind:: 
* Examples of gnatbind Usage:: 

Switches for gnatbind

* Consistency-Checking Modes:: 
* Binder Error Message Control:: 
* Elaboration Control:: 
* Output Control:: 
* Dynamic Allocation Control:: 
* Binding with Non-Ada Main Programs:: 
* Binding Programs with No Main Subprogram:: 

Linking with gnatlink

* Running gnatlink:: 
* Switches for gnatlink:: 

Using the GNU make Utility

* Using gnatmake in a Makefile:: 
* Automatically Creating a List of Directories:: 
* Generating the Command Line Switches:: 
* Overcoming Command Line Length Limits:: 

GNAT Utility Programs

* The File Cleanup Utility gnatclean:: 
* The GNAT Library Browser gnatls:: 

The File Cleanup Utility gnatclean

* Running gnatclean:: 
* Switches for gnatclean:: 

The GNAT Library Browser gnatls

* Running gnatls:: 
* Switches for gnatls:: 
* Example of gnatls Usage:: 

GNAT and Program Execution

* Running and Debugging Ada Programs:: 
* Profiling:: 
* Improving Performance:: 
* Overflow Check Handling in GNAT:: 
* Performing Dimensionality Analysis in GNAT:: 
* Stack Related Facilities:: 
* Memory Management Issues:: 

Running and Debugging Ada Programs

* The GNAT Debugger GDB:: 
* Running GDB:: 
* Introduction to GDB Commands:: 
* Using Ada Expressions:: 
* Calling User-Defined Subprograms:: 
* Using the next Command in a Function:: 
* Stopping When Ada Exceptions Are Raised:: 
* Ada Tasks:: 
* Debugging Generic Units:: 
* Remote Debugging with gdbserver:: 
* GNAT Abnormal Termination or Failure to Terminate:: 
* Naming Conventions for GNAT Source Files:: 
* Getting Internal Debugging Information:: 
* Stack Traceback:: 
* Pretty-Printers for the GNAT runtime:: 

Stack Traceback

* Non-Symbolic Traceback:: 
* Symbolic Traceback:: 

Profiling

* Profiling an Ada Program with gprof:: 

Profiling an Ada Program with gprof

* Compilation for profiling:: 
* Program execution:: 
* Running gprof:: 
* Interpretation of profiling results:: 

Improving Performance

* Performance Considerations:: 
* Text_IO Suggestions:: 
* Reducing Size of Executables with Unused Subprogram/Data Elimination:: 

Performance Considerations

* Controlling Run-Time Checks:: 
* Use of Restrictions:: 
* Optimization Levels:: 
* Debugging Optimized Code:: 
* Inlining of Subprograms:: 
* Floating Point Operations:: 
* Vectorization of loops:: 
* Other Optimization Switches:: 
* Optimization and Strict Aliasing:: 
* Aliased Variables and Optimization:: 
* Atomic Variables and Optimization:: 
* Passive Task Optimization:: 

Reducing Size of Executables with Unused Subprogram/Data Elimination

* About unused subprogram/data elimination:: 
* Compilation options:: 
* Example of unused subprogram/data elimination:: 

Overflow Check Handling in GNAT

* Background:: 
* Management of Overflows in GNAT:: 
* Specifying the Desired Mode:: 
* Default Settings:: 
* Implementation Notes:: 

Stack Related Facilities

* Stack Overflow Checking:: 
* Static Stack Usage Analysis:: 
* Dynamic Stack Usage Analysis:: 

Memory Management Issues

* Some Useful Memory Pools:: 
* The GNAT Debug Pool Facility:: 

Platform-Specific Information

* Run-Time Libraries:: 
* Specifying a Run-Time Library:: 
* GNU/Linux Topics:: 
* Microsoft Windows Topics:: 
* Mac OS Topics:: 

Run-Time Libraries

* Summary of Run-Time Configurations:: 

Specifying a Run-Time Library

* Choosing the Scheduling Policy:: 

GNU/Linux Topics

* Required Packages on GNU/Linux:: 
* A GNU/Linux Debug Quirk:: 

Microsoft Windows Topics

* Using GNAT on Windows:: 
* Using a network installation of GNAT:: 
* CONSOLE and WINDOWS subsystems:: 
* Temporary Files:: 
* Disabling Command Line Argument Expansion:: 
* Windows Socket Timeouts:: 
* Mixed-Language Programming on Windows:: 
* Windows Specific Add-Ons:: 

Mixed-Language Programming on Windows

* Windows Calling Conventions:: 
* Introduction to Dynamic Link Libraries (DLLs): Introduction to Dynamic Link Libraries DLLs. 
* Using DLLs with GNAT:: 
* Building DLLs with GNAT Project files:: 
* Building DLLs with GNAT:: 
* Building DLLs with gnatdll:: 
* Ada DLLs and Finalization:: 
* Creating a Spec for Ada DLLs:: 
* GNAT and Windows Resources:: 
* Using GNAT DLLs from Microsoft Visual Studio Applications:: 
* Debugging a DLL:: 
* Setting Stack Size from gnatlink:: 
* Setting Heap Size from gnatlink:: 

Windows Calling Conventions

* C Calling Convention:: 
* Stdcall Calling Convention:: 
* Win32 Calling Convention:: 
* DLL Calling Convention:: 

Using DLLs with GNAT

* Creating an Ada Spec for the DLL Services:: 
* Creating an Import Library:: 

Building DLLs with gnatdll

* Limitations When Using Ada DLLs from Ada:: 
* Exporting Ada Entities:: 
* Ada DLLs and Elaboration:: 

Creating a Spec for Ada DLLs

* Creating the Definition File:: 
* Using gnatdll:: 

GNAT and Windows Resources

* Building Resources:: 
* Compiling Resources:: 
* Using Resources:: 

Debugging a DLL

* Program and DLL Both Built with GCC/GNAT:: 
* Program Built with Foreign Tools and DLL Built with GCC/GNAT:: 

Windows Specific Add-Ons

* Win32Ada:: 
* wPOSIX:: 

Mac OS Topics

* Codesigning the Debugger:: 

Elaboration Order Handling in GNAT

* Elaboration Code:: 
* Elaboration Order:: 
* Checking the Elaboration Order:: 
* Controlling the Elaboration Order in Ada:: 
* Controlling the Elaboration Order in GNAT:: 
* Mixing Elaboration Models:: 
* ABE Diagnostics:: 
* SPARK Diagnostics:: 
* Elaboration Circularities:: 
* Resolving Elaboration Circularities:: 
* Elaboration-related Compiler Switches:: 
* Summary of Procedures for Elaboration Control:: 
* Inspecting the Chosen Elaboration Order:: 

Inline Assembler

* Basic Assembler Syntax:: 
* A Simple Example of Inline Assembler:: 
* Output Variables in Inline Assembler:: 
* Input Variables in Inline Assembler:: 
* Inlining Inline Assembler Code:: 
* Other Asm Functionality:: 

Other Asm Functionality

* The Clobber Parameter:: 
* The Volatile Parameter:: 

@end detailmenu
@end menu

@node About This Guide,Getting Started with GNAT,Top,Top
@anchor{gnat_ugn/about_this_guide doc}@anchor{2}@anchor{gnat_ugn/about_this_guide about-this-guide}@anchor{3}@anchor{gnat_ugn/about_this_guide gnat-user-s-guide-for-native-platforms}@anchor{4}@anchor{gnat_ugn/about_this_guide id1}@anchor{5}
@chapter About This Guide



This guide describes the use of GNAT,
a compiler and software development
toolset for the full Ada programming language.
It documents the features of the compiler and tools, and explains
how to use them to build Ada applications.

GNAT implements Ada 95, Ada 2005, Ada 2012, and Ada 202x, and it may also be
invoked in Ada 83 compatibility mode.
By default, GNAT assumes Ada 2012, but you can override with a
compiler switch (@ref{6,,Compiling Different Versions of Ada})
to explicitly specify the language version.
Throughout this manual, references to ‘Ada’ without a year suffix
apply to all Ada versions of the language, starting with Ada 95.

@menu
* What This Guide Contains:: 
* What You Should Know before Reading This Guide:: 
* Related Information:: 
* Conventions:: 

@end menu

@node What This Guide Contains,What You Should Know before Reading This Guide,,About This Guide
@anchor{gnat_ugn/about_this_guide what-this-guide-contains}@anchor{7}
@section What This Guide Contains


This guide contains the following chapters:


@itemize *

@item 
@ref{8,,Getting Started with GNAT} describes how to get started compiling
and running Ada programs with the GNAT Ada programming environment.

@item 
@ref{9,,The GNAT Compilation Model} describes the compilation model used
by GNAT.

@item 
@ref{a,,Building Executable Programs with GNAT} describes how to use the
main GNAT tools to build executable programs, and it also gives examples of
using the GNU make utility with GNAT.

@item 
@ref{b,,GNAT Utility Programs} explains the various utility programs that
are included in the GNAT environment

@item 
@ref{c,,GNAT and Program Execution} covers a number of topics related to
running, debugging, and tuning the performace of programs developed
with GNAT
@end itemize

Appendices cover several additional topics:


@itemize *

@item 
@ref{d,,Platform-Specific Information} describes the different run-time
library implementations and also presents information on how to use
GNAT on several specific platforms

@item 
@ref{e,,Example of Binder Output File} shows the source code for the binder
output file for a sample program.

@item 
@ref{f,,Elaboration Order Handling in GNAT} describes how GNAT helps
you deal with elaboration order issues.

@item 
@ref{10,,Inline Assembler} shows how to use the inline assembly facility
in an Ada program.
@end itemize

@node What You Should Know before Reading This Guide,Related Information,What This Guide Contains,About This Guide
@anchor{gnat_ugn/about_this_guide what-you-should-know-before-reading-this-guide}@anchor{11}
@section What You Should Know before Reading This Guide


@geindex Ada 95 Language Reference Manual

@geindex Ada 2005 Language Reference Manual

This guide assumes a basic familiarity with the Ada 95 language, as
described in the International Standard ANSI/ISO/IEC-8652:1995, January
1995.
Reference manuals for Ada 95, Ada 2005, and Ada 2012 are included in
the GNAT documentation package.

@node Related Information,Conventions,What You Should Know before Reading This Guide,About This Guide
@anchor{gnat_ugn/about_this_guide related-information}@anchor{12}
@section Related Information


For further information about Ada and related tools, please refer to the
following documents:


@itemize *

@item 
@cite{Ada 95 Reference Manual}, @cite{Ada 2005 Reference Manual}, and
@cite{Ada 2012 Reference Manual}, which contain reference
material for the several revisions of the Ada language standard.

@item 
@cite{GNAT Reference_Manual}, which contains all reference material for the GNAT
implementation of Ada.

@item 
@cite{Using GNAT Studio}, which describes the GNAT Studio
Integrated Development Environment.

@item 
@cite{GNAT Studio Tutorial}, which introduces the
main GNAT Studio features through examples.

@item 
@cite{Debugging with GDB},
for all details on the use of the GNU source-level debugger.

@item 
@cite{GNU Emacs Manual},
for full information on the extensible editor and programming
environment Emacs.
@end itemize

@node Conventions,,Related Information,About This Guide
@anchor{gnat_ugn/about_this_guide conventions}@anchor{13}
@section Conventions


@geindex Conventions
@geindex typographical

@geindex Typographical conventions

Following are examples of the typographical and graphic conventions used
in this guide:


@itemize *

@item 
@code{Functions}, @code{utility program names}, @code{standard names},
and @code{classes}.

@item 
@code{Option flags}

@item 
@code{File names}

@item 
@code{Variables}

@item 
@emph{Emphasis}

@item 
[optional information or parameters]

@item 
Examples are described by text

@example
and then shown this way.
@end example

@item 
Commands that are entered by the user are shown as preceded by a prompt string
comprising the @code{$} character followed by a space.

@item 
Full file names are shown with the ‘/’ character
as the directory separator; e.g., @code{parent-dir/subdir/myfile.adb}.
If you are using GNAT on a Windows platform, please note that
the ‘\’ character should be used instead.
@end itemize

@node Getting Started with GNAT,The GNAT Compilation Model,About This Guide,Top
@anchor{gnat_ugn/getting_started_with_gnat doc}@anchor{14}@anchor{gnat_ugn/getting_started_with_gnat getting-started-with-gnat}@anchor{8}@anchor{gnat_ugn/getting_started_with_gnat id1}@anchor{15}
@chapter Getting Started with GNAT


This chapter describes how to use GNAT’s command line interface to build
executable Ada programs.
On most platforms a visually oriented Integrated Development Environment
is also available: GNAT Studio.
GNAT Studio offers a graphical “look and feel”, support for development in
other programming languages, comprehensive browsing features, and
many other capabilities.
For information on GNAT Studio please refer to the
@cite{GNAT Studio documentation}.

@menu
* System Requirements:: 
* Running GNAT:: 
* Running a Simple Ada Program:: 
* Running a Program with Multiple Units:: 

@end menu

@node System Requirements,Running GNAT,,Getting Started with GNAT
@anchor{gnat_ugn/getting_started_with_gnat id2}@anchor{16}@anchor{gnat_ugn/getting_started_with_gnat system-requirements}@anchor{17}
@section System Requirements


Even though any machine can run the GNAT toolset and GNAT Studio IDE, in order
to get the best experience, we recommend using a machine with as many cores
as possible since all individual compilations can run in parallel.
A comfortable setup for a compiler server is a machine with 24 physical cores
or more, with at least 48 GB of memory (2 GB per core).

For a desktop machine, a minimum of 4 cores is recommended (8 preferred),
with at least 2GB per core (so 8 to 16GB).

In addition, for running and navigating sources in GNAT Studio smoothly, we
recommend at least 1.5 GB plus 3 GB of RAM per 1 million source line of code.
In other words, we recommend at least 3 GB for for 500K lines of code and
7.5 GB for 2 million lines of code.

Note that using local and fast drives will also make a difference in terms of
build and link time. Network drives such as NFS, SMB, or worse, configuration
management filesystems (such as ClearCase dynamic views) should be avoided as
much as possible and will produce very degraded performance (typically 2 to 3
times slower than on local fast drives). If such slow drives cannot be avoided
for accessing the source code, then you should at least configure your project
file so that the result of the compilation is stored on a drive local to the
machine performing the run. This can be achieved by setting the @code{Object_Dir}
project file attribute.

@node Running GNAT,Running a Simple Ada Program,System Requirements,Getting Started with GNAT
@anchor{gnat_ugn/getting_started_with_gnat id3}@anchor{18}@anchor{gnat_ugn/getting_started_with_gnat running-gnat}@anchor{19}
@section Running GNAT


Three steps are needed to create an executable file from an Ada source
file:


@itemize *

@item 
The source file(s) must be compiled.

@item 
The file(s) must be bound using the GNAT binder.

@item 
All appropriate object files must be linked to produce an executable.
@end itemize

All three steps are most commonly handled by using the @code{gnatmake}
utility program that, given the name of the main program, automatically
performs the necessary compilation, binding and linking steps.

@node Running a Simple Ada Program,Running a Program with Multiple Units,Running GNAT,Getting Started with GNAT
@anchor{gnat_ugn/getting_started_with_gnat id4}@anchor{1a}@anchor{gnat_ugn/getting_started_with_gnat running-a-simple-ada-program}@anchor{1b}
@section Running a Simple Ada Program


Any text editor may be used to prepare an Ada program.
(If Emacs is used, the optional Ada mode may be helpful in laying out the
program.)
The program text is a normal text file. We will assume in our initial
example that you have used your editor to prepare the following
standard format text file:

@example
with Ada.Text_IO; use Ada.Text_IO;
procedure Hello is
begin
   Put_Line ("Hello WORLD!");
end Hello;
@end example

This file should be named @code{hello.adb}.
With the normal default file naming conventions, GNAT requires
that each file
contain a single compilation unit whose file name is the
unit name,
with periods replaced by hyphens; the
extension is @code{ads} for a
spec and @code{adb} for a body.
You can override this default file naming convention by use of the
special pragma @code{Source_File_Name} (for further information please
see @ref{1c,,Using Other File Names}).
Alternatively, if you want to rename your files according to this default
convention, which is probably more convenient if you will be using GNAT
for all your compilations, then the @code{gnatchop} utility
can be used to generate correctly-named source files
(see @ref{1d,,Renaming Files with gnatchop}).

You can compile the program using the following command (@code{$} is used
as the command prompt in the examples in this document):

@example
$ gcc -c hello.adb
@end example

@code{gcc} is the command used to run the compiler. This compiler is
capable of compiling programs in several languages, including Ada and
C. It assumes that you have given it an Ada program if the file extension is
either @code{.ads} or @code{.adb}, and it will then call
the GNAT compiler to compile the specified file.

The @code{-c} switch is required. It tells @code{gcc} to only do a
compilation. (For C programs, @code{gcc} can also do linking, but this
capability is not used directly for Ada programs, so the @code{-c}
switch must always be present.)

This compile command generates a file
@code{hello.o}, which is the object
file corresponding to your Ada program. It also generates
an ‘Ada Library Information’ file @code{hello.ali},
which contains additional information used to check
that an Ada program is consistent.

To build an executable file, use either @code{gnatmake} or gprbuild with
the name of the main file: these tools are builders that will take care of
all the necessary build steps in the correct order.
In particular, these builders automatically recompile any sources that have
been modified since they were last compiled, or sources that depend
on such modified sources, so that ‘version skew’ is avoided.

@geindex Version skew (avoided by `@w{`}gnatmake`@w{`})

@example
$ gnatmake hello.adb
@end example

The result is an executable program called @code{hello}, which can be
run by entering:

@example
$ hello
@end example

assuming that the current directory is on the search path
for executable programs.

and, if all has gone well, you will see:

@example
Hello WORLD!
@end example

appear in response to this command.

@node Running a Program with Multiple Units,,Running a Simple Ada Program,Getting Started with GNAT
@anchor{gnat_ugn/getting_started_with_gnat id5}@anchor{1e}@anchor{gnat_ugn/getting_started_with_gnat running-a-program-with-multiple-units}@anchor{1f}
@section Running a Program with Multiple Units


Consider a slightly more complicated example that has three files: a
main program, and the spec and body of a package:

@example
package Greetings is
   procedure Hello;
   procedure Goodbye;
end Greetings;

with Ada.Text_IO; use Ada.Text_IO;
package body Greetings is
   procedure Hello is
   begin
      Put_Line ("Hello WORLD!");
   end Hello;

   procedure Goodbye is
   begin
      Put_Line ("Goodbye WORLD!");
   end Goodbye;
end Greetings;

with Greetings;
procedure Gmain is
begin
   Greetings.Hello;
   Greetings.Goodbye;
end Gmain;
@end example

Following the one-unit-per-file rule, place this program in the
following three separate files:


@table @asis

@item @emph{greetings.ads}

spec of package @code{Greetings}

@item @emph{greetings.adb}

body of package @code{Greetings}

@item @emph{gmain.adb}

body of main program
@end table

Note that there is no required order of compilation when using GNAT.
In particular it is perfectly fine to compile the main program first.
Also, it is not necessary to compile package specs in the case where
there is an accompanying body; you only need to compile the body. If you want
to submit these files to the compiler for semantic checking and not code
generation, then use the @code{-gnatc} switch:

@example
$ gcc -c greetings.ads -gnatc
@end example

Although the compilation can be done in separate steps, in practice it is
almost always more convenient to use the @code{gnatmake} or @code{gprbuild} tools:

@example
$ gnatmake gmain.adb
@end example

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

@node The GNAT Compilation Model,Building Executable Programs with GNAT,Getting Started with GNAT,Top
@anchor{gnat_ugn/the_gnat_compilation_model doc}@anchor{20}@anchor{gnat_ugn/the_gnat_compilation_model id1}@anchor{21}@anchor{gnat_ugn/the_gnat_compilation_model the-gnat-compilation-model}@anchor{9}
@chapter The GNAT Compilation Model


@geindex GNAT compilation model

@geindex Compilation model

This chapter describes the compilation model used by GNAT. Although
similar to that used by other languages such as C and C++, this model
is substantially different from the traditional Ada compilation models,
which are based on a centralized program library. The chapter covers
the following material:


@itemize *

@item 
Topics related to source file makeup and naming


@itemize *

@item 
@ref{22,,Source Representation}

@item 
@ref{23,,Foreign Language Representation}

@item 
@ref{24,,File Naming Topics and Utilities}
@end itemize

@item 
@ref{25,,Configuration Pragmas}

@item 
@ref{26,,Generating Object Files}

@item 
@ref{27,,Source Dependencies}

@item 
@ref{28,,The Ada Library Information Files}

@item 
@ref{29,,Binding an Ada Program}

@item 
@ref{2a,,GNAT and Libraries}

@item 
@ref{2b,,Conditional Compilation}

@item 
@ref{2c,,Mixed Language Programming}

@item 
@ref{2d,,GNAT and Other Compilation Models}

@item 
@ref{2e,,Using GNAT Files with External Tools}
@end itemize

@menu
* Source Representation:: 
* Foreign Language Representation:: 
* File Naming Topics and Utilities:: 
* Configuration Pragmas:: 
* Generating Object Files:: 
* Source Dependencies:: 
* The Ada Library Information Files:: 
* Binding an Ada Program:: 
* GNAT and Libraries:: 
* Conditional Compilation:: 
* Mixed Language Programming:: 
* GNAT and Other Compilation Models:: 
* Using GNAT Files with External Tools:: 

@end menu

@node Source Representation,Foreign Language Representation,,The GNAT Compilation Model
@anchor{gnat_ugn/the_gnat_compilation_model id2}@anchor{2f}@anchor{gnat_ugn/the_gnat_compilation_model source-representation}@anchor{22}
@section Source Representation


@geindex Latin-1

@geindex VT
@geindex HT
@geindex CR
@geindex LF
@geindex FF

Ada source programs are represented in standard text files, using
Latin-1 coding. Latin-1 is an 8-bit code that includes the familiar
7-bit ASCII set, plus additional characters used for
representing foreign languages (see @ref{23,,Foreign Language Representation}
for support of non-USA character sets). The format effector characters
are represented using their standard ASCII encodings, as follows:

@quotation


@multitable {xxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxx} 
@item

Character

@tab

Effect

@tab

Code

@item

@code{VT}

@tab

Vertical tab

@tab

@code{16#0B#}

@item

@code{HT}

@tab

Horizontal tab

@tab

@code{16#09#}

@item

@code{CR}

@tab

Carriage return

@tab

@code{16#0D#}

@item

@code{LF}

@tab

Line feed

@tab

@code{16#0A#}

@item

@code{FF}

@tab

Form feed

@tab

@code{16#0C#}

@end multitable

@end quotation

Source files are in standard text file format. In addition, GNAT will
recognize a wide variety of stream formats, in which the end of
physical lines is marked by any of the following sequences:
@code{LF}, @code{CR}, @code{CR-LF}, or @code{LF-CR}. This is useful
in accommodating files that are imported from other operating systems.

@geindex End of source file; Source file@comma{} end

@geindex SUB (control character)

The end of a source file is normally represented by the physical end of
file. However, the control character @code{16#1A#} (@code{SUB}) is also
recognized as signalling the end of the source file. Again, this is
provided for compatibility with other operating systems where this
code is used to represent the end of file.

@geindex spec (definition)
@geindex compilation (definition)

Each file contains a single Ada compilation unit, including any pragmas
associated with the unit. For example, this means you must place a
package declaration (a package @emph{spec}) and the corresponding body in
separate files. An Ada @emph{compilation} (which is a sequence of
compilation units) is represented using a sequence of files. Similarly,
you will place each subunit or child unit in a separate file.

@node Foreign Language Representation,File Naming Topics and Utilities,Source Representation,The GNAT Compilation Model
@anchor{gnat_ugn/the_gnat_compilation_model foreign-language-representation}@anchor{23}@anchor{gnat_ugn/the_gnat_compilation_model id3}@anchor{30}
@section Foreign Language Representation


GNAT supports the standard character sets defined in Ada as well as
several other non-standard character sets for use in localized versions
of the compiler (@ref{31,,Character Set Control}).

@menu
* Latin-1:: 
* Other 8-Bit Codes:: 
* Wide_Character Encodings:: 
* Wide_Wide_Character Encodings:: 

@end menu

@node Latin-1,Other 8-Bit Codes,,Foreign Language Representation
@anchor{gnat_ugn/the_gnat_compilation_model id4}@anchor{32}@anchor{gnat_ugn/the_gnat_compilation_model latin-1}@anchor{33}
@subsection Latin-1


@geindex Latin-1

The basic character set is Latin-1. This character set is defined by ISO
standard 8859, part 1. The lower half (character codes @code{16#00#}
… @code{16#7F#)} is identical to standard ASCII coding, but the upper
half is used to represent additional characters. These include extended letters
used by European languages, such as French accents, the vowels with umlauts
used in German, and the extra letter A-ring used in Swedish.

@geindex Ada.Characters.Latin_1

For a complete list of Latin-1 codes and their encodings, see the source
file of library unit @code{Ada.Characters.Latin_1} in file
@code{a-chlat1.ads}.
You may use any of these extended characters freely in character or
string literals. In addition, the extended characters that represent
letters can be used in identifiers.

@node Other 8-Bit Codes,Wide_Character Encodings,Latin-1,Foreign Language Representation
@anchor{gnat_ugn/the_gnat_compilation_model id5}@anchor{34}@anchor{gnat_ugn/the_gnat_compilation_model other-8-bit-codes}@anchor{35}
@subsection Other 8-Bit Codes


GNAT also supports several other 8-bit coding schemes:

@geindex Latin-2

@geindex ISO 8859-2


@table @asis

@item @emph{ISO 8859-2 (Latin-2)}

Latin-2 letters allowed in identifiers, with uppercase and lowercase
equivalence.
@end table

@geindex Latin-3

@geindex ISO 8859-3


@table @asis

@item @emph{ISO 8859-3 (Latin-3)}

Latin-3 letters allowed in identifiers, with uppercase and lowercase
equivalence.
@end table

@geindex Latin-4

@geindex ISO 8859-4


@table @asis

@item @emph{ISO 8859-4 (Latin-4)}

Latin-4 letters allowed in identifiers, with uppercase and lowercase
equivalence.
@end table

@geindex ISO 8859-5

@geindex Cyrillic


@table @asis

@item @emph{ISO 8859-5 (Cyrillic)}

ISO 8859-5 letters (Cyrillic) allowed in identifiers, with uppercase and
lowercase equivalence.
@end table

@geindex ISO 8859-15

@geindex Latin-9


@table @asis

@item @emph{ISO 8859-15 (Latin-9)}

ISO 8859-15 (Latin-9) letters allowed in identifiers, with uppercase and
lowercase equivalence
@end table

@geindex code page 437 (IBM PC)


@table @asis

@item @emph{IBM PC (code page 437)}

This code page is the normal default for PCs in the U.S. It corresponds
to the original IBM PC character set. This set has some, but not all, of
the extended Latin-1 letters, but these letters do not have the same
encoding as Latin-1. In this mode, these letters are allowed in
identifiers with uppercase and lowercase equivalence.
@end table

@geindex code page 850 (IBM PC)


@table @asis

@item @emph{IBM PC (code page 850)}

This code page is a modification of 437 extended to include all the
Latin-1 letters, but still not with the usual Latin-1 encoding. In this
mode, all these letters are allowed in identifiers with uppercase and
lowercase equivalence.

@item @emph{Full Upper 8-bit}

Any character in the range 80-FF allowed in identifiers, and all are
considered distinct. In other words, there are no uppercase and lowercase
equivalences in this range. This is useful in conjunction with
certain encoding schemes used for some foreign character sets (e.g.,
the typical method of representing Chinese characters on the PC).

@item @emph{No Upper-Half}

No upper-half characters in the range 80-FF are allowed in identifiers.
This gives Ada 83 compatibility for identifier names.
@end table

For precise data on the encodings permitted, and the uppercase and lowercase
equivalences that are recognized, see the file @code{csets.adb} in
the GNAT compiler sources. You will need to obtain a full source release
of GNAT to obtain this file.

@node Wide_Character Encodings,Wide_Wide_Character Encodings,Other 8-Bit Codes,Foreign Language Representation
@anchor{gnat_ugn/the_gnat_compilation_model id6}@anchor{36}@anchor{gnat_ugn/the_gnat_compilation_model wide-character-encodings}@anchor{37}
@subsection Wide_Character Encodings


GNAT allows wide character codes to appear in character and string
literals, and also optionally in identifiers, by means of the following
possible encoding schemes:


@table @asis

@item @emph{Hex Coding}

In this encoding, a wide character is represented by the following five
character sequence:

@example
ESC a b c d
@end example

where @code{a}, @code{b}, @code{c}, @code{d} are the four hexadecimal
characters (using uppercase letters) of the wide character code. For
example, ESC A345 is used to represent the wide character with code
@code{16#A345#}.
This scheme is compatible with use of the full Wide_Character set.

@item @emph{Upper-Half Coding}

@geindex Upper-Half Coding

The wide character with encoding @code{16#abcd#} where the upper bit is on
(in other words, ‘a’ is in the range 8-F) is represented as two bytes,
@code{16#ab#} and @code{16#cd#}. The second byte cannot be a format control
character, but is not required to be in the upper half. This method can
be also used for shift-JIS or EUC, where the internal coding matches the
external coding.

@item @emph{Shift JIS Coding}

@geindex Shift JIS Coding

A wide character is represented by a two-character sequence,
@code{16#ab#} and
@code{16#cd#}, with the restrictions described for upper-half encoding as
described above. The internal character code is the corresponding JIS
character according to the standard algorithm for Shift-JIS
conversion. Only characters defined in the JIS code set table can be
used with this encoding method.

@item @emph{EUC Coding}

@geindex EUC Coding

A wide character is represented by a two-character sequence
@code{16#ab#} and
@code{16#cd#}, with both characters being in the upper half. The internal
character code is the corresponding JIS character according to the EUC
encoding algorithm. Only characters defined in the JIS code set table
can be used with this encoding method.

@item @emph{UTF-8 Coding}

A wide character is represented using
UCS Transformation Format 8 (UTF-8) as defined in Annex R of ISO
10646-1/Am.2. Depending on the character value, the representation
is a one, two, or three byte sequence:

@example
16#0000#-16#007f#: 2#0xxxxxxx#
16#0080#-16#07ff#: 2#110xxxxx# 2#10xxxxxx#
16#0800#-16#ffff#: 2#1110xxxx# 2#10xxxxxx# 2#10xxxxxx#
@end example

where the @code{xxx} bits correspond to the left-padded bits of the
16-bit character value. Note that all lower half ASCII characters
are represented as ASCII bytes and all upper half characters and
other wide characters are represented as sequences of upper-half
(The full UTF-8 scheme allows for encoding 31-bit characters as
6-byte sequences, and in the following section on wide wide
characters, the use of these sequences is documented).

@item @emph{Brackets Coding}

In this encoding, a wide character is represented by the following eight
character sequence:

@example
[ " a b c d " ]
@end example

where @code{a}, @code{b}, @code{c}, @code{d} are the four hexadecimal
characters (using uppercase letters) of the wide character code. For
example, [‘A345’] is used to represent the wide character with code
@code{16#A345#}. It is also possible (though not required) to use the
Brackets coding for upper half characters. For example, the code
@code{16#A3#} can be represented as @code{['A3']}.

This scheme is compatible with use of the full Wide_Character set,
and is also the method used for wide character encoding in some standard
ACATS (Ada Conformity Assessment Test Suite) test suite distributions.
@end table

@cartouche
@quotation Note 
Some of these coding schemes do not permit the full use of the
Ada character set. For example, neither Shift JIS nor EUC allow the
use of the upper half of the Latin-1 set.
@end quotation
@end cartouche

@node Wide_Wide_Character Encodings,,Wide_Character Encodings,Foreign Language Representation
@anchor{gnat_ugn/the_gnat_compilation_model id7}@anchor{38}@anchor{gnat_ugn/the_gnat_compilation_model wide-wide-character-encodings}@anchor{39}
@subsection Wide_Wide_Character Encodings


GNAT allows wide wide character codes to appear in character and string
literals, and also optionally in identifiers, by means of the following
possible encoding schemes:


@table @asis

@item @emph{UTF-8 Coding}

A wide character is represented using
UCS Transformation Format 8 (UTF-8) as defined in Annex R of ISO
10646-1/Am.2. Depending on the character value, the representation
of character codes with values greater than 16#FFFF# is a
is a four, five, or six byte sequence:

@example
16#01_0000#-16#10_FFFF#:     11110xxx 10xxxxxx 10xxxxxx
                             10xxxxxx
16#0020_0000#-16#03FF_FFFF#: 111110xx 10xxxxxx 10xxxxxx
                             10xxxxxx 10xxxxxx
16#0400_0000#-16#7FFF_FFFF#: 1111110x 10xxxxxx 10xxxxxx
                             10xxxxxx 10xxxxxx 10xxxxxx
@end example

where the @code{xxx} bits correspond to the left-padded bits of the
32-bit character value.

@item @emph{Brackets Coding}

In this encoding, a wide wide character is represented by the following ten or
twelve byte character sequence:

@example
[ " a b c d e f " ]
[ " a b c d e f g h " ]
@end example

where @code{a-h} are the six or eight hexadecimal
characters (using uppercase letters) of the wide wide character code. For
example, [“1F4567”] is used to represent the wide wide character with code
@code{16#001F_4567#}.

This scheme is compatible with use of the full Wide_Wide_Character set,
and is also the method used for wide wide character encoding in some standard
ACATS (Ada Conformity Assessment Test Suite) test suite distributions.
@end table

@node File Naming Topics and Utilities,Configuration Pragmas,Foreign Language Representation,The GNAT Compilation Model
@anchor{gnat_ugn/the_gnat_compilation_model file-naming-topics-and-utilities}@anchor{24}@anchor{gnat_ugn/the_gnat_compilation_model id8}@anchor{3a}
@section File Naming Topics and Utilities


GNAT has a default file naming scheme and also provides the user with
a high degree of control over how the names and extensions of the
source files correspond to the Ada compilation units that they contain.

@menu
* File Naming Rules:: 
* Using Other File Names:: 
* Alternative File Naming Schemes:: 
* Handling Arbitrary File Naming Conventions with gnatname:: 
* File Name Krunching with gnatkr:: 
* Renaming Files with gnatchop:: 

@end menu

@node File Naming Rules,Using Other File Names,,File Naming Topics and Utilities
@anchor{gnat_ugn/the_gnat_compilation_model file-naming-rules}@anchor{3b}@anchor{gnat_ugn/the_gnat_compilation_model id9}@anchor{3c}
@subsection File Naming Rules


The default file name is determined by the name of the unit that the
file contains. The name is formed by taking the full expanded name of
the unit and replacing the separating dots with hyphens and using
lowercase for all letters.

An exception arises if the file name generated by the above rules starts
with one of the characters
@code{a}, @code{g}, @code{i}, or @code{s}, and the second character is a
minus. In this case, the character tilde is used in place
of the minus. The reason for this special rule is to avoid clashes with
the standard names for child units of the packages System, Ada,
Interfaces, and GNAT, which use the prefixes
@code{s-}, @code{a-}, @code{i-}, and @code{g-},
respectively.

The file extension is @code{.ads} for a spec and
@code{.adb} for a body. The following table shows some
examples of these rules.

@quotation


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

Source File

@tab

Ada Compilation Unit

@item

@code{main.ads}

@tab

Main (spec)

@item

@code{main.adb}

@tab

Main (body)

@item

@code{arith_functions.ads}

@tab

Arith_Functions (package spec)

@item

@code{arith_functions.adb}

@tab

Arith_Functions (package body)

@item

@code{func-spec.ads}

@tab

Func.Spec (child package spec)

@item

@code{func-spec.adb}

@tab

Func.Spec (child package body)

@item

@code{main-sub.adb}

@tab

Sub (subunit of Main)

@item

@code{a~bad.adb}

@tab

A.Bad (child package body)

@end multitable

@end quotation

Following these rules can result in excessively long
file names if corresponding
unit names are long (for example, if child units or subunits are
heavily nested). An option is available to shorten such long file names
(called file name ‘krunching’). This may be particularly useful when
programs being developed with GNAT are to be used on operating systems
with limited file name lengths. @ref{3d,,Using gnatkr}.

Of course, no file shortening algorithm can guarantee uniqueness over
all possible unit names; if file name krunching is used, it is your
responsibility to ensure no name clashes occur. Alternatively you
can specify the exact file names that you want used, as described
in the next section. Finally, if your Ada programs are migrating from a
compiler with a different naming convention, you can use the gnatchop
utility to produce source files that follow the GNAT naming conventions.
(For details see @ref{1d,,Renaming Files with gnatchop}.)

Note: in the case of Windows or Mac OS operating systems, case is not
significant. So for example on Windows if the canonical name is
@code{main-sub.adb}, you can use the file name @code{Main-Sub.adb} instead.
However, case is significant for other operating systems, so for example,
if you want to use other than canonically cased file names on a Unix system,
you need to follow the procedures described in the next section.

@node Using Other File Names,Alternative File Naming Schemes,File Naming Rules,File Naming Topics and Utilities
@anchor{gnat_ugn/the_gnat_compilation_model id10}@anchor{3e}@anchor{gnat_ugn/the_gnat_compilation_model using-other-file-names}@anchor{1c}
@subsection Using Other File Names


@geindex File names

In the previous section, we have described the default rules used by
GNAT to determine the file name in which a given unit resides. It is
often convenient to follow these default rules, and if you follow them,
the compiler knows without being explicitly told where to find all
the files it needs.

@geindex Source_File_Name pragma

However, in some cases, particularly when a program is imported from
another Ada compiler environment, it may be more convenient for the
programmer to specify which file names contain which units. GNAT allows
arbitrary file names to be used by means of the Source_File_Name pragma.
The form of this pragma is as shown in the following examples:

@example
pragma Source_File_Name (My_Utilities.Stacks,
  Spec_File_Name => "myutilst_a.ada");
pragma Source_File_name (My_Utilities.Stacks,
  Body_File_Name => "myutilst.ada");
@end example

As shown in this example, the first argument for the pragma is the unit
name (in this example a child unit). The second argument has the form
of a named association. The identifier
indicates whether the file name is for a spec or a body;
the file name itself is given by a string literal.

The source file name pragma is a configuration pragma, which means that
normally it will be placed in the @code{gnat.adc}
file used to hold configuration
pragmas that apply to a complete compilation environment.
For more details on how the @code{gnat.adc} file is created and used
see @ref{3f,,Handling of Configuration Pragmas}.

@geindex gnat.adc

GNAT allows completely arbitrary file names to be specified using the
source file name pragma. However, if the file name specified has an
extension other than @code{.ads} or @code{.adb} it is necessary to use
a special syntax when compiling the file. The name in this case must be
preceded by the special sequence @code{-x} followed by a space and the name
of the language, here @code{ada}, as in:

@example
$ gcc -c -x ada peculiar_file_name.sim
@end example

@code{gnatmake} handles non-standard file names in the usual manner (the
non-standard file name for the main program is simply used as the
argument to gnatmake). Note that if the extension is also non-standard,
then it must be included in the @code{gnatmake} command, it may not
be omitted.

@node Alternative File Naming Schemes,Handling Arbitrary File Naming Conventions with gnatname,Using Other File Names,File Naming Topics and Utilities
@anchor{gnat_ugn/the_gnat_compilation_model alternative-file-naming-schemes}@anchor{40}@anchor{gnat_ugn/the_gnat_compilation_model id11}@anchor{41}
@subsection Alternative File Naming Schemes


@geindex File naming schemes
@geindex alternative

@geindex File names

The previous section described the use of the @code{Source_File_Name}
pragma to allow arbitrary names to be assigned to individual source files.
However, this approach requires one pragma for each file, and especially in
large systems can result in very long @code{gnat.adc} files, and also create
a maintenance problem.

@geindex Source_File_Name pragma

GNAT also provides a facility for specifying systematic file naming schemes
other than the standard default naming scheme previously described. An
alternative scheme for naming is specified by the use of
@code{Source_File_Name} pragmas having the following format:

@example
pragma Source_File_Name (
   Spec_File_Name  => FILE_NAME_PATTERN
 [ , Casing          => CASING_SPEC]
 [ , Dot_Replacement => STRING_LITERAL ] );

pragma Source_File_Name (
   Body_File_Name  => FILE_NAME_PATTERN
 [ , Casing          => CASING_SPEC ]
 [ , Dot_Replacement => STRING_LITERAL ] ) ;

pragma Source_File_Name (
   Subunit_File_Name  => FILE_NAME_PATTERN
 [ , Casing          => CASING_SPEC ]
 [ , Dot_Replacement => STRING_LITERAL ] ) ;

FILE_NAME_PATTERN ::= STRING_LITERAL
CASING_SPEC ::= Lowercase | Uppercase | Mixedcase
@end example

The @code{FILE_NAME_PATTERN} string shows how the file name is constructed.
It contains a single asterisk character, and the unit name is substituted
systematically for this asterisk. The optional parameter
@code{Casing} indicates
whether the unit name is to be all upper-case letters, all lower-case letters,
or mixed-case. If no
@code{Casing} parameter is used, then the default is all
lower-case.

The optional @code{Dot_Replacement} string is used to replace any periods
that occur in subunit or child unit names. If no @code{Dot_Replacement}
argument is used then separating dots appear unchanged in the resulting
file name.
Although the above syntax indicates that the
@code{Casing} argument must appear
before the @code{Dot_Replacement} argument, but it
is also permissible to write these arguments in the opposite order.

As indicated, it is possible to specify different naming schemes for
bodies, specs, and subunits. Quite often the rule for subunits is the
same as the rule for bodies, in which case, there is no need to give
a separate @code{Subunit_File_Name} rule, and in this case the
@code{Body_File_name} rule is used for subunits as well.

The separate rule for subunits can also be used to implement the rather
unusual case of a compilation environment (e.g., a single directory) which
contains a subunit and a child unit with the same unit name. Although
both units cannot appear in the same partition, the Ada Reference Manual
allows (but does not require) the possibility of the two units coexisting
in the same environment.

The file name translation works in the following steps:


@itemize *

@item 
If there is a specific @code{Source_File_Name} pragma for the given unit,
then this is always used, and any general pattern rules are ignored.

@item 
If there is a pattern type @code{Source_File_Name} pragma that applies to
the unit, then the resulting file name will be used if the file exists. If
more than one pattern matches, the latest one will be tried first, and the
first attempt resulting in a reference to a file that exists will be used.

@item 
If no pattern type @code{Source_File_Name} pragma that applies to the unit
for which the corresponding file exists, then the standard GNAT default
naming rules are used.
@end itemize

As an example of the use of this mechanism, consider a commonly used scheme
in which file names are all lower case, with separating periods copied
unchanged to the resulting file name, and specs end with @code{.1.ada}, and
bodies end with @code{.2.ada}. GNAT will follow this scheme if the following
two pragmas appear:

@example
pragma Source_File_Name
  (Spec_File_Name => ".1.ada");
pragma Source_File_Name
  (Body_File_Name => ".2.ada");
@end example

The default GNAT scheme is actually implemented by providing the following
default pragmas internally:

@example
pragma Source_File_Name
  (Spec_File_Name => ".ads", Dot_Replacement => "-");
pragma Source_File_Name
  (Body_File_Name => ".adb", Dot_Replacement => "-");
@end example

Our final example implements a scheme typically used with one of the
Ada 83 compilers, where the separator character for subunits was ‘__’
(two underscores), specs were identified by adding @code{_.ADA}, bodies
by adding @code{.ADA}, and subunits by
adding @code{.SEP}. All file names were
upper case. Child units were not present of course since this was an
Ada 83 compiler, but it seems reasonable to extend this scheme to use
the same double underscore separator for child units.

@example
pragma Source_File_Name
  (Spec_File_Name => "_.ADA",
   Dot_Replacement => "__",
   Casing = Uppercase);
pragma Source_File_Name
  (Body_File_Name => ".ADA",
   Dot_Replacement => "__",
   Casing = Uppercase);
pragma Source_File_Name
  (Subunit_File_Name => ".SEP",
   Dot_Replacement => "__",
   Casing = Uppercase);
@end example

@geindex gnatname

@node Handling Arbitrary File Naming Conventions with gnatname,File Name Krunching with gnatkr,Alternative File Naming Schemes,File Naming Topics and Utilities
@anchor{gnat_ugn/the_gnat_compilation_model handling-arbitrary-file-naming-conventions-with-gnatname}@anchor{42}@anchor{gnat_ugn/the_gnat_compilation_model id12}@anchor{43}
@subsection Handling Arbitrary File Naming Conventions with @code{gnatname}


@geindex File Naming Conventions

@menu
* Arbitrary File Naming Conventions:: 
* Running gnatname:: 
* Switches for gnatname:: 
* Examples of gnatname Usage:: 

@end menu

@node Arbitrary File Naming Conventions,Running gnatname,,Handling Arbitrary File Naming Conventions with gnatname
@anchor{gnat_ugn/the_gnat_compilation_model arbitrary-file-naming-conventions}@anchor{44}@anchor{gnat_ugn/the_gnat_compilation_model id13}@anchor{45}
@subsubsection Arbitrary File Naming Conventions


The GNAT compiler must be able to know the source file name of a compilation
unit.  When using the standard GNAT default file naming conventions
(@code{.ads} for specs, @code{.adb} for bodies), the GNAT compiler
does not need additional information.

When the source file names do not follow the standard GNAT default file naming
conventions, the GNAT compiler must be given additional information through
a configuration pragmas file (@ref{25,,Configuration Pragmas})
or a project file.
When the non-standard file naming conventions are well-defined,
a small number of pragmas @code{Source_File_Name} specifying a naming pattern
(@ref{40,,Alternative File Naming Schemes}) may be sufficient. However,
if the file naming conventions are irregular or arbitrary, a number
of pragma @code{Source_File_Name} for individual compilation units
must be defined.
To help maintain the correspondence between compilation unit names and
source file names within the compiler,
GNAT provides a tool @code{gnatname} to generate the required pragmas for a
set of files.

@node Running gnatname,Switches for gnatname,Arbitrary File Naming Conventions,Handling Arbitrary File Naming Conventions with gnatname
@anchor{gnat_ugn/the_gnat_compilation_model id14}@anchor{46}@anchor{gnat_ugn/the_gnat_compilation_model running-gnatname}@anchor{47}
@subsubsection Running @code{gnatname}


The usual form of the @code{gnatname} command is:

@example
$ gnatname [ switches ]  naming_pattern  [ naming_patterns ]
    [--and [ switches ]  naming_pattern  [ naming_patterns ]]
@end example

All of the arguments are optional. If invoked without any argument,
@code{gnatname} will display its usage.

When used with at least one naming pattern, @code{gnatname} will attempt to
find all the compilation units in files that follow at least one of the
naming patterns. To find these compilation units,
@code{gnatname} will use the GNAT compiler in syntax-check-only mode on all
regular files.

One or several Naming Patterns may be given as arguments to @code{gnatname}.
Each Naming Pattern is enclosed between double quotes (or single
quotes on Windows).
A Naming Pattern is a regular expression similar to the wildcard patterns
used in file names by the Unix shells or the DOS prompt.

@code{gnatname} may be called with several sections of directories/patterns.
Sections are separated by the switch @code{--and}. In each section, there must be
at least one pattern. If no directory is specified in a section, the current
directory (or the project directory if @code{-P} is used) is implied.
The options other that the directory switches and the patterns apply globally
even if they are in different sections.

Examples of Naming Patterns are:

@example
"*.[12].ada"
"*.ad[sb]*"
"body_*"    "spec_*"
@end example

For a more complete description of the syntax of Naming Patterns,
see the second kind of regular expressions described in @code{g-regexp.ads}
(the ‘Glob’ regular expressions).

When invoked without the switch @code{-P}, @code{gnatname} will create a
configuration pragmas file @code{gnat.adc} in the current working directory,
with pragmas @code{Source_File_Name} for each file that contains a valid Ada
unit.

@node Switches for gnatname,Examples of gnatname Usage,Running gnatname,Handling Arbitrary File Naming Conventions with gnatname
@anchor{gnat_ugn/the_gnat_compilation_model id15}@anchor{48}@anchor{gnat_ugn/the_gnat_compilation_model switches-for-gnatname}@anchor{49}
@subsubsection Switches for @code{gnatname}


Switches for @code{gnatname} must precede any specified Naming Pattern.

You may specify any of the following switches to @code{gnatname}:

@geindex --version (gnatname)


@table @asis

@item @code{--version}

Display Copyright and version, then exit disregarding all other options.
@end table

@geindex --help (gnatname)


@table @asis

@item @code{--help}

If @code{--version} was not used, display usage, then exit disregarding
all other options.

@item @code{--subdirs=@emph{dir}}

Real object, library or exec directories are subdirectories <dir> of the
specified ones.

@item @code{--no-backup}

Do not create a backup copy of an existing project file.

@item @code{--and}

Start another section of directories/patterns.
@end table

@geindex -c (gnatname)


@table @asis

@item @code{-c@emph{filename}}

Create a configuration pragmas file @code{filename} (instead of the default
@code{gnat.adc}).
There may be zero, one or more space between @code{-c} and
@code{filename}.
@code{filename} may include directory information. @code{filename} must be
writable. There may be only one switch @code{-c}.
When a switch @code{-c} is
specified, no switch @code{-P} may be specified (see below).
@end table

@geindex -d (gnatname)


@table @asis

@item @code{-d@emph{dir}}

Look for source files in directory @code{dir}. There may be zero, one or more
spaces between @code{-d} and @code{dir}.
@code{dir} may end with @code{/**}, that is it may be of the form
@code{root_dir/**}. In this case, the directory @code{root_dir} and all of its
subdirectories, recursively, have to be searched for sources.
When a switch @code{-d}
is specified, the current working directory will not be searched for source
files, unless it is explicitly specified with a @code{-d}
or @code{-D} switch.
Several switches @code{-d} may be specified.
If @code{dir} is a relative path, it is relative to the directory of
the configuration pragmas file specified with switch
@code{-c},
or to the directory of the project file specified with switch
@code{-P} or,
if neither switch @code{-c}
nor switch @code{-P} are specified, it is relative to the
current working directory. The directory
specified with switch @code{-d} must exist and be readable.
@end table

@geindex -D (gnatname)


@table @asis

@item @code{-D@emph{filename}}

Look for source files in all directories listed in text file @code{filename}.
There may be zero, one or more spaces between @code{-D}
and @code{filename}.
@code{filename} must be an existing, readable text file.
Each nonempty line in @code{filename} must be a directory.
Specifying switch @code{-D} is equivalent to specifying as many
switches @code{-d} as there are nonempty lines in
@code{file}.

@item @code{-eL}

Follow symbolic links when processing project files.

@geindex -f (gnatname)

@item @code{-f@emph{pattern}}

Foreign patterns. Using this switch, it is possible to add sources of languages
other than Ada to the list of sources of a project file.
It is only useful if a -P switch is used.
For example,

@example
gnatname -Pprj -f"*.c" "*.ada"
@end example

will look for Ada units in all files with the @code{.ada} extension,
and will add to the list of file for project @code{prj.gpr} the C files
with extension @code{.c}.

@geindex -h (gnatname)

@item @code{-h}

Output usage (help) information. The output is written to @code{stdout}.

@geindex -P (gnatname)

@item @code{-P@emph{proj}}

Create or update project file @code{proj}. There may be zero, one or more space
between @code{-P} and @code{proj}. @code{proj} may include directory
information. @code{proj} must be writable.
There may be only one switch @code{-P}.
When a switch @code{-P} is specified,
no switch @code{-c} may be specified.
On all platforms, except on VMS, when @code{gnatname} is invoked for an
existing project file <proj>.gpr, a backup copy of the project file is created
in the project directory with file name <proj>.gpr.saved_x. ‘x’ is the first
non negative number that makes this backup copy a new file.

@geindex -v (gnatname)

@item @code{-v}

Verbose mode. Output detailed explanation of behavior to @code{stdout}.
This includes name of the file written, the name of the directories to search
and, for each file in those directories whose name matches at least one of
the Naming Patterns, an indication of whether the file contains a unit,
and if so the name of the unit.
@end table

@geindex -v -v (gnatname)


@table @asis

@item @code{-v -v}

Very Verbose mode. In addition to the output produced in verbose mode,
for each file in the searched directories whose name matches none of
the Naming Patterns, an indication is given that there is no match.

@geindex -x (gnatname)

@item @code{-x@emph{pattern}}

Excluded patterns. Using this switch, it is possible to exclude some files
that would match the name patterns. For example,

@example
gnatname -x "*_nt.ada" "*.ada"
@end example

will look for Ada units in all files with the @code{.ada} extension,
except those whose names end with @code{_nt.ada}.
@end table

@node Examples of gnatname Usage,,Switches for gnatname,Handling Arbitrary File Naming Conventions with gnatname
@anchor{gnat_ugn/the_gnat_compilation_model examples-of-gnatname-usage}@anchor{4a}@anchor{gnat_ugn/the_gnat_compilation_model id16}@anchor{4b}
@subsubsection Examples of @code{gnatname} Usage


@example
$ gnatname -c /home/me/names.adc -d sources "[a-z]*.ada*"
@end example

In this example, the directory @code{/home/me} must already exist
and be writable. In addition, the directory
@code{/home/me/sources} (specified by
@code{-d sources}) must exist and be readable.

Note the optional spaces after @code{-c} and @code{-d}.

@example
$ gnatname -P/home/me/proj -x "*_nt_body.ada"
-dsources -dsources/plus -Dcommon_dirs.txt "body_*" "spec_*"
@end example

Note that several switches @code{-d} may be used,
even in conjunction with one or several switches
@code{-D}. Several Naming Patterns and one excluded pattern
are used in this example.

@node File Name Krunching with gnatkr,Renaming Files with gnatchop,Handling Arbitrary File Naming Conventions with gnatname,File Naming Topics and Utilities
@anchor{gnat_ugn/the_gnat_compilation_model file-name-krunching-with-gnatkr}@anchor{4c}@anchor{gnat_ugn/the_gnat_compilation_model id17}@anchor{4d}
@subsection File Name Krunching with @code{gnatkr}


@geindex gnatkr

This section discusses the method used by the compiler to shorten
the default file names chosen for Ada units so that they do not
exceed the maximum length permitted. It also describes the
@code{gnatkr} utility that can be used to determine the result of
applying this shortening.

@menu
* About gnatkr:: 
* Using gnatkr:: 
* Krunching Method:: 
* Examples of gnatkr Usage:: 

@end menu

@node About gnatkr,Using gnatkr,,File Name Krunching with gnatkr
@anchor{gnat_ugn/the_gnat_compilation_model about-gnatkr}@anchor{4e}@anchor{gnat_ugn/the_gnat_compilation_model id18}@anchor{4f}
@subsubsection About @code{gnatkr}


The default file naming rule in GNAT
is that the file name must be derived from
the unit name. The exact default rule is as follows:


@itemize *

@item 
Take the unit name and replace all dots by hyphens.

@item 
If such a replacement occurs in the
second character position of a name, and the first character is
@code{a}, @code{g}, @code{s}, or @code{i},
then replace the dot by the character
@code{~} (tilde)
instead of a minus.

The reason for this exception is to avoid clashes
with the standard names for children of System, Ada, Interfaces,
and GNAT, which use the prefixes
@code{s-}, @code{a-}, @code{i-}, and @code{g-},
respectively.
@end itemize

The @code{-gnatk@emph{nn}}
switch of the compiler activates a ‘krunching’
circuit that limits file names to nn characters (where nn is a decimal
integer).

The @code{gnatkr} utility can be used to determine the krunched name for
a given file, when krunched to a specified maximum length.

@node Using gnatkr,Krunching Method,About gnatkr,File Name Krunching with gnatkr
@anchor{gnat_ugn/the_gnat_compilation_model id19}@anchor{50}@anchor{gnat_ugn/the_gnat_compilation_model using-gnatkr}@anchor{3d}
@subsubsection Using @code{gnatkr}


The @code{gnatkr} command has the form:

@example
$ gnatkr name [ length ]
@end example

@code{name} is the uncrunched file name, derived from the name of the unit
in the standard manner described in the previous section (i.e., in particular
all dots are replaced by hyphens). The file name may or may not have an
extension (defined as a suffix of the form period followed by arbitrary
characters other than period). If an extension is present then it will
be preserved in the output. For example, when krunching @code{hellofile.ads}
to eight characters, the result will be hellofil.ads.

Note: for compatibility with previous versions of @code{gnatkr} dots may
appear in the name instead of hyphens, but the last dot will always be
taken as the start of an extension. So if @code{gnatkr} is given an argument
such as @code{Hello.World.adb} it will be treated exactly as if the first
period had been a hyphen, and for example krunching to eight characters
gives the result @code{hellworl.adb}.

Note that the result is always all lower case.
Characters of the other case are folded as required.

@code{length} represents the length of the krunched name. The default
when no argument is given is 8 characters. A length of zero stands for
unlimited, in other words do not chop except for system files where the
implied crunching length is always eight characters.

The output is the krunched name. The output has an extension only if the
original argument was a file name with an extension.

@node Krunching Method,Examples of gnatkr Usage,Using gnatkr,File Name Krunching with gnatkr
@anchor{gnat_ugn/the_gnat_compilation_model id20}@anchor{51}@anchor{gnat_ugn/the_gnat_compilation_model krunching-method}@anchor{52}
@subsubsection Krunching Method


The initial file name is determined by the name of the unit that the file
contains. The name is formed by taking the full expanded name of the
unit and replacing the separating dots with hyphens and
using lowercase
for all letters, except that a hyphen in the second character position is
replaced by a tilde if the first character is
@code{a}, @code{i}, @code{g}, or @code{s}.
The extension is @code{.ads} for a
spec and @code{.adb} for a body.
Krunching does not affect the extension, but the file name is shortened to
the specified length by following these rules:


@itemize *

@item 
The name is divided into segments separated by hyphens, tildes or
underscores and all hyphens, tildes, and underscores are
eliminated. If this leaves the name short enough, we are done.

@item 
If the name is too long, the longest segment is located (left-most
if there are two of equal length), and shortened by dropping
its last character. This is repeated until the name is short enough.

As an example, consider the krunching of @code{our-strings-wide_fixed.adb}
to fit the name into 8 characters as required by some operating systems:

@example
our-strings-wide_fixed 22
our strings wide fixed 19
our string  wide fixed 18
our strin   wide fixed 17
our stri    wide fixed 16
our stri    wide fixe  15
our str     wide fixe  14
our str     wid  fixe  13
our str     wid  fix   12
ou  str     wid  fix   11
ou  st      wid  fix   10
ou  st      wi   fix   9
ou  st      wi   fi    8
Final file name: oustwifi.adb
@end example

@item 
The file names for all predefined units are always krunched to eight
characters. The krunching of these predefined units uses the following
special prefix replacements:


@multitable {xxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxx} 
@item

Prefix

@tab

Replacement

@item

@code{ada-}

@tab

@code{a-}

@item

@code{gnat-}

@tab

@code{g-}

@item

@code{interfac es-}

@tab

@code{i-}

@item

@code{system-}

@tab

@code{s-}

@end multitable


These system files have a hyphen in the second character position. That
is why normal user files replace such a character with a
tilde, to avoid confusion with system file names.

As an example of this special rule, consider
@code{ada-strings-wide_fixed.adb}, which gets krunched as follows:

@example
ada-strings-wide_fixed 22
a-  strings wide fixed 18
a-  string  wide fixed 17
a-  strin   wide fixed 16
a-  stri    wide fixed 15
a-  stri    wide fixe  14
a-  str     wide fixe  13
a-  str     wid  fixe  12
a-  str     wid  fix   11
a-  st      wid  fix   10
a-  st      wi   fix   9
a-  st      wi   fi    8
Final file name: a-stwifi.adb
@end example
@end itemize

Of course no file shortening algorithm can guarantee uniqueness over all
possible unit names, and if file name krunching is used then it is your
responsibility to ensure that no name clashes occur. The utility
program @code{gnatkr} is supplied for conveniently determining the
krunched name of a file.

@node Examples of gnatkr Usage,,Krunching Method,File Name Krunching with gnatkr
@anchor{gnat_ugn/the_gnat_compilation_model examples-of-gnatkr-usage}@anchor{53}@anchor{gnat_ugn/the_gnat_compilation_model id21}@anchor{54}
@subsubsection Examples of @code{gnatkr} Usage


@example
$ gnatkr very_long_unit_name.ads      --> velounna.ads
$ gnatkr grandparent-parent-child.ads --> grparchi.ads
$ gnatkr Grandparent.Parent.Child.ads --> grparchi.ads
$ gnatkr grandparent-parent-child     --> grparchi
$ gnatkr very_long_unit_name.ads/count=6 --> vlunna.ads
$ gnatkr very_long_unit_name.ads/count=0 --> very_long_unit_name.ads
@end example

@node Renaming Files with gnatchop,,File Name Krunching with gnatkr,File Naming Topics and Utilities
@anchor{gnat_ugn/the_gnat_compilation_model id22}@anchor{55}@anchor{gnat_ugn/the_gnat_compilation_model renaming-files-with-gnatchop}@anchor{1d}
@subsection Renaming Files with @code{gnatchop}


@geindex gnatchop

This section discusses how to handle files with multiple units by using
the @code{gnatchop} utility. This utility is also useful in renaming
files to meet the standard GNAT default file naming conventions.

@menu
* Handling Files with Multiple Units:: 
* Operating gnatchop in Compilation Mode:: 
* Command Line for gnatchop:: 
* Switches for gnatchop:: 
* Examples of gnatchop Usage:: 

@end menu

@node Handling Files with Multiple Units,Operating gnatchop in Compilation Mode,,Renaming Files with gnatchop
@anchor{gnat_ugn/the_gnat_compilation_model handling-files-with-multiple-units}@anchor{56}@anchor{gnat_ugn/the_gnat_compilation_model id23}@anchor{57}
@subsubsection Handling Files with Multiple Units


The basic compilation model of GNAT requires that a file submitted to the
compiler have only one unit and there be a strict correspondence
between the file name and the unit name.

If you want to keep your files with multiple units,
perhaps to maintain compatibility with some other Ada compilation system,
you can use @code{gnatname} to generate or update your project files.
Generated or modified project files can be processed by GNAT.

See @ref{42,,Handling Arbitrary File Naming Conventions with gnatname}
for more details on how to use @cite{gnatname}.

Alternatively, if you want to permanently restructure a set of ‘foreign’
files so that they match the GNAT rules, and do the remaining development
using the GNAT structure, you can simply use @code{gnatchop} once, generate the
new set of files and work with them from that point on.

Note that if your file containing multiple units starts with a byte order
mark (BOM) specifying UTF-8 encoding, then the files generated by gnatchop
will each start with a copy of this BOM, meaning that they can be compiled
automatically in UTF-8 mode without needing to specify an explicit encoding.

@node Operating gnatchop in Compilation Mode,Command Line for gnatchop,Handling Files with Multiple Units,Renaming Files with gnatchop
@anchor{gnat_ugn/the_gnat_compilation_model id24}@anchor{58}@anchor{gnat_ugn/the_gnat_compilation_model operating-gnatchop-in-compilation-mode}@anchor{59}
@subsubsection Operating gnatchop in Compilation Mode


The basic function of @code{gnatchop} is to take a file with multiple units
and split it into separate files. The boundary between files is reasonably
clear, except for the issue of comments and pragmas. In default mode, the
rule is that any pragmas between units belong to the previous unit, except
that configuration pragmas always belong to the following unit. Any comments
belong to the following unit. These rules
almost always result in the right choice of
the split point without needing to mark it explicitly and most users will
find this default to be what they want. In this default mode it is incorrect to
submit a file containing only configuration pragmas, or one that ends in
configuration pragmas, to @code{gnatchop}.

However, using a special option to activate ‘compilation mode’,
@code{gnatchop}
can perform another function, which is to provide exactly the semantics
required by the RM for handling of configuration pragmas in a compilation.
In the absence of configuration pragmas (at the main file level), this
option has no effect, but it causes such configuration pragmas to be handled
in a quite different manner.

First, in compilation mode, if @code{gnatchop} is given a file that consists of
only configuration pragmas, then this file is appended to the
@code{gnat.adc} file in the current directory. This behavior provides
the required behavior described in the RM for the actions to be taken
on submitting such a file to the compiler, namely that these pragmas
should apply to all subsequent compilations in the same compilation
environment. Using GNAT, the current directory, possibly containing a
@code{gnat.adc} file is the representation
of a compilation environment. For more information on the
@code{gnat.adc} file, see @ref{3f,,Handling of Configuration Pragmas}.

Second, in compilation mode, if @code{gnatchop}
is given a file that starts with
configuration pragmas, and contains one or more units, then these
configuration pragmas are prepended to each of the chopped files. This
behavior provides the required behavior described in the RM for the
actions to be taken on compiling such a file, namely that the pragmas
apply to all units in the compilation, but not to subsequently compiled
units.

Finally, if configuration pragmas appear between units, they are appended
to the previous unit. This results in the previous unit being illegal,
since the compiler does not accept configuration pragmas that follow
a unit. This provides the required RM behavior that forbids configuration
pragmas other than those preceding the first compilation unit of a
compilation.

For most purposes, @code{gnatchop} will be used in default mode. The
compilation mode described above is used only if you need exactly
accurate behavior with respect to compilations, and you have files
that contain multiple units and configuration pragmas. In this
circumstance the use of @code{gnatchop} with the compilation mode
switch provides the required behavior, and is for example the mode
in which GNAT processes the ACVC tests.

@node Command Line for gnatchop,Switches for gnatchop,Operating gnatchop in Compilation Mode,Renaming Files with gnatchop
@anchor{gnat_ugn/the_gnat_compilation_model command-line-for-gnatchop}@anchor{5a}@anchor{gnat_ugn/the_gnat_compilation_model id25}@anchor{5b}
@subsubsection Command Line for @code{gnatchop}


The @code{gnatchop} command has the form:

@example
$ gnatchop switches file_name [file_name ...]
      [directory]
@end example

The only required argument is the file name of the file to be chopped.
There are no restrictions on the form of this file name. The file itself
contains one or more Ada units, in normal GNAT format, concatenated
together. As shown, more than one file may be presented to be chopped.

When run in default mode, @code{gnatchop} generates one output file in
the current directory for each unit in each of the files.

@code{directory}, if specified, gives the name of the directory to which
the output files will be written. If it is not specified, all files are
written to the current directory.

For example, given a
file called @code{hellofiles} containing

@example
procedure Hello;

with Ada.Text_IO; use Ada.Text_IO;
procedure Hello is
begin
   Put_Line ("Hello");
end Hello;
@end example

the command

@example
$ gnatchop hellofiles
@end example

generates two files in the current directory, one called
@code{hello.ads} containing the single line that is the procedure spec,
and the other called @code{hello.adb} containing the remaining text. The
original file is not affected. The generated files can be compiled in
the normal manner.

When gnatchop is invoked on a file that is empty or that contains only empty
lines and/or comments, gnatchop will not fail, but will not produce any
new sources.

For example, given a
file called @code{toto.txt} containing

@example
--  Just a comment
@end example

the command

@example
$ gnatchop toto.txt
@end example

will not produce any new file and will result in the following warnings:

@example
toto.txt:1:01: warning: empty file, contains no compilation units
no compilation units found
no source files written
@end example

@node Switches for gnatchop,Examples of gnatchop Usage,Command Line for gnatchop,Renaming Files with gnatchop
@anchor{gnat_ugn/the_gnat_compilation_model id26}@anchor{5c}@anchor{gnat_ugn/the_gnat_compilation_model switches-for-gnatchop}@anchor{5d}
@subsubsection Switches for @code{gnatchop}


@code{gnatchop} recognizes the following switches:

@geindex --version (gnatchop)


@table @asis

@item @code{--version}

Display Copyright and version, then exit disregarding all other options.
@end table

@geindex --help (gnatchop)


@table @asis

@item @code{--help}

If @code{--version} was not used, display usage, then exit disregarding
all other options.
@end table

@geindex -c (gnatchop)


@table @asis

@item @code{-c}

Causes @code{gnatchop} to operate in compilation mode, in which
configuration pragmas are handled according to strict RM rules. See
previous section for a full description of this mode.

@item @code{-gnat@emph{xxx}}

This passes the given @code{-gnat@emph{xxx}} switch to @code{gnat} which is
used to parse the given file. Not all @emph{xxx} options make sense,
but for example, the use of @code{-gnati2} allows @code{gnatchop} to
process a source file that uses Latin-2 coding for identifiers.

@item @code{-h}

Causes @code{gnatchop} to generate a brief help summary to the standard
output file showing usage information.
@end table

@geindex -k (gnatchop)


@table @asis

@item @code{-k@emph{mm}}

Limit generated file names to the specified number @code{mm}
of characters.
This is useful if the
resulting set of files is required to be interoperable with systems
which limit the length of file names.
No space is allowed between the @code{-k} and the numeric value. The numeric
value may be omitted in which case a default of @code{-k8},
suitable for use
with DOS-like file systems, is used. If no @code{-k} switch
is present then
there is no limit on the length of file names.
@end table

@geindex -p (gnatchop)


@table @asis

@item @code{-p}

Causes the file modification time stamp of the input file to be
preserved and used for the time stamp of the output file(s). This may be
useful for preserving coherency of time stamps in an environment where
@code{gnatchop} is used as part of a standard build process.
@end table

@geindex -q (gnatchop)


@table @asis

@item @code{-q}

Causes output of informational messages indicating the set of generated
files to be suppressed. Warnings and error messages are unaffected.
@end table

@geindex -r (gnatchop)

@geindex Source_Reference pragmas


@table @asis

@item @code{-r}

Generate @code{Source_Reference} pragmas. Use this switch if the output
files are regarded as temporary and development is to be done in terms
of the original unchopped file. This switch causes
@code{Source_Reference} pragmas to be inserted into each of the
generated files to refers back to the original file name and line number.
The result is that all error messages refer back to the original
unchopped file.
In addition, the debugging information placed into the object file (when
the @code{-g} switch of @code{gcc} or @code{gnatmake} is
specified)
also refers back to this original file so that tools like profilers and
debuggers will give information in terms of the original unchopped file.

If the original file to be chopped itself contains
a @code{Source_Reference}
pragma referencing a third file, then gnatchop respects
this pragma, and the generated @code{Source_Reference} pragmas
in the chopped file refer to the original file, with appropriate
line numbers. This is particularly useful when @code{gnatchop}
is used in conjunction with @code{gnatprep} to compile files that
contain preprocessing statements and multiple units.
@end table

@geindex -v (gnatchop)


@table @asis

@item @code{-v}

Causes @code{gnatchop} to operate in verbose mode. The version
number and copyright notice are output, as well as exact copies of
the gnat1 commands spawned to obtain the chop control information.
@end table

@geindex -w (gnatchop)


@table @asis

@item @code{-w}

Overwrite existing file names. Normally @code{gnatchop} regards it as a
fatal error if there is already a file with the same name as a
file it would otherwise output, in other words if the files to be
chopped contain duplicated units. This switch bypasses this
check, and causes all but the last instance of such duplicated
units to be skipped.
@end table

@geindex --GCC= (gnatchop)


@table @asis

@item @code{--GCC=@emph{xxxx}}

Specify the path of the GNAT parser to be used. When this switch is used,
no attempt is made to add the prefix to the GNAT parser executable.
@end table

@node Examples of gnatchop Usage,,Switches for gnatchop,Renaming Files with gnatchop
@anchor{gnat_ugn/the_gnat_compilation_model examples-of-gnatchop-usage}@anchor{5e}@anchor{gnat_ugn/the_gnat_compilation_model id27}@anchor{5f}
@subsubsection Examples of @code{gnatchop} Usage


@example
$ gnatchop -w hello_s.ada prerelease/files
@end example

Chops the source file @code{hello_s.ada}. The output files will be
placed in the directory @code{prerelease/files},
overwriting any
files with matching names in that directory (no files in the current
directory are modified).

@example
$ gnatchop archive
@end example

Chops the source file @code{archive}
into the current directory. One
useful application of @code{gnatchop} is in sending sets of sources
around, for example in email messages. The required sources are simply
concatenated (for example, using a Unix @code{cat}
command), and then
@code{gnatchop} is used at the other end to reconstitute the original
file names.

@example
$ gnatchop file1 file2 file3 direc
@end example

Chops all units in files @code{file1}, @code{file2}, @code{file3}, placing
the resulting files in the directory @code{direc}. Note that if any units
occur more than once anywhere within this set of files, an error message
is generated, and no files are written. To override this check, use the
@code{-w} switch,
in which case the last occurrence in the last file will
be the one that is output, and earlier duplicate occurrences for a given
unit will be skipped.

@node Configuration Pragmas,Generating Object Files,File Naming Topics and Utilities,The GNAT Compilation Model
@anchor{gnat_ugn/the_gnat_compilation_model configuration-pragmas}@anchor{25}@anchor{gnat_ugn/the_gnat_compilation_model id28}@anchor{60}
@section Configuration Pragmas


@geindex Configuration pragmas

@geindex Pragmas
@geindex configuration

Configuration pragmas include those pragmas described as
such in the Ada Reference Manual, as well as
implementation-dependent pragmas that are configuration pragmas.
See the @code{Implementation_Defined_Pragmas} chapter in the
@cite{GNAT_Reference_Manual} for details on these
additional GNAT-specific configuration pragmas.
Most notably, the pragma @code{Source_File_Name}, which allows
specifying non-default names for source files, is a configuration
pragma. The following is a complete list of configuration pragmas
recognized by GNAT:

@example
Ada_83
Ada_95
Ada_05
Ada_2005
Ada_12
Ada_2012
Allow_Integer_Address
Annotate
Assertion_Policy
Assume_No_Invalid_Values
C_Pass_By_Copy
Check_Float_Overflow
Check_Name
Check_Policy
Component_Alignment
Convention_Identifier
Debug_Policy
Default_Scalar_Storage_Order
Default_Storage_Pool
Detect_Blocking
Disable_Atomic_Synchronization
Discard_Names
Elaboration_Checks
Eliminate
Enable_Atomic_Synchronization
Extend_System
Extensions_Allowed
External_Name_Casing
Fast_Math
Favor_Top_Level
Ignore_Pragma
Implicit_Packing
Initialize_Scalars
Interrupt_State
License
Locking_Policy
No_Component_Reordering
No_Heap_Finalization
No_Strict_Aliasing
Normalize_Scalars
Optimize_Alignment
Overflow_Mode
Overriding_Renamings
Partition_Elaboration_Policy
Persistent_BSS
Prefix_Exception_Messages
Priority_Specific_Dispatching
Profile
Profile_Warnings
Queuing_Policy
Rename_Pragma
Restrictions
Restriction_Warnings
Reviewable
Short_Circuit_And_Or
Source_File_Name
Source_File_Name_Project
SPARK_Mode
Style_Checks
Suppress
Suppress_Exception_Locations
Task_Dispatching_Policy
Unevaluated_Use_Of_Old
Unsuppress
Use_VADS_Size
Validity_Checks
Warning_As_Error
Warnings
Wide_Character_Encoding
@end example

@menu
* Handling of Configuration Pragmas:: 
* The Configuration Pragmas Files:: 

@end menu

@node Handling of Configuration Pragmas,The Configuration Pragmas Files,,Configuration Pragmas
@anchor{gnat_ugn/the_gnat_compilation_model handling-of-configuration-pragmas}@anchor{3f}@anchor{gnat_ugn/the_gnat_compilation_model id29}@anchor{61}
@subsection Handling of Configuration Pragmas


Configuration pragmas may either appear at the start of a compilation
unit, or they can appear in a configuration pragma file to apply to
all compilations performed in a given compilation environment.

GNAT also provides the @code{gnatchop} utility to provide an automatic
way to handle configuration pragmas following the semantics for
compilations (that is, files with multiple units), described in the RM.
See @ref{59,,Operating gnatchop in Compilation Mode} for details.
However, for most purposes, it will be more convenient to edit the
@code{gnat.adc} file that contains configuration pragmas directly,
as described in the following section.

In the case of @code{Restrictions} pragmas appearing as configuration
pragmas in individual compilation units, the exact handling depends on
the type of restriction.

Restrictions that require partition-wide consistency (like
@code{No_Tasking}) are
recognized wherever they appear
and can be freely inherited, e.g. from a @emph{with}ed unit to the @emph{with}ing
unit. This makes sense since the binder will in any case insist on seeing
consistent use, so any unit not conforming to any restrictions that are
anywhere in the partition will be rejected, and you might as well find
that out at compile time rather than at bind time.

For restrictions that do not require partition-wide consistency, e.g.
SPARK or No_Implementation_Attributes, in general the restriction applies
only to the unit in which the pragma appears, and not to any other units.

The exception is No_Elaboration_Code which always applies to the entire
object file from a compilation, i.e. to the body, spec, and all subunits.
This restriction can be specified in a configuration pragma file, or it
can be on the body and/or the spec (in either case it applies to all the
relevant units). It can appear on a subunit only if it has previously
appeared in the body of spec.

@node The Configuration Pragmas Files,,Handling of Configuration Pragmas,Configuration Pragmas
@anchor{gnat_ugn/the_gnat_compilation_model id30}@anchor{62}@anchor{gnat_ugn/the_gnat_compilation_model the-configuration-pragmas-files}@anchor{63}
@subsection The Configuration Pragmas Files


@geindex gnat.adc

In GNAT a compilation environment is defined by the current
directory at the time that a compile command is given. This current
directory is searched for a file whose name is @code{gnat.adc}. If
this file is present, it is expected to contain one or more
configuration pragmas that will be applied to the current compilation.
However, if the switch @code{-gnatA} is used, @code{gnat.adc} is not
considered. When taken into account, @code{gnat.adc} is added to the
dependencies, so that if @code{gnat.adc} is modified later, an invocation of
@code{gnatmake} will recompile the source.

Configuration pragmas may be entered into the @code{gnat.adc} file
either by running @code{gnatchop} on a source file that consists only of
configuration pragmas, or more conveniently by direct editing of the
@code{gnat.adc} file, which is a standard format source file.

Besides @code{gnat.adc}, additional files containing configuration
pragmas may be applied to the current compilation using the switch
@code{-gnatec=@emph{path}} where @code{path} must designate an existing file that
contains only configuration pragmas. These configuration pragmas are
in addition to those found in @code{gnat.adc} (provided @code{gnat.adc}
is present and switch @code{-gnatA} is not used).

It is allowable to specify several switches @code{-gnatec=}, all of which
will be taken into account.

Files containing configuration pragmas specified with switches
@code{-gnatec=} are added to the dependencies, unless they are
temporary files. A file is considered temporary if its name ends in
@code{.tmp} or @code{.TMP}. Certain tools follow this naming
convention because they pass information to @code{gcc} via
temporary files that are immediately deleted; it doesn’t make sense to
depend on a file that no longer exists. Such tools include
@code{gprbuild}, @code{gnatmake}, and @code{gnatcheck}.

By default, configuration pragma files are stored by their absolute paths in
ALI files. You can use the @code{-gnateb} switch in order to store them by
their basename instead.

If you are using project file, a separate mechanism is provided using
project attributes.

@c --Comment
@c See :ref:`Specifying_Configuration_Pragmas` for more details.

@node Generating Object Files,Source Dependencies,Configuration Pragmas,The GNAT Compilation Model
@anchor{gnat_ugn/the_gnat_compilation_model generating-object-files}@anchor{26}@anchor{gnat_ugn/the_gnat_compilation_model id31}@anchor{64}
@section Generating Object Files


An Ada program consists of a set of source files, and the first step in
compiling the program is to generate the corresponding object files.
These are generated by compiling a subset of these source files.
The files you need to compile are the following:


@itemize *

@item 
If a package spec has no body, compile the package spec to produce the
object file for the package.

@item 
If a package has both a spec and a body, compile the body to produce the
object file for the package. The source file for the package spec need
not be compiled in this case because there is only one object file, which
contains the code for both the spec and body of the package.

@item 
For a subprogram, compile the subprogram body to produce the object file
for the subprogram. The spec, if one is present, is as usual in a
separate file, and need not be compiled.
@end itemize

@geindex Subunits


@itemize *

@item 
In the case of subunits, only compile the parent unit. A single object
file is generated for the entire subunit tree, which includes all the
subunits.

@item 
Compile child units independently of their parent units
(though, of course, the spec of all the ancestor unit must be present in order
to compile a child unit).

@geindex Generics

@item 
Compile generic units in the same manner as any other units. The object
files in this case are small dummy files that contain at most the
flag used for elaboration checking. This is because GNAT always handles generic
instantiation by means of macro expansion. However, it is still necessary to
compile generic units, for dependency checking and elaboration purposes.
@end itemize

The preceding rules describe the set of files that must be compiled to
generate the object files for a program. Each object file has the same
name as the corresponding source file, except that the extension is
@code{.o} as usual.

You may wish to compile other files for the purpose of checking their
syntactic and semantic correctness. For example, in the case where a
package has a separate spec and body, you would not normally compile the
spec. However, it is convenient in practice to compile the spec to make
sure it is error-free before compiling clients of this spec, because such
compilations will fail if there is an error in the spec.

GNAT provides an option for compiling such files purely for the
purposes of checking correctness; such compilations are not required as
part of the process of building a program. To compile a file in this
checking mode, use the @code{-gnatc} switch.

@node Source Dependencies,The Ada Library Information Files,Generating Object Files,The GNAT Compilation Model
@anchor{gnat_ugn/the_gnat_compilation_model id32}@anchor{65}@anchor{gnat_ugn/the_gnat_compilation_model source-dependencies}@anchor{27}
@section Source Dependencies


A given object file clearly depends on the source file which is compiled
to produce it. Here we are using “depends” in the sense of a typical
@code{make} utility; in other words, an object file depends on a source
file if changes to the source file require the object file to be
recompiled.
In addition to this basic dependency, a given object may depend on
additional source files as follows:


@itemize *

@item 
If a file being compiled @emph{with}s a unit @code{X}, the object file
depends on the file containing the spec of unit @code{X}. This includes
files that are @emph{with}ed implicitly either because they are parents
of @emph{with}ed child units or they are run-time units required by the
language constructs used in a particular unit.

@item 
If a file being compiled instantiates a library level generic unit, the
object file depends on both the spec and body files for this generic
unit.

@item 
If a file being compiled instantiates a generic unit defined within a
package, the object file depends on the body file for the package as
well as the spec file.
@end itemize

@geindex Inline

@geindex -gnatn switch


@itemize *

@item 
If a file being compiled contains a call to a subprogram for which
pragma @code{Inline} applies and inlining is activated with the
@code{-gnatn} switch, the object file depends on the file containing the
body of this subprogram as well as on the file containing the spec. Note
that for inlining to actually occur as a result of the use of this switch,
it is necessary to compile in optimizing mode.

@geindex -gnatN switch

The use of @code{-gnatN} activates  inlining optimization
that is performed by the front end of the compiler. This inlining does
not require that the code generation be optimized. Like @code{-gnatn},
the use of this switch generates additional dependencies.

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

@item 
If an object file @code{O} depends on the proper body of a subunit through
inlining or instantiation, it depends on the parent unit of the subunit.
This means that any modification of the parent unit or one of its subunits
affects the compilation of @code{O}.

@item 
The object file for a parent unit depends on all its subunit body files.

@item 
The previous two rules meant that for purposes of computing dependencies and
recompilation, a body and all its subunits are treated as an indivisible whole.

These rules are applied transitively: if unit @code{A} @emph{with}s
unit @code{B}, whose elaboration calls an inlined procedure in package
@code{C}, the object file for unit @code{A} will depend on the body of
@code{C}, in file @code{c.adb}.

The set of dependent files described by these rules includes all the
files on which the unit is semantically dependent, as dictated by the
Ada language standard. However, it is a superset of what the
standard describes, because it includes generic, inline, and subunit
dependencies.

An object file must be recreated by recompiling the corresponding source
file if any of the source files on which it depends are modified. For
example, if the @code{make} utility is used to control compilation,
the rule for an Ada object file must mention all the source files on
which the object file depends, according to the above definition.
The determination of the necessary
recompilations is done automatically when one uses @code{gnatmake}.
@end itemize

@node The Ada Library Information Files,Binding an Ada Program,Source Dependencies,The GNAT Compilation Model
@anchor{gnat_ugn/the_gnat_compilation_model id33}@anchor{66}@anchor{gnat_ugn/the_gnat_compilation_model the-ada-library-information-files}@anchor{28}
@section The Ada Library Information Files


@geindex Ada Library Information files

@geindex ALI files

Each compilation actually generates two output files. The first of these
is the normal object file that has a @code{.o} extension. The second is a
text file containing full dependency information. It has the same
name as the source file, but an @code{.ali} extension.
This file is known as the Ada Library Information (@code{ALI}) file.
The following information is contained in the @code{ALI} file.


@itemize *

@item 
Version information (indicates which version of GNAT was used to compile
the unit(s) in question)

@item 
Main program information (including priority and time slice settings,
as well as the wide character encoding used during compilation).

@item 
List of arguments used in the @code{gcc} command for the compilation

@item 
Attributes of the unit, including configuration pragmas used, an indication
of whether the compilation was successful, exception model used etc.

@item 
A list of relevant restrictions applying to the unit (used for consistency)
checking.

@item 
Categorization information (e.g., use of pragma @code{Pure}).

@item 
Information on all @emph{with}ed units, including presence of
@code{Elaborate} or @code{Elaborate_All} pragmas.

@item 
Information from any @code{Linker_Options} pragmas used in the unit

@item 
Information on the use of @code{Body_Version} or @code{Version}
attributes in the unit.

@item 
Dependency information. This is a list of files, together with
time stamp and checksum information. These are files on which
the unit depends in the sense that recompilation is required
if any of these units are modified.

@item 
Cross-reference data. Contains information on all entities referenced
in the unit. Used by tools like @code{gnatxref} and @code{gnatfind} to
provide cross-reference information.
@end itemize

For a full detailed description of the format of the @code{ALI} file,
see the source of the body of unit @code{Lib.Writ}, contained in file
@code{lib-writ.adb} in the GNAT compiler sources.

@node Binding an Ada Program,GNAT and Libraries,The Ada Library Information Files,The GNAT Compilation Model
@anchor{gnat_ugn/the_gnat_compilation_model binding-an-ada-program}@anchor{29}@anchor{gnat_ugn/the_gnat_compilation_model id34}@anchor{67}
@section Binding an Ada Program


When using languages such as C and C++, once the source files have been
compiled the only remaining step in building an executable program
is linking the object modules together. This means that it is possible to
link an inconsistent version of a program, in which two units have
included different versions of the same header.

The rules of Ada do not permit such an inconsistent program to be built.
For example, if two clients have different versions of the same package,
it is illegal to build a program containing these two clients.
These rules are enforced by the GNAT binder, which also determines an
elaboration order consistent with the Ada rules.

The GNAT binder is run after all the object files for a program have
been created. It is given the name of the main program unit, and from
this it determines the set of units required by the program, by reading the
corresponding ALI files. It generates error messages if the program is
inconsistent or if no valid order of elaboration exists.

If no errors are detected, the binder produces a main program, in Ada by
default, that contains calls to the elaboration procedures of those
compilation unit that require them, followed by
a call to the main program. This Ada program is compiled to generate the
object file for the main program. The name of
the Ada file is @code{b~xxx}.adb` (with the corresponding spec
@code{b~xxx}.ads`) where @code{xxx} is the name of the
main program unit.

Finally, the linker is used to build the resulting executable program,
using the object from the main program from the bind step as well as the
object files for the Ada units of the program.

@node GNAT and Libraries,Conditional Compilation,Binding an Ada Program,The GNAT Compilation Model
@anchor{gnat_ugn/the_gnat_compilation_model gnat-and-libraries}@anchor{2a}@anchor{gnat_ugn/the_gnat_compilation_model id35}@anchor{68}
@section GNAT and Libraries


@geindex Library building and using

This section describes how to build and use libraries with GNAT, and also shows
how to recompile the GNAT run-time library. You should be familiar with the
Project Manager facility (see the @emph{GNAT_Project_Manager} chapter of the
@emph{GPRbuild User’s Guide}) before reading this chapter.

@menu
* Introduction to Libraries in GNAT:: 
* General Ada Libraries:: 
* Stand-alone Ada Libraries:: 
* Rebuilding the GNAT Run-Time Library:: 

@end menu

@node Introduction to Libraries in GNAT,General Ada Libraries,,GNAT and Libraries
@anchor{gnat_ugn/the_gnat_compilation_model id36}@anchor{69}@anchor{gnat_ugn/the_gnat_compilation_model introduction-to-libraries-in-gnat}@anchor{6a}
@subsection Introduction to Libraries in GNAT


A library is, conceptually, a collection of objects which does not have its
own main thread of execution, but rather provides certain services to the
applications that use it. A library can be either statically linked with the
application, in which case its code is directly included in the application,
or, on platforms that support it, be dynamically linked, in which case
its code is shared by all applications making use of this library.

GNAT supports both types of libraries.
In the static case, the compiled code can be provided in different ways. The
simplest approach is to provide directly the set of objects resulting from
compilation of the library source files. Alternatively, you can group the
objects into an archive using whatever commands are provided by the operating
system. For the latter case, the objects are grouped into a shared library.

In the GNAT environment, a library has three types of components:


@itemize *

@item 
Source files,

@item 
@code{ALI} files (see @ref{28,,The Ada Library Information Files}), and

@item 
Object files, an archive or a shared library.
@end itemize

A GNAT library may expose all its source files, which is useful for
documentation purposes. Alternatively, it may expose only the units needed by
an external user to make use of the library. That is to say, the specs
reflecting the library services along with all the units needed to compile
those specs, which can include generic bodies or any body implementing an
inlined routine. In the case of @emph{stand-alone libraries} those exposed
units are called @emph{interface units} (@ref{6b,,Stand-alone Ada Libraries}).

All compilation units comprising an application, including those in a library,
need to be elaborated in an order partially defined by Ada’s semantics. GNAT
computes the elaboration order from the @code{ALI} files and this is why they
constitute a mandatory part of GNAT libraries.
@emph{Stand-alone libraries} are the exception to this rule because a specific
library elaboration routine is produced independently of the application(s)
using the library.

@node General Ada Libraries,Stand-alone Ada Libraries,Introduction to Libraries in GNAT,GNAT and Libraries
@anchor{gnat_ugn/the_gnat_compilation_model general-ada-libraries}@anchor{6c}@anchor{gnat_ugn/the_gnat_compilation_model id37}@anchor{6d}
@subsection General Ada Libraries


@menu
* Building a library:: 
* Installing a library:: 
* Using a library:: 

@end menu

@node Building a library,Installing a library,,General Ada Libraries
@anchor{gnat_ugn/the_gnat_compilation_model building-a-library}@anchor{6e}@anchor{gnat_ugn/the_gnat_compilation_model id38}@anchor{6f}
@subsubsection Building a library


The easiest way to build a library is to use the Project Manager,
which supports a special type of project called a @emph{Library Project}
(see the @emph{Library Projects} section in the @emph{GNAT Project Manager}
chapter of the @emph{GPRbuild User’s Guide}).

A project is considered a library project, when two project-level attributes
are defined in it: @code{Library_Name} and @code{Library_Dir}. In order to
control different aspects of library configuration, additional optional
project-level attributes can be specified:


@itemize *

@item 

@table @asis

@item @code{Library_Kind}

This attribute controls whether the library is to be static or dynamic
@end table

@item 

@table @asis

@item @code{Library_Version}

This attribute specifies the library version; this value is used
during dynamic linking of shared libraries to determine if the currently
installed versions of the binaries are compatible.
@end table

@item 
@code{Library_Options}

@item 

@table @asis

@item @code{Library_GCC}

These attributes specify additional low-level options to be used during
library generation, and redefine the actual application used to generate
library.
@end table
@end itemize

The GNAT Project Manager takes full care of the library maintenance task,
including recompilation of the source files for which objects do not exist
or are not up to date, assembly of the library archive, and installation of
the library (i.e., copying associated source, object and @code{ALI} files
to the specified location).

Here is a simple library project file:

@example
project My_Lib is
  for Source_Dirs use ("src1", "src2");
  for Object_Dir use "obj";
  for Library_Name use "mylib";
  for Library_Dir use "lib";
  for Library_Kind use "dynamic";
end My_lib;
@end example

and the compilation command to build and install the library:

@example
$ gnatmake -Pmy_lib
@end example

It is not entirely trivial to perform manually all the steps required to
produce a library. We recommend that you use the GNAT Project Manager
for this task. In special cases where this is not desired, the necessary
steps are discussed below.

There are various possibilities for compiling the units that make up the
library: for example with a Makefile (@ref{70,,Using the GNU make Utility}) or
with a conventional script. For simple libraries, it is also possible to create
a dummy main program which depends upon all the packages that comprise the
interface of the library. This dummy main program can then be given to
@code{gnatmake}, which will ensure that all necessary objects are built.

After this task is accomplished, you should follow the standard procedure
of the underlying operating system to produce the static or shared library.

Here is an example of such a dummy program:

@example
with My_Lib.Service1;
with My_Lib.Service2;
with My_Lib.Service3;
procedure My_Lib_Dummy is
begin
   null;
end;
@end example

Here are the generic commands that will build an archive or a shared library.

@example
# compiling the library
$ gnatmake -c my_lib_dummy.adb

# we don't need the dummy object itself
$ rm my_lib_dummy.o my_lib_dummy.ali

# create an archive with the remaining objects
$ ar rc libmy_lib.a *.o
# some systems may require "ranlib" to be run as well

# or create a shared library
$ gcc -shared -o libmy_lib.so *.o
# some systems may require the code to have been compiled with -fPIC

# remove the object files that are now in the library
$ rm *.o

# Make the ALI files read-only so that gnatmake will not try to
# regenerate the objects that are in the library
$ chmod -w *.ali
@end example

Please note that the library must have a name of the form @code{lib@emph{xxx}.a}
or @code{lib@emph{xxx}.so} (or @code{lib@emph{xxx}.dll} on Windows) in order to
be accessed by the directive @code{-l@emph{xxx}} at link time.

@node Installing a library,Using a library,Building a library,General Ada Libraries
@anchor{gnat_ugn/the_gnat_compilation_model id39}@anchor{71}@anchor{gnat_ugn/the_gnat_compilation_model installing-a-library}@anchor{72}
@subsubsection Installing a library


@geindex ADA_PROJECT_PATH

@geindex GPR_PROJECT_PATH

If you use project files, library installation is part of the library build
process (see the @emph{Installing a Library with Project Files} section of the
@emph{GNAT Project Manager} chapter of the @emph{GPRbuild User’s Guide}).

When project files are not an option, it is also possible, but not recommended,
to install the library so that the sources needed to use the library are on the
Ada source path and the ALI files & libraries be on the Ada Object path (see
@ref{73,,Search Paths and the Run-Time Library (RTL)}. Alternatively, the system
administrator can place general-purpose libraries in the default compiler
paths, by specifying the libraries’ location in the configuration files
@code{ada_source_path} and @code{ada_object_path}. These configuration files
must be located in the GNAT installation tree at the same place as the gcc spec
file. The location of the gcc spec file can be determined as follows:

@example
$ gcc -v
@end example

The configuration files mentioned above have a simple format: each line
must contain one unique directory name.
Those names are added to the corresponding path
in their order of appearance in the file. The names can be either absolute
or relative; in the latter case, they are relative to where theses files
are located.

The files @code{ada_source_path} and @code{ada_object_path} might not be
present in a
GNAT installation, in which case, GNAT will look for its run-time library in
the directories @code{adainclude} (for the sources) and @code{adalib} (for the
objects and @code{ALI} files). When the files exist, the compiler does not
look in @code{adainclude} and @code{adalib}, and thus the
@code{ada_source_path} file
must contain the location for the GNAT run-time sources (which can simply
be @code{adainclude}). In the same way, the @code{ada_object_path} file must
contain the location for the GNAT run-time objects (which can simply
be @code{adalib}).

You can also specify a new default path to the run-time library at compilation
time with the switch @code{--RTS=rts-path}. You can thus choose / change
the run-time library you want your program to be compiled with. This switch is
recognized by @code{gcc}, @code{gnatmake}, @code{gnatbind},
@code{gnatls}, @code{gnatfind} and @code{gnatxref}.

It is possible to install a library before or after the standard GNAT
library, by reordering the lines in the configuration files. In general, a
library must be installed before the GNAT library if it redefines
any part of it.

@node Using a library,,Installing a library,General Ada Libraries
@anchor{gnat_ugn/the_gnat_compilation_model id40}@anchor{74}@anchor{gnat_ugn/the_gnat_compilation_model using-a-library}@anchor{75}
@subsubsection Using a library


Once again, the project facility greatly simplifies the use of
libraries. In this context, using a library is just a matter of adding a
@emph{with} clause in the user project. For instance, to make use of the
library @code{My_Lib} shown in examples in earlier sections, you can
write:

@example
with "my_lib";
project My_Proj is
  ...
end My_Proj;
@end example

Even if you have a third-party, non-Ada library, you can still use GNAT’s
Project Manager facility to provide a wrapper for it. For example, the
following project, when @emph{with}ed by your main project, will link with the
third-party library @code{liba.a}:

@example
project Liba is
   for Externally_Built use "true";
   for Source_Files use ();
   for Library_Dir use "lib";
   for Library_Name use "a";
   for Library_Kind use "static";
end Liba;
@end example

This is an alternative to the use of @code{pragma Linker_Options}. It is
especially interesting in the context of systems with several interdependent
static libraries where finding a proper linker order is not easy and best be
left to the tools having visibility over project dependence information.

In order to use an Ada library manually, you need to make sure that this
library is on both your source and object path
(see @ref{73,,Search Paths and the Run-Time Library (RTL)}
and @ref{76,,Search Paths for gnatbind}). Furthermore, when the objects are grouped
in an archive or a shared library, you need to specify the desired
library at link time.

For example, you can use the library @code{mylib} installed in
@code{/dir/my_lib_src} and @code{/dir/my_lib_obj} with the following commands:

@example
$ gnatmake -aI/dir/my_lib_src -aO/dir/my_lib_obj my_appl \\
  -largs -lmy_lib
@end example

This can be expressed more simply:

@example
$ gnatmake my_appl
@end example

when the following conditions are met:


@itemize *

@item 
@code{/dir/my_lib_src} has been added by the user to the environment
variable 
@geindex ADA_INCLUDE_PATH
@geindex environment variable; ADA_INCLUDE_PATH
@code{ADA_INCLUDE_PATH}, or by the administrator to the file
@code{ada_source_path}

@item 
@code{/dir/my_lib_obj} has been added by the user to the environment
variable 
@geindex ADA_OBJECTS_PATH
@geindex environment variable; ADA_OBJECTS_PATH
@code{ADA_OBJECTS_PATH}, or by the administrator to the file
@code{ada_object_path}

@item 
a pragma @code{Linker_Options} has been added to one of the sources.
For example:

@example
pragma Linker_Options ("-lmy_lib");
@end example
@end itemize

Note that you may also load a library dynamically at
run time given its filename, as illustrated in the GNAT @code{plugins} example
in the directory @code{share/examples/gnat/plugins} within the GNAT
install area.

@node Stand-alone Ada Libraries,Rebuilding the GNAT Run-Time Library,General Ada Libraries,GNAT and Libraries
@anchor{gnat_ugn/the_gnat_compilation_model id41}@anchor{77}@anchor{gnat_ugn/the_gnat_compilation_model stand-alone-ada-libraries}@anchor{6b}
@subsection Stand-alone Ada Libraries


@geindex Stand-alone libraries

@menu
* Introduction to Stand-alone Libraries:: 
* Building a Stand-alone Library:: 
* Creating a Stand-alone Library to be used in a non-Ada context:: 
* Restrictions in Stand-alone Libraries:: 

@end menu

@node Introduction to Stand-alone Libraries,Building a Stand-alone Library,,Stand-alone Ada Libraries
@anchor{gnat_ugn/the_gnat_compilation_model id42}@anchor{78}@anchor{gnat_ugn/the_gnat_compilation_model introduction-to-stand-alone-libraries}@anchor{79}
@subsubsection Introduction to Stand-alone Libraries


A Stand-alone Library (abbreviated ‘SAL’) is a library that contains the
necessary code to
elaborate the Ada units that are included in the library. In contrast with
an ordinary library, which consists of all sources, objects and @code{ALI}
files of the
library, a SAL may specify a restricted subset of compilation units
to serve as a library interface. In this case, the fully
self-sufficient set of files will normally consist of an objects
archive, the sources of interface units’ specs, and the @code{ALI}
files of interface units.
If an interface spec contains a generic unit or an inlined subprogram,
the body’s
source must also be provided; if the units that must be provided in the source
form depend on other units, the source and @code{ALI} files of those must
also be provided.

The main purpose of a SAL is to minimize the recompilation overhead of client
applications when a new version of the library is installed. Specifically,
if the interface sources have not changed, client applications do not need to
be recompiled. If, furthermore, a SAL is provided in the shared form and its
version, controlled by @code{Library_Version} attribute, is not changed,
then the clients do not need to be relinked.

SALs also allow the library providers to minimize the amount of library source
text exposed to the clients.  Such ‘information hiding’ might be useful or
necessary for various reasons.

Stand-alone libraries are also well suited to be used in an executable whose
main routine is not written in Ada.

@node Building a Stand-alone Library,Creating a Stand-alone Library to be used in a non-Ada context,Introduction to Stand-alone Libraries,Stand-alone Ada Libraries
@anchor{gnat_ugn/the_gnat_compilation_model building-a-stand-alone-library}@anchor{7a}@anchor{gnat_ugn/the_gnat_compilation_model id43}@anchor{7b}
@subsubsection Building a Stand-alone Library


GNAT’s Project facility provides a simple way of building and installing
stand-alone libraries; see the @emph{Stand-alone Library Projects} section
in the @emph{GNAT Project Manager} chapter of the @emph{GPRbuild User’s Guide}.
To be a Stand-alone Library Project, in addition to the two attributes
that make a project a Library Project (@code{Library_Name} and
@code{Library_Dir}; see the @emph{Library Projects} section in the
@emph{GNAT Project Manager} chapter of the @emph{GPRbuild User’s Guide}),
the attribute @code{Library_Interface} must be defined.  For example:

@example
for Library_Dir use "lib_dir";
for Library_Name use "dummy";
for Library_Interface use ("int1", "int1.child");
@end example

Attribute @code{Library_Interface} has a non-empty string list value,
each string in the list designating a unit contained in an immediate source
of the project file.

When a Stand-alone Library is built, first the binder is invoked to build
a package whose name depends on the library name
(@code{b~dummy.ads/b} in the example above).
This binder-generated package includes initialization and
finalization procedures whose
names depend on the library name (@code{dummyinit} and @code{dummyfinal}
in the example
above). The object corresponding to this package is included in the library.

You must ensure timely (e.g., prior to any use of interfaces in the SAL)
calling of these procedures if a static SAL is built, or if a shared SAL
is built
with the project-level attribute @code{Library_Auto_Init} set to
@code{"false"}.

For a Stand-Alone Library, only the @code{ALI} files of the Interface Units
(those that are listed in attribute @code{Library_Interface}) are copied to
the Library Directory. As a consequence, only the Interface Units may be
imported from Ada units outside of the library. If other units are imported,
the binding phase will fail.

It is also possible to build an encapsulated library where not only
the code to elaborate and finalize the library is embedded but also
ensuring that the library is linked only against static
libraries. So an encapsulated library only depends on system
libraries, all other code, including the GNAT runtime, is embedded. To
build an encapsulated library the attribute
@code{Library_Standalone} must be set to @code{encapsulated}:

@example
for Library_Dir use "lib_dir";
for Library_Name use "dummy";
for Library_Kind use "dynamic";
for Library_Interface use ("int1", "int1.child");
for Library_Standalone use "encapsulated";
@end example

The default value for this attribute is @code{standard} in which case
a stand-alone library is built.

The attribute @code{Library_Src_Dir} may be specified for a
Stand-Alone Library. @code{Library_Src_Dir} is a simple attribute that has a
single string value. Its value must be the path (absolute or relative to the
project directory) of an existing directory. This directory cannot be the
object directory or one of the source directories, but it can be the same as
the library directory. The sources of the Interface
Units of the library that are needed by an Ada client of the library will be
copied to the designated directory, called the Interface Copy directory.
These sources include the specs of the Interface Units, but they may also
include bodies and subunits, when pragmas @code{Inline} or @code{Inline_Always}
are used, or when there is a generic unit in the spec. Before the sources
are copied to the Interface Copy directory, an attempt is made to delete all
files in the Interface Copy directory.

Building stand-alone libraries by hand is somewhat tedious, but for those
occasions when it is necessary here are the steps that you need to perform:


@itemize *

@item 
Compile all library sources.

@item 
Invoke the binder with the switch @code{-n} (No Ada main program),
with all the @code{ALI} files of the interfaces, and
with the switch @code{-L} to give specific names to the @code{init}
and @code{final} procedures.  For example:

@example
$ gnatbind -n int1.ali int2.ali -Lsal1
@end example

@item 
Compile the binder generated file:

@example
$ gcc -c b~int2.adb
@end example

@item 
Link the dynamic library with all the necessary object files,
indicating to the linker the names of the @code{init} (and possibly
@code{final}) procedures for automatic initialization (and finalization).
The built library should be placed in a directory different from
the object directory.

@item 
Copy the @code{ALI} files of the interface to the library directory,
add in this copy an indication that it is an interface to a SAL
(i.e., add a word @code{SL} on the line in the @code{ALI} file that starts
with letter ‘P’) and make the modified copy of the @code{ALI} file
read-only.
@end itemize

Using SALs is not different from using other libraries
(see @ref{75,,Using a library}).

@node Creating a Stand-alone Library to be used in a non-Ada context,Restrictions in Stand-alone Libraries,Building a Stand-alone Library,Stand-alone Ada Libraries
@anchor{gnat_ugn/the_gnat_compilation_model creating-a-stand-alone-library-to-be-used-in-a-non-ada-context}@anchor{7c}@anchor{gnat_ugn/the_gnat_compilation_model id44}@anchor{7d}
@subsubsection Creating a Stand-alone Library to be used in a non-Ada context


It is easy to adapt the SAL build procedure discussed above for use of a SAL in
a non-Ada context.

The only extra step required is to ensure that library interface subprograms
are compatible with the main program, by means of @code{pragma Export}
or @code{pragma Convention}.

Here is an example of simple library interface for use with C main program:

@example
package My_Package is

   procedure Do_Something;
   pragma Export (C, Do_Something, "do_something");

   procedure Do_Something_Else;
   pragma Export (C, Do_Something_Else, "do_something_else");

end My_Package;
@end example

On the foreign language side, you must provide a ‘foreign’ view of the
library interface; remember that it should contain elaboration routines in
addition to interface subprograms.

The example below shows the content of @code{mylib_interface.h} (note
that there is no rule for the naming of this file, any name can be used)

@example
/* the library elaboration procedure */
extern void mylibinit (void);

/* the library finalization procedure */
extern void mylibfinal (void);

/* the interface exported by the library */
extern void do_something (void);
extern void do_something_else (void);
@end example

Libraries built as explained above can be used from any program, provided
that the elaboration procedures (named @code{mylibinit} in the previous
example) are called before the library services are used. Any number of
libraries can be used simultaneously, as long as the elaboration
procedure of each library is called.

Below is an example of a C program that uses the @code{mylib} library.

@example
#include "mylib_interface.h"

int
main (void)
@{
   /* First, elaborate the library before using it */
   mylibinit ();

   /* Main program, using the library exported entities */
   do_something ();
   do_something_else ();

   /* Library finalization at the end of the program */
   mylibfinal ();
   return 0;
@}
@end example

Note that invoking any library finalization procedure generated by
@code{gnatbind} shuts down the Ada run-time environment.
Consequently, the
finalization of all Ada libraries must be performed at the end of the program.
No call to these libraries or to the Ada run-time library should be made
after the finalization phase.

Note also that special care must be taken with multi-tasks
applications. The initialization and finalization routines are not
protected against concurrent access. If such requirement is needed it
must be ensured at the application level using a specific operating
system services like a mutex or a critical-section.

@node Restrictions in Stand-alone Libraries,,Creating a Stand-alone Library to be used in a non-Ada context,Stand-alone Ada Libraries
@anchor{gnat_ugn/the_gnat_compilation_model id45}@anchor{7e}@anchor{gnat_ugn/the_gnat_compilation_model restrictions-in-stand-alone-libraries}@anchor{7f}
@subsubsection Restrictions in Stand-alone Libraries


The pragmas listed below should be used with caution inside libraries,
as they can create incompatibilities with other Ada libraries:


@itemize *

@item 
pragma @code{Locking_Policy}

@item 
pragma @code{Partition_Elaboration_Policy}

@item 
pragma @code{Queuing_Policy}

@item 
pragma @code{Task_Dispatching_Policy}

@item 
pragma @code{Unreserve_All_Interrupts}
@end itemize

When using a library that contains such pragmas, the user must make sure
that all libraries use the same pragmas with the same values. Otherwise,
@code{Program_Error} will
be raised during the elaboration of the conflicting
libraries. The usage of these pragmas and its consequences for the user
should therefore be well documented.

Similarly, the traceback in the exception occurrence mechanism should be
enabled or disabled in a consistent manner across all libraries.
Otherwise, Program_Error will be raised during the elaboration of the
conflicting libraries.

If the @code{Version} or @code{Body_Version}
attributes are used inside a library, then you need to
perform a @code{gnatbind} step that specifies all @code{ALI} files in all
libraries, so that version identifiers can be properly computed.
In practice these attributes are rarely used, so this is unlikely
to be a consideration.

@node Rebuilding the GNAT Run-Time Library,,Stand-alone Ada Libraries,GNAT and Libraries
@anchor{gnat_ugn/the_gnat_compilation_model id46}@anchor{80}@anchor{gnat_ugn/the_gnat_compilation_model rebuilding-the-gnat-run-time-library}@anchor{81}
@subsection Rebuilding the GNAT Run-Time Library


@geindex GNAT Run-Time Library
@geindex rebuilding

@geindex Building the GNAT Run-Time Library

@geindex Rebuilding the GNAT Run-Time Library

@geindex Run-Time Library
@geindex rebuilding

It may be useful to recompile the GNAT library in various debugging or
experimentation contexts. A project file called
@code{libada.gpr} is provided to that effect and can be found in
the directory containing the GNAT library. The location of this
directory depends on the way the GNAT environment has been installed and can
be determined by means of the command:

@example
$ gnatls -v
@end example

The last entry in the source search path usually contains the
gnat library (the @code{adainclude} directory). This project file contains its
own documentation and in particular the set of instructions needed to rebuild a
new library and to use it.

Note that rebuilding the GNAT Run-Time is only recommended for temporary
experiments or debugging, and is not supported.

@geindex Conditional compilation

@node Conditional Compilation,Mixed Language Programming,GNAT and Libraries,The GNAT Compilation Model
@anchor{gnat_ugn/the_gnat_compilation_model conditional-compilation}@anchor{2b}@anchor{gnat_ugn/the_gnat_compilation_model id47}@anchor{82}
@section Conditional Compilation


This section presents some guidelines for modeling conditional compilation in Ada and describes the
gnatprep preprocessor utility.

@geindex Conditional compilation

@menu
* Modeling Conditional Compilation in Ada:: 
* Preprocessing with gnatprep:: 
* Integrated Preprocessing:: 

@end menu

@node Modeling Conditional Compilation in Ada,Preprocessing with gnatprep,,Conditional Compilation
@anchor{gnat_ugn/the_gnat_compilation_model id48}@anchor{83}@anchor{gnat_ugn/the_gnat_compilation_model modeling-conditional-compilation-in-ada}@anchor{84}
@subsection Modeling Conditional Compilation in Ada


It is often necessary to arrange for a single source program
to serve multiple purposes, where it is compiled in different
ways to achieve these different goals. Some examples of the
need for this feature are


@itemize *

@item 
Adapting a program to a different hardware environment

@item 
Adapting a program to a different target architecture

@item 
Turning debugging features on and off

@item 
Arranging for a program to compile with different compilers
@end itemize

In C, or C++, the typical approach would be to use the preprocessor
that is defined as part of the language. The Ada language does not
contain such a feature. This is not an oversight, but rather a very
deliberate design decision, based on the experience that overuse of
the preprocessing features in C and C++ can result in programs that
are extremely difficult to maintain. For example, if we have ten
switches that can be on or off, this means that there are a thousand
separate programs, any one of which might not even be syntactically
correct, and even if syntactically correct, the resulting program
might not work correctly. Testing all combinations can quickly become
impossible.

Nevertheless, the need to tailor programs certainly exists, and in
this section we will discuss how this can
be achieved using Ada in general, and GNAT in particular.

@menu
* Use of Boolean Constants:: 
* Debugging - A Special Case:: 
* Conditionalizing Declarations:: 
* Use of Alternative Implementations:: 
* Preprocessing:: 

@end menu

@node Use of Boolean Constants,Debugging - A Special Case,,Modeling Conditional Compilation in Ada
@anchor{gnat_ugn/the_gnat_compilation_model id49}@anchor{85}@anchor{gnat_ugn/the_gnat_compilation_model use-of-boolean-constants}@anchor{86}
@subsubsection Use of Boolean Constants


In the case where the difference is simply which code
sequence is executed, the cleanest solution is to use Boolean
constants to control which code is executed.

@example
FP_Initialize_Required : constant Boolean := True;
...
if FP_Initialize_Required then
...
end if;
@end example

Not only will the code inside the @code{if} statement not be executed if
the constant Boolean is @code{False}, but it will also be completely
deleted from the program.
However, the code is only deleted after the @code{if} statement
has been checked for syntactic and semantic correctness.
(In contrast, with preprocessors the code is deleted before the
compiler ever gets to see it, so it is not checked until the switch
is turned on.)

@geindex Preprocessors (contrasted with conditional compilation)

Typically the Boolean constants will be in a separate package,
something like:

@example
package Config is
   FP_Initialize_Required : constant Boolean := True;
   Reset_Available        : constant Boolean := False;
   ...
end Config;
@end example

The @code{Config} package exists in multiple forms for the various targets,
with an appropriate script selecting the version of @code{Config} needed.
Then any other unit requiring conditional compilation can do a @emph{with}
of @code{Config} to make the constants visible.

@node Debugging - A Special Case,Conditionalizing Declarations,Use of Boolean Constants,Modeling Conditional Compilation in Ada
@anchor{gnat_ugn/the_gnat_compilation_model debugging-a-special-case}@anchor{87}@anchor{gnat_ugn/the_gnat_compilation_model id50}@anchor{88}
@subsubsection Debugging - A Special Case


A common use of conditional code is to execute statements (for example
dynamic checks, or output of intermediate results) under control of a
debug switch, so that the debugging behavior can be turned on and off.
This can be done using a Boolean constant to control whether the code
is active:

@example
if Debugging then
   Put_Line ("got to the first stage!");
end if;
@end example

or

@example
if Debugging and then Temperature > 999.0 then
   raise Temperature_Crazy;
end if;
@end example

@geindex pragma Assert

Since this is a common case, there are special features to deal with
this in a convenient manner. For the case of tests, Ada 2005 has added
a pragma @code{Assert} that can be used for such tests. This pragma is modeled
on the @code{Assert} pragma that has always been available in GNAT, so this
feature may be used with GNAT even if you are not using Ada 2005 features.
The use of pragma @code{Assert} is described in the
@cite{GNAT_Reference_Manual}, but as an
example, the last test could be written:

@example
pragma Assert (Temperature <= 999.0, "Temperature Crazy");
@end example

or simply

@example
pragma Assert (Temperature <= 999.0);
@end example

In both cases, if assertions are active and the temperature is excessive,
the exception @code{Assert_Failure} will be raised, with the given string in
the first case or a string indicating the location of the pragma in the second
case used as the exception message.

@geindex pragma Assertion_Policy

You can turn assertions on and off by using the @code{Assertion_Policy}
pragma.

@geindex -gnata switch

This is an Ada 2005 pragma which is implemented in all modes by
GNAT. Alternatively, you can use the @code{-gnata} switch
to enable assertions from the command line, which applies to
all versions of Ada.

@geindex pragma Debug

For the example above with the @code{Put_Line}, the GNAT-specific pragma
@code{Debug} can be used:

@example
pragma Debug (Put_Line ("got to the first stage!"));
@end example

If debug pragmas are enabled, the argument, which must be of the form of
a procedure call, is executed (in this case, @code{Put_Line} will be called).
Only one call can be present, but of course a special debugging procedure
containing any code you like can be included in the program and then
called in a pragma @code{Debug} argument as needed.

One advantage of pragma @code{Debug} over the @code{if Debugging then}
construct is that pragma @code{Debug} can appear in declarative contexts,
such as at the very beginning of a procedure, before local declarations have
been elaborated.

@geindex pragma Debug_Policy

Debug pragmas are enabled using either the @code{-gnata} switch that also
controls assertions, or with a separate Debug_Policy pragma.

The latter pragma is new in the Ada 2005 versions of GNAT (but it can be used
in Ada 95 and Ada 83 programs as well), and is analogous to
pragma @code{Assertion_Policy} to control assertions.

@code{Assertion_Policy} and @code{Debug_Policy} are configuration pragmas,
and thus they can appear in @code{gnat.adc} if you are not using a
project file, or in the file designated to contain configuration pragmas
in a project file.
They then apply to all subsequent compilations. In practice the use of
the @code{-gnata} switch is often the most convenient method of controlling
the status of these pragmas.

Note that a pragma is not a statement, so in contexts where a statement
sequence is required, you can’t just write a pragma on its own. You have
to add a @code{null} statement.

@example
if ... then
   ... -- some statements
else
   pragma Assert (Num_Cases < 10);
   null;
end if;
@end example

@node Conditionalizing Declarations,Use of Alternative Implementations,Debugging - A Special Case,Modeling Conditional Compilation in Ada
@anchor{gnat_ugn/the_gnat_compilation_model conditionalizing-declarations}@anchor{89}@anchor{gnat_ugn/the_gnat_compilation_model id51}@anchor{8a}
@subsubsection Conditionalizing Declarations


In some cases it may be necessary to conditionalize declarations to meet
different requirements. For example we might want a bit string whose length
is set to meet some hardware message requirement.

This may be possible using declare blocks controlled
by conditional constants:

@example
if Small_Machine then
   declare
      X : Bit_String (1 .. 10);
   begin
      ...
   end;
else
   declare
      X : Large_Bit_String (1 .. 1000);
   begin
      ...
   end;
end if;
@end example

Note that in this approach, both declarations are analyzed by the
compiler so this can only be used where both declarations are legal,
even though one of them will not be used.

Another approach is to define integer constants, e.g., @code{Bits_Per_Word},
or Boolean constants, e.g., @code{Little_Endian}, and then write declarations
that are parameterized by these constants. For example

@example
for Rec use
  Field1 at 0 range Boolean'Pos (Little_Endian) * 10 .. Bits_Per_Word;
end record;
@end example

If @code{Bits_Per_Word} is set to 32, this generates either

@example
for Rec use
  Field1 at 0 range 0 .. 32;
end record;
@end example

for the big endian case, or

@example
for Rec use record
    Field1 at 0 range 10 .. 32;
end record;
@end example

for the little endian case. Since a powerful subset of Ada expression
notation is usable for creating static constants, clever use of this
feature can often solve quite difficult problems in conditionalizing
compilation (note incidentally that in Ada 95, the little endian
constant was introduced as @code{System.Default_Bit_Order}, so you do not
need to define this one yourself).

@node Use of Alternative Implementations,Preprocessing,Conditionalizing Declarations,Modeling Conditional Compilation in Ada
@anchor{gnat_ugn/the_gnat_compilation_model id52}@anchor{8b}@anchor{gnat_ugn/the_gnat_compilation_model use-of-alternative-implementations}@anchor{8c}
@subsubsection Use of Alternative Implementations


In some cases, none of the approaches described above are adequate. This
can occur for example if the set of declarations required is radically
different for two different configurations.

In this situation, the official Ada way of dealing with conditionalizing
such code is to write separate units for the different cases. As long as
this does not result in excessive duplication of code, this can be done
without creating maintenance problems. The approach is to share common
code as far as possible, and then isolate the code and declarations
that are different. Subunits are often a convenient method for breaking
out a piece of a unit that is to be conditionalized, with separate files
for different versions of the subunit for different targets, where the
build script selects the right one to give to the compiler.

@geindex Subunits (and conditional compilation)

As an example, consider a situation where a new feature in Ada 2005
allows something to be done in a really nice way. But your code must be able
to compile with an Ada 95 compiler. Conceptually you want to say:

@example
if Ada_2005 then
   ... neat Ada 2005 code
else
   ... not quite as neat Ada 95 code
end if;
@end example

where @code{Ada_2005} is a Boolean constant.

But this won’t work when @code{Ada_2005} is set to @code{False},
since the @code{then} clause will be illegal for an Ada 95 compiler.
(Recall that although such unreachable code would eventually be deleted
by the compiler, it still needs to be legal.  If it uses features
introduced in Ada 2005, it will be illegal in Ada 95.)

So instead we write

@example
procedure Insert is separate;
@end example

Then we have two files for the subunit @code{Insert}, with the two sets of
code.
If the package containing this is called @code{File_Queries}, then we might
have two files


@itemize *

@item 
@code{file_queries-insert-2005.adb}

@item 
@code{file_queries-insert-95.adb}
@end itemize

and the build script renames the appropriate file to @code{file_queries-insert.adb} and then carries out the compilation.

This can also be done with project files’ naming schemes. For example:

@example
for body ("File_Queries.Insert") use "file_queries-insert-2005.ada";
@end example

Note also that with project files it is desirable to use a different extension
than @code{ads} / @code{adb} for alternative versions. Otherwise a naming
conflict may arise through another commonly used feature: to declare as part
of the project a set of directories containing all the sources obeying the
default naming scheme.

The use of alternative units is certainly feasible in all situations,
and for example the Ada part of the GNAT run-time is conditionalized
based on the target architecture using this approach. As a specific example,
consider the implementation of the AST feature in VMS. There is one
spec: @code{s-asthan.ads} which is the same for all architectures, and three
bodies:


@itemize *

@item 

@table @asis

@item @code{s-asthan.adb}

used for all non-VMS operating systems
@end table

@item 

@table @asis

@item @code{s-asthan-vms-alpha.adb}

used for VMS on the Alpha
@end table

@item 

@table @asis

@item @code{s-asthan-vms-ia64.adb}

used for VMS on the ia64
@end table
@end itemize

The dummy version @code{s-asthan.adb} simply raises exceptions noting that
this operating system feature is not available, and the two remaining
versions interface with the corresponding versions of VMS to provide
VMS-compatible AST handling. The GNAT build script knows the architecture
and operating system, and automatically selects the right version,
renaming it if necessary to @code{s-asthan.adb} before the run-time build.

Another style for arranging alternative implementations is through Ada’s
access-to-subprogram facility.
In case some functionality is to be conditionally included,
you can declare an access-to-procedure variable @code{Ref} that is initialized
to designate a ‘do nothing’ procedure, and then invoke @code{Ref.all}
when appropriate.
In some library package, set @code{Ref} to @code{Proc'Access} for some
procedure @code{Proc} that performs the relevant processing.
The initialization only occurs if the library package is included in the
program.
The same idea can also be implemented using tagged types and dispatching
calls.

@node Preprocessing,,Use of Alternative Implementations,Modeling Conditional Compilation in Ada
@anchor{gnat_ugn/the_gnat_compilation_model id53}@anchor{8d}@anchor{gnat_ugn/the_gnat_compilation_model preprocessing}@anchor{8e}
@subsubsection Preprocessing


@geindex Preprocessing

Although it is quite possible to conditionalize code without the use of
C-style preprocessing, as described earlier in this section, it is
nevertheless convenient in some cases to use the C approach. Moreover,
older Ada compilers have often provided some preprocessing capability,
so legacy code may depend on this approach, even though it is not
standard.

To accommodate such use, GNAT provides a preprocessor (modeled to a large
extent on the various preprocessors that have been used
with legacy code on other compilers, to enable easier transition).

@geindex gnatprep

The preprocessor may be used in two separate modes. It can be used quite
separately from the compiler, to generate a separate output source file
that is then fed to the compiler as a separate step. This is the
@code{gnatprep} utility, whose use is fully described in
@ref{8f,,Preprocessing with gnatprep}.

The preprocessing language allows such constructs as

@example
#if DEBUG or else (PRIORITY > 4) then
   sequence of declarations
#else
   completely different sequence of declarations
#end if;
@end example

The values of the symbols @code{DEBUG} and @code{PRIORITY} can be
defined either on the command line or in a separate file.

The other way of running the preprocessor is even closer to the C style and
often more convenient. In this approach the preprocessing is integrated into
the compilation process. The compiler is given the preprocessor input which
includes @code{#if} lines etc, and then the compiler carries out the
preprocessing internally and processes the resulting output.
For more details on this approach, see @ref{90,,Integrated Preprocessing}.

@node Preprocessing with gnatprep,Integrated Preprocessing,Modeling Conditional Compilation in Ada,Conditional Compilation
@anchor{gnat_ugn/the_gnat_compilation_model id54}@anchor{91}@anchor{gnat_ugn/the_gnat_compilation_model preprocessing-with-gnatprep}@anchor{8f}
@subsection Preprocessing with @code{gnatprep}


@geindex gnatprep

@geindex Preprocessing (gnatprep)

This section discusses how to use GNAT’s @code{gnatprep} utility for simple
preprocessing.
Although designed for use with GNAT, @code{gnatprep} does not depend on any
special GNAT features.
For further discussion of conditional compilation in general, see
@ref{2b,,Conditional Compilation}.

@menu
* Preprocessing Symbols:: 
* Using gnatprep:: 
* Switches for gnatprep:: 
* Form of Definitions File:: 
* Form of Input Text for gnatprep:: 

@end menu

@node Preprocessing Symbols,Using gnatprep,,Preprocessing with gnatprep
@anchor{gnat_ugn/the_gnat_compilation_model id55}@anchor{92}@anchor{gnat_ugn/the_gnat_compilation_model preprocessing-symbols}@anchor{93}
@subsubsection Preprocessing Symbols


Preprocessing symbols are defined in @emph{definition files} and referenced in the
sources to be preprocessed. A preprocessing symbol is an identifier, following
normal Ada (case-insensitive) rules for its syntax, with the restriction that
all characters need to be in the ASCII set (no accented letters).

@node Using gnatprep,Switches for gnatprep,Preprocessing Symbols,Preprocessing with gnatprep
@anchor{gnat_ugn/the_gnat_compilation_model id56}@anchor{94}@anchor{gnat_ugn/the_gnat_compilation_model using-gnatprep}@anchor{95}
@subsubsection Using @code{gnatprep}


To call @code{gnatprep} use:

@example
$ gnatprep [ switches ] infile outfile [ deffile ]
@end example

where


@itemize *

@item 

@table @asis

@item @emph{switches}

is an optional sequence of switches as described in the next section.
@end table

@item 

@table @asis

@item @emph{infile}

is the full name of the input file, which is an Ada source
file containing preprocessor directives.
@end table

@item 

@table @asis

@item @emph{outfile}

is the full name of the output file, which is an Ada source
in standard Ada form. When used with GNAT, this file name will
normally have an @code{ads} or @code{adb} suffix.
@end table

@item 

@table @asis

@item @code{deffile}

is the full name of a text file containing definitions of
preprocessing symbols to be referenced by the preprocessor. This argument is
optional, and can be replaced by the use of the @code{-D} switch.
@end table
@end itemize

@node Switches for gnatprep,Form of Definitions File,Using gnatprep,Preprocessing with gnatprep
@anchor{gnat_ugn/the_gnat_compilation_model id57}@anchor{96}@anchor{gnat_ugn/the_gnat_compilation_model switches-for-gnatprep}@anchor{97}
@subsubsection Switches for @code{gnatprep}


@geindex --version (gnatprep)


@table @asis

@item @code{--version}

Display Copyright and version, then exit disregarding all other options.
@end table

@geindex --help (gnatprep)


@table @asis

@item @code{--help}

If @code{--version} was not used, display usage and then exit disregarding
all other options.
@end table

@geindex -b (gnatprep)


@table @asis

@item @code{-b}

Causes both preprocessor lines and the lines deleted by
preprocessing to be replaced by blank lines in the output source file,
preserving line numbers in the output file.
@end table

@geindex -c (gnatprep)


@table @asis

@item @code{-c}

Causes both preprocessor lines and the lines deleted
by preprocessing to be retained in the output source as comments marked
with the special string @code{"--! "}. This option will result in line numbers
being preserved in the output file.
@end table

@geindex -C (gnatprep)


@table @asis

@item @code{-C}

Causes comments to be scanned. Normally comments are ignored by gnatprep.
If this option is specified, then comments are scanned and any $symbol
substitutions performed as in program text. This is particularly useful
when structured comments are used (e.g., for programs written in a
pre-2014 version of the SPARK Ada subset). Note that this switch is not
available when  doing integrated preprocessing (it would be useless in
this context since comments are ignored by the compiler in any case).
@end table

@geindex -D (gnatprep)


@table @asis

@item @code{-D@emph{symbol}[=@emph{value}]}

Defines a new preprocessing symbol with the specified value. If no value is given
on the command line, then symbol is considered to be @code{True}. This switch
can be used in place of a definition file.
@end table

@geindex -r (gnatprep)


@table @asis

@item @code{-r}

Causes a @code{Source_Reference} pragma to be generated that
references the original input file, so that error messages will use
the file name of this original file. The use of this switch implies
that preprocessor lines are not to be removed from the file, so its
use will force @code{-b} mode if @code{-c}
has not been specified explicitly.

Note that if the file to be preprocessed contains multiple units, then
it will be necessary to @code{gnatchop} the output file from
@code{gnatprep}. If a @code{Source_Reference} pragma is present
in the preprocessed file, it will be respected by
@code{gnatchop -r}
so that the final chopped files will correctly refer to the original
input source file for @code{gnatprep}.
@end table

@geindex -s (gnatprep)


@table @asis

@item @code{-s}

Causes a sorted list of symbol names and values to be
listed on the standard output file.
@end table

@geindex -T (gnatprep)


@table @asis

@item @code{-T}

Use LF as line terminators when writing files. By default the line terminator
of the host (LF under unix, CR/LF under Windows) is used.
@end table

@geindex -u (gnatprep)


@table @asis

@item @code{-u}

Causes undefined symbols to be treated as having the value FALSE in the context
of a preprocessor test. In the absence of this option, an undefined symbol in
a @code{#if} or @code{#elsif} test will be treated as an error.
@end table

@geindex -v (gnatprep)


@table @asis

@item @code{-v}

Verbose mode: generates more output about work done.
@end table

Note: if neither @code{-b} nor @code{-c} is present,
then preprocessor lines and
deleted lines are completely removed from the output, unless -r is
specified, in which case -b is assumed.

@node Form of Definitions File,Form of Input Text for gnatprep,Switches for gnatprep,Preprocessing with gnatprep
@anchor{gnat_ugn/the_gnat_compilation_model form-of-definitions-file}@anchor{98}@anchor{gnat_ugn/the_gnat_compilation_model id58}@anchor{99}
@subsubsection Form of Definitions File


The definitions file contains lines of the form:

@example
symbol := value
@end example

where @code{symbol} is a preprocessing symbol, and @code{value} is one of the following:


@itemize *

@item 
Empty, corresponding to a null substitution,

@item 
A string literal using normal Ada syntax, or

@item 
Any sequence of characters from the set @{letters, digits, period, underline@}.
@end itemize

Comment lines may also appear in the definitions file, starting with
the usual @code{--},
and comments may be added to the definitions lines.

@node Form of Input Text for gnatprep,,Form of Definitions File,Preprocessing with gnatprep
@anchor{gnat_ugn/the_gnat_compilation_model form-of-input-text-for-gnatprep}@anchor{9a}@anchor{gnat_ugn/the_gnat_compilation_model id59}@anchor{9b}
@subsubsection Form of Input Text for @code{gnatprep}


The input text may contain preprocessor conditional inclusion lines,
as well as general symbol substitution sequences.

The preprocessor conditional inclusion commands have the form:

@example
#if <expression> [then]
   lines
#elsif <expression> [then]
   lines
#elsif <expression> [then]
   lines
...
#else
   lines
#end if;
@end example

In this example, <expression> is defined by the following grammar:

@example
<expression> ::=  <symbol>
<expression> ::=  <symbol> = "<value>"
<expression> ::=  <symbol> = <symbol>
<expression> ::=  <symbol> = <integer>
<expression> ::=  <symbol> > <integer>
<expression> ::=  <symbol> >= <integer>
<expression> ::=  <symbol> < <integer>
<expression> ::=  <symbol> <= <integer>
<expression> ::=  <symbol> 'Defined
<expression> ::=  not <expression>
<expression> ::=  <expression> and <expression>
<expression> ::=  <expression> or <expression>
<expression> ::=  <expression> and then <expression>
<expression> ::=  <expression> or else <expression>
<expression> ::=  ( <expression> )
@end example

Note the following restriction: it is not allowed to have “and” or “or”
following “not” in the same expression without parentheses. For example, this
is not allowed:

@example
not X or Y
@end example

This can be expressed instead as one of the following forms:

@example
(not X) or Y
not (X or Y)
@end example

For the first test (<expression> ::= <symbol>) the symbol must have
either the value true or false, that is to say the right-hand of the
symbol definition must be one of the (case-insensitive) literals
@code{True} or @code{False}. If the value is true, then the
corresponding lines are included, and if the value is false, they are
excluded.

When comparing a symbol to an integer, the integer is any non negative
literal integer as defined in the Ada Reference Manual, such as 3, 16#FF# or
2#11#. The symbol value must also be a non negative integer. Integer values
in the range 0 .. 2**31-1 are supported.

The test (<expression> ::= <symbol>’Defined) is true only if
the symbol has been defined in the definition file or by a @code{-D}
switch on the command line. Otherwise, the test is false.

The equality tests are case insensitive, as are all the preprocessor lines.

If the symbol referenced is not defined in the symbol definitions file,
then the effect depends on whether or not switch @code{-u}
is specified. If so, then the symbol is treated as if it had the value
false and the test fails. If this switch is not specified, then
it is an error to reference an undefined symbol. It is also an error to
reference a symbol that is defined with a value other than @code{True}
or @code{False}.

The use of the @code{not} operator inverts the sense of this logical test.
The @code{not} operator cannot be combined with the @code{or} or @code{and}
operators, without parentheses. For example, “if not X or Y then” is not
allowed, but “if (not X) or Y then” and “if not (X or Y) then” are.

The @code{then} keyword is optional as shown

The @code{#} must be the first non-blank character on a line, but
otherwise the format is free form. Spaces or tabs may appear between
the @code{#} and the keyword. The keywords and the symbols are case
insensitive as in normal Ada code. Comments may be used on a
preprocessor line, but other than that, no other tokens may appear on a
preprocessor line. Any number of @code{elsif} clauses can be present,
including none at all. The @code{else} is optional, as in Ada.

The @code{#} marking the start of a preprocessor line must be the first
non-blank character on the line, i.e., it must be preceded only by
spaces or horizontal tabs.

Symbol substitution outside of preprocessor lines is obtained by using
the sequence:

@example
$symbol
@end example

anywhere within a source line, except in a comment or within a
string literal. The identifier
following the @code{$} must match one of the symbols defined in the symbol
definition file, and the result is to substitute the value of the
symbol in place of @code{$symbol} in the output file.

Note that although the substitution of strings within a string literal
is not possible, it is possible to have a symbol whose defined value is
a string literal. So instead of setting XYZ to @code{hello} and writing:

@example
Header : String := "$XYZ";
@end example

you should set XYZ to @code{"hello"} and write:

@example
Header : String := $XYZ;
@end example

and then the substitution will occur as desired.

@node Integrated Preprocessing,,Preprocessing with gnatprep,Conditional Compilation
@anchor{gnat_ugn/the_gnat_compilation_model id60}@anchor{9c}@anchor{gnat_ugn/the_gnat_compilation_model integrated-preprocessing}@anchor{90}
@subsection Integrated Preprocessing


As noted above, a file to be preprocessed consists of Ada source code
in which preprocessing lines have been inserted. However,
instead of using @code{gnatprep} to explicitly preprocess a file as a separate
step before compilation, you can carry out the preprocessing implicitly
as part of compilation. Such @emph{integrated preprocessing}, which is the common
style with C, is performed when either or both of the following switches
are passed to the compiler:

@quotation


@itemize *

@item 
@code{-gnatep}, which specifies the @emph{preprocessor data file}.
This file dictates how the source files will be preprocessed (e.g., which
symbol definition files apply to which sources).

@item 
@code{-gnateD}, which defines values for preprocessing symbols.
@end itemize
@end quotation

Integrated preprocessing applies only to Ada source files, it is
not available for configuration pragma files.

With integrated preprocessing, the output from the preprocessor is not,
by default, written to any external file. Instead it is passed
internally to the compiler. To preserve the result of
preprocessing in a file, either run @code{gnatprep}
in standalone mode or else supply the @code{-gnateG} switch
(described below) to the compiler.

When using project files:

@quotation


@itemize *

@item 
the builder switch @code{-x} should be used if any Ada source is
compiled with @code{gnatep=}, so that the compiler finds the
@emph{preprocessor data file}.

@item 
the preprocessing data file and the symbol definition files should be
located in the source directories of the project.
@end itemize
@end quotation

Note that the @code{gnatmake} switch @code{-m} will almost
always trigger recompilation for sources that are preprocessed,
because @code{gnatmake} cannot compute the checksum of the source after
preprocessing.

The actual preprocessing function is described in detail in
@ref{8f,,Preprocessing with gnatprep}. This section explains the switches
that relate to integrated preprocessing.

@geindex -gnatep (gcc)


@table @asis

@item @code{-gnatep=@emph{preprocessor_data_file}}

This switch specifies the file name (without directory
information) of the preprocessor data file. Either place this file
in one of the source directories, or, when using project
files, reference the project file’s directory via the
@code{project_name'Project_Dir} project attribute; e.g:

@quotation

@example
project Prj is
   package Compiler is
      for Switches ("Ada") use
        ("-gnatep=" & Prj'Project_Dir & "prep.def");
   end Compiler;
end Prj;
@end example
@end quotation

A preprocessor data file is a text file that contains @emph{preprocessor
control lines}.  A preprocessor control line directs the preprocessing of
either a particular source file, or, analogous to @code{others} in Ada,
all sources not specified elsewhere in  the preprocessor data file.
A preprocessor control line
can optionally identify a @emph{definition file} that assigns values to
preprocessor symbols, as well as a list of switches that relate to
preprocessing.
Empty lines and comments (using Ada syntax) are also permitted, with no
semantic effect.

Here’s an example of a preprocessor data file:

@quotation

@example
"toto.adb"  "prep.def" -u
--  Preprocess toto.adb, using definition file prep.def
--  Undefined symbols are treated as False

* -c -DVERSION=V101
--  Preprocess all other sources without using a definition file
--  Suppressed lined are commented
--  Symbol VERSION has the value V101

"tata.adb" "prep2.def" -s
--  Preprocess tata.adb, using definition file prep2.def
--  List all symbols with their values
@end example
@end quotation

A preprocessor control line has the following syntax:

@quotation

@example
<preprocessor_control_line> ::=
   <preprocessor_input> [ <definition_file_name> ] @{ <switch> @}

<preprocessor_input> ::= <source_file_name> | '*'

<definition_file_name> ::= <string_literal>

<source_file_name> := <string_literal>

<switch> := (See below for list)
@end example
@end quotation

Thus  each preprocessor control line starts with either a literal string or
the character ‘*’:


@itemize *

@item 
A literal string is the file name (without directory information) of the source
file that will be input to the preprocessor.

@item 
The character ‘*’ is a wild-card indicator; the additional parameters on the line
indicate the preprocessing for all the sources
that are not specified explicitly on other lines (the order of the lines is not
significant).
@end itemize

It is an error to have two lines with the same file name or two
lines starting with the character ‘*’.

After the file name or ‘*’, an optional literal string specifies the name of
the definition file to be used for preprocessing
(@ref{98,,Form of Definitions File}). The definition files are found by the
compiler in one of the source directories. In some cases, when compiling
a source in a directory other than the current directory, if the definition
file is in the current directory, it may be necessary to add the current
directory as a source directory through the @code{-I} switch; otherwise
the compiler would not find the definition file.

Finally, switches similar to those of @code{gnatprep} may optionally appear:


@table @asis

@item @code{-b}

Causes both preprocessor lines and the lines deleted by
preprocessing to be replaced by blank lines, preserving the line number.
This switch is always implied; however, if specified after @code{-c}
it cancels the effect of @code{-c}.

@item @code{-c}

Causes both preprocessor lines and the lines deleted
by preprocessing to be retained as comments marked
with the special string ‘@cite{–!}’.

@item @code{-D@emph{symbol}=@emph{new_value}}

Define or redefine @code{symbol} to have @code{new_value} as its value.
The permitted form for @code{symbol} is either an Ada identifier, or any Ada reserved word
aside from @code{if},
@code{else}, @code{elsif}, @code{end}, @code{and}, @code{or} and @code{then}.
The permitted form for @code{new_value} is a literal string, an Ada identifier or any Ada reserved
word. A symbol declared with this switch replaces a symbol with the
same name defined in a definition file.

@item @code{-s}

Causes a sorted list of symbol names and values to be
listed on the standard output file.

@item @code{-u}

Causes undefined symbols to be treated as having the value @code{FALSE}
in the context
of a preprocessor test. In the absence of this option, an undefined symbol in
a @code{#if} or @code{#elsif} test will be treated as an error.
@end table
@end table

@geindex -gnateD (gcc)


@table @asis

@item @code{-gnateD@emph{symbol}[=@emph{new_value}]}

Define or redefine @code{symbol} to have @code{new_value} as its value. If no value
is supplied, then the value of @code{symbol} is @code{True}.
The form of @code{symbol} is an identifier, following normal Ada (case-insensitive)
rules for its syntax, and @code{new_value} is either an arbitrary string between double
quotes or any sequence (including an empty sequence) of characters from the
set (letters, digits, period, underline).
Ada reserved words may be used as symbols, with the exceptions of @code{if},
@code{else}, @code{elsif}, @code{end}, @code{and}, @code{or} and @code{then}.

Examples:

@quotation

@example
-gnateDToto=Tata
-gnateDFoo
-gnateDFoo=\"Foo-Bar\"
@end example
@end quotation

A symbol declared with this switch on the command line replaces a
symbol with the same name either in a definition file or specified with a
switch @code{-D} in the preprocessor data file.

This switch is similar to switch @code{-D} of @code{gnatprep}.

@item @code{-gnateG}

When integrated preprocessing is performed on source file @code{filename.extension},
create or overwrite @code{filename.extension.prep} to contain
the result of the preprocessing.
For example if the source file is @code{foo.adb} then
the output file will be @code{foo.adb.prep}.
@end table

@node Mixed Language Programming,GNAT and Other Compilation Models,Conditional Compilation,The GNAT Compilation Model
@anchor{gnat_ugn/the_gnat_compilation_model id61}@anchor{9d}@anchor{gnat_ugn/the_gnat_compilation_model mixed-language-programming}@anchor{2c}
@section Mixed Language Programming


@geindex Mixed Language Programming

This section describes how to develop a mixed-language program,
with a focus on combining Ada with C or C++.

@menu
* Interfacing to C:: 
* Calling Conventions:: 
* Building Mixed Ada and C++ Programs:: 
* Generating Ada Bindings for C and C++ headers:: 
* Generating C Headers for Ada Specifications:: 

@end menu

@node Interfacing to C,Calling Conventions,,Mixed Language Programming
@anchor{gnat_ugn/the_gnat_compilation_model id62}@anchor{9e}@anchor{gnat_ugn/the_gnat_compilation_model interfacing-to-c}@anchor{9f}
@subsection Interfacing to C


Interfacing Ada with a foreign language such as C involves using
compiler directives to import and/or export entity definitions in each
language – using @code{extern} statements in C, for instance, and the
@code{Import}, @code{Export}, and @code{Convention} pragmas in Ada.
A full treatment of these topics is provided in Appendix B, section 1
of the Ada Reference Manual.

There are two ways to build a program using GNAT that contains some Ada
sources and some foreign language sources, depending on whether or not
the main subprogram is written in Ada.  Here is a source example with
the main subprogram in Ada:

@example
/* file1.c */
#include <stdio.h>

void print_num (int num)
@{
  printf ("num is %d.\\n", num);
  return;
@}
@end example

@example
/* file2.c */

/* num_from_Ada is declared in my_main.adb */
extern int num_from_Ada;

int get_num (void)
@{
  return num_from_Ada;
@}
@end example

@example
--  my_main.adb
procedure My_Main is

   --  Declare then export an Integer entity called num_from_Ada
   My_Num : Integer := 10;
   pragma Export (C, My_Num, "num_from_Ada");

   --  Declare an Ada function spec for Get_Num, then use
   --  C function get_num for the implementation.
   function Get_Num return Integer;
   pragma Import (C, Get_Num, "get_num");

   --  Declare an Ada procedure spec for Print_Num, then use
   --  C function print_num for the implementation.
   procedure Print_Num (Num : Integer);
   pragma Import (C, Print_Num, "print_num");

begin
   Print_Num (Get_Num);
end My_Main;
@end example

To build this example:


@itemize *

@item 
First compile the foreign language files to
generate object files:

@example
$ gcc -c file1.c
$ gcc -c file2.c
@end example

@item 
Then, compile the Ada units to produce a set of object files and ALI
files:

@example
$ gnatmake -c my_main.adb
@end example

@item 
Run the Ada binder on the Ada main program:

@example
$ gnatbind my_main.ali
@end example

@item 
Link the Ada main program, the Ada objects and the other language
objects:

@example
$ gnatlink my_main.ali file1.o file2.o
@end example
@end itemize

The last three steps can be grouped in a single command:

@example
$ gnatmake my_main.adb -largs file1.o file2.o
@end example

@geindex Binder output file

If the main program is in a language other than Ada, then you may have
more than one entry point into the Ada subsystem. You must use a special
binder option to generate callable routines that initialize and
finalize the Ada units (@ref{a0,,Binding with Non-Ada Main Programs}).
Calls to the initialization and finalization routines must be inserted
in the main program, or some other appropriate point in the code. The
call to initialize the Ada units must occur before the first Ada
subprogram is called, and the call to finalize the Ada units must occur
after the last Ada subprogram returns. The binder will place the
initialization and finalization subprograms into the
@code{b~xxx.adb} file where they can be accessed by your C
sources.  To illustrate, we have the following example:

@example
/* main.c */
extern void adainit (void);
extern void adafinal (void);
extern int add (int, int);
extern int sub (int, int);

int main (int argc, char *argv[])
@{
   int a = 21, b = 7;

   adainit();

   /* Should print "21 + 7 = 28" */
   printf ("%d + %d = %d\\n", a, b, add (a, b));

   /* Should print "21 - 7 = 14" */
   printf ("%d - %d = %d\\n", a, b, sub (a, b));

   adafinal();
@}
@end example

@example
--  unit1.ads
package Unit1 is
   function Add (A, B : Integer) return Integer;
   pragma Export (C, Add, "add");
end Unit1;
@end example

@example
--  unit1.adb
package body Unit1 is
   function Add (A, B : Integer) return Integer is
   begin
      return A + B;
   end Add;
end Unit1;
@end example

@example
--  unit2.ads
package Unit2 is
   function Sub (A, B : Integer) return Integer;
   pragma Export (C, Sub, "sub");
end Unit2;
@end example

@example
--  unit2.adb
package body Unit2 is
   function Sub (A, B : Integer) return Integer is
   begin
      return A - B;
   end Sub;
end Unit2;
@end example

The build procedure for this application is similar to the last
example’s:


@itemize *

@item 
First, compile the foreign language files to generate object files:

@example
$ gcc -c main.c
@end example

@item 
Next, compile the Ada units to produce a set of object files and ALI
files:

@example
$ gnatmake -c unit1.adb
$ gnatmake -c unit2.adb
@end example

@item 
Run the Ada binder on every generated ALI file.  Make sure to use the
@code{-n} option to specify a foreign main program:

@example
$ gnatbind -n unit1.ali unit2.ali
@end example

@item 
Link the Ada main program, the Ada objects and the foreign language
objects. You need only list the last ALI file here:

@example
$ gnatlink unit2.ali main.o -o exec_file
@end example

This procedure yields a binary executable called @code{exec_file}.
@end itemize

Depending on the circumstances (for example when your non-Ada main object
does not provide symbol @code{main}), you may also need to instruct the
GNAT linker not to include the standard startup objects by passing the
@code{-nostartfiles} switch to @code{gnatlink}.

@node Calling Conventions,Building Mixed Ada and C++ Programs,Interfacing to C,Mixed Language Programming
@anchor{gnat_ugn/the_gnat_compilation_model calling-conventions}@anchor{a1}@anchor{gnat_ugn/the_gnat_compilation_model id63}@anchor{a2}
@subsection Calling Conventions


@geindex Foreign Languages

@geindex Calling Conventions

GNAT follows standard calling sequence conventions and will thus interface
to any other language that also follows these conventions. The following
Convention identifiers are recognized by GNAT:

@geindex Interfacing to Ada

@geindex Other Ada compilers

@geindex Convention Ada


@table @asis

@item @code{Ada}

This indicates that the standard Ada calling sequence will be
used and all Ada data items may be passed without any limitations in the
case where GNAT is used to generate both the caller and callee. It is also
possible to mix GNAT generated code and code generated by another Ada
compiler. In this case, the data types should be restricted to simple
cases, including primitive types. Whether complex data types can be passed
depends on the situation. Probably it is safe to pass simple arrays, such
as arrays of integers or floats. Records may or may not work, depending
on whether both compilers lay them out identically. Complex structures
involving variant records, access parameters, tasks, or protected types,
are unlikely to be able to be passed.

Note that in the case of GNAT running
on a platform that supports HP Ada 83, a higher degree of compatibility
can be guaranteed, and in particular records are laid out in an identical
manner in the two compilers. Note also that if output from two different
compilers is mixed, the program is responsible for dealing with elaboration
issues. Probably the safest approach is to write the main program in the
version of Ada other than GNAT, so that it takes care of its own elaboration
requirements, and then call the GNAT-generated adainit procedure to ensure
elaboration of the GNAT components. Consult the documentation of the other
Ada compiler for further details on elaboration.

However, it is not possible to mix the tasking run time of GNAT and
HP Ada 83, All the tasking operations must either be entirely within
GNAT compiled sections of the program, or entirely within HP Ada 83
compiled sections of the program.
@end table

@geindex Interfacing to Assembly

@geindex Convention Assembler


@table @asis

@item @code{Assembler}

Specifies assembler as the convention. In practice this has the
same effect as convention Ada (but is not equivalent in the sense of being
considered the same convention).
@end table

@geindex Convention Asm

@geindex Asm


@table @asis

@item @code{Asm}

Equivalent to Assembler.

@geindex Interfacing to COBOL

@geindex Convention COBOL
@end table

@geindex COBOL


@table @asis

@item @code{COBOL}

Data will be passed according to the conventions described
in section B.4 of the Ada Reference Manual.
@end table

@geindex C

@geindex Interfacing to C

@geindex Convention C


@table @asis

@item @code{C}

Data will be passed according to the conventions described
in section B.3 of the Ada Reference Manual.

A note on interfacing to a C ‘varargs’ function:

@quotation

@geindex C varargs function

@geindex Interfacing to C varargs function

@geindex varargs function interfaces

In C, @code{varargs} allows a function to take a variable number of
arguments. There is no direct equivalent in this to Ada. One
approach that can be used is to create a C wrapper for each
different profile and then interface to this C wrapper. For
example, to print an @code{int} value using @code{printf},
create a C function @code{printfi} that takes two arguments, a
pointer to a string and an int, and calls @code{printf}.
Then in the Ada program, use pragma @code{Import} to
interface to @code{printfi}.

It may work on some platforms to directly interface to
a @code{varargs} function by providing a specific Ada profile
for a particular call. However, this does not work on
all platforms, since there is no guarantee that the
calling sequence for a two argument normal C function
is the same as for calling a @code{varargs} C function with
the same two arguments.
@end quotation
@end table

@geindex Convention Default

@geindex Default


@table @asis

@item @code{Default}

Equivalent to C.
@end table

@geindex Convention External

@geindex External


@table @asis

@item @code{External}

Equivalent to C.
@end table

@geindex C++

@geindex Interfacing to C++

@geindex Convention C++


@table @asis

@item @code{C_Plus_Plus} (or @code{CPP})

This stands for C++. For most purposes this is identical to C.
See the separate description of the specialized GNAT pragmas relating to
C++ interfacing for further details.
@end table

@geindex Fortran

@geindex Interfacing to Fortran

@geindex Convention Fortran


@table @asis

@item @code{Fortran}

Data will be passed according to the conventions described
in section B.5 of the Ada Reference Manual.

@item @code{Intrinsic}

This applies to an intrinsic operation, as defined in the Ada
Reference Manual. If a pragma Import (Intrinsic) applies to a subprogram,
this means that the body of the subprogram is provided by the compiler itself,
usually by means of an efficient code sequence, and that the user does not
supply an explicit body for it. In an application program, the pragma may
be applied to the following sets of names:


@itemize *

@item 
Rotate_Left, Rotate_Right, Shift_Left, Shift_Right, Shift_Right_Arithmetic.
The corresponding subprogram declaration must have
two formal parameters. The
first one must be a signed integer type or a modular type with a binary
modulus, and the second parameter must be of type Natural.
The return type must be the same as the type of the first argument. The size
of this type can only be 8, 16, 32, or 64.

@item 
Binary arithmetic operators: ‘+’, ‘-‘, ‘*’, ‘/’.
The corresponding operator declaration must have parameters and result type
that have the same root numeric type (for example, all three are long_float
types). This simplifies the definition of operations that use type checking
to perform dimensional checks:
@end itemize

@example
  type Distance is new Long_Float;
  type Time     is new Long_Float;
  type Velocity is new Long_Float;
  function "/" (D : Distance; T : Time)
    return Velocity;
  pragma Import (Intrinsic, "/");

This common idiom is often programmed with a generic definition and an
explicit body. The pragma makes it simpler to introduce such declarations.
It incurs no overhead in compilation time or code size, because it is
implemented as a single machine instruction.
@end example


@itemize *

@item 
General subprogram entities. This is used  to bind an Ada subprogram
declaration to
a compiler builtin by name with back-ends where such interfaces are
available. A typical example is the set of @code{__builtin} functions
exposed by the GCC back-end, as in the following example:

@example
function builtin_sqrt (F : Float) return Float;
pragma Import (Intrinsic, builtin_sqrt, "__builtin_sqrtf");
@end example

Most of the GCC builtins are accessible this way, and as for other
import conventions (e.g. C), it is the user’s responsibility to ensure
that the Ada subprogram profile matches the underlying builtin
expectations.
@end itemize
@end table

@geindex Stdcall

@geindex Convention Stdcall


@table @asis

@item @code{Stdcall}

This is relevant only to Windows implementations of GNAT,
and specifies that the @code{Stdcall} calling sequence will be used,
as defined by the NT API. Nevertheless, to ease building
cross-platform bindings this convention will be handled as a @code{C} calling
convention on non-Windows platforms.
@end table

@geindex DLL

@geindex Convention DLL


@table @asis

@item @code{DLL}

This is equivalent to @code{Stdcall}.
@end table

@geindex Win32

@geindex Convention Win32


@table @asis

@item @code{Win32}

This is equivalent to @code{Stdcall}.
@end table

@geindex Stubbed

@geindex Convention Stubbed


@table @asis

@item @code{Stubbed}

This is a special convention that indicates that the compiler
should provide a stub body that raises @code{Program_Error}.
@end table

GNAT additionally provides a useful pragma @code{Convention_Identifier}
that can be used to parameterize conventions and allow additional synonyms
to be specified. For example if you have legacy code in which the convention
identifier Fortran77 was used for Fortran, you can use the configuration
pragma:

@example
pragma Convention_Identifier (Fortran77, Fortran);
@end example

And from now on the identifier Fortran77 may be used as a convention
identifier (for example in an @code{Import} pragma) with the same
meaning as Fortran.

@node Building Mixed Ada and C++ Programs,Generating Ada Bindings for C and C++ headers,Calling Conventions,Mixed Language Programming
@anchor{gnat_ugn/the_gnat_compilation_model building-mixed-ada-and-c-programs}@anchor{a3}@anchor{gnat_ugn/the_gnat_compilation_model id64}@anchor{a4}
@subsection Building Mixed Ada and C++ Programs


A programmer inexperienced with mixed-language development may find that
building an application containing both Ada and C++ code can be a
challenge.  This section gives a few hints that should make this task easier.

@menu
* Interfacing to C++:: 
* Linking a Mixed C++ & Ada Program:: 
* A Simple Example:: 
* Interfacing with C++ constructors:: 
* Interfacing with C++ at the Class Level:: 

@end menu

@node Interfacing to C++,Linking a Mixed C++ & Ada Program,,Building Mixed Ada and C++ Programs
@anchor{gnat_ugn/the_gnat_compilation_model id65}@anchor{a5}@anchor{gnat_ugn/the_gnat_compilation_model id66}@anchor{a6}
@subsubsection Interfacing to C++


GNAT supports interfacing with the G++ compiler (or any C++ compiler
generating code that is compatible with the G++ Application Binary
Interface —see @indicateurl{http://www.codesourcery.com/archives/cxx-abi}).

Interfacing can be done at 3 levels: simple data, subprograms, and
classes. In the first two cases, GNAT offers a specific @code{Convention C_Plus_Plus}
(or @code{CPP}) that behaves exactly like @code{Convention C}.
Usually, C++ mangles the names of subprograms. To generate proper mangled
names automatically, see @ref{a7,,Generating Ada Bindings for C and C++ headers}).
This problem can also be addressed manually in two ways:


@itemize *

@item 
by modifying the C++ code in order to force a C convention using
the @code{extern "C"} syntax.

@item 
by figuring out the mangled name (using e.g. @code{nm}) and using it as the
Link_Name argument of the pragma import.
@end itemize

Interfacing at the class level can be achieved by using the GNAT specific
pragmas such as @code{CPP_Constructor}.  See the @cite{GNAT_Reference_Manual} for additional information.

@node Linking a Mixed C++ & Ada Program,A Simple Example,Interfacing to C++,Building Mixed Ada and C++ Programs
@anchor{gnat_ugn/the_gnat_compilation_model linking-a-mixed-c-ada-program}@anchor{a8}@anchor{gnat_ugn/the_gnat_compilation_model linking-a-mixed-c-and-ada-program}@anchor{a9}
@subsubsection Linking a Mixed C++ & Ada Program


Usually the linker of the C++ development system must be used to link
mixed applications because most C++ systems will resolve elaboration
issues (such as calling constructors on global class instances)
transparently during the link phase. GNAT has been adapted to ease the
use of a foreign linker for the last phase. Three cases can be
considered:


@itemize *

@item 
Using GNAT and G++ (GNU C++ compiler) from the same GCC installation:
The C++ linker can simply be called by using the C++ specific driver
called @code{g++}.

Note that if the C++ code uses inline functions, you will need to
compile your C++ code with the @code{-fkeep-inline-functions} switch in
order to provide an existing function implementation that the Ada code can
link with.

@example
$ g++ -c -fkeep-inline-functions file1.C
$ g++ -c -fkeep-inline-functions file2.C
$ gnatmake ada_unit -largs file1.o file2.o --LINK=g++
@end example

@item 
Using GNAT and G++ from two different GCC installations: If both
compilers are on the :envvar`PATH`, the previous method may be used. It is
important to note that environment variables such as
@geindex C_INCLUDE_PATH
@geindex environment variable; C_INCLUDE_PATH
@code{C_INCLUDE_PATH}, 
@geindex GCC_EXEC_PREFIX
@geindex environment variable; GCC_EXEC_PREFIX
@code{GCC_EXEC_PREFIX},
@geindex BINUTILS_ROOT
@geindex environment variable; BINUTILS_ROOT
@code{BINUTILS_ROOT}, and
@geindex GCC_ROOT
@geindex environment variable; GCC_ROOT
@code{GCC_ROOT} will affect both compilers
at the same time and may make one of the two compilers operate
improperly if set during invocation of the wrong compiler.  It is also
very important that the linker uses the proper @code{libgcc.a} GCC
library – that is, the one from the C++ compiler installation. The
implicit link command as suggested in the @code{gnatmake} command
from the former example can be replaced by an explicit link command with
the full-verbosity option in order to verify which library is used:

@example
$ gnatbind ada_unit
$ gnatlink -v -v ada_unit file1.o file2.o --LINK=c++
@end example

If there is a problem due to interfering environment variables, it can
be worked around by using an intermediate script. The following example
shows the proper script to use when GNAT has not been installed at its
default location and g++ has been installed at its default location:

@example
$ cat ./my_script
#!/bin/sh
unset BINUTILS_ROOT
unset GCC_ROOT
c++ $*
$ gnatlink -v -v ada_unit file1.o file2.o --LINK=./my_script
@end example

@item 
Using a non-GNU C++ compiler: The commands previously described can be
used to insure that the C++ linker is used. Nonetheless, you need to add
a few more parameters to the link command line, depending on the exception
mechanism used.

If the @code{setjmp} / @code{longjmp} exception mechanism is used, only the paths
to the @code{libgcc} libraries are required:

@example
$ cat ./my_script
#!/bin/sh
CC $* gcc -print-file-name=libgcc.a gcc -print-file-name=libgcc_eh.a
$ gnatlink ada_unit file1.o file2.o --LINK=./my_script
@end example

where CC is the name of the non-GNU C++ compiler.

If the “zero cost” exception mechanism is used, and the platform
supports automatic registration of exception tables (e.g., Solaris),
paths to more objects are required:

@example
$ cat ./my_script
#!/bin/sh
CC gcc -print-file-name=crtbegin.o $* \\
gcc -print-file-name=libgcc.a gcc -print-file-name=libgcc_eh.a \\
gcc -print-file-name=crtend.o
$ gnatlink ada_unit file1.o file2.o --LINK=./my_script
@end example

If the “zero cost exception” mechanism is used, and the platform
doesn’t support automatic registration of exception tables (e.g., HP-UX
or AIX), the simple approach described above will not work and
a pre-linking phase using GNAT will be necessary.
@end itemize

Another alternative is to use the @code{gprbuild} multi-language builder
which has a large knowledge base and knows how to link Ada and C++ code
together automatically in most cases.

@node A Simple Example,Interfacing with C++ constructors,Linking a Mixed C++ & Ada Program,Building Mixed Ada and C++ Programs
@anchor{gnat_ugn/the_gnat_compilation_model a-simple-example}@anchor{aa}@anchor{gnat_ugn/the_gnat_compilation_model id67}@anchor{ab}
@subsubsection A Simple Example


The following example, provided as part of the GNAT examples, shows how
to achieve procedural interfacing between Ada and C++ in both
directions. The C++ class A has two methods. The first method is exported
to Ada by the means of an extern C wrapper function. The second method
calls an Ada subprogram. On the Ada side, the C++ calls are modelled by
a limited record with a layout comparable to the C++ class. The Ada
subprogram, in turn, calls the C++ method. So, starting from the C++
main program, the process passes back and forth between the two
languages.

Here are the compilation commands:

@example
$ gnatmake -c simple_cpp_interface
$ g++ -c cpp_main.C
$ g++ -c ex7.C
$ gnatbind -n simple_cpp_interface
$ gnatlink simple_cpp_interface -o cpp_main --LINK=g++ -lstdc++ ex7.o cpp_main.o
@end example

Here are the corresponding sources:

@example
//cpp_main.C

#include "ex7.h"

extern "C" @{
  void adainit (void);
  void adafinal (void);
  void method1 (A *t);
@}

void method1 (A *t)
@{
  t->method1 ();
@}

int main ()
@{
  A obj;
  adainit ();
  obj.method2 (3030);
  adafinal ();
@}
@end example

@example
//ex7.h

class Origin @{
 public:
  int o_value;
@};
class A : public Origin @{
 public:
  void method1 (void);
  void method2 (int v);
  A();
  int   a_value;
@};
@end example

@example
//ex7.C

#include "ex7.h"
#include <stdio.h>

extern "C" @{ void ada_method2 (A *t, int v);@}

void A::method1 (void)
@{
  a_value = 2020;
  printf ("in A::method1, a_value = %d \\n",a_value);
@}

void A::method2 (int v)
@{
   ada_method2 (this, v);
   printf ("in A::method2, a_value = %d \\n",a_value);
@}

A::A(void)
@{
   a_value = 1010;
  printf ("in A::A, a_value = %d \\n",a_value);
@}
@end example

@example
-- simple_cpp_interface.ads
with System;
package Simple_Cpp_Interface is
   type A is limited
      record
         Vptr    : System.Address;
         O_Value : Integer;
         A_Value : Integer;
      end record;
   pragma Convention (C, A);

   procedure Method1 (This : in out A);
   pragma Import (C, Method1);

   procedure Ada_Method2 (This : in out A; V : Integer);
   pragma Export (C, Ada_Method2);

end Simple_Cpp_Interface;
@end example

@example
-- simple_cpp_interface.adb
package body Simple_Cpp_Interface is

   procedure Ada_Method2 (This : in out A; V : Integer) is
   begin
      Method1 (This);
      This.A_Value := V;
   end Ada_Method2;

end Simple_Cpp_Interface;
@end example

@node Interfacing with C++ constructors,Interfacing with C++ at the Class Level,A Simple Example,Building Mixed Ada and C++ Programs
@anchor{gnat_ugn/the_gnat_compilation_model id68}@anchor{ac}@anchor{gnat_ugn/the_gnat_compilation_model interfacing-with-c-constructors}@anchor{ad}
@subsubsection Interfacing with C++ constructors


In order to interface with C++ constructors GNAT provides the
@code{pragma CPP_Constructor} (see the @cite{GNAT_Reference_Manual}
for additional information).
In this section we present some common uses of C++ constructors
in mixed-languages programs in GNAT.

Let us assume that we need to interface with the following
C++ class:

@example
class Root @{
public:
  int  a_value;
  int  b_value;
  virtual int Get_Value ();
  Root();              // Default constructor
  Root(int v);         // 1st non-default constructor
  Root(int v, int w);  // 2nd non-default constructor
@};
@end example

For this purpose we can write the following package spec (further
information on how to build this spec is available in
@ref{ae,,Interfacing with C++ at the Class Level} and
@ref{a7,,Generating Ada Bindings for C and C++ headers}).

@example
with Interfaces.C; use Interfaces.C;
package Pkg_Root is
  type Root is tagged limited record
     A_Value : int;
     B_Value : int;
  end record;
  pragma Import (CPP, Root);

  function Get_Value (Obj : Root) return int;
  pragma Import (CPP, Get_Value);

  function Constructor return Root;
  pragma Cpp_Constructor (Constructor, "_ZN4RootC1Ev");

  function Constructor (v : Integer) return Root;
  pragma Cpp_Constructor (Constructor, "_ZN4RootC1Ei");

  function Constructor (v, w : Integer) return Root;
  pragma Cpp_Constructor (Constructor, "_ZN4RootC1Eii");
end Pkg_Root;
@end example

On the Ada side the constructor is represented by a function (whose
name is arbitrary) that returns the classwide type corresponding to
the imported C++ class. Although the constructor is described as a
function, it is typically a procedure with an extra implicit argument
(the object being initialized) at the implementation level. GNAT
issues the appropriate call, whatever it is, to get the object
properly initialized.

Constructors can only appear in the following contexts:


@itemize *

@item 
On the right side of an initialization of an object of type @code{T}.

@item 
On the right side of an initialization of a record component of type @code{T}.

@item 
In an Ada 2005 limited aggregate.

@item 
In an Ada 2005 nested limited aggregate.

@item 
In an Ada 2005 limited aggregate that initializes an object built in
place by an extended return statement.
@end itemize

In a declaration of an object whose type is a class imported from C++,
either the default C++ constructor is implicitly called by GNAT, or
else the required C++ constructor must be explicitly called in the
expression that initializes the object. For example:

@example
Obj1 : Root;
Obj2 : Root := Constructor;
Obj3 : Root := Constructor (v => 10);
Obj4 : Root := Constructor (30, 40);
@end example

The first two declarations are equivalent: in both cases the default C++
constructor is invoked (in the former case the call to the constructor is
implicit, and in the latter case the call is explicit in the object
declaration). @code{Obj3} is initialized by the C++ non-default constructor
that takes an integer argument, and @code{Obj4} is initialized by the
non-default C++ constructor that takes two integers.

Let us derive the imported C++ class in the Ada side. For example:

@example
type DT is new Root with record
   C_Value : Natural := 2009;
end record;
@end example

In this case the components DT inherited from the C++ side must be
initialized by a C++ constructor, and the additional Ada components
of type DT are initialized by GNAT. The initialization of such an
object is done either by default, or by means of a function returning
an aggregate of type DT, or by means of an extension aggregate.

@example
Obj5 : DT;
Obj6 : DT := Function_Returning_DT (50);
Obj7 : DT := (Constructor (30,40) with C_Value => 50);
@end example

The declaration of @code{Obj5} invokes the default constructors: the
C++ default constructor of the parent type takes care of the initialization
of the components inherited from Root, and GNAT takes care of the default
initialization of the additional Ada components of type DT (that is,
@code{C_Value} is initialized to value 2009). The order of invocation of
the constructors is consistent with the order of elaboration required by
Ada and C++. That is, the constructor of the parent type is always called
before the constructor of the derived type.

Let us now consider a record that has components whose type is imported
from C++. For example:

@example
type Rec1 is limited record
   Data1 : Root := Constructor (10);
   Value : Natural := 1000;
end record;

type Rec2 (D : Integer := 20) is limited record
   Rec   : Rec1;
   Data2 : Root := Constructor (D, 30);
end record;
@end example

The initialization of an object of type @code{Rec2} will call the
non-default C++ constructors specified for the imported components.
For example:

@example
Obj8 : Rec2 (40);
@end example

Using Ada 2005 we can use limited aggregates to initialize an object
invoking C++ constructors that differ from those specified in the type
declarations. For example:

@example
Obj9 : Rec2 := (Rec => (Data1 => Constructor (15, 16),
                        others => <>),
                others => <>);
@end example

The above declaration uses an Ada 2005 limited aggregate to
initialize @code{Obj9}, and the C++ constructor that has two integer
arguments is invoked to initialize the @code{Data1} component instead
of the constructor specified in the declaration of type @code{Rec1}. In
Ada 2005 the box in the aggregate indicates that unspecified components
are initialized using the expression (if any) available in the component
declaration. That is, in this case discriminant @code{D} is initialized
to value @code{20}, @code{Value} is initialized to value 1000, and the
non-default C++ constructor that handles two integers takes care of
initializing component @code{Data2} with values @code{20,30}.

In Ada 2005 we can use the extended return statement to build the Ada
equivalent to C++ non-default constructors. For example:

@example
function Constructor (V : Integer) return Rec2 is
begin
   return Obj : Rec2 := (Rec => (Data1  => Constructor (V, 20),
                                 others => <>),
                         others => <>) do
      --  Further actions required for construction of
      --  objects of type Rec2
      ...
   end record;
end Constructor;
@end example

In this example the extended return statement construct is used to
build in place the returned object whose components are initialized
by means of a limited aggregate. Any further action associated with
the constructor can be placed inside the construct.

@node Interfacing with C++ at the Class Level,,Interfacing with C++ constructors,Building Mixed Ada and C++ Programs
@anchor{gnat_ugn/the_gnat_compilation_model id69}@anchor{af}@anchor{gnat_ugn/the_gnat_compilation_model interfacing-with-c-at-the-class-level}@anchor{ae}
@subsubsection Interfacing with C++ at the Class Level


In this section we demonstrate the GNAT features for interfacing with
C++ by means of an example making use of Ada 2005 abstract interface
types. This example consists of a classification of animals; classes
have been used to model our main classification of animals, and
interfaces provide support for the management of secondary
classifications. We first demonstrate a case in which the types and
constructors are defined on the C++ side and imported from the Ada
side, and latter the reverse case.

The root of our derivation will be the @code{Animal} class, with a
single private attribute (the @code{Age} of the animal), a constructor,
and two public primitives to set and get the value of this attribute.

@example
class Animal @{
 public:
   virtual void Set_Age (int New_Age);
   virtual int Age ();
   Animal() @{Age_Count = 0;@};
 private:
   int Age_Count;
@};
@end example

Abstract interface types are defined in C++ by means of classes with pure
virtual functions and no data members. In our example we will use two
interfaces that provide support for the common management of @code{Carnivore}
and @code{Domestic} animals:

@example
class Carnivore @{
public:
   virtual int Number_Of_Teeth () = 0;
@};

class Domestic @{
public:
   virtual void Set_Owner (char* Name) = 0;
@};
@end example

Using these declarations, we can now say that a @code{Dog} is an animal that is
both Carnivore and Domestic, that is:

@example
class Dog : Animal, Carnivore, Domestic @{
 public:
   virtual int  Number_Of_Teeth ();
   virtual void Set_Owner (char* Name);

   Dog(); // Constructor
 private:
   int  Tooth_Count;
   char *Owner;
@};
@end example

In the following examples we will assume that the previous declarations are
located in a file named @code{animals.h}. The following package demonstrates
how to import these C++ declarations from the Ada side:

@example
with Interfaces.C.Strings; use Interfaces.C.Strings;
package Animals is
  type Carnivore is limited interface;
  pragma Convention (C_Plus_Plus, Carnivore);
  function Number_Of_Teeth (X : Carnivore)
     return Natural is abstract;

  type Domestic is limited interface;
  pragma Convention (C_Plus_Plus, Domestic);
  procedure Set_Owner
    (X    : in out Domestic;
     Name : Chars_Ptr) is abstract;

  type Animal is tagged limited record
    Age : Natural;
  end record;
  pragma Import (C_Plus_Plus, Animal);

  procedure Set_Age (X : in out Animal; Age : Integer);
  pragma Import (C_Plus_Plus, Set_Age);

  function Age (X : Animal) return Integer;
  pragma Import (C_Plus_Plus, Age);

  function New_Animal return Animal;
  pragma CPP_Constructor (New_Animal);
  pragma Import (CPP, New_Animal, "_ZN6AnimalC1Ev");

  type Dog is new Animal and Carnivore and Domestic with record
    Tooth_Count : Natural;
    Owner       : Chars_Ptr;
  end record;
  pragma Import (C_Plus_Plus, Dog);

  function Number_Of_Teeth (A : Dog) return Natural;
  pragma Import (C_Plus_Plus, Number_Of_Teeth);

  procedure Set_Owner (A : in out Dog; Name : Chars_Ptr);
  pragma Import (C_Plus_Plus, Set_Owner);

  function New_Dog return Dog;
  pragma CPP_Constructor (New_Dog);
  pragma Import (CPP, New_Dog, "_ZN3DogC2Ev");
end Animals;
@end example

Thanks to the compatibility between GNAT run-time structures and the C++ ABI,
interfacing with these C++ classes is easy. The only requirement is that all
the primitives and components must be declared exactly in the same order in
the two languages.

Regarding the abstract interfaces, we must indicate to the GNAT compiler by
means of a @code{pragma Convention (C_Plus_Plus)}, the convention used to pass
the arguments to the called primitives will be the same as for C++. For the
imported classes we use @code{pragma Import} with convention @code{C_Plus_Plus}
to indicate that they have been defined on the C++ side; this is required
because the dispatch table associated with these tagged types will be built
in the C++ side and therefore will not contain the predefined Ada primitives
which Ada would otherwise expect.

As the reader can see there is no need to indicate the C++ mangled names
associated with each subprogram because it is assumed that all the calls to
these primitives will be dispatching calls. The only exception is the
constructor, which must be registered with the compiler by means of
@code{pragma CPP_Constructor} and needs to provide its associated C++
mangled name because the Ada compiler generates direct calls to it.

With the above packages we can now declare objects of type Dog on the Ada side
and dispatch calls to the corresponding subprograms on the C++ side. We can
also extend the tagged type Dog with further fields and primitives, and
override some of its C++ primitives on the Ada side. For example, here we have
a type derivation defined on the Ada side that inherits all the dispatching
primitives of the ancestor from the C++ side.

@example
with Animals; use Animals;
package Vaccinated_Animals is
  type Vaccinated_Dog is new Dog with null record;
  function Vaccination_Expired (A : Vaccinated_Dog) return Boolean;
end Vaccinated_Animals;
@end example

It is important to note that, because of the ABI compatibility, the programmer
does not need to add any further information to indicate either the object
layout or the dispatch table entry associated with each dispatching operation.

Now let us define all the types and constructors on the Ada side and export
them to C++, using the same hierarchy of our previous example:

@example
with Interfaces.C.Strings;
use Interfaces.C.Strings;
package Animals is
  type Carnivore is limited interface;
  pragma Convention (C_Plus_Plus, Carnivore);
  function Number_Of_Teeth (X : Carnivore)
     return Natural is abstract;

  type Domestic is limited interface;
  pragma Convention (C_Plus_Plus, Domestic);
  procedure Set_Owner
    (X    : in out Domestic;
     Name : Chars_Ptr) is abstract;

  type Animal is tagged record
    Age : Natural;
  end record;
  pragma Convention (C_Plus_Plus, Animal);

  procedure Set_Age (X : in out Animal; Age : Integer);
  pragma Export (C_Plus_Plus, Set_Age);

  function Age (X : Animal) return Integer;
  pragma Export (C_Plus_Plus, Age);

  function New_Animal return Animal'Class;
  pragma Export (C_Plus_Plus, New_Animal);

  type Dog is new Animal and Carnivore and Domestic with record
    Tooth_Count : Natural;
    Owner       : String (1 .. 30);
  end record;
  pragma Convention (C_Plus_Plus, Dog);

  function Number_Of_Teeth (A : Dog) return Natural;
  pragma Export (C_Plus_Plus, Number_Of_Teeth);

  procedure Set_Owner (A : in out Dog; Name : Chars_Ptr);
  pragma Export (C_Plus_Plus, Set_Owner);

  function New_Dog return Dog'Class;
  pragma Export (C_Plus_Plus, New_Dog);
end Animals;
@end example

Compared with our previous example the only differences are the use of
@code{pragma Convention} (instead of @code{pragma Import}), and the use of
@code{pragma Export} to indicate to the GNAT compiler that the primitives will
be available to C++. Thanks to the ABI compatibility, on the C++ side there is
nothing else to be done; as explained above, the only requirement is that all
the primitives and components are declared in exactly the same order.

For completeness, let us see a brief C++ main program that uses the
declarations available in @code{animals.h} (presented in our first example) to
import and use the declarations from the Ada side, properly initializing and
finalizing the Ada run-time system along the way:

@example
#include "animals.h"
#include <iostream>
using namespace std;

void Check_Carnivore (Carnivore *obj) @{...@}
void Check_Domestic (Domestic *obj)   @{...@}
void Check_Animal (Animal *obj)       @{...@}
void Check_Dog (Dog *obj)             @{...@}

extern "C" @{
  void adainit (void);
  void adafinal (void);
  Dog* new_dog ();
@}

void test ()
@{
  Dog *obj = new_dog();  // Ada constructor
  Check_Carnivore (obj); // Check secondary DT
  Check_Domestic (obj);  // Check secondary DT
  Check_Animal (obj);    // Check primary DT
  Check_Dog (obj);       // Check primary DT
@}

int main ()
@{
  adainit ();  test();  adafinal ();
  return 0;
@}
@end example

@node Generating Ada Bindings for C and C++ headers,Generating C Headers for Ada Specifications,Building Mixed Ada and C++ Programs,Mixed Language Programming
@anchor{gnat_ugn/the_gnat_compilation_model generating-ada-bindings-for-c-and-c-headers}@anchor{a7}@anchor{gnat_ugn/the_gnat_compilation_model id70}@anchor{b0}
@subsection Generating Ada Bindings for C and C++ headers


@geindex Binding generation (for C and C++ headers)

@geindex C headers (binding generation)

@geindex C++ headers (binding generation)

GNAT includes a binding generator for C and C++ headers which is
intended to do 95% of the tedious work of generating Ada specs from C
or C++ header files.

Note that this capability is not intended to generate 100% correct Ada specs,
and will is some cases require manual adjustments, although it can often
be used out of the box in practice.

Some of the known limitations include:


@itemize *

@item 
only very simple character constant macros are translated into Ada
constants. Function macros (macros with arguments) are partially translated
as comments, to be completed manually if needed.

@item 
some extensions (e.g. vector types) are not supported

@item 
pointers to pointers are mapped to System.Address

@item 
identifiers with identical name (except casing) may generate compilation
errors (e.g. @code{shm_get} vs @code{SHM_GET}).
@end itemize

The code is generated using Ada 2012 syntax, which makes it easier to interface
with other languages. In most cases you can still use the generated binding
even if your code is compiled using earlier versions of Ada (e.g. @code{-gnat95}).

@menu
* Running the Binding Generator:: 
* Generating Bindings for C++ Headers:: 
* Switches:: 

@end menu

@node Running the Binding Generator,Generating Bindings for C++ Headers,,Generating Ada Bindings for C and C++ headers
@anchor{gnat_ugn/the_gnat_compilation_model id71}@anchor{b1}@anchor{gnat_ugn/the_gnat_compilation_model running-the-binding-generator}@anchor{b2}
@subsubsection Running the Binding Generator


The binding generator is part of the @code{gcc} compiler and can be
invoked via the @code{-fdump-ada-spec} switch, which will generate Ada
spec files for the header files specified on the command line, and all
header files needed by these files transitively. For example:

@example
$ gcc -c -fdump-ada-spec -C /usr/include/time.h
$ gcc -c *.ads
@end example

will generate, under GNU/Linux, the following files: @code{time_h.ads},
@code{bits_time_h.ads}, @code{stddef_h.ads}, @code{bits_types_h.ads} which
correspond to the files @code{/usr/include/time.h},
@code{/usr/include/bits/time.h}, etc…, and then compile these Ada specs.
That is to say, the name of the Ada specs is in keeping with the relative path
under @code{/usr/include/} of the header files. This behavior is specific to
paths ending with @code{/include/}; in all the other cases, the name of the
Ada specs is derived from the simple name of the header files instead.

The @code{-C} switch tells @code{gcc} to extract comments from headers,
and will attempt to generate corresponding Ada comments.

If you want to generate a single Ada file and not the transitive closure, you
can use instead the @code{-fdump-ada-spec-slim} switch.

You can optionally specify a parent unit, of which all generated units will
be children, using @code{-fada-spec-parent=@emph{unit}}.

The simple @code{gcc`}-based command works only for C headers. For C++ headers
you need to use either the @code{g++} command or the combination @code{gcc -x c++`}.

In some cases, the generated bindings will be more complete or more meaningful
when defining some macros, which you can do via the @code{-D} switch. This
is for example the case with @code{Xlib.h} under GNU/Linux:

@example
$ gcc -c -fdump-ada-spec -DXLIB_ILLEGAL_ACCESS -C /usr/include/X11/Xlib.h
@end example

The above will generate more complete bindings than a straight call without
the @code{-DXLIB_ILLEGAL_ACCESS} switch.

In other cases, it is not possible to parse a header file in a stand-alone
manner, because other include files need to be included first. In this
case, the solution is to create a small header file including the needed
@code{#include} and possible @code{#define} directives. For example, to
generate Ada bindings for @code{readline/readline.h}, you need to first
include @code{stdio.h}, so you can create a file with the following two
lines in e.g. @code{readline1.h}:

@example
#include <stdio.h>
#include <readline/readline.h>
@end example

and then generate Ada bindings from this file:

@example
$ gcc -c -fdump-ada-spec readline1.h
@end example

@node Generating Bindings for C++ Headers,Switches,Running the Binding Generator,Generating Ada Bindings for C and C++ headers
@anchor{gnat_ugn/the_gnat_compilation_model generating-bindings-for-c-headers}@anchor{b3}@anchor{gnat_ugn/the_gnat_compilation_model id72}@anchor{b4}
@subsubsection Generating Bindings for C++ Headers


Generating bindings for C++ headers is done using the same options, always
with the @emph{g++} compiler. Note that generating Ada spec from C++ headers is a
much more complex job and support for C++ headers is much more limited that
support for C headers. As a result, you will need to modify the resulting
bindings by hand more extensively when using C++ headers.

In this mode, C++ classes will be mapped to Ada tagged types, constructors
will be mapped using the @code{CPP_Constructor} pragma, and when possible,
multiple inheritance of abstract classes will be mapped to Ada interfaces
(see the @emph{Interfacing to C++} section in the @cite{GNAT Reference Manual}
for additional information on interfacing to C++).

For example, given the following C++ header file:

@example
class Carnivore @{
public:
   virtual int Number_Of_Teeth () = 0;
@};

class Domestic @{
public:
   virtual void Set_Owner (char* Name) = 0;
@};

class Animal @{
public:
  int Age_Count;
  virtual void Set_Age (int New_Age);
@};

class Dog : Animal, Carnivore, Domestic @{
 public:
  int  Tooth_Count;
  char *Owner;

  virtual int  Number_Of_Teeth ();
  virtual void Set_Owner (char* Name);

  Dog();
@};
@end example

The corresponding Ada code is generated:

@example
package Class_Carnivore is
  type Carnivore is limited interface;
  pragma Import (CPP, Carnivore);

  function Number_Of_Teeth (this : access Carnivore) return int is abstract;
end;
use Class_Carnivore;

package Class_Domestic is
  type Domestic is limited interface;
  pragma Import (CPP, Domestic);

  procedure Set_Owner
    (this : access Domestic;
     Name : Interfaces.C.Strings.chars_ptr) is abstract;
end;
use Class_Domestic;

package Class_Animal is
  type Animal is tagged limited record
    Age_Count : aliased int;
  end record;
  pragma Import (CPP, Animal);

  procedure Set_Age (this : access Animal; New_Age : int);
  pragma Import (CPP, Set_Age, "_ZN6Animal7Set_AgeEi");
end;
use Class_Animal;

package Class_Dog is
  type Dog is new Animal and Carnivore and Domestic with record
    Tooth_Count : aliased int;
    Owner : Interfaces.C.Strings.chars_ptr;
  end record;
  pragma Import (CPP, Dog);

  function Number_Of_Teeth (this : access Dog) return int;
  pragma Import (CPP, Number_Of_Teeth, "_ZN3Dog15Number_Of_TeethEv");

  procedure Set_Owner
    (this : access Dog; Name : Interfaces.C.Strings.chars_ptr);
  pragma Import (CPP, Set_Owner, "_ZN3Dog9Set_OwnerEPc");

  function New_Dog return Dog;
  pragma CPP_Constructor (New_Dog);
  pragma Import (CPP, New_Dog, "_ZN3DogC1Ev");
end;
use Class_Dog;
@end example

@node Switches,,Generating Bindings for C++ Headers,Generating Ada Bindings for C and C++ headers
@anchor{gnat_ugn/the_gnat_compilation_model switches}@anchor{b5}@anchor{gnat_ugn/the_gnat_compilation_model switches-for-ada-binding-generation}@anchor{b6}
@subsubsection Switches


@geindex -fdump-ada-spec (gcc)


@table @asis

@item @code{-fdump-ada-spec}

Generate Ada spec files for the given header files transitively (including
all header files that these headers depend upon).
@end table

@geindex -fdump-ada-spec-slim (gcc)


@table @asis

@item @code{-fdump-ada-spec-slim}

Generate Ada spec files for the header files specified on the command line
only.
@end table

@geindex -fada-spec-parent (gcc)


@table @asis

@item @code{-fada-spec-parent=@emph{unit}}

Specifies that all files generated by @code{-fdump-ada-spec} are
to be child units of the specified parent unit.
@end table

@geindex -C (gcc)


@table @asis

@item @code{-C}

Extract comments from headers and generate Ada comments in the Ada spec files.
@end table

@node Generating C Headers for Ada Specifications,,Generating Ada Bindings for C and C++ headers,Mixed Language Programming
@anchor{gnat_ugn/the_gnat_compilation_model generating-c-headers-for-ada-specifications}@anchor{b7}@anchor{gnat_ugn/the_gnat_compilation_model id73}@anchor{b8}
@subsection Generating C Headers for Ada Specifications


@geindex Binding generation (for Ada specs)

@geindex C headers (binding generation)

GNAT includes a C header generator for Ada specifications which supports
Ada types that have a direct mapping to C types. This includes in particular
support for:


@itemize *

@item 
Scalar types

@item 
Constrained arrays

@item 
Records (untagged)

@item 
Composition of the above types

@item 
Constant declarations

@item 
Object declarations

@item 
Subprogram declarations
@end itemize

@menu
* Running the C Header Generator:: 

@end menu

@node Running the C Header Generator,,,Generating C Headers for Ada Specifications
@anchor{gnat_ugn/the_gnat_compilation_model running-the-c-header-generator}@anchor{b9}
@subsubsection Running the C Header Generator


The C header generator is part of the GNAT compiler and can be invoked via
the @code{-gnatceg} combination of switches, which will generate a @code{.h}
file corresponding to the given input file (Ada spec or body). Note that
only spec files are processed in any case, so giving a spec or a body file
as input is equivalent. For example:

@example
$ gcc -c -gnatceg pack1.ads
@end example

will generate a self-contained file called @code{pack1.h} including
common definitions from the Ada Standard package, followed by the
definitions included in @code{pack1.ads}, as well as all the other units
withed by this file.

For instance, given the following Ada files:

@example
package Pack2 is
   type Int is range 1 .. 10;
end Pack2;
@end example

@example
with Pack2;

package Pack1 is
   type Rec is record
      Field1, Field2 : Pack2.Int;
   end record;

   Global : Rec := (1, 2);

   procedure Proc1 (R : Rec);
   procedure Proc2 (R : in out Rec);
end Pack1;
@end example

The above @code{gcc} command will generate the following @code{pack1.h} file:

@example
/* Standard definitions skipped */
#ifndef PACK2_ADS
#define PACK2_ADS
typedef short_short_integer pack2__TintB;
typedef pack2__TintB pack2__int;
#endif /* PACK2_ADS */

#ifndef PACK1_ADS
#define PACK1_ADS
typedef struct _pack1__rec @{
  pack2__int field1;
  pack2__int field2;
@} pack1__rec;
extern pack1__rec pack1__global;
extern void pack1__proc1(const pack1__rec r);
extern void pack1__proc2(pack1__rec *r);
#endif /* PACK1_ADS */
@end example

You can then @code{include} @code{pack1.h} from a C source file and use the types,
call subprograms, reference objects, and constants.

@node GNAT and Other Compilation Models,Using GNAT Files with External Tools,Mixed Language Programming,The GNAT Compilation Model
@anchor{gnat_ugn/the_gnat_compilation_model gnat-and-other-compilation-models}@anchor{2d}@anchor{gnat_ugn/the_gnat_compilation_model id74}@anchor{ba}
@section GNAT and Other Compilation Models


This section compares the GNAT model with the approaches taken in
other environments, first the C/C++ model and then the mechanism that
has been used in other Ada systems, in particular those traditionally
used for Ada 83.

@menu
* Comparison between GNAT and C/C++ Compilation Models:: 
* Comparison between GNAT and Conventional Ada Library Models:: 

@end menu

@node Comparison between GNAT and C/C++ Compilation Models,Comparison between GNAT and Conventional Ada Library Models,,GNAT and Other Compilation Models
@anchor{gnat_ugn/the_gnat_compilation_model comparison-between-gnat-and-c-c-compilation-models}@anchor{bb}@anchor{gnat_ugn/the_gnat_compilation_model id75}@anchor{bc}
@subsection Comparison between GNAT and C/C++ Compilation Models


The GNAT model of compilation is close to the C and C++ models. You can
think of Ada specs as corresponding to header files in C. As in C, you
don’t need to compile specs; they are compiled when they are used. The
Ada @emph{with} is similar in effect to the @code{#include} of a C
header.

One notable difference is that, in Ada, you may compile specs separately
to check them for semantic and syntactic accuracy. This is not always
possible with C headers because they are fragments of programs that have
less specific syntactic or semantic rules.

The other major difference is the requirement for running the binder,
which performs two important functions. First, it checks for
consistency. In C or C++, the only defense against assembling
inconsistent programs lies outside the compiler, in a makefile, for
example. The binder satisfies the Ada requirement that it be impossible
to construct an inconsistent program when the compiler is used in normal
mode.

@geindex Elaboration order control

The other important function of the binder is to deal with elaboration
issues. There are also elaboration issues in C++ that are handled
automatically. This automatic handling has the advantage of being
simpler to use, but the C++ programmer has no control over elaboration.
Where @code{gnatbind} might complain there was no valid order of
elaboration, a C++ compiler would simply construct a program that
malfunctioned at run time.

@node Comparison between GNAT and Conventional Ada Library Models,,Comparison between GNAT and C/C++ Compilation Models,GNAT and Other Compilation Models
@anchor{gnat_ugn/the_gnat_compilation_model comparison-between-gnat-and-conventional-ada-library-models}@anchor{bd}@anchor{gnat_ugn/the_gnat_compilation_model id76}@anchor{be}
@subsection Comparison between GNAT and Conventional Ada Library Models


This section is intended for Ada programmers who have
used an Ada compiler implementing the traditional Ada library
model, as described in the Ada Reference Manual.

@geindex GNAT library

In GNAT, there is no ‘library’ in the normal sense. Instead, the set of
source files themselves acts as the library. Compiling Ada programs does
not generate any centralized information, but rather an object file and
a ALI file, which are of interest only to the binder and linker.
In a traditional system, the compiler reads information not only from
the source file being compiled, but also from the centralized library.
This means that the effect of a compilation depends on what has been
previously compiled. In particular:


@itemize *

@item 
When a unit is @emph{with}ed, the unit seen by the compiler corresponds
to the version of the unit most recently compiled into the library.

@item 
Inlining is effective only if the necessary body has already been
compiled into the library.

@item 
Compiling a unit may obsolete other units in the library.
@end itemize

In GNAT, compiling one unit never affects the compilation of any other
units because the compiler reads only source files. Only changes to source
files can affect the results of a compilation. In particular:


@itemize *

@item 
When a unit is @emph{with}ed, the unit seen by the compiler corresponds
to the source version of the unit that is currently accessible to the
compiler.

@geindex Inlining

@item 
Inlining requires the appropriate source files for the package or
subprogram bodies to be available to the compiler. Inlining is always
effective, independent of the order in which units are compiled.

@item 
Compiling a unit never affects any other compilations. The editing of
sources may cause previous compilations to be out of date if they
depended on the source file being modified.
@end itemize

The most important result of these differences is that order of compilation
is never significant in GNAT. There is no situation in which one is
required to do one compilation before another. What shows up as order of
compilation requirements in the traditional Ada library becomes, in
GNAT, simple source dependencies; in other words, there is only a set
of rules saying what source files must be present when a file is
compiled.

@node Using GNAT Files with External Tools,,GNAT and Other Compilation Models,The GNAT Compilation Model
@anchor{gnat_ugn/the_gnat_compilation_model id77}@anchor{bf}@anchor{gnat_ugn/the_gnat_compilation_model using-gnat-files-with-external-tools}@anchor{2e}
@section Using GNAT Files with External Tools


This section explains how files that are produced by GNAT may be
used with tools designed for other languages.

@menu
* Using Other Utility Programs with GNAT:: 
* The External Symbol Naming Scheme of GNAT:: 

@end menu

@node Using Other Utility Programs with GNAT,The External Symbol Naming Scheme of GNAT,,Using GNAT Files with External Tools
@anchor{gnat_ugn/the_gnat_compilation_model id78}@anchor{c0}@anchor{gnat_ugn/the_gnat_compilation_model using-other-utility-programs-with-gnat}@anchor{c1}
@subsection Using Other Utility Programs with GNAT


The object files generated by GNAT are in standard system format and in
particular the debugging information uses this format. This means
programs generated by GNAT can be used with existing utilities that
depend on these formats.

In general, any utility program that works with C will also often work with
Ada programs generated by GNAT. This includes software utilities such as
gprof (a profiling program), gdb (the FSF debugger), and utilities such
as Purify.

@node The External Symbol Naming Scheme of GNAT,,Using Other Utility Programs with GNAT,Using GNAT Files with External Tools
@anchor{gnat_ugn/the_gnat_compilation_model id79}@anchor{c2}@anchor{gnat_ugn/the_gnat_compilation_model the-external-symbol-naming-scheme-of-gnat}@anchor{c3}
@subsection The External Symbol Naming Scheme of GNAT


In order to interpret the output from GNAT, when using tools that are
originally intended for use with other languages, it is useful to
understand the conventions used to generate link names from the Ada
entity names.

All link names are in all lowercase letters. With the exception of library
procedure names, the mechanism used is simply to use the full expanded
Ada name with dots replaced by double underscores. For example, suppose
we have the following package spec:

@example
package QRS is
   MN : Integer;
end QRS;
@end example

@geindex pragma Export

The variable @code{MN} has a full expanded Ada name of @code{QRS.MN}, so
the corresponding link name is @code{qrs__mn}.
Of course if a @code{pragma Export} is used this may be overridden:

@example
package Exports is
   Var1 : Integer;
   pragma Export (Var1, C, External_Name => "var1_name");
   Var2 : Integer;
   pragma Export (Var2, C, Link_Name => "var2_link_name");
end Exports;
@end example

In this case, the link name for @code{Var1} is whatever link name the
C compiler would assign for the C function @code{var1_name}. This typically
would be either @code{var1_name} or @code{_var1_name}, depending on operating
system conventions, but other possibilities exist. The link name for
@code{Var2} is @code{var2_link_name}, and this is not operating system
dependent.

One exception occurs for library level procedures. A potential ambiguity
arises between the required name @code{_main} for the C main program,
and the name we would otherwise assign to an Ada library level procedure
called @code{Main} (which might well not be the main program).

To avoid this ambiguity, we attach the prefix @code{_ada_} to such
names. So if we have a library level procedure such as:

@example
procedure Hello (S : String);
@end example

the external name of this procedure will be @code{_ada_hello}.

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

@node Building Executable Programs with GNAT,GNAT Utility Programs,The GNAT Compilation Model,Top
@anchor{gnat_ugn/building_executable_programs_with_gnat doc}@anchor{c4}@anchor{gnat_ugn/building_executable_programs_with_gnat building-executable-programs-with-gnat}@anchor{a}@anchor{gnat_ugn/building_executable_programs_with_gnat id1}@anchor{c5}
@chapter Building Executable Programs with GNAT


This chapter describes first the gnatmake tool
(@ref{c6,,Building with 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{c7,,Compiling with gcc}),
binder (gnatbind, see @ref{c8,,Binding with gnatbind}),
and linker (gnatlink, see @ref{c9,,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{70,,Using the GNU make Utility}).


@menu
* Building with gnatmake:: 
* Compiling with gcc:: 
* Compiler Switches:: 
* Linker Switches:: 
* Binding with gnatbind:: 
* Linking with gnatlink:: 
* Using the GNU make Utility:: 

@end menu

@node Building with gnatmake,Compiling with gcc,,Building Executable Programs with GNAT
@anchor{gnat_ugn/building_executable_programs_with_gnat building-with-gnatmake}@anchor{ca}@anchor{gnat_ugn/building_executable_programs_with_gnat the-gnat-make-program-gnatmake}@anchor{c6}
@section Building with @code{gnatmake}


@geindex gnatmake

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


@enumerate 

@item 
Edit some sources to fix bugs;

@item 
Add enhancements;

@item 
Compile all sources affected;

@item 
Rebind and relink; and

@item 
Test.
@end enumerate

@geindex 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, @code{use} clauses, generics and inlined
subprograms.

@code{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
@code{gnatmake}.

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

@menu
* Running gnatmake:: 
* Switches for gnatmake:: 
* Mode Switches for gnatmake:: 
* Notes on the Command Line:: 
* How gnatmake Works:: 
* Examples of gnatmake Usage:: 

@end menu

@node Running gnatmake,Switches for gnatmake,,Building with gnatmake
@anchor{gnat_ugn/building_executable_programs_with_gnat id2}@anchor{cb}@anchor{gnat_ugn/building_executable_programs_with_gnat running-gnatmake}@anchor{cc}
@subsection Running @code{gnatmake}


The usual form of the @code{gnatmake} command is

@example
$ gnatmake [<switches>] <file_name> [<file_names>] [<mode_switches>]
@end example

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

If you are using standard file extensions (@code{.adb} and
@code{.ads}), then the
extension may be omitted from the @code{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 @code{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
@code{gnatmake} was invoked and if it is not found, it will be search on
the source path of the compiler as described in
@ref{73,,Search Paths and the Run-Time Library (RTL)}.

All @code{gnatmake} output (except when you specify @code{-M}) is sent to
@code{stderr}. The output produced by the
@code{-M} switch is sent to @code{stdout}.

@node Switches for gnatmake,Mode Switches for gnatmake,Running gnatmake,Building with gnatmake
@anchor{gnat_ugn/building_executable_programs_with_gnat id3}@anchor{cd}@anchor{gnat_ugn/building_executable_programs_with_gnat switches-for-gnatmake}@anchor{ce}
@subsection Switches for @code{gnatmake}


You may specify any of the following switches to @code{gnatmake}:

@geindex --version (gnatmake)


@table @asis

@item @code{--version}

Display Copyright and version, then exit disregarding all other options.
@end table

@geindex --help (gnatmake)


@table @asis

@item @code{--help}

If @code{--version} was not used, display usage, then exit disregarding
all other options.
@end table

@geindex --GCC=compiler_name (gnatmake)


@table @asis

@item @code{--GCC=@emph{compiler_name}}

Program used for compiling. The default is @code{gcc}. You need to use
quotes around @code{compiler_name} if @code{compiler_name} contains
spaces or other separator characters.
As an example @code{--GCC="foo -x  -y"}
will instruct @code{gnatmake} to use @code{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 @code{-c} is always inserted after your command name. Thus in the
above example the compiler command that will be used by @code{gnatmake}
will be @code{foo -c -x -y}. If several @code{--GCC=compiler_name} are
used, only the last @code{compiler_name} is taken into account. However,
all the additional switches are also taken into account. Thus,
@code{--GCC="foo -x -y" --GCC="bar -z -t"} is equivalent to
@code{--GCC="bar -x -y -z -t"}.
@end table

@geindex --GNATBIND=binder_name (gnatmake)


@table @asis

@item @code{--GNATBIND=@emph{binder_name}}

Program used for binding. The default is @code{gnatbind}. You need to
use quotes around @code{binder_name} if @code{binder_name} contains spaces
or other separator characters.
As an example @code{--GNATBIND="bar -x  -y"}
will instruct @code{gnatmake} to use @code{bar -x -y} as your
binder. Binder switches that are normally appended by @code{gnatmake}
to @code{gnatbind} are now appended to the end of @code{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.
@end table

@geindex --GNATLINK=linker_name (gnatmake)


@table @asis

@item @code{--GNATLINK=@emph{linker_name}}

Program used for linking. The default is @code{gnatlink}. You need to
use quotes around @code{linker_name} if @code{linker_name} contains spaces
or other separator characters.
As an example @code{--GNATLINK="lan -x  -y"}
will instruct @code{gnatmake} to use @code{lan -x -y} as your
linker. Linker switches that are normally appended by @code{gnatmake} to
@code{gnatlink} are now appended to the end of @code{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.

@item @code{--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”.

@item @code{--create-map-file=@emph{mapfile}}

When linking an executable, create a map file with the specified name.
@end table

@geindex --create-missing-dirs (gnatmake)


@table @asis

@item @code{--create-missing-dirs}

When using project files (@code{-P@emph{project}}), automatically create
missing object directories, library directories and exec
directories.

@item @code{--single-compile-per-obj-dir}

Disallow simultaneous compilations in the same object directory when
project files are used.

@item @code{--subdirs=@emph{subdir}}

Actual object directory of each project file is the subdirectory subdir of the
object directory specified or defaulted in the project file.

@item @code{--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.

@item @code{--source-info=@emph{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. @code{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.
@end table

@geindex -a (gnatmake)


@table @asis

@item @code{-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,
@code{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 @code{-a} is also useful
in conjunction with @code{-f}
if you need to recompile an entire application,
including run-time files, using special configuration pragmas,
such as a @code{Normalize_Scalars} pragma.

By default
@code{gnatmake -a} compiles all GNAT
internal files with
@code{gcc -c -gnatpg} rather than @code{gcc -c}.
@end table

@geindex -b (gnatmake)


@table @asis

@item @code{-b}

Bind only. Can be combined with @code{-c} to do
compilation and binding, but no link.
Can be combined with @code{-l}
to do binding and linking. When not combined with
@code{-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 @code{file_name}
may be given without extension, with the source extension or, if no GNAT
Project File is specified, with the ALI file extension.
@end table

@geindex -c (gnatmake)


@table @asis

@item @code{-c}

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

@geindex -C (gnatmake)


@table @asis

@item @code{-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
@code{-P} is used, a mapping file is always used, so
@code{-C} is unnecessary; in this case the mapping file
is initially populated based on the project file. If
@code{-C} is used without
@code{-P},
the mapping file is initially empty. Each invocation of the compiler
will add any newly accessed sources to the mapping file.
@end table

@geindex -C= (gnatmake)


@table @asis

@item @code{-C=@emph{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).
@end table

@geindex -d (gnatmake)


@table @asis

@item @code{-d}

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

@example
completed x out of y (zz%)
@end example

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.
@end table

@geindex -D (gnatmake)


@table @asis

@item @code{-D @emph{dir}}

Put all object files and ALI file in directory @code{dir}.
If the @code{-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.
@end table

@geindex -eI (gnatmake)


@table @asis

@item @code{-eI@emph{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 @code{gnatmake} is
invoked for several mains.
@end table

@geindex -eL (gnatmake)

@geindex symbolic links


@table @asis

@item @code{-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.

@geindex 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.
@end table

@geindex -eS (gnatmake)


@table @asis

@item @code{-eS}

Output the commands for the compiler, the binder and the linker
on standard output,
instead of standard error.
@end table

@geindex -f (gnatmake)


@table @asis

@item @code{-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 @code{-a} switch is also specified.
@end table

@geindex -F (gnatmake)


@table @asis

@item @code{-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.
@end table

@geindex -g (gnatmake)


@table @asis

@item @code{-g}

Enable debugging. This switch is simply passed to the compiler and to the
linker.
@end table

@geindex -i (gnatmake)


@table @asis

@item @code{-i}

In normal mode, @code{gnatmake} compiles all object files and ALI files
into the current directory. If the @code{-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 @code{gnatmake} will automatically
maintain and update this organization. If no ALI files are found on the
Ada object path (see @ref{73,,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, @code{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.
@end table

@geindex -j (gnatmake)

@geindex Parallel make


@table @asis

@item @code{-j@emph{n}}

Use @code{n} processes to carry out the (re)compilations. On a multiprocessor
machine compilations will occur in parallel. If @code{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 @code{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.
@end table

@geindex -k (gnatmake)


@table @asis

@item @code{-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 @code{gnatmake}
terminates.

If @code{gnatmake} is invoked with several @code{file_names} and with this
switch, if there are compilation errors when building an executable,
@code{gnatmake} will not attempt to build the following executables.
@end table

@geindex -l (gnatmake)


@table @asis

@item @code{-l}

Link only. Can be combined with @code{-b} to binding
and linking. Linking will not be performed if combined with
@code{-c}
but not with @code{-b}.
When not combined with @code{-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 @code{file_name}
may be given without extension, with the source extension or, if no GNAT
Project File is specified, with the ALI file extension.
@end table

@geindex -m (gnatmake)


@table @asis

@item @code{-m}

Specify that the minimum necessary amount of recompilations
be performed. In this mode @code{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 @code{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 @code{-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.
@end table

@geindex Dependencies
@geindex producing list

@geindex -M (gnatmake)


@table @asis

@item @code{-M}

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

@geindex -n (gnatmake)


@table @asis

@item @code{-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.
@end table

@geindex -o (gnatmake)


@table @asis

@item @code{-o @emph{exec_name}}

Output executable name. The name of the final executable program will be
@code{exec_name}. If the @code{-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 @code{gnatmake} with several
@code{file_names}.
@end table

@geindex -p (gnatmake)


@table @asis

@item @code{-p}

Same as @code{--create-missing-dirs}
@end table

@geindex -P (gnatmake)


@table @asis

@item @code{-P@emph{project}}

Use project file @code{project}. Only one such switch can be used.
@end table

@c -- Comment:
@c :ref:`gnatmake_and_Project_Files`.

@geindex -q (gnatmake)


@table @asis

@item @code{-q}

Quiet. When this flag is not set, the commands carried out by
@code{gnatmake} are displayed.
@end table

@geindex -s (gnatmake)


@table @asis

@item @code{-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,
@code{-O -O2} is different than @code{-O2 -O}, but @code{-g -O}
is equivalent to @code{-O -g}.

This switch is recommended when Integrated Preprocessing is used.
@end table

@geindex -u (gnatmake)


@table @asis

@item @code{-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.
@end table

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

@geindex -U (gnatmake)


@table @asis

@item @code{-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.
@end table

@geindex -v (gnatmake)


@table @asis

@item @code{-v}

Verbose. Display the reason for all recompilations @code{gnatmake}
decides are necessary, with the highest verbosity level.
@end table

@geindex -vl (gnatmake)


@table @asis

@item @code{-vl}

Verbosity level Low. Display fewer lines than in verbosity Medium.
@end table

@geindex -vm (gnatmake)


@table @asis

@item @code{-vm}

Verbosity level Medium. Potentially display fewer lines than in verbosity High.
@end table

@geindex -vm (gnatmake)


@table @asis

@item @code{-vh}

Verbosity level High. Equivalent to -v.

@item @code{-vP@emph{x}}

Indicate the verbosity of the parsing of GNAT project files.
See @ref{cf,,Switches Related to Project Files}.
@end table

@geindex -x (gnatmake)


@table @asis

@item @code{-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
@code{-x} is used, mains specified on the
command line need to be sources of a project file.

@item @code{-X@emph{name}=@emph{value}}

Indicate that external variable @code{name} has the value @code{value}.
The Project Manager will use this value for occurrences of
@code{external(name)} when parsing the project file.
@ref{cf,,Switches Related to Project Files}.
@end table

@geindex -z (gnatmake)


@table @asis

@item @code{-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.
@end table

@subsubheading GCC switches


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

@subsubheading Source and library search path switches


@geindex -aI (gnatmake)


@table @asis

@item @code{-aI@emph{dir}}

When looking for source files also look in directory @code{dir}.
The order in which source files search is undertaken is
described in @ref{73,,Search Paths and the Run-Time Library (RTL)}.
@end table

@geindex -aL (gnatmake)


@table @asis

@item @code{-aL@emph{dir}}

Consider @code{dir} as being an externally provided Ada library.
Instructs @code{gnatmake} to skip compilation units whose @code{.ALI}
files have been located in directory @code{dir}. This allows you to have
missing bodies for the units in @code{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
@code{-aI@emph{dir}}  or @code{-I@emph{dir}}.
Note: this switch is provided for compatibility with previous versions
of @code{gnatmake}. The easier method of causing standard libraries
to be excluded from consideration is to write-protect the corresponding
ALI files.
@end table

@geindex -aO (gnatmake)


@table @asis

@item @code{-aO@emph{dir}}

When searching for library and object files, look in directory
@code{dir}. The order in which library files are searched is described in
@ref{76,,Search Paths for gnatbind}.
@end table

@geindex Search paths
@geindex for gnatmake

@geindex -A (gnatmake)


@table @asis

@item @code{-A@emph{dir}}

Equivalent to @code{-aL@emph{dir}} @code{-aI@emph{dir}}.

@geindex -I (gnatmake)

@item @code{-I@emph{dir}}

Equivalent to @code{-aO@emph{dir} -aI@emph{dir}}.
@end table

@geindex -I- (gnatmake)

@geindex Source files
@geindex suppressing search


@table @asis

@item @code{-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 @code{gnatmake} was invoked.
@end table

@geindex -L (gnatmake)

@geindex Linker libraries


@table @asis

@item @code{-L@emph{dir}}

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

@geindex -nostdinc (gnatmake)


@table @asis

@item @code{-nostdinc}

Do not look for source files in the system default directory.
@end table

@geindex -nostdlib (gnatmake)


@table @asis

@item @code{-nostdlib}

Do not look for library files in the system default directory.
@end table

@geindex --RTS (gnatmake)


@table @asis

@item @code{--RTS=@emph{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
(@code{adainclude} or @code{ada_source_path}, and @code{adalib} or
@code{ada_object_path} present):


@itemize *

@item 
@emph{<current directory>/$rts_path}

@item 
@emph{<default-search-dir>/$rts_path}

@item 
@emph{<default-search-dir>/rts-$rts_path}

@item 
The selected path is handled like a normal RTS path.
@end itemize
@end table

@node Mode Switches for gnatmake,Notes on the Command Line,Switches for gnatmake,Building with gnatmake
@anchor{gnat_ugn/building_executable_programs_with_gnat id4}@anchor{d0}@anchor{gnat_ugn/building_executable_programs_with_gnat mode-switches-for-gnatmake}@anchor{d1}
@subsection Mode Switches for @code{gnatmake}


The mode switches (referred to as @code{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.

@geindex -cargs (gnatmake)


@table @asis

@item @code{-cargs @emph{switches}}

Compiler switches. Here @code{switches} is a list of switches
that are valid switches for @code{gcc}. They will be passed on to
all compile steps performed by @code{gnatmake}.
@end table

@geindex -bargs (gnatmake)


@table @asis

@item @code{-bargs @emph{switches}}

Binder switches. Here @code{switches} is a list of switches
that are valid switches for @code{gnatbind}. They will be passed on to
all bind steps performed by @code{gnatmake}.
@end table

@geindex -largs (gnatmake)


@table @asis

@item @code{-largs @emph{switches}}

Linker switches. Here @code{switches} is a list of switches
that are valid switches for @code{gnatlink}. They will be passed on to
all link steps performed by @code{gnatmake}.
@end table

@geindex -margs (gnatmake)


@table @asis

@item @code{-margs @emph{switches}}

Make switches. The switches are directly interpreted by @code{gnatmake},
regardless of any previous occurrence of @code{-cargs}, @code{-bargs}
or @code{-largs}.
@end table

@node Notes on the Command Line,How gnatmake Works,Mode Switches for gnatmake,Building with gnatmake
@anchor{gnat_ugn/building_executable_programs_with_gnat id5}@anchor{d2}@anchor{gnat_ugn/building_executable_programs_with_gnat notes-on-the-command-line}@anchor{d3}
@subsection Notes on the Command Line


This section contains some additional useful notes on the operation
of the @code{gnatmake} command.

@geindex Recompilation (by gnatmake)


@itemize *

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

@item 
If you enter @code{gnatmake foo.adb}, where @code{foo}
is a subunit or body of a generic unit, @code{gnatmake} recompiles
@code{foo.adb} (because it finds no ALI) and stops, issuing a
warning.

@item 
In @code{gnatmake} the switch @code{-I}
is used to specify both source and
library file paths. Use @code{-aI}
instead if you just want to specify
source paths only and @code{-aO}
if you want to specify library paths
only.

@item 
@code{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
@code{-f} switch will not recompile these files
unless @code{-a} is also specified.

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

@example
$ gnatmake -aI`include-dir`  -aL`obj-dir`  main
@end example

@item 
Using @code{gnatmake} along with the @code{-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.
@end itemize

@node How gnatmake Works,Examples of gnatmake Usage,Notes on the Command Line,Building with gnatmake
@anchor{gnat_ugn/building_executable_programs_with_gnat how-gnatmake-works}@anchor{d4}@anchor{gnat_ugn/building_executable_programs_with_gnat id6}@anchor{d5}
@subsection How @code{gnatmake} Works


Generally @code{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 @code{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 @emph{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.

@code{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,
@code{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 @code{gnatmake} recursively applies the above procedure on all these
files.

This process ensures that @code{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
@code{gnatmake} will recompute a correct set of new dependencies if
necessary.

When invoking @code{gnatmake} with several @code{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{1c,,Using Other File Names}), changing through a configuration pragmas
file the version of a source and invoking @code{gnatmake} to recompile may
have no effect, if the previous version of the source is still accessible
by @code{gnatmake}. It may be necessary to use the switch
-f.

@node Examples of gnatmake Usage,,How gnatmake Works,Building with gnatmake
@anchor{gnat_ugn/building_executable_programs_with_gnat examples-of-gnatmake-usage}@anchor{d6}@anchor{gnat_ugn/building_executable_programs_with_gnat id7}@anchor{d7}
@subsection Examples of @code{gnatmake} Usage



@table @asis

@item @emph{gnatmake hello.adb}

Compile all files necessary to bind and link the main program
@code{hello.adb} (containing unit @code{Hello}) and bind and link the
resulting object files to generate an executable file @code{hello}.

@item @emph{gnatmake main1 main2 main3}

Compile all files necessary to bind and link the main programs
@code{main1.adb} (containing unit @code{Main1}), @code{main2.adb}
(containing unit @code{Main2}) and @code{main3.adb}
(containing unit @code{Main3}) and bind and link the resulting object files
to generate three executable files @code{main1},
@code{main2}  and @code{main3}.

@item @emph{gnatmake -q Main_Unit -cargs -O2 -bargs -l}

Compile all files necessary to bind and link the main program unit
@code{Main_Unit} (from file @code{main_unit.adb}). All compilations will
be done with optimization level 2 and the order of elaboration will be
listed by the binder. @code{gnatmake} will operate in quiet mode, not
displaying commands it is executing.
@end table

@node Compiling with gcc,Compiler Switches,Building with gnatmake,Building Executable Programs with GNAT
@anchor{gnat_ugn/building_executable_programs_with_gnat compiling-with-gcc}@anchor{c7}@anchor{gnat_ugn/building_executable_programs_with_gnat id8}@anchor{d8}
@section Compiling with @code{gcc}


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

@menu
* Compiling Programs:: 
* Search Paths and the Run-Time Library (RTL): Search Paths and the Run-Time Library RTL. 
* Order of Compilation Issues:: 
* Examples:: 

@end menu

@node Compiling Programs,Search Paths and the Run-Time Library RTL,,Compiling with gcc
@anchor{gnat_ugn/building_executable_programs_with_gnat compiling-programs}@anchor{d9}@anchor{gnat_ugn/building_executable_programs_with_gnat id9}@anchor{da}
@subsection Compiling Programs


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


@itemize *

@item 
the body file (@code{.adb}) for a library level subprogram or generic
subprogram

@item 
the spec file (@code{.ads}) for a library level package or generic
package that has no body

@item 
the body file (@code{.adb}) for a library level package
or generic package that has a body
@end itemize

You need @emph{not} compile the following files


@itemize *

@item 
the spec of a library unit which has a body

@item 
subunits
@end itemize

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.

@geindex cannot generate code

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

@quotation

@example
cannot generate code for file `@w{`}fff`@w{`} (package spec)
to check package spec, use -gnatc

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

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

cannot generate code for file `@w{`}fff`@w{`} (subunit)
to check subunit, use -gnatc
@end example
@end quotation

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 @code{-gnatc} switch.

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

@example
$ gcc -c [switches] <file name>
@end example

where @code{file name} is the name of the Ada file (usually
having an extension @code{.ads} for a spec or @code{.adb} for a body).
You specify the
@code{-c} switch to tell @code{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 @code{.o} and an Ada
Library Information (ALI) file, which also has the same name as the
source file, but with @code{.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 @code{--foobar@emph{NN}} switch

@geindex gnat1

@code{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 @code{cc1}, and the Ada compiler is @code{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 @code{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 @code{gcc}
command. This causes @code{gcc} to call the appropriate compiler for
each file. For example, the following command lists two separate
files to be compiled:

@example
$ gcc -c x.adb y.adb
@end example

calls @code{gnat1} (the Ada compiler) twice to compile @code{x.adb} and
@code{y.adb}.
The compiler generates two object files @code{x.o} and @code{y.o}
and the two ALI files @code{x.ali} and @code{y.ali}.

Any switches apply to all the files listed, see @ref{db,,Compiler Switches} for a
list of available @code{gcc} switches.

@node Search Paths and the Run-Time Library RTL,Order of Compilation Issues,Compiling Programs,Compiling with gcc
@anchor{gnat_ugn/building_executable_programs_with_gnat id10}@anchor{dc}@anchor{gnat_ugn/building_executable_programs_with_gnat search-paths-and-the-run-time-library-rtl}@anchor{73}
@subsection 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:


@itemize *

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

@item 
Each directory named by an @code{-I} switch given on the @code{gcc}
command line, in the order given.

@geindex ADA_PRJ_INCLUDE_FILE

@item 
Each of the directories listed in the text file whose name is given
by the 
@geindex ADA_PRJ_INCLUDE_FILE
@geindex environment variable; ADA_PRJ_INCLUDE_FILE
@code{ADA_PRJ_INCLUDE_FILE} environment variable.
@geindex ADA_PRJ_INCLUDE_FILE
@geindex environment variable; ADA_PRJ_INCLUDE_FILE
@code{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.

@geindex ADA_INCLUDE_PATH

@item 
Each of the directories listed in the value of the
@geindex ADA_INCLUDE_PATH
@geindex environment variable; ADA_INCLUDE_PATH
@code{ADA_INCLUDE_PATH} environment variable.
Construct this value
exactly as the 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} environment variable: a list of directory
names separated by colons (semicolons when working with the NT version).

@item 
The content of the @code{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{72,,Installing a library}
@end itemize

Specifying the switch @code{-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 @code{-I} switch.

Specifying the switch @code{-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 @code{-o} switch;
however, @code{gcc} and @code{gnat1} have not been coordinated on this
so the @code{ALI} file will not go to the right place. Therefore, you should
avoid using the @code{-o} switch.

@geindex System.IO

The packages @code{Ada}, @code{System}, and @code{Interfaces} and their
children make up the GNAT RTL, together with the simple @code{System.IO}
package used in the @code{"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 (@code{System}, @code{Ada} and
@code{Interfaces}), the GNAT distribution provides a fourth hierarchy,
consisting of child units of @code{GNAT}. This is a collection of generally
useful types, subprograms, etc. See the @cite{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.

@node Order of Compilation Issues,Examples,Search Paths and the Run-Time Library RTL,Compiling with gcc
@anchor{gnat_ugn/building_executable_programs_with_gnat id11}@anchor{dd}@anchor{gnat_ugn/building_executable_programs_with_gnat order-of-compilation-issues}@anchor{de}
@subsection Order of Compilation Issues


If, in our earlier example, there was a spec for the @code{hello}
procedure, it would be contained in the file @code{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:


@itemize *

@item 
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.

@item 
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.

@item 
There is no library as such, apart from the ALI files
(@ref{28,,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.

@item 
When you compile a unit, the source files for the specs of all units
that it @emph{with}s, 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.
@end itemize

@node Examples,,Order of Compilation Issues,Compiling with gcc
@anchor{gnat_ugn/building_executable_programs_with_gnat examples}@anchor{df}@anchor{gnat_ugn/building_executable_programs_with_gnat id12}@anchor{e0}
@subsection Examples


The following are some typical Ada compilation command line examples:

@example
$ gcc -c xyz.adb
@end example

Compile body in file @code{xyz.adb} with all default options.

@example
$ gcc -c -O2 -gnata xyz-def.adb
@end example

Compile the child unit package in file @code{xyz-def.adb} with extensive
optimizations, and pragma @code{Assert}/@cite{Debug} statements
enabled.

@example
$ gcc -c -gnatc abc-def.adb
@end example

Compile the subunit in file @code{abc-def.adb} in semantic-checking-only
mode.

@node Compiler Switches,Linker Switches,Compiling with gcc,Building Executable Programs with GNAT
@anchor{gnat_ugn/building_executable_programs_with_gnat compiler-switches}@anchor{e1}@anchor{gnat_ugn/building_executable_programs_with_gnat switches-for-gcc}@anchor{db}
@section Compiler Switches


The @code{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.

@menu
* Alphabetical List of All Switches:: 
* Output and Error Message Control:: 
* Warning Message Control:: 
* Debugging and Assertion Control:: 
* Validity Checking:: 
* Style Checking:: 
* Run-Time Checks:: 
* Using gcc for Syntax Checking:: 
* Using gcc for Semantic Checking:: 
* Compiling Different Versions of Ada:: 
* Character Set Control:: 
* File Naming Control:: 
* Subprogram Inlining Control:: 
* Auxiliary Output Control:: 
* Debugging Control:: 
* Exception Handling Control:: 
* Units to Sources Mapping Files:: 
* Code Generation Control:: 

@end menu

@node Alphabetical List of All Switches,Output and Error Message Control,,Compiler Switches
@anchor{gnat_ugn/building_executable_programs_with_gnat alphabetical-list-of-all-switches}@anchor{e2}@anchor{gnat_ugn/building_executable_programs_with_gnat id13}@anchor{e3}
@subsection Alphabetical List of All Switches


@geindex -b (gcc)


@table @asis

@item @code{-b @emph{target}}

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

@geindex -B (gcc)


@table @asis

@item @code{-B@emph{dir}}

Load compiler executables (for example, @code{gnat1}, the Ada compiler)
from @code{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
@cite{Using the GNU Compiler Collection (GCC)} manual for further details.
You would normally use the @code{-b} or @code{-V} switch instead.
@end table

@geindex -c (gcc)


@table @asis

@item @code{-c}

Compile. Always use this switch when compiling Ada programs.

Note: for some other languages when using @code{gcc}, notably in
the case of C and C++, it is possible to use
use @code{gcc} without a @code{-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 @code{gcc} cannot be used to run the GNAT binder.
@end table

@geindex -fcallgraph-info (gcc)


@table @asis

@item @code{-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
@code{su} marker is specified, the callgraph is decorated with stack usage
information; it is equivalent to @code{-fstack-usage}. When the @code{da}
marker is specified, the callgraph is decorated with information about
dynamically allocated objects.
@end table

@geindex -fdiagnostics-format (gcc)


@table @asis

@item @code{-fdiagnostics-format=json}

Makes GNAT emit warning and error messages as JSON. Inhibits printing of
text warning and errors messages except if @code{-gnatv} or
@code{-gnatl} are present.
@end table

@geindex -fdump-scos (gcc)


@table @asis

@item @code{-fdump-scos}

Generates SCO (Source Coverage Obligation) information in the ALI file.
This information is used by advanced coverage tools. See unit @code{SCOs}
in the compiler sources for details in files @code{scos.ads} and
@code{scos.adb}.
@end table

@geindex -fgnat-encodings (gcc)


@table @asis

@item @code{-fgnat-encodings=[all|gdb|minimal]}

This switch controls the balance between GNAT encodings and standard DWARF
emitted in the debug information.
@end table

@geindex -flto (gcc)


@table @asis

@item @code{-flto[=@emph{n}]}

Enables Link Time Optimization. This switch must be used in conjunction
with the @code{-Ox} switches (but not with the @code{-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 @code{-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 @code{-Ox} switches, must be
specified both for the compilation and the link phases.
If the @code{n} parameter is specified, the optimization and final code
generation at link time are executed using @code{n} parallel jobs by
means of an installed @code{make} program.
@end table

@geindex -fno-inline (gcc)


@table @asis

@item @code{-fno-inline}

Suppresses all inlining, unless requested with pragma @code{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 @code{No_Inline}.
@end table

@geindex -fno-inline-functions (gcc)


@table @asis

@item @code{-fno-inline-functions}

Suppresses automatic inlining of subprograms, which is enabled
if @code{-O3} is used.
@end table

@geindex -fno-inline-small-functions (gcc)


@table @asis

@item @code{-fno-inline-small-functions}

Suppresses automatic inlining of small subprograms, which is enabled
if @code{-O2} is used.
@end table

@geindex -fno-inline-functions-called-once (gcc)


@table @asis

@item @code{-fno-inline-functions-called-once}

Suppresses inlining of subprograms local to the unit and called once
from within it, which is enabled if @code{-O1} is used.
@end table

@geindex -fno-ivopts (gcc)


@table @asis

@item @code{-fno-ivopts}

Suppresses high-level loop induction variable optimizations, which are
enabled if @code{-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.
@end table

@geindex -fno-strict-aliasing (gcc)


@table @asis

@item @code{-fno-strict-aliasing}

Causes the compiler to avoid assumptions regarding non-aliasing
of objects of different types. See
@ref{e4,,Optimization and Strict Aliasing} for details.
@end table

@geindex -fno-strict-overflow (gcc)


@table @asis

@item @code{-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 @code{-gnato0}
for very peculiar cases of low-level programming.
@end table

@geindex -fstack-check (gcc)


@table @asis

@item @code{-fstack-check}

Activates stack checking.
See @ref{e5,,Stack Overflow Checking} for details.
@end table

@geindex -fstack-usage (gcc)


@table @asis

@item @code{-fstack-usage}

Makes the compiler output stack usage information for the program, on a
per-subprogram basis. See @ref{e6,,Static Stack Usage Analysis} for details.
@end table

@geindex -g (gcc)


@table @asis

@item @code{-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
@code{-g} switch if you plan on using the debugger.
@end table

@geindex -gnat05 (gcc)


@table @asis

@item @code{-gnat05}

Allow full Ada 2005 features.
@end table

@geindex -gnat12 (gcc)


@table @asis

@item @code{-gnat12}

Allow full Ada 2012 features.
@end table

@geindex -gnat83 (gcc)

@geindex -gnat2005 (gcc)


@table @asis

@item @code{-gnat2005}

Allow full Ada 2005 features (same as @code{-gnat05})
@end table

@geindex -gnat2012 (gcc)


@table @asis

@item @code{-gnat2012}

Allow full Ada 2012 features (same as @code{-gnat12})
@end table

@geindex -gnat2022 (gcc)


@table @asis

@item @code{-gnat2022}

Allow full Ada 2022 features

@item @code{-gnat83}

Enforce Ada 83 restrictions.
@end table

@geindex -gnat95 (gcc)


@table @asis

@item @code{-gnat95}

Enforce Ada 95 restrictions.

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

@code{-gnatd.D} instructs GNAT to consider @code{overriding} as a keyword
and handle its associated semantic checks, even in Ada 95 mode.
@end table

@geindex -gnata (gcc)


@table @asis

@item @code{-gnata}

Assertions enabled. @code{Pragma Assert} and @code{pragma Debug} to be
activated. Note that these pragmas can also be controlled using the
configuration pragmas @code{Assertion_Policy} and @code{Debug_Policy}.
It also activates pragmas @code{Check}, @code{Precondition}, and
@code{Postcondition}. Note that these pragmas can also be controlled
using the configuration pragma @code{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.
@end table

@geindex -gnatA (gcc)


@table @asis

@item @code{-gnatA}

Avoid processing @code{gnat.adc}. If a @code{gnat.adc} file is present,
it will be ignored.
@end table

@geindex -gnatb (gcc)


@table @asis

@item @code{-gnatb}

Generate brief messages to @code{stderr} even if verbose mode set.
@end table

@geindex -gnatB (gcc)


@table @asis

@item @code{-gnatB}

Assume no invalid (bad) values except for ‘Valid attribute use
(@ref{e7,,Validity Checking}).
@end table

@geindex -gnatc (gcc)


@table @asis

@item @code{-gnatc}

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

@geindex -gnatC (gcc)


@table @asis

@item @code{-gnatC}

Generate CodePeer intermediate format (no code generation attempted).
This switch will generate an intermediate representation suitable for
use by CodePeer (@code{.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).
@end table

@geindex -gnatd (gcc)


@table @asis

@item @code{-gnatd}

Specify debug options for the compiler. The string of characters after
the @code{-gnatd} specifies the specific debug options. The possible
characters are 0-9, a-z, A-Z, optionally preceded by a dot or underscore.
See compiler source file @code{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.
@end table

@geindex -gnatD[nn] (gcc)


@table @asis

@item @code{-gnatD}

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

@geindex -gnateA (gcc)


@table @asis

@item @code{-gnateA}

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

@example
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));
@end example

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

@geindex -gnateb (gcc)


@table @asis

@item @code{-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.
@end table

@geindex -gnatec (gcc)


@table @asis

@item @code{-gnatec=@emph{path}}

Specify a configuration pragma file
(the equal sign is optional)
(@ref{63,,The Configuration Pragmas Files}).
@end table

@geindex -gnateC (gcc)


@table @asis

@item @code{-gnateC}

Generate CodePeer messages in a compiler-like format. This switch is only
effective if @code{-gnatcC} is also specified and requires an installation
of CodePeer.
@end table

@geindex -gnated (gcc)


@table @asis

@item @code{-gnated}

Disable atomic synchronization
@end table

@geindex -gnateD (gcc)


@table @asis

@item @code{-gnateDsymbol[=@emph{value}]}

Defines a symbol, associated with @code{value}, for preprocessing.
(@ref{90,,Integrated Preprocessing}).
@end table

@geindex -gnateE (gcc)


@table @asis

@item @code{-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.
@end table

@geindex -gnatef (gcc)


@table @asis

@item @code{-gnatef}

Display full source path name in brief error messages.
@end table

@geindex -gnateF (gcc)


@table @asis

@item @code{-gnateF}

Check for overflow on all floating-point operations, including those
for unconstrained predefined types. See description of pragma
@code{Check_Float_Overflow} in GNAT RM.
@end table

@geindex -gnateg (gcc)

@code{-gnateg}
@code{-gnatceg}

@quotation

The @code{-gnatc} switch must always be specified before this switch, e.g.
@code{-gnatceg}. Generate a C header from the Ada input file. See
@ref{b7,,Generating C Headers for Ada Specifications} for more
information.
@end quotation

@geindex -gnateG (gcc)


@table @asis

@item @code{-gnateG}

Save result of preprocessing in a text file.
@end table

@geindex -gnatei (gcc)


@table @asis

@item @code{-gnatei@emph{nnn}}

Set maximum number of instantiations during compilation of a single unit to
@code{nnn}. This may be useful in increasing the default maximum of 8000 for
the rare case when a single unit legitimately exceeds this limit.
@end table

@geindex -gnateI (gcc)


@table @asis

@item @code{-gnateI@emph{nnn}}

Indicates that the source is a multi-unit source and that the index of the
unit to compile is @code{nnn}. @code{nnn} needs to be a positive number and need
to be a valid index in the multi-unit source.
@end table

@geindex -gnatel (gcc)


@table @asis

@item @code{-gnatel}

This switch can be used with the static elaboration model to issue info
messages showing
where implicit @code{pragma Elaborate} and @code{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.
@end table

@geindex -gnatel (gcc)


@table @asis

@item @code{-gnateL}

This switch turns off the info messages about implicit elaboration pragmas.
@end table

@geindex -gnatem (gcc)


@table @asis

@item @code{-gnatem=@emph{path}}

Specify a mapping file
(the equal sign is optional)
(@ref{e8,,Units to Sources Mapping Files}).
@end table

@geindex -gnatep (gcc)


@table @asis

@item @code{-gnatep=@emph{file}}

Specify a preprocessing data file
(the equal sign is optional)
(@ref{90,,Integrated Preprocessing}).
@end table

@geindex -gnateP (gcc)


@table @asis

@item @code{-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.
@end table

@geindex -gnateS (gcc)


@table @asis

@item @code{-gnateS}

Synonym of @code{-fdump-scos}, kept for backwards compatibility.
@end table

@geindex -gnatet=file (gcc)


@table @asis

@item @code{-gnatet=@emph{path}}

Generate target dependent information. The format of the output file is
described in the section about switch @code{-gnateT}.
@end table

@geindex -gnateT (gcc)


@table @asis

@item @code{-gnateT=@emph{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 @code{Nat} denotes a natural integer value, @code{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:

@example
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?
@end example

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

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

@code{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.

@code{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.

@code{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 @code{BIGGEST_ALIGNMENT
/ BITS_PER_UNIT} where GCC macro @code{BIGGEST_ALIGNMENT} is documented as
follows: @cite{Biggest alignment that any data type can require on this machine@comma{} in bits.}

@code{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).

@code{Strict_Alignment} is the equivalent of GCC macro @code{STRICT_ALIGNMENT}
documented as follows: @cite{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@comma{} define this macro as 0.}

@code{System_Allocator_Alignment} is the guaranteed alignment of data returned
by calls to @code{malloc}.

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

@example
name  value
@end example

where @code{name} is the name of the parameter, spelled out in full,
and cased as in the above list, and @code{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:

@example
name  digs float_rep size alignment
@end example

where @code{name} is the string name of the type (which can have
single spaces embedded in the name (e.g. long double), @code{digs} is
the number of digits for the floating-point type, @code{float_rep} is
the float representation (I for IEEE-754-Binary, which is
the only one supported at this time),
@code{size} is the size in bits, @code{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:

@example
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
@end example
@end table

@geindex -gnateu (gcc)


@table @asis

@item @code{-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.
@end table

@geindex -gnateV (gcc)


@table @asis

@item @code{-gnateV}

Check that all actual parameters of a subprogram call are valid according to
the rules of validity checking (@ref{e7,,Validity Checking}).
@end table

@geindex -gnateY (gcc)


@table @asis

@item @code{-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.
@end table

@geindex -gnatE (gcc)


@table @asis

@item @code{-gnatE}

Dynamic elaboration checking mode enabled. For further details see
@ref{f,,Elaboration Order Handling in GNAT}.
@end table

@geindex -gnatf (gcc)


@table @asis

@item @code{-gnatf}

Full errors. Multiple errors per line, all undefined references, do not
attempt to suppress cascaded errors.
@end table

@geindex -gnatF (gcc)


@table @asis

@item @code{-gnatF}

Externals names are folded to all uppercase.
@end table

@geindex -gnatg (gcc)


@table @asis

@item @code{-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 @code{-gnatg}
implies @code{-gnatw.ge} and @code{-gnatyg} so that all standard
warnings and all standard style options are turned on. All warnings and style
messages are treated as errors.
@end table

@geindex -gnatG[nn] (gcc)


@table @asis

@item @code{-gnatG=nn}

List generated expanded code in source form.
@end table

@geindex -gnath (gcc)


@table @asis

@item @code{-gnath}

Output usage information. The output is written to @code{stdout}.
@end table

@geindex -gnatH (gcc)


@table @asis

@item @code{-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{f,,Elaboration Order Handling in GNAT}.
@end table

@geindex -gnati (gcc)


@table @asis

@item @code{-gnati@emph{c}}

Identifier character set (@code{c} = 1/2/3/4/5/9/p/8/f/n/w).
For details of the possible selections for @code{c},
see @ref{31,,Character Set Control}.
@end table

@geindex -gnatI (gcc)


@table @asis

@item @code{-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.
@end table

@geindex -gnatjnn (gcc)


@table @asis

@item @code{-gnatj@emph{nn}}

Reformat error messages to fit on @code{nn} character lines
@end table

@geindex -gnatJ (gcc)


@table @asis

@item @code{-gnatJ}

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


@itemize -

@item 
Accept statements

@item 
Activations of tasks defined in instances

@item 
Assertion pragmas

@item 
Calls from within an instance to its enclosing context

@item 
Calls through generic formal parameters

@item 
Calls to subprograms defined in instances

@item 
Entry calls

@item 
Indirect calls using ‘Access

@item 
Requeue statements

@item 
Select statements

@item 
Synchronous task suspension
@end itemize

and does not emit compile-time diagnostics or run-time checks. For further
details see @ref{f,,Elaboration Order Handling in GNAT}.
@end table

@geindex -gnatk (gcc)


@table @asis

@item @code{-gnatk=@emph{n}}

Limit file names to @code{n} (1-999) characters (@code{k} = krunch).
@end table

@geindex -gnatl (gcc)


@table @asis

@item @code{-gnatl}

Output full source listing with embedded error messages.
@end table

@geindex -gnatL (gcc)


@table @asis

@item @code{-gnatL}

Used in conjunction with -gnatG or -gnatD to intersperse original
source lines (as comment lines with line numbers) in the expanded
source output.
@end table

@geindex -gnatm (gcc)


@table @asis

@item @code{-gnatm=@emph{n}}

Limit number of detected error or warning messages to @code{n}
where @code{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.
@end table

@geindex -gnatn (gcc)


@table @asis

@item @code{-gnatn[12]}

Activate inlining across units for subprograms for which pragma @code{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.
@end table

@geindex -gnatN (gcc)


@table @asis

@item @code{-gnatN}

Activate front end inlining for subprograms for which
pragma @code{Inline} is specified. This inlining is performed
by the front end and will be visible in the
@code{-gnatG} output.

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

@geindex -gnato0 (gcc)


@table @asis

@item @code{-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
@code{pragma Suppress (Overflow_Check)} in a configuration pragma file.
@end table

@geindex -gnato?? (gcc)


@table @asis

@item @code{-gnato??}

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


@multitable {xxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

Digit

@tab

Interpretation

@item

@emph{1}

@tab

All intermediate overflows checked against base type (@code{STRICT})

@item

@emph{2}

@tab

Minimize intermediate overflows (@code{MINIMIZED})

@item

@emph{3}

@tab

Eliminate intermediate overflows (@code{ELIMINATED})

@end multitable


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 @code{-gnato}, then it is equivalent to
@code{-gnato11},
causing all intermediate overflows to be handled in strict
mode.

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

The default if no option @code{-gnato} is given is that overflow handling
is in @code{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{e9,,Specifying the Desired Mode}.
@end table

@geindex -gnatp (gcc)


@table @asis

@item @code{-gnatp}

Suppress all checks. See @ref{ea,,Run-Time Checks} for details. This switch
has no effect if cancelled by a subsequent @code{-gnat-p} switch.
@end table

@geindex -gnat-p (gcc)


@table @asis

@item @code{-gnat-p}

Cancel effect of previous @code{-gnatp} switch.
@end table

@geindex -gnatq (gcc)


@table @asis

@item @code{-gnatq}

Don’t quit. Try semantics, even if parse errors.
@end table

@geindex -gnatQ (gcc)


@table @asis

@item @code{-gnatQ}

Don’t quit. Generate @code{ALI} and tree files even if illegalities.
Note that code generation is still suppressed in the presence of any
errors, so even with @code{-gnatQ} no object file is generated.
@end table

@geindex -gnatr (gcc)


@table @asis

@item @code{-gnatr}

Treat pragma Restrictions as Restriction_Warnings.
@end table

@geindex -gnatR (gcc)


@table @asis

@item @code{-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
@code{-gnatD} switch has been given, since these two switches
are not compatible.
@end table

@geindex -gnats (gcc)


@table @asis

@item @code{-gnats}

Syntax check only.
@end table

@geindex -gnatS (gcc)


@table @asis

@item @code{-gnatS}

Print package Standard.
@end table

@geindex -gnatT (gcc)


@table @asis

@item @code{-gnatT@emph{nnn}}

All compiler tables start at @code{nnn} times usual starting size.
@end table

@geindex -gnatu (gcc)


@table @asis

@item @code{-gnatu}

List units for this compilation.
@end table

@geindex -gnatU (gcc)


@table @asis

@item @code{-gnatU}

Tag all error messages with the unique string ‘error:’
@end table

@geindex -gnatv (gcc)


@table @asis

@item @code{-gnatv}

Verbose mode. Full error output with source lines to @code{stdout}.
@end table

@geindex -gnatV (gcc)


@table @asis

@item @code{-gnatV}

Control level of validity checking (@ref{e7,,Validity Checking}).
@end table

@geindex -gnatw (gcc)


@table @asis

@item @code{-gnatw@emph{xxx}}

Warning mode where
@code{xxx} is a string of option letters that denotes
the exact warnings that
are enabled or disabled (@ref{eb,,Warning Message Control}).
@end table

@geindex -gnatW (gcc)


@table @asis

@item @code{-gnatW@emph{e}}

Wide character encoding method
(@code{e}=n/h/u/s/e/8).
@end table

@geindex -gnatx (gcc)


@table @asis

@item @code{-gnatx}

Suppress generation of cross-reference information.
@end table

@geindex -gnatX (gcc)


@table @asis

@item @code{-gnatX}

Enable GNAT implementation extensions and latest Ada version.
@end table

@geindex -gnaty (gcc)


@table @asis

@item @code{-gnaty}

Enable built-in style checks (@ref{ec,,Style Checking}).
@end table

@geindex -gnatz (gcc)


@table @asis

@item @code{-gnatz@emph{m}}

Distribution stub generation and compilation
(@code{m}=r/c for receiver/caller stubs).
@end table

@geindex -I (gcc)


@table @asis

@item @code{-I@emph{dir}}

@geindex RTL

Direct GNAT to search the @code{dir} directory for source files needed by
the current compilation
(see @ref{73,,Search Paths and the Run-Time Library (RTL)}).
@end table

@geindex -I- (gcc)


@table @asis

@item @code{-I-}

@geindex 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{73,,Search Paths and the Run-Time Library (RTL)}).
@end table

@geindex -o (gcc)


@table @asis

@item @code{-o @emph{file}}

This switch is used in @code{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.
@end table

@geindex -nostdinc (gcc)


@table @asis

@item @code{-nostdinc}

Inhibit the search of the default location for the GNAT Run Time
Library (RTL) source files.
@end table

@geindex -nostdlib (gcc)


@table @asis

@item @code{-nostdlib}

Inhibit the search of the default location for the GNAT Run Time
Library (RTL) ALI files.
@end table

@geindex -O (gcc)


@table @asis

@item @code{-O[@emph{n}]}

@code{n} controls the optimization level:


@multitable {xxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@emph{n}

@tab

Effect

@item

@emph{0}

@tab

No optimization, the default setting if no @code{-O} appears

@item

@emph{1}

@tab

Normal optimization, the default if you specify @code{-O} without an
operand. A good compromise between code quality and compilation
time.

@item

@emph{2}

@tab

Extensive optimization, may improve execution time, possibly at
the cost of substantially increased compilation time.

@item

@emph{3}

@tab

Same as @code{-O2}, and also includes inline expansion for small
subprograms in the same unit.

@item

@emph{s}

@tab

Optimize space usage

@end multitable


See also @ref{ed,,Optimization Levels}.
@end table

@geindex -pass-exit-codes (gcc)


@table @asis

@item @code{-pass-exit-codes}

Catch exit codes from the compiler and use the most meaningful as
exit status.
@end table

@geindex --RTS (gcc)


@table @asis

@item @code{--RTS=@emph{rts-path}}

Specifies the default location of the run-time library. Same meaning as the
equivalent @code{gnatmake} flag (@ref{ce,,Switches for gnatmake}).
@end table

@geindex -S (gcc)


@table @asis

@item @code{-S}

Used in place of @code{-c} to
cause the assembler source file to be
generated, using @code{.s} as the extension,
instead of the object file.
This may be useful if you need to examine the generated assembly code.
@end table

@geindex -fverbose-asm (gcc)


@table @asis

@item @code{-fverbose-asm}

Used in conjunction with @code{-S}
to cause the generated assembly code file to be annotated with variable
names, making it significantly easier to follow.
@end table

@geindex -v (gcc)


@table @asis

@item @code{-v}

Show commands generated by the @code{gcc} driver. Normally used only for
debugging purposes or if you need to be sure what version of the
compiler you are executing.
@end table

@geindex -V (gcc)


@table @asis

@item @code{-V @emph{ver}}

Execute @code{ver} version of the compiler. This is the @code{gcc}
version, not the GNAT version.
@end table

@geindex -w (gcc)


@table @asis

@item @code{-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 @code{-gnatws} had appeared at the start of
the options).
@end table

@geindex Combining GNAT switches

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

@quotation

@example
-gnatofi3
@end example
@end quotation

is equivalent to specifying the following sequence of switches:

@quotation

@example
-gnato -gnatf -gnati3
@end example
@end quotation

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


@itemize *

@item 
The switch @code{-gnatc} if combined with other switches must come
first in the string.

@item 
The switch @code{-gnats} if combined with other switches must come
first in the string.

@item 
The switches
@code{-gnatzc} and @code{-gnatzr} may not be combined with any other
switches, and only one of them may appear in the command line.

@item 
The switch @code{-gnat-p} may not be combined with any other switch.

@item 
Once a ‘y’ appears in the string (that is a use of the @code{-gnaty}
switch), then all further characters in the switch are interpreted
as style modifiers (see description of @code{-gnaty}).

@item 
Once a ‘d’ appears in the string (that is a use of the @code{-gnatd}
switch), then all further characters in the switch are interpreted
as debug flags (see description of @code{-gnatd}).

@item 
Once a ‘w’ appears in the string (that is a use of the @code{-gnatw}
switch), then all further characters in the switch are interpreted
as warning mode modifiers (see description of @code{-gnatw}).

@item 
Once a ‘V’ appears in the string (that is a use of the @code{-gnatV}
switch), then all further characters in the switch are interpreted
as validity checking options (@ref{e7,,Validity Checking}).

@item 
Option ‘em’, ‘ec’, ‘ep’, ‘l=’ and ‘R’ must be the last options in
a combined list of options.
@end itemize

@node Output and Error Message Control,Warning Message Control,Alphabetical List of All Switches,Compiler Switches
@anchor{gnat_ugn/building_executable_programs_with_gnat id14}@anchor{ee}@anchor{gnat_ugn/building_executable_programs_with_gnat output-and-error-message-control}@anchor{ef}
@subsection Output and Error Message Control


@geindex stderr

The standard default format for error messages is called ‘brief format’.
Brief format messages are written to @code{stderr} (the standard error
file) and have the following form:

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

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.
@code{GNAT Studio} can parse the error messages
and point to the referenced character.
The following switches provide control over the error message
format:

@geindex -gnatv (gcc)


@table @asis

@item @code{-gnatv}

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

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

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

@geindex -gnatl (gcc)


@table @asis

@item @code{-gnatl}

The @code{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 @code{p.adb} might look like:

@example
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;
@end example

When you specify the @code{-gnatv} or @code{-gnatl} switches and
standard output is redirected, a brief summary is written to
@code{stderr} (standard error) giving the number of error messages and
warning messages generated.
@end table

@geindex -gnatl=fname (gcc)


@table @asis

@item @code{-gnatl=@emph{fname}}

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

@geindex -gnatU (gcc)


@table @asis

@item @code{-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.
@end table

@geindex -gnatb (gcc)


@table @asis

@item @code{-gnatb}

The @code{b} stands for brief.
This switch causes GNAT to generate the
brief format error messages to @code{stderr} (the standard error
file) as well as the verbose
format message or full listing (which as usual is written to
@code{stdout} (the standard output file).
@end table

@geindex -gnatm (gcc)


@table @asis

@item @code{-gnatm=@emph{n}}

The @code{m} stands for maximum.
@code{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
@code{-gnatm2} might yield

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

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
@code{-gnatm2} and @code{-gnatm=2} are equivalent.
@end table

@geindex -gnatf (gcc)


@table @asis

@item @code{-gnatf}

@geindex Error messages
@geindex suppressing

The @code{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

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

where the parenthetical comment warns that there are additional
references to the variable @code{V}. Compiling the same program with the
@code{-gnatf} switch yields

@example
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
@end example

The @code{-gnatf} switch also generates additional information for
some error messages.  Some examples are:


@itemize *

@item 
Details on possibly non-portable unchecked conversion

@item 
List possible interpretations for ambiguous calls

@item 
Additional details on incorrect parameters
@end itemize
@end table

@geindex -gnatjnn (gcc)


@table @asis

@item @code{-gnatjnn}

In normal operation mode (or if @code{-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 @code{-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.
@end table

@geindex -gnatq (gcc)


@table @asis

@item @code{-gnatq}

The @code{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.
@end table

@geindex -gnatQ (gcc)


@table @asis

@item @code{-gnatQ}

In normal operation mode, the @code{ALI} file is not generated if any
illegalities are detected in the program. The use of @code{-gnatQ} forces
generation of the @code{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 @code{ALI} file. This switch
implies @code{-gnatq}, since the semantic phase must be run to get a
meaningful ALI file.

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

Note that @code{-gnatQ} has no effect if @code{-gnats} is specified,
since ALI files are never generated if @code{-gnats} is set.
@end table

@node Warning Message Control,Debugging and Assertion Control,Output and Error Message Control,Compiler Switches
@anchor{gnat_ugn/building_executable_programs_with_gnat id15}@anchor{f0}@anchor{gnat_ugn/building_executable_programs_with_gnat warning-message-control}@anchor{eb}
@subsection Warning Message Control


@geindex 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:

@example
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
@end example

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
@code{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.


@itemize *

@item 
Possible infinitely recursive calls

@item 
Out-of-range values being assigned

@item 
Possible order of elaboration problems

@item 
Size not a multiple of alignment for a record type

@item 
Assertions (pragma Assert) that are sure to fail

@item 
Unreachable code

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

@item 
Fixed-point type declarations with a null range

@item 
Direct_IO or Sequential_IO instantiated with a type that has access values

@item 
Variables that are never assigned a value

@item 
Variables that are referenced before being initialized

@item 
Task entries with no corresponding @code{accept} statement

@item 
Duplicate accepts for the same task entry in a @code{select}

@item 
Objects that take too much storage

@item 
Unchecked conversion between types of differing sizes

@item 
Missing @code{return} statement along some execution path in a function

@item 
Incorrect (unrecognized) pragmas

@item 
Incorrect external names

@item 
Allocation from empty storage pool

@item 
Potentially blocking operation in protected type

@item 
Suspicious parenthesization of expressions

@item 
Mismatching bounds in an aggregate

@item 
Attempt to return local value by reference

@item 
Premature instantiation of a generic body

@item 
Attempt to pack aliased components

@item 
Out of bounds array subscripts

@item 
Wrong length on string assignment

@item 
Violations of style rules if style checking is enabled

@item 
Unused @emph{with} clauses

@item 
@code{Bit_Order} usage that does not have any effect

@item 
@code{Standard.Duration} used to resolve universal fixed expression

@item 
Dereference of possibly null value

@item 
Declaration that is likely to cause storage error

@item 
Internal GNAT unit @emph{with}ed by application unit

@item 
Values known to be out of range at compile time

@item 
Unreferenced or unmodified variables. Note that a special
exemption applies to variables which contain any of the substrings
@code{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.

@item 
Address overlays that could clobber memory

@item 
Unexpected initialization when address clause present

@item 
Bad alignment for address clause

@item 
Useless type conversions

@item 
Redundant assignment statements and other redundant constructs

@item 
Useless exception handlers

@item 
Accidental hiding of name by child unit

@item 
Access before elaboration detected at compile time

@item 
A range in a @code{for} loop that is known to be null or might be null
@end itemize

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 @cite{GNAT_Reference_manual}).

@geindex -gnatwa (gcc)


@table @asis

@item @code{-gnatwa}

@emph{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:


@itemize *

@item 
@code{-gnatwd} (implicit dereferencing)

@item 
@code{-gnatw.d} (tag warnings with -gnatw switch)

@item 
@code{-gnatwh} (hiding)

@item 
@code{-gnatw.h} (holes in record layouts)

@item 
@code{-gnatw.j} (late primitives of tagged types)

@item 
@code{-gnatw.k} (redefinition of names in standard)

@item 
@code{-gnatwl} (elaboration warnings)

@item 
@code{-gnatw.l} (inherited aspects)

@item 
@code{-gnatw.n} (atomic synchronization)

@item 
@code{-gnatwo} (address clause overlay)

@item 
@code{-gnatw.o} (values set by out parameters ignored)

@item 
@code{-gnatw.q} (questionable layout of record types)

@item 
@code{-gnatw_r} (out-of-order record representation clauses)

@item 
@code{-gnatw.s} (overridden size clause)

@item 
@code{-gnatwt} (tracking of deleted conditional code)

@item 
@code{-gnatw.u} (unordered enumeration)

@item 
@code{-gnatw.w} (use of Warnings Off)

@item 
@code{-gnatw.y} (reasons for package needing body)
@end itemize

All other optional warnings are turned on.
@end table

@geindex -gnatwA (gcc)


@table @asis

@item @code{-gnatwA}

@emph{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 @code{-gnatws}, the
use of switch @code{-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 @code{-gnatws}, warnings suppressed by
the use of switch @code{-gnatwA} can be individually turned back
on. For example the use of switch @code{-gnatwA} followed by
switch @code{-gnatwd} will suppress all optional warnings except
the warnings for implicit dereferencing.
@end table

@geindex -gnatw.a (gcc)


@table @asis

@item @code{-gnatw.a}

@emph{Activate warnings on failing assertions.}

@geindex 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.
@end table

@geindex -gnatw.A (gcc)


@table @asis

@item @code{-gnatw.A}

@emph{Suppress warnings on failing assertions.}

@geindex Assert failures

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

@geindex -gnatw_a


@table @asis

@item @code{-gnatw_a}

@emph{Activate warnings on anonymous allocators.}

@geindex 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).
@end table

@geindex -gnatw_A


@table @asis

@item @code{-gnatw_A}

@emph{Supress warnings on anonymous allocators.}

@geindex Anonymous allocators

This switch suppresses warnings for anonymous access type allocators.
@end table

@geindex -gnatwb (gcc)


@table @asis

@item @code{-gnatwb}

@emph{Activate warnings on bad fixed values.}

@geindex Bad fixed values

@geindex Fixed-point Small value

@geindex 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.
@end table

@geindex -gnatwB (gcc)


@table @asis

@item @code{-gnatwB}

@emph{Suppress warnings on bad fixed values.}

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

@geindex -gnatw.b (gcc)


@table @asis

@item @code{-gnatw.b}

@emph{Activate warnings on biased representation.}

@geindex 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.
@end table

@geindex -gnatwB (gcc)


@table @asis

@item @code{-gnatw.B}

@emph{Suppress warnings on biased representation.}

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

@geindex -gnatwc (gcc)


@table @asis

@item @code{-gnatwc}

@emph{Activate warnings on conditionals.}

@geindex Conditionals
@geindex 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 @code{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 @code{-gnatwa}.
@end table

@geindex -gnatwC (gcc)


@table @asis

@item @code{-gnatwC}

@emph{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.
@end table

@geindex -gnatw.c (gcc)


@table @asis

@item @code{-gnatw.c}

@emph{Activate warnings on missing component clauses.}

@geindex Component clause
@geindex 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.
@end table

@geindex -gnatw.C (gcc)


@table @asis

@item @code{-gnatw.C}

@emph{Suppress warnings on missing component clauses.}

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

@geindex -gnatw_c (gcc)


@table @asis

@item @code{-gnatw_c}

@emph{Activate warnings on unknown condition in Compile_Time_Warning.}

@geindex Compile_Time_Warning

@geindex 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.
@end table

@geindex -gnatw_C (gcc)


@table @asis

@item @code{-gnatw_C}

@emph{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.
@end table

@geindex -gnatwd (gcc)


@table @asis

@item @code{-gnatwd}

@emph{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 @code{.all} will generate a warning. With this warning
enabled, access checks occur only at points where an explicit
@code{.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.
@end table

@geindex -gnatwD (gcc)


@table @asis

@item @code{-gnatwD}

@emph{Suppress warnings on implicit dereferencing.}

@geindex Implicit dereferencing

@geindex Dereferencing
@geindex implicit

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

@geindex -gnatw.d (gcc)


@table @asis

@item @code{-gnatw.d}

@emph{Activate tagging of warning and info messages.}

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

@quotation


@itemize -

@item 
@emph{[-gnatw?]}
Used to tag warnings controlled by the switch @code{-gnatwx} where x
is a letter a-z.

@item 
@emph{[-gnatw.?]}
Used to tag warnings controlled by the switch @code{-gnatw.x} where x
is a letter a-z.

@item 
@emph{[-gnatel]}
Used to tag elaboration information (info) messages generated when the
static model of elaboration is used and the @code{-gnatel} switch is set.

@item 
@emph{[restriction warning]}
Used to tag warning messages for restriction violations, activated by use
of the pragma @code{Restriction_Warnings}.

@item 
@emph{[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: “.

@item 
@emph{[enabled by default]}
Used to tag all other warnings that are always given by default, unless
warnings are completely suppressed using pragma @emph{Warnings(Off)} or
the switch @code{-gnatws}.
@end itemize
@end quotation
@end table

@geindex -gnatw.d (gcc)


@table @asis

@item @code{-gnatw.D}

@emph{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
@code{-gnatw.d}.
@end table

@geindex -gnatwe (gcc)

@geindex Warnings
@geindex treat as error


@table @asis

@item @code{-gnatwe}

@emph{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.
@end table

@geindex -gnatw.e (gcc)


@table @asis

@item @code{-gnatw.e}

@emph{Activate every optional warning.}

@geindex Warnings
@geindex activate every optional warning

This switch activates all optional warnings, including those which
are not activated by @code{-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 @code{-gnatwa} are typically highly
specialized warnings that are suitable for use only in code that has
been specifically designed according to specialized coding rules.
@end table

@geindex -gnatwE (gcc)

@geindex Warnings
@geindex treat as error


@table @asis

@item @code{-gnatwE}

@emph{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.
@end table

@geindex -gnatwf (gcc)


@table @asis

@item @code{-gnatwf}

@emph{Activate warnings on unreferenced formals.}

@geindex Formals
@geindex 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 @code{-gnatwu}. The
default is that these warnings are not generated.
@end table

@geindex -gnatwF (gcc)


@table @asis

@item @code{-gnatwF}

@emph{Suppress warnings on unreferenced formals.}

This switch suppresses warnings for unreferenced formal
parameters. Note that the
combination @code{-gnatwu} followed by @code{-gnatwF} has the
effect of warning on unreferenced entities other than subprogram
formals.
@end table

@geindex -gnatwg (gcc)


@table @asis

@item @code{-gnatwg}

@emph{Activate warnings on unrecognized pragmas.}

@geindex Pragmas
@geindex 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).
@end table

@geindex -gnatwG (gcc)


@table @asis

@item @code{-gnatwG}

@emph{Suppress warnings on unrecognized pragmas.}

This switch suppresses warnings for unrecognized pragmas.
@end table

@geindex -gnatw.g (gcc)


@table @asis

@item @code{-gnatw.g}

@emph{Warnings used for GNAT sources.}

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

@geindex -gnatwh (gcc)


@table @asis

@item @code{-gnatwh}

@emph{Activate warnings on hiding.}

@geindex 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.
@end table

@geindex -gnatwH (gcc)


@table @asis

@item @code{-gnatwH}

@emph{Suppress warnings on hiding.}

This switch suppresses warnings on hiding declarations.
@end table

@geindex -gnatw.h (gcc)


@table @asis

@item @code{-gnatw.h}

@emph{Activate warnings on holes/gaps in records.}

@geindex 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.
@end table

@geindex -gnatw.H (gcc)


@table @asis

@item @code{-gnatw.H}

@emph{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.
@end table

@geindex -gnatwi (gcc)


@table @asis

@item @code{-gnatwi}

@emph{Activate warnings on implementation units.}

This switch activates warnings for a @emph{with} of an internal GNAT
implementation unit, defined as any unit from the @code{Ada},
@code{Interfaces}, @code{GNAT},
or @code{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 @emph{with}ed
by user programs. The default is that such warnings are generated
@end table

@geindex -gnatwI (gcc)


@table @asis

@item @code{-gnatwI}

@emph{Disable warnings on implementation units.}

This switch disables warnings for a @emph{with} of an internal GNAT
implementation unit.
@end table

@geindex -gnatw.i (gcc)


@table @asis

@item @code{-gnatw.i}

@emph{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.
@end table

@geindex -gnatw.I (gcc)


@table @asis

@item @code{-gnatw.I}

@emph{Disable warnings on overlapping actuals.}

This switch disables warnings on overlapping actuals in a call.
@end table

@geindex -gnatwj (gcc)


@table @asis

@item @code{-gnatwj}

@emph{Activate warnings on obsolescent features (Annex J).}

@geindex Features
@geindex obsolescent

@geindex Obsolescent features

If this warning option is activated, then warnings are generated for
calls to subprograms marked with @code{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 @code{Text_IO}) and use of package
@code{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, @code{pragma Ravenscar} will be flagged since its
function is replaced by @code{pragma Profile(Ravenscar)}, and
@code{pragma Interface_Name} will be flagged since its function
is replaced by @code{pragma Import}.

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

@geindex -gnatwJ (gcc)


@table @asis

@item @code{-gnatwJ}

@emph{Suppress warnings on obsolescent features (Annex J).}

This switch disables warnings on use of obsolescent features.
@end table

@geindex -gnatw.j (gcc)


@table @asis

@item @code{-gnatw.j}

@emph{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.
@end table

@geindex -gnatw.J (gcc)


@table @asis

@item @code{-gnatw.J}

@emph{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.
@end table

@geindex -gnatwk (gcc)


@table @asis

@item @code{-gnatwk}

@emph{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.
@end table

@geindex -gnatwK (gcc)


@table @asis

@item @code{-gnatwK}

@emph{Suppress warnings on variables that could be constants.}

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

@geindex -gnatw.k (gcc)


@table @asis

@item @code{-gnatw.k}

@emph{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.
@end table

@geindex -gnatwK (gcc)


@table @asis

@item @code{-gnatw.K}

@emph{Suppress warnings on redefinition of names in standard.}

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

@geindex -gnatwl (gcc)


@table @asis

@item @code{-gnatwl}

@emph{Activate warnings for elaboration pragmas.}

@geindex Elaboration
@geindex warnings

This switch activates warnings for possible elaboration problems,
including suspicious use
of @code{Elaborate} pragmas, when using the static elaboration model, and
possible situations that may raise @code{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.
@end table

@geindex -gnatwL (gcc)


@table @asis

@item @code{-gnatwL}

@emph{Suppress warnings for elaboration pragmas.}

This switch suppresses warnings for possible elaboration problems.
@end table

@geindex -gnatw.l (gcc)


@table @asis

@item @code{-gnatw.l}

@emph{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.
@end table

@geindex -gnatw.L (gcc)


@table @asis

@item @code{-gnatw.L}

@emph{Suppress listing of inherited aspects.}

This switch suppresses listing of inherited aspects.
@end table

@geindex -gnatwm (gcc)


@table @asis

@item @code{-gnatwm}

@emph{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.
@end table

@geindex -gnatwM (gcc)


@table @asis

@item @code{-gnatwM}

@emph{Disable warnings on modified but unreferenced variables.}

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

@geindex -gnatw.m (gcc)


@table @asis

@item @code{-gnatw.m}

@emph{Activate warnings on suspicious modulus values.}

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

@geindex -gnatw.M (gcc)


@table @asis

@item @code{-gnatw.M}

@emph{Disable warnings on suspicious modulus values.}

This switch disables warnings for suspicious modulus values.
@end table

@geindex -gnatwn (gcc)


@table @asis

@item @code{-gnatwn}

@emph{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 @code{-gnatwn} can be used to cancel the effect of
an explicit @code{-gnatws} or
@code{-gnatwe}. It also cancels the effect of the
implicit @code{-gnatwe} that is activated by the
use of @code{-gnatg}.
@end table

@geindex -gnatw.n (gcc)

@geindex Atomic Synchronization
@geindex warnings


@table @asis

@item @code{-gnatw.n}

@emph{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.
@end table

@geindex -gnatw.N (gcc)


@table @asis

@item @code{-gnatw.N}

@emph{Suppress warnings on atomic synchronization.}

@geindex Atomic Synchronization
@geindex warnings

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

@geindex -gnatwo (gcc)

@geindex Address Clauses
@geindex warnings


@table @asis

@item @code{-gnatwo}

@emph{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.
@end table

@geindex -gnatwO (gcc)


@table @asis

@item @code{-gnatwO}

@emph{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.
@end table

@geindex -gnatw.o (gcc)


@table @asis

@item @code{-gnatw.o}

@emph{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.
@end table

@geindex -gnatw.O (gcc)


@table @asis

@item @code{-gnatw.O}

@emph{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.
@end table

@geindex -gnatwp (gcc)

@geindex Inlining
@geindex warnings


@table @asis

@item @code{-gnatwp}

@emph{Activate warnings on ineffective pragma Inlines.}

This switch activates warnings for failure of front end inlining
(activated by @code{-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.
@end table

@geindex -gnatwP (gcc)


@table @asis

@item @code{-gnatwP}

@emph{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.
@end table

@geindex -gnatw.p (gcc)

@geindex Parameter order
@geindex warnings


@table @asis

@item @code{-gnatw.p}

@emph{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.
@end table

@geindex -gnatw.P (gcc)


@table @asis

@item @code{-gnatw.P}

@emph{Suppress warnings on parameter ordering.}

This switch suppresses warnings on cases of suspicious parameter
ordering.
@end table

@geindex -gnatw_p (gcc)


@table @asis

@item @code{-gnatw_p}

@emph{Activate warnings for pedantic checks.}

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

@geindex -gnatw_P (gcc)


@table @asis

@item @code{-gnatw_P}

@emph{Suppress warnings for pedantic checks.}

This switch suppresses warnings on violations of pedantic checks.
@end table

@geindex -gnatwq (gcc)

@geindex Parentheses
@geindex warnings


@table @asis

@item @code{-gnatwq}

@emph{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.
@end table

@geindex -gnatwQ (gcc)


@table @asis

@item @code{-gnatwQ}

@emph{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.
@end table

@geindex -gnatw.q (gcc)

@geindex Layout
@geindex warnings


@table @asis

@item @code{-gnatw.q}

@emph{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:


@itemize *

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

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

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

@item 
then all components whose length depends on discriminants,

@item 
finally the variant part (if any),
@end itemize

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 @code{No_Component_Reordering}.

The default is that these warnings are not given.
@end table

@geindex -gnatw.Q (gcc)


@table @asis

@item @code{-gnatw.Q}

@emph{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.
@end table

@geindex -gnatwr (gcc)


@table @asis

@item @code{-gnatwr}

@emph{Activate warnings on redundant constructs.}

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


@itemize *

@item 
Assignment of an item to itself.

@item 
Type conversion that converts an expression to its own type.

@item 
Use of the attribute @code{Base} where @code{typ'Base} is the same
as @code{typ}.

@item 
Use of pragma @code{Pack} when all components are placed by a record
representation clause.

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

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

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

@item 
Import of parent package.
@end itemize

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

@geindex -gnatwR (gcc)


@table @asis

@item @code{-gnatwR}

@emph{Suppress warnings on redundant constructs.}

This switch suppresses warnings for redundant constructs.
@end table

@geindex -gnatw.r (gcc)


@table @asis

@item @code{-gnatw.r}

@emph{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.
@end table

@geindex -gnatw.R (gcc)


@table @asis

@item @code{-gnatw.R}

@emph{Suppress warnings for object renaming function.}

This switch suppresses warnings for object renaming function.
@end table

@geindex -gnatw_r (gcc)


@table @asis

@item @code{-gnatw_r}

@emph{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.
@end table

@geindex -gnatw_R (gcc)


@table @asis

@item @code{-gnatw_R}

@emph{Suppress warnings for out-of-order record representation clauses.}
@end table

@geindex -gnatws (gcc)


@table @asis

@item @code{-gnatws}

@emph{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 @code{-gnatwn}.

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

@geindex -gnatw.s (gcc)

@geindex Record Representation (component sizes)


@table @asis

@item @code{-gnatw.s}

@emph{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.
@end table

@geindex -gnatw.S (gcc)


@table @asis

@item @code{-gnatw.S}

@emph{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.
@end table

@geindex -gnatwt (gcc)

@geindex Deactivated code
@geindex warnings

@geindex Deleted code
@geindex warnings


@table @asis

@item @code{-gnatwt}

@emph{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.
@end table

@geindex -gnatwT (gcc)


@table @asis

@item @code{-gnatwT}

@emph{Suppress warnings for tracking of deleted conditional code.}

This switch suppresses warnings for tracking of deleted conditional code.
@end table

@geindex -gnatw.t (gcc)


@table @asis

@item @code{-gnatw.t}

@emph{Activate warnings on suspicious contracts.}

This switch activates warnings on suspicious contracts. This includes
warnings on suspicious postconditions (whether a pragma @code{Postcondition} or a
@code{Post} aspect in Ada 2012) and suspicious contract cases (pragma or aspect
@code{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.
@end table

@geindex -gnatw.T (gcc)


@table @asis

@item @code{-gnatw.T}

@emph{Suppress warnings on suspicious contracts.}

This switch suppresses warnings on suspicious contracts.
@end table

@geindex -gnatwu (gcc)


@table @asis

@item @code{-gnatwu}

@emph{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 @emph{with}ed
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 @code{use}
clauses or @code{renames}
declarations, a warning is still generated. A warning is also generated
for a generic package that is @emph{with}ed but never instantiated.
In the case where a package or subprogram body is compiled, and there
is a @emph{with} on the corresponding spec
that is only referenced in the body,
a warning is also generated, noting that the
@emph{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 @code{-gnatwf}).
@end table

@geindex -gnatwU (gcc)


@table @asis

@item @code{-gnatwU}

@emph{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 @code{-gnatwF}).
@end table

@geindex -gnatw.u (gcc)


@table @asis

@item @code{-gnatw.u}

@emph{Activate warnings on unordered enumeration types.}

This switch causes enumeration types to be considered as conceptually
unordered, unless an explicit pragma @code{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 @emph{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 @code{Ordered} in the
@cite{GNAT Reference Manual} for further details.
The default is that such warnings are not generated.
@end table

@geindex -gnatw.U (gcc)


@table @asis

@item @code{-gnatw.U}

@emph{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.
@end table

@geindex -gnatwv (gcc)

@geindex Unassigned variable warnings


@table @asis

@item @code{-gnatwv}

@emph{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:

@example
Array_Or_Record : XXX := (others => <>);
@end example

unless the relevant type fully initializes all components.
@end table

@geindex -gnatwV (gcc)


@table @asis

@item @code{-gnatwV}

@emph{Suppress warnings on unassigned variables.}

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

@geindex -gnatw.v (gcc)

@geindex bit order warnings


@table @asis

@item @code{-gnatw.v}

@emph{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.
@end table

@geindex -gnatw.V (gcc)


@table @asis

@item @code{-gnatw.V}

@emph{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.
@end table

@geindex -gnatww (gcc)

@geindex String indexing warnings


@table @asis

@item @code{-gnatww}

@emph{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.
@end table

@geindex -gnatwW (gcc)


@table @asis

@item @code{-gnatwW}

@emph{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:

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

@geindex -gnatw.w (gcc)

@geindex Warnings Off control


@table @asis

@item @code{-gnatw.w}

@emph{Activate warnings on Warnings Off pragmas.}

This switch activates warnings for use of @code{pragma Warnings (Off, entity)}
where either the pragma is entirely useless (because it suppresses no
warnings), or it could be replaced by @code{pragma Unreferenced} or
@code{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.
@end table

@geindex -gnatw.W (gcc)


@table @asis

@item @code{-gnatw.W}

@emph{Suppress warnings on unnecessary Warnings Off pragmas.}

This switch suppresses warnings for use of @code{pragma Warnings (Off, ...)}.
@end table

@geindex -gnatwx (gcc)

@geindex Export/Import pragma warnings


@table @asis

@item @code{-gnatwx}

@emph{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.
@end table

@geindex -gnatwX (gcc)


@table @asis

@item @code{-gnatwX}

@emph{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.
@end table

@geindex -gnatwm (gcc)


@table @asis

@item @code{-gnatw.x}

@emph{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.

@item @code{-gnatw.X}

@emph{Disable warnings for No_Exception_Propagation mode.}

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

@geindex -gnatwy (gcc)

@geindex Ada compatibility issues warnings


@table @asis

@item @code{-gnatwy}

@emph{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
@code{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.
@end table

@geindex -gnatwY (gcc)

@geindex Ada compatibility issues warnings


@table @asis

@item @code{-gnatwY}

@emph{Disable warnings for Ada compatibility issues.}

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

@geindex -gnatw.y (gcc)

@geindex Package spec needing body


@table @asis

@item @code{-gnatw.y}

@emph{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.
@end table

@geindex -gnatw.Y (gcc)

@geindex No information messages for why package spec needs body


@table @asis

@item @code{-gnatw.Y}

@emph{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.
@end table

@geindex -gnatwz (gcc)

@geindex Unchecked_Conversion warnings


@table @asis

@item @code{-gnatwz}

@emph{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.
@end table

@geindex -gnatwZ (gcc)


@table @asis

@item @code{-gnatwZ}

@emph{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.
@end table

@geindex -gnatw.z (gcc)

@geindex Size/Alignment warnings


@table @asis

@item @code{-gnatw.z}

@emph{Activate warnings for size not a multiple of alignment.}

This switch activates warnings for cases of array and record types
with specified @code{Size} and @code{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.
@end table

@geindex -gnatw.Z (gcc)

@geindex Size/Alignment warnings


@table @asis

@item @code{-gnatw.Z}

@emph{Suppress warnings for size not a multiple of alignment.}

This switch suppresses warnings for cases of array and record types
with specified @code{Size} and @code{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 @code{Object_Size} value.
@end table

@geindex -Wunused (gcc)


@table @asis

@item @code{-Wunused}

The warnings controlled by the @code{-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 @code{-W} switch.
For example, @code{-Wunused} activates back end
warnings for entities that are declared but not referenced.
@end table

@geindex -Wuninitialized (gcc)


@table @asis

@item @code{-Wuninitialized}

Similarly, @code{-Wuninitialized} activates
the back end warning for uninitialized variables. This switch must be
used in conjunction with an optimization level greater than zero.
@end table

@geindex -Wstack-usage (gcc)


@table @asis

@item @code{-Wstack-usage=@emph{len}}

Warn if the stack usage of a subprogram might be larger than @code{len} bytes.
See @ref{e6,,Static Stack Usage Analysis} for details.
@end table

@geindex -Wall (gcc)


@table @asis

@item @code{-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
@code{-gnatwa}, that is, most front-end warnings are activated as well.
@end table

@geindex -w (gcc)


@table @asis

@item @code{-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
@code{-gnatws}, that is, front-end warnings are suppressed as well.
@end table

@geindex -Werror (gcc)


@table @asis

@item @code{-Werror}

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

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

@example
-gnatwaGe
@end example

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

When no switch @code{-gnatw} is used, this is equivalent to:

@quotation


@itemize *

@item 
@code{-gnatw.a}

@item 
@code{-gnatwB}

@item 
@code{-gnatw.b}

@item 
@code{-gnatwC}

@item 
@code{-gnatw.C}

@item 
@code{-gnatwD}

@item 
@code{-gnatw.D}

@item 
@code{-gnatwF}

@item 
@code{-gnatw.F}

@item 
@code{-gnatwg}

@item 
@code{-gnatwH}

@item 
@code{-gnatw.H}

@item 
@code{-gnatwi}

@item 
@code{-gnatwJ}

@item 
@code{-gnatw.J}

@item 
@code{-gnatwK}

@item 
@code{-gnatw.K}

@item 
@code{-gnatwL}

@item 
@code{-gnatw.L}

@item 
@code{-gnatwM}

@item 
@code{-gnatw.m}

@item 
@code{-gnatwn}

@item 
@code{-gnatw.N}

@item 
@code{-gnatwo}

@item 
@code{-gnatw.O}

@item 
@code{-gnatwP}

@item 
@code{-gnatw.P}

@item 
@code{-gnatwq}

@item 
@code{-gnatw.Q}

@item 
@code{-gnatwR}

@item 
@code{-gnatw.R}

@item 
@code{-gnatw.S}

@item 
@code{-gnatwT}

@item 
@code{-gnatw.t}

@item 
@code{-gnatwU}

@item 
@code{-gnatw.U}

@item 
@code{-gnatwv}

@item 
@code{-gnatw.v}

@item 
@code{-gnatww}

@item 
@code{-gnatw.W}

@item 
@code{-gnatwx}

@item 
@code{-gnatw.X}

@item 
@code{-gnatwy}

@item 
@code{-gnatw.Y}

@item 
@code{-gnatwz}

@item 
@code{-gnatw.z}
@end itemize
@end quotation

@node Debugging and Assertion Control,Validity Checking,Warning Message Control,Compiler Switches
@anchor{gnat_ugn/building_executable_programs_with_gnat debugging-and-assertion-control}@anchor{f1}@anchor{gnat_ugn/building_executable_programs_with_gnat id16}@anchor{f2}
@subsection Debugging and Assertion Control


@geindex -gnata (gcc)


@table @asis

@item @code{-gnata}

@geindex Assert

@geindex Debug

@geindex Assertions

@geindex Precondition

@geindex Postcondition

@geindex Type invariants

@geindex Subtype predicates

The @code{-gnata} option is equivalent to the following @code{Assertion_Policy} pragma:

@example
pragma Assertion_Policy (Check);
@end example

Which is a shorthand for:

@example
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);
@end example

The pragmas @code{Assert} and @code{Debug} normally have no effect and
are ignored. This switch, where @code{a} stands for ‘assert’, causes
pragmas @code{Assert} and @code{Debug} to be activated. This switch also
causes preconditions, postconditions, subtype predicates, and
type invariants to be activated.

The pragmas have the form:

@example
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>)
@end example

The aspects have the form:

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

The @code{Assert} pragma causes @code{Boolean-expression} to be tested.
If the result is @code{True}, the pragma has no effect (other than
possible side effects from evaluating the expression). If the result is
@code{False}, the exception @code{Assert_Failure} declared in the package
@code{System.Assertions} is raised (passing @code{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 @code{Debug} pragma causes @code{procedure} to be called. Note that
@code{pragma Debug} may appear within a declaration sequence, allowing
debugging procedures to be called between declarations.

For the aspect specification, the @code{Boolean-expression} is evaluated.
If the result is @code{True}, the aspect has no effect. If the result
is @code{False}, the exception @code{Assert_Failure} is raised.
@end table

@node Validity Checking,Style Checking,Debugging and Assertion Control,Compiler Switches
@anchor{gnat_ugn/building_executable_programs_with_gnat id17}@anchor{f3}@anchor{gnat_ugn/building_executable_programs_with_gnat validity-checking}@anchor{e7}
@subsection Validity Checking


@geindex 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 @code{-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 @code{-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 @code{-gnatV@emph{x}} switches below allow finer-grained
control; you can enable whichever validity checks you desire. However,
for most debugging purposes, @code{-gnatVa} is sufficient, and the
default @code{-gnatVd} (i.e. standard Ada behavior) is usually
sufficient for non-debugging use.

The @code{-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 @code{-gnatV@emph{x}} switch allows control over the validity
checking mode as described below.
The @code{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.

@geindex -gnatVa (gcc)


@table @asis

@item @code{-gnatVa}

@emph{All validity checks.}

All validity checks are turned on.
That is, @code{-gnatVa} is
equivalent to @code{gnatVcdfimoprst}.
@end table

@geindex -gnatVc (gcc)


@table @asis

@item @code{-gnatVc}

@emph{Validity checks for copies.}

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

@geindex -gnatVd (gcc)


@table @asis

@item @code{-gnatVd}

@emph{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 @code{-gnatVD}.
They are turned on by default. If @code{-gnatVD} is specified, a subsequent
switch @code{-gnatVd} will leave the checks turned on.
Switch @code{-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.
@end table

@geindex -gnatVe (gcc)


@table @asis

@item @code{-gnatVe}

@emph{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
(@code{-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.
@end table

@geindex -gnatVf (gcc)


@table @asis

@item @code{-gnatVf}

@emph{Validity checks for floating-point values.}

In the absence of this switch, validity checking occurs only for discrete
values. If @code{-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, @code{-gnatVif} or @code{-gnatVfi}
(the order does not matter) specifies that floating-point parameters of mode
@code{in} should be validity checked.
@end table

@geindex -gnatVi (gcc)


@table @asis

@item @code{-gnatVi}

@emph{Validity checks for `@w{`}in`@w{`} mode parameters.}

Arguments for parameters of mode @code{in} are validity checked in function
and procedure calls at the point of call.
@end table

@geindex -gnatVm (gcc)


@table @asis

@item @code{-gnatVm}

@emph{Validity checks for `@w{`}in out`@w{`} mode parameters.}

Arguments for parameters of mode @code{in out} are validity checked in
procedure calls at the point of call. The @code{'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 @code{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.
@end table

@geindex -gnatVn (gcc)


@table @asis

@item @code{-gnatVn}

@emph{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 @code{-gnatp} suppresses all run-time checks, including
validity checks, and thus implies @code{-gnatVn}. When this switch
is used, it cancels any other @code{-gnatV} previously issued.
@end table

@geindex -gnatVo (gcc)


@table @asis

@item @code{-gnatVo}

@emph{Validity checks for operator and attribute operands.}

Arguments for predefined operators and attributes are validity checked.
This includes all operators in package @code{Standard},
the shift operators defined as intrinsic in package @code{Interfaces}
and operands for attributes such as @code{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 @code{..} (e.g., slices, loops etc).
@end table

@geindex -gnatVp (gcc)


@table @asis

@item @code{-gnatVp}

@emph{Validity checks for parameters.}

This controls the treatment of parameters within a subprogram (as opposed
to @code{-gnatVi} and @code{-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 @code{-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.
@end table

@geindex -gnatVr (gcc)


@table @asis

@item @code{-gnatVr}

@emph{Validity checks for function returns.}

The expression in @code{return} statements in functions is validity
checked.
@end table

@geindex -gnatVs (gcc)


@table @asis

@item @code{-gnatVs}

@emph{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).
@end table

@geindex -gnatVt (gcc)


@table @asis

@item @code{-gnatVt}

@emph{Validity checks for tests.}

Expressions used as conditions in @code{if}, @code{while} or @code{exit}
statements are checked, as well as guard expressions in entry calls.
@end table

The @code{-gnatV} switch may be followed by a string of letters
to turn on a series of validity checking options.
For example, @code{-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 @code{CDFIMORST} may
be used to turn off the corresponding lower case option.
Thus @code{-gnatVaM} turns on all validity checking options except for
checking of @code{in out} parameters.

The specification of additional validity checking generates extra code (and
in the case of @code{-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 @code{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 @code{Validity_Checks} which allows modification of
the validity checking mode at the program source level, and also allows for
temporary disabling of validity checks.

@node Style Checking,Run-Time Checks,Validity Checking,Compiler Switches
@anchor{gnat_ugn/building_executable_programs_with_gnat id18}@anchor{f4}@anchor{gnat_ugn/building_executable_programs_with_gnat style-checking}@anchor{ec}
@subsection Style Checking


@geindex Style checking

@geindex -gnaty (gcc)

The @code{-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 @code{-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.


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

@geindex -gnaty[0-9] (gcc)


@table @asis

@item @code{-gnaty0}

@emph{Specify indentation level.}

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


@itemize *

@item 
beginnings of declarations (except record component declarations)
and statements;

@item 
beginnings of the structural components of compound statements;

@item 
@code{end} keyword that completes the declaration of a program unit declaration
or body or that completes a compound statement.
@end itemize

Full line comments must be
aligned with the @code{--} 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.
@end table

@geindex -gnatya (gcc)


@table @asis

@item @code{-gnatya}

@emph{Check attribute casing.}

Attribute names, including the case of keywords such as @code{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.
@end table

@geindex -gnatyA (gcc)


@table @asis

@item @code{-gnatyA}

@emph{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.
@end table

@geindex -gnatyb (gcc)


@table @asis

@item @code{-gnatyb}

@emph{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.
@end table

@geindex -gnatyB (gcc)


@table @asis

@item @code{-gnatyB}

@emph{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 @code{and then}/@cite{or else} are
required.
@end table

@geindex -gnatyc (gcc)


@table @asis

@item @code{-gnatyc}

@emph{Check comments, double space.}

Comments must meet the following set of rules:


@itemize *

@item 
The @code{--} that starts the column must either start in column one,
or else at least one blank must precede this sequence.

@item 
Comments that follow other tokens on a line must have at least one blank
following the @code{--} at the start of the comment.

@item 
Full line comments must have at least two blanks following the
@code{--} that starts the comment, with the following exceptions.

@item 
A line consisting only of the @code{--} characters, possibly preceded
by blanks is permitted.

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

@item 
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.

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

@example
---------------------------
-- This is a box comment --
-- with two text lines.  --
---------------------------
@end example
@end itemize
@end table

@geindex -gnatyC (gcc)


@table @asis

@item @code{-gnatyC}

@emph{Check comments, single space.}

This is identical to @code{c} except that only one space
is required following the @code{--} of a comment instead of two.
@end table

@geindex -gnatyd (gcc)


@table @asis

@item @code{-gnatyd}

@emph{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).
@end table

@geindex -gnatyD (gcc)


@table @asis

@item @code{-gnatyD}

@emph{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.
@end table

@geindex -gnatye (gcc)


@table @asis

@item @code{-gnatye}

@emph{Check end/exit labels.}

Optional labels on @code{end} statements ending subprograms and on
@code{exit} statements exiting named loops, are required to be present.
@end table

@geindex -gnatyf (gcc)


@table @asis

@item @code{-gnatyf}

@emph{No form feeds or vertical tabs.}

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

@geindex -gnatyg (gcc)


@table @asis

@item @code{-gnatyg}

@emph{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 @code{-gnatyydISux})
but additional style switches may be added to this set in the future without
advance notice.
@end table

@geindex -gnatyh (gcc)


@table @asis

@item @code{-gnatyh}

@emph{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.
@end table

@geindex -gnatyi (gcc)


@table @asis

@item @code{-gnatyi}

@emph{Check if-then layout.}

The keyword @code{then} must appear either on the same
line as corresponding @code{if}, or on a line on its own, lined
up under the @code{if}.
@end table

@geindex -gnatyI (gcc)


@table @asis

@item @code{-gnatyI}

@emph{check mode IN keywords.}

Mode @code{in} (the default mode) is not
allowed to be given explicitly. @code{in out} is fine,
but not @code{in} on its own.
@end table

@geindex -gnatyk (gcc)


@table @asis

@item @code{-gnatyk}

@emph{Check keyword casing.}

All keywords must be in lower case (with the exception of keywords
such as @code{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.
@end table

@geindex -gnatyl (gcc)


@table @asis

@item @code{-gnatyl}

@emph{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 @code{else} keyword must
be lined up with the corresponding @code{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
@code{record} keyword on the same line as the @code{type} keyword, and
then the @code{end} in @code{end record} must line up under @code{type}.
This is also permitted when the type declaration is split on two lines.
For example, any of the following three layouts is acceptable:

@example
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;
@end example

Second, in the case of a block statement, a permitted alternative
is to put the block label on the same line as the @code{declare} or
@code{begin} keyword, and then line the @code{end} keyword up under
the block label. For example both the following are permitted:

@example
Block : declare
   A : Integer := 3;
begin
   Proc (A, A);
end Block;

Block :
   declare
      A : Integer := 3;
   begin
      Proc (A, A);
   end Block;
@end example

The same alternative format is allowed for loops. For example, both of
the following are permitted:

@example
Clear : while J < 10 loop
   A (J) := 0;
end loop Clear;

Clear :
   while J < 10 loop
      A (J) := 0;
   end loop Clear;
@end example
@end table

@geindex -gnatyLnnn (gcc)


@table @asis

@item @code{-gnatyL}

@emph{Set maximum nesting level.}

The maximum level of nesting of constructs (including subprograms, loops,
blocks, packages, and conditionals) may not exceed the given value
@emph{nnn}. A value of zero disconnects this style check.
@end table

@geindex -gnatym (gcc)


@table @asis

@item @code{-gnatym}

@emph{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).
@end table

@geindex -gnatyMnnn (gcc)


@table @asis

@item @code{-gnatyM}

@emph{Set maximum line length.}

The length of lines must not exceed the
given value @emph{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.
@end table

@geindex -gnatyn (gcc)


@table @asis

@item @code{-gnatyn}

@emph{Check casing of entities in Standard.}

Any identifier from Standard must be cased
to match the presentation in the Ada Reference Manual (for example,
@code{Integer} and @code{ASCII.NUL}).
@end table

@geindex -gnatyN (gcc)


@table @asis

@item @code{-gnatyN}

@emph{Turn off all style checks.}

All style check options are turned off.
@end table

@geindex -gnatyo (gcc)


@table @asis

@item @code{-gnatyo}

@emph{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).
@end table

@geindex -gnatyO (gcc)


@table @asis

@item @code{-gnatyO}

@emph{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).
@end table

@geindex -gnatyp (gcc)


@table @asis

@item @code{-gnatyp}

@emph{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.
@end table

@geindex -gnatyr (gcc)


@table @asis

@item @code{-gnatyr}

@emph{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.
@end table

@geindex -gnatys (gcc)


@table @asis

@item @code{-gnatys}

@emph{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.
@end table

@geindex -gnatyS (gcc)


@table @asis

@item @code{-gnatyS}

@emph{Check no statements after then/else.}

No statements are allowed
on the same line as a @code{then} or @code{else} keyword following the
keyword in an @code{if} statement. @code{or else} and @code{and then} are not
affected, and a special exception allows a pragma to appear after @code{else}.
@end table

@geindex -gnatyt (gcc)


@table @asis

@item @code{-gnatyt}

@emph{Check token spacing.}

The following token spacing rules are enforced:


@itemize *

@item 
The keywords @code{abs} and @code{not} must be followed by a space.

@item 
The token @code{=>} must be surrounded by spaces.

@item 
The token @code{<>} must be preceded by a space or a left parenthesis.

@item 
Binary operators other than @code{**} must be surrounded by spaces.
There is no restriction on the layout of the @code{**} binary operator.

@item 
Colon must be surrounded by spaces.

@item 
Colon-equal (assignment, initialization) must be surrounded by spaces.

@item 
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.

@item 
If the token preceding a left parenthesis ends with a letter or digit, then
a space must separate the two tokens.

@item 
If the token following a right parenthesis starts with a letter or digit, then
a space must separate the two tokens.

@item 
A right parenthesis must either be the first non-blank character on
a line, or it must be preceded by a non-blank character.

@item 
A semicolon must not be preceded by a space, and must not be followed by
a non-blank character.

@item 
A unary plus or minus may not be followed by a space.

@item 
A vertical bar must be surrounded by spaces.
@end itemize

Exactly one blank (and no other white space) must appear between
a @code{not} token and a following @code{in} token.
@end table

@geindex -gnatyu (gcc)


@table @asis

@item @code{-gnatyu}

@emph{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.
@end table

@geindex -gnatyx (gcc)


@table @asis

@item @code{-gnatyx}

@emph{Check extra parentheses.}

Unnecessary extra level of parentheses (C-style) are not allowed
around conditions in @code{if} statements, @code{while} statements and
@code{exit} statements.
@end table

@geindex -gnatyy (gcc)


@table @asis

@item @code{-gnatyy}

@emph{Set all standard style check options.}

This is equivalent to @code{gnaty3aAbcefhiklmnprst}, that is all checking
options enabled with the exception of @code{-gnatyB}, @code{-gnatyd},
@code{-gnatyI}, @code{-gnatyLnnn}, @code{-gnatyo}, @code{-gnatyO},
@code{-gnatyS}, @code{-gnatyu}, and @code{-gnatyx}.
@end table

@geindex -gnaty- (gcc)


@table @asis

@item @code{-gnaty-}

@emph{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 @code{L} parameter without any integer value after that, because any
digit following @emph{-} in the parameter string of the @code{-gnaty}
option will be treated as canceling the indentation check. The same is true
for the @code{M} parameter. @code{y} and @code{N} parameters are not
allowed after @emph{-}.
@end table

@geindex -gnaty+ (gcc)


@table @asis

@item @code{-gnaty+}

@emph{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 table

@c end of switch description (leave this comment to ease automatic parsing for

@c 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 ‘@cite{(style)}’. Note that these messages are treated as warning
messages, so they normally do not prevent the generation of an object
file. The @code{-gnatwe} switch can be used to treat warning messages,
including style messages, as fatal errors.

The switch @code{-gnaty} on its own (that is not
followed by any letters or digits) is equivalent
to the use of @code{-gnatyy} as described above, that is all
built-in standard style check options are enabled.

The switch @code{-gnatyN} clears any previously set style checks.

@node Run-Time Checks,Using gcc for Syntax Checking,Style Checking,Compiler Switches
@anchor{gnat_ugn/building_executable_programs_with_gnat id19}@anchor{f5}@anchor{gnat_ugn/building_executable_programs_with_gnat run-time-checks}@anchor{ea}
@subsection Run-Time Checks


@geindex Division by zero

@geindex Access before elaboration

@geindex Checks
@geindex division by zero

@geindex Checks
@geindex access before elaboration

@geindex Checks
@geindex 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 @code{gcc}
switches refine this default behavior.

@geindex -gnatp (gcc)


@table @asis

@item @code{-gnatp}

@geindex Suppressing checks

@geindex Checks
@geindex suppressing

This switch causes the unit to be compiled
as though @code{pragma Suppress (All_checks)}
had been present in the source. Validity checks are also eliminated (in
other words @code{-gnatp} also implies @code{-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 @code{Alignment_Check},
@code{Duplicated_Tag_Check}, @code{Predicate_Check}, @code{Container_Checks}, @code{Tampering_Check},
and @code{Validity_Check}, as well as any checks introduced using @code{pragma Check_Name}.
Note that @code{Atomic_Synchronization} is not automatically suppressed by use of this option.

If the code depends on certain checks being active, you can use
pragma @code{Unsuppress} either as a configuration pragma or as
a local pragma to make sure that a specified check is performed
even if @code{gnatp} is specified.

The @code{-gnatp} switch has no effect if a subsequent
@code{-gnat-p} switch appears.
@end table

@geindex -gnat-p (gcc)

@geindex Suppressing checks

@geindex Checks
@geindex suppressing

@geindex Suppress


@table @asis

@item @code{-gnat-p}

This switch cancels the effect of a previous @code{gnatp} switch.
@end table

@geindex -gnato?? (gcc)

@geindex Overflow checks

@geindex Overflow mode

@geindex Check
@geindex overflow


@table @asis

@item @code{-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


@table @asis

@item @emph{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.

@item @emph{2 = MINIMIZED}

In MINIMIZED mode, overflows in intermediate operations are avoided
where possible by using a larger integer type for the computation
(typically @code{Long_Long_Integer}). Overflow checking ensures that
the result fits in this larger integer type.

@item @emph{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).
@end table

If two digits are present after @code{-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 @code{-gnato} in previous versions of GNAT.

@geindex Machine_Overflows

Note that the @code{-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 @code{Machine_Overflows}
attribute set to @code{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 @code{-gnato11} (equivalent to @code{-gnato1}),
so overflow checking is performed in STRICT mode by default.
@end table

@geindex -gnatE (gcc)

@geindex Elaboration checks

@geindex Check
@geindex elaboration


@table @asis

@item @code{-gnatE}

Enables dynamic checks for access-before-elaboration
on subprogram calls and generic instantiations.
Note that @code{-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{c7,,Compiling with gcc}.
@end table

@geindex -fstack-check (gcc)

@geindex Stack Overflow Checking

@geindex Checks
@geindex stack overflow checking


@table @asis

@item @code{-fstack-check}

Activates stack overflow checking. For full details of the effect and use of
this switch see @ref{e5,,Stack Overflow Checking}.
@end table

@geindex Unsuppress

The setting of these switches only controls the default setting of the
checks. You may modify them using either @code{Suppress} (to remove
checks) or @code{Unsuppress} (to add back suppressed checks) pragmas in
the program source.

@node Using gcc for Syntax Checking,Using gcc for Semantic Checking,Run-Time Checks,Compiler Switches
@anchor{gnat_ugn/building_executable_programs_with_gnat id20}@anchor{f6}@anchor{gnat_ugn/building_executable_programs_with_gnat using-gcc-for-syntax-checking}@anchor{f7}
@subsection Using @code{gcc} for Syntax Checking


@geindex -gnats (gcc)


@table @asis

@item @code{-gnats}

The @code{s} stands for ‘syntax’.

Run GNAT in syntax checking only mode. For
example, the command

@example
$ gcc -c -gnats x.adb
@end example

compiles file @code{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 @code{-c} (compile
only) flag in addition to the @code{-gnats} flag.

You may use other switches in conjunction with @code{-gnats}. In
particular, @code{-gnatl} and @code{-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:

@example
$ gcc -c -gnats -x ada toto.txt
toto.txt:1:01: warning: empty file, contains no compilation units
$
@end example

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 @code{X}
@emph{with}s a unit @code{Y}, compiling unit @code{X} in syntax
check only mode does not access the source file containing unit
@code{Y}.

@geindex Multiple units
@geindex 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 @code{gnatchop} utility
(@ref{1d,,Renaming Files with gnatchop}).
@end table

@node Using gcc for Semantic Checking,Compiling Different Versions of Ada,Using gcc for Syntax Checking,Compiler Switches
@anchor{gnat_ugn/building_executable_programs_with_gnat id21}@anchor{f8}@anchor{gnat_ugn/building_executable_programs_with_gnat using-gcc-for-semantic-checking}@anchor{f9}
@subsection Using @code{gcc} for Semantic Checking


@geindex -gnatc (gcc)


@table @asis

@item @code{-gnatc}

The @code{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:


@itemize *

@item 
The needed source files must be accessible
(see @ref{73,,Search Paths and the Run-Time Library (RTL)}).

@item 
Each file must contain only one compilation unit.

@item 
The file name and unit name must match (@ref{3b,,File Naming Rules}).
@end itemize

The output consists of error messages as appropriate. No object file is
generated. An @code{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).
@end table

@node Compiling Different Versions of Ada,Character Set Control,Using gcc for Semantic Checking,Compiler Switches
@anchor{gnat_ugn/building_executable_programs_with_gnat compiling-different-versions-of-ada}@anchor{6}@anchor{gnat_ugn/building_executable_programs_with_gnat id22}@anchor{fa}
@subsection 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.

@geindex Compatibility with Ada 83

@geindex -gnat83 (gcc)

@geindex ACVC
@geindex Ada 83 tests

@geindex Ada 83 mode


@table @asis

@item @code{-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
@code{-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 @code{<>} on
unconstrained 
@geindex 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
@code{-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 @emph{Compatibility and Porting Guide} chapter in the
@cite{GNAT Reference Manual}.
@end table

@geindex -gnat95 (gcc)

@geindex Ada 95 mode


@table @asis

@item @code{-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 @code{-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
@code{-gnat83}, @code{-gnat05/2005}, or @code{-gnat12/2012}
switch earlier in the command line.
@end table

@geindex -gnat05 (gcc)

@geindex -gnat2005 (gcc)

@geindex Ada 2005 mode


@table @asis

@item @code{-gnat05} or @code{-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
@code{-gnat83} and @code{-gnat95} switches for further
information).
@end table

@geindex -gnat12 (gcc)

@geindex -gnat2012 (gcc)

@geindex Ada 2012 mode


@table @asis

@item @code{-gnat12} or @code{-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
@code{-gnat83}, @code{-gnat95}, and @code{-gnat05/2005} switches
for further information).
@end table

@geindex -gnat2022 (gcc)

@geindex Ada 2022 mode


@table @asis

@item @code{-gnat2022} (Ada 2022 mode)

This switch directs the compiler to implement the Ada 2022 version of the
language.
@end table

@geindex -gnatX (gcc)

@geindex Ada language extensions

@geindex GNAT extensions


@table @asis

@item @code{-gnatX} (Enable GNAT Extensions)

This switch directs the compiler to implement the latest version of the
language (currently Ada 2022) and also to enable certain GNAT implementation
extensions that are not part of any Ada standard. For a full list of these
extensions, see the GNAT reference manual, @code{Pragma Extensions_Allowed}.
@end table

@node Character Set Control,File Naming Control,Compiling Different Versions of Ada,Compiler Switches
@anchor{gnat_ugn/building_executable_programs_with_gnat character-set-control}@anchor{31}@anchor{gnat_ugn/building_executable_programs_with_gnat id23}@anchor{fb}
@subsection Character Set Control


@geindex -gnati (gcc)


@table @asis

@item @code{-gnati@emph{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. @code{c} is a
single character  indicating the character set, as follows:


@multitable {xxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@emph{1}

@tab

ISO 8859-1 (Latin-1) identifiers

@item

@emph{2}

@tab

ISO 8859-2 (Latin-2) letters allowed in identifiers

@item

@emph{3}

@tab

ISO 8859-3 (Latin-3) letters allowed in identifiers

@item

@emph{4}

@tab

ISO 8859-4 (Latin-4) letters allowed in identifiers

@item

@emph{5}

@tab

ISO 8859-5 (Cyrillic) letters allowed in identifiers

@item

@emph{9}

@tab

ISO 8859-15 (Latin-9) letters allowed in identifiers

@item

@emph{p}

@tab

IBM PC letters (code page 437) allowed in identifiers

@item

@emph{8}

@tab

IBM PC letters (code page 850) allowed in identifiers

@item

@emph{f}

@tab

Full upper-half codes allowed in identifiers

@item

@emph{n}

@tab

No upper-half codes allowed in identifiers

@item

@emph{w}

@tab

Wide-character codes (that is, codes greater than 255)
allowed in identifiers

@end multitable


See @ref{23,,Foreign Language Representation} for full details on the
implementation of these character sets.
@end table

@geindex -gnatW (gcc)


@table @asis

@item @code{-gnatW@emph{e}}

Specify the method of encoding for wide characters.
@code{e} is one of the following:


@multitable {xxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@emph{h}

@tab

Hex encoding (brackets coding also recognized)

@item

@emph{u}

@tab

Upper half encoding (brackets encoding also recognized)

@item

@emph{s}

@tab

Shift/JIS encoding (brackets encoding also recognized)

@item

@emph{e}

@tab

EUC encoding (brackets encoding also recognized)

@item

@emph{8}

@tab

UTF-8 encoding (brackets encoding also recognized)

@item

@emph{b}

@tab

Brackets encoding only (default value)

@end multitable


For full details on these encoding
methods see @ref{37,,Wide_Character Encodings}.
Note that brackets coding is always accepted, even if one of the other
options is specified, so for example @code{-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 @code{-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.
@end table

When no @code{-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.

@node File Naming Control,Subprogram Inlining Control,Character Set Control,Compiler Switches
@anchor{gnat_ugn/building_executable_programs_with_gnat file-naming-control}@anchor{fc}@anchor{gnat_ugn/building_executable_programs_with_gnat id24}@anchor{fd}
@subsection File Naming Control


@geindex -gnatk (gcc)


@table @asis

@item @code{-gnatk@emph{n}}

Activates file name ‘krunching’. @code{n}, a decimal integer in the range
1-999, indicates the maximum allowable length of a file name (not
including the @code{.ads} or @code{.adb} extension). The default is not
to enable file name krunching.

For the source file naming rules, @ref{3b,,File Naming Rules}.
@end table

@node Subprogram Inlining Control,Auxiliary Output Control,File Naming Control,Compiler Switches
@anchor{gnat_ugn/building_executable_programs_with_gnat id25}@anchor{fe}@anchor{gnat_ugn/building_executable_programs_with_gnat subprogram-inlining-control}@anchor{ff}
@subsection Subprogram Inlining Control


@geindex -gnatn (gcc)


@table @asis

@item @code{-gnatn[12]}

The @code{n} here is intended to suggest the first syllable of the word ‘inline’.
GNAT recognizes and processes @code{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 @code{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 @code{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 @code{-O1}, @code{-O2} or
@code{-Os} and 2 for @code{-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{100,,Inlining of Subprograms}.
@end table

@geindex -gnatN (gcc)


@table @asis

@item @code{-gnatN}

This switch activates front-end inlining which also
generates additional dependencies.

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

@node Auxiliary Output Control,Debugging Control,Subprogram Inlining Control,Compiler Switches
@anchor{gnat_ugn/building_executable_programs_with_gnat auxiliary-output-control}@anchor{101}@anchor{gnat_ugn/building_executable_programs_with_gnat id26}@anchor{102}
@subsection Auxiliary Output Control


@geindex -gnatu (gcc)


@table @asis

@item @code{-gnatu}

Print a list of units required by this compilation on @code{stdout}.
The listing includes all units on which the unit being compiled depends
either directly or indirectly.
@end table

@geindex -pass-exit-codes (gcc)


@table @asis

@item @code{-pass-exit-codes}

If this switch is not used, the exit code returned by @code{gcc} when
compiling multiple files indicates whether all source files have
been successfully used to generate object files or not.

When @code{-pass-exit-codes} is used, @code{gcc} exits with an extended
exit status and allows an integrated development environment to better
react to a compilation failure. Those exit status are:


@multitable {xxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@emph{5}

@tab

There was an error in at least one source file.

@item

@emph{3}

@tab

At least one source file did not generate an object file.

@item

@emph{2}

@tab

The compiler died unexpectedly (internal error for example).

@item

@emph{0}

@tab

An object file has been generated for every source file.

@end multitable

@end table

@node Debugging Control,Exception Handling Control,Auxiliary Output Control,Compiler Switches
@anchor{gnat_ugn/building_executable_programs_with_gnat debugging-control}@anchor{103}@anchor{gnat_ugn/building_executable_programs_with_gnat id27}@anchor{104}
@subsection Debugging Control


@quotation

@geindex Debugging options
@end quotation

@geindex -gnatd (gcc)


@table @asis

@item @code{-gnatd@emph{x}}

Activate internal debugging switches. @code{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 @code{Debug} unit in the compiler source
file @code{debug.adb}.
@end table

@geindex -gnatG (gcc)


@table @asis

@item @code{-gnatG[=@emph{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 @code{-gnatG} you can identify
these cases, and consider whether it may be desirable to modify the coding
approach to improve efficiency.

The optional parameter @code{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 @code{Sprint} in file @code{sprint.ads} for a full list.

@geindex -gnatL (gcc)

If the switch @code{-gnatL} is used in conjunction with
@code{-gnatG}, then the original source lines are interspersed
in the expanded source (as comment lines with the original line number).


@table @asis

@item @code{new @emph{xxx} [storage_pool = @emph{yyy}]}

Shows the storage pool being used for an allocator.

@item @code{at end @emph{procedure-name};}

Shows the finalization (cleanup) procedure for a scope.

@item @code{(if @emph{expr} then @emph{expr} else @emph{expr})}

Conditional expression equivalent to the @code{x?y:z} construction in C.

@item @code{@emph{target}^(@emph{source})}

A conversion with floating-point truncation instead of rounding.

@item @code{@emph{target}?(@emph{source})}

A conversion that bypasses normal Ada semantic checking. In particular
enumeration types and fixed-point types are treated simply as integers.

@item @code{@emph{target}?^(@emph{source})}

Combines the above two cases.
@end table

@code{@emph{x} #/ @emph{y}}

@code{@emph{x} #mod @emph{y}}

@code{@emph{x} # @emph{y}}


@table @asis

@item @code{@emph{x} #rem @emph{y}}

A division or multiplication of fixed-point values which are treated as
integers without any kind of scaling.

@item @code{free @emph{expr} [storage_pool = @emph{xxx}]}

Shows the storage pool associated with a @code{free} statement.

@item @code{[subtype or type declaration]}

Used to list an equivalent declaration for an internally generated
type that is referenced elsewhere in the listing.

@item @code{freeze @emph{type-name} [@emph{actions}]}

Shows the point at which @code{type-name} is frozen, with possible
associated actions to be performed at the freeze point.

@item @code{reference @emph{itype}}

Reference (and hence definition) to internal type @code{itype}.

@item @code{@emph{function-name}! (@emph{arg}, @emph{arg}, @emph{arg})}

Intrinsic function call.

@item @code{@emph{label-name} : label}

Declaration of label @code{labelname}.

@item @code{#$ @emph{subprogram-name}}

An implicit call to a run-time support routine
(to meet the requirement of H.3.1(9) in a
convenient manner).

@item @code{@emph{expr} && @emph{expr} && @emph{expr} ... && @emph{expr}}

A multiple concatenation (same effect as @code{expr} & @code{expr} &
@code{expr}, but handled more efficiently).

@item @code{[constraint_error]}

Raise the @code{Constraint_Error} exception.

@item @code{@emph{expression}'reference}

A pointer to the result of evaluating @{expression@}.

@item @code{@emph{target-type}!(@emph{source-expression})}

An unchecked conversion of @code{source-expression} to @code{target-type}.

@item @code{[@emph{numerator}/@emph{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).
@end table
@end table

@geindex -gnatD (gcc)


@table @asis

@item @code{-gnatD[=nn]}

When used in conjunction with @code{-gnatG}, this switch causes
the expanded source, as described above for
@code{-gnatG} to be written to files with names
@code{xxx.dg}, where @code{xxx} is the normal file name,
instead of to the standard output file. For
example, if the source file name is @code{hello.adb}, then a file
@code{hello.adb.dg} will be written.  The debugging
information generated by the @code{gcc} @code{-g} switch
will refer to the generated @code{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
@code{-gnatx}) since otherwise the cross-reference information
would refer to the @code{.dg} file, which would cause
confusion since this is not the original source file.

Note that @code{-gnatD} actually implies @code{-gnatG}
automatically, so it is not necessary to give both options.
In other words @code{-gnatD} is equivalent to @code{-gnatDG}).

@geindex -gnatL (gcc)

If the switch @code{-gnatL} is used in conjunction with
@code{-gnatDG}, then the original source lines are interspersed
in the expanded source (as comment lines with the original line number).

The optional parameter @code{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.
@end table

@geindex -gnatr (gcc)

@geindex pragma Restrictions


@table @asis

@item @code{-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.
@end table

@geindex -gnatR (gcc)


@table @asis

@item @code{-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 @code{-gnatR0}, no information is output (equivalent to omitting
the @code{-gnatR} switch). For @code{-gnatR1} (which is the default,
so @code{-gnatR} with no parameter has the same effect), size and
alignment information is listed for declared array and record types.

For @code{-gnatR2}, size and alignment information is listed for all
declared types and objects. The @code{Linker_Section} is also listed for any
entity for which the @code{Linker_Section} is set explicitly or implicitly (the
latter case occurs for objects of a type for which a @code{Linker_Section}
is set).

For @code{-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 @code{repinfo.ads/adb} in the
GNAT sources for full details on the format of @code{-gnatR3} output.

For @code{-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 @code{e} (e.g. @code{-gnatR2e}), then
extended representation information for record sub-components of records
is included.

If the switch is followed by an @code{m} (e.g. @code{-gnatRm}), then
subprogram conventions and parameter passing mechanisms for all the
subprograms are included.

If the switch is followed by a @code{j} (e.g., @code{-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 @code{s} (e.g., @code{-gnatR3s}), then
the output is to a file with the name @code{file.rep} where @code{file} is
the name of the corresponding source file, except if @code{j} is also
specified, in which case the file name is @code{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 @code{at 0 range 0 .. -1}.
@end table

@geindex -gnatS (gcc)


@table @asis

@item @code{-gnatS}

The use of the switch @code{-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.
@end table

@geindex -gnatx (gcc)


@table @asis

@item @code{-gnatx}

Normally the compiler generates full cross-referencing information in
the @code{ALI} file. This information is used by a number of tools,
including @code{gnatfind} and @code{gnatxref}. The @code{-gnatx} switch
suppresses this information. This saves some space and may slightly
speed up compilation, but means that these tools cannot be used.
@end table

@geindex -fgnat-encodings (gcc)


@table @asis

@item @code{-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
@code{-fgnat-encodings} is about.


@itemize *

@item 
@code{=all}: Emit all GNAT encodings, and then emit as much standard DWARF as
possible so it does not conflict with GNAT encodings.

@item 
@code{=gdb}: Emit as much standard DWARF as possible as long as the current
GDB handles it. Emit GNAT encodings for the rest.

@item 
@code{=minimal}: Emit as much standard DWARF as possible and emit GNAT
encodings for the rest.
@end itemize
@end table

@node Exception Handling Control,Units to Sources Mapping Files,Debugging Control,Compiler Switches
@anchor{gnat_ugn/building_executable_programs_with_gnat exception-handling-control}@anchor{105}@anchor{gnat_ugn/building_executable_programs_with_gnat id28}@anchor{106}
@subsection Exception Handling Control


GNAT uses two methods for handling exceptions at run time. The
@code{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 @code{-funwind-tables} GCC’s
option.

The following switches may be used to control which of the
two exception handling methods is used.

@geindex --RTS=sjlj (gnatmake)


@table @asis

@item @code{--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.
@end table

@geindex --RTS=zcx (gnatmake)

@geindex Zero Cost Exceptions


@table @asis

@item @code{--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.
@end table

The same option @code{--RTS} must be used both for @code{gcc}
and @code{gnatbind}. Passing this option to @code{gnatmake}
(@ref{ce,,Switches for gnatmake}) will ensure the required consistency
through the compilation and binding steps.

@node Units to Sources Mapping Files,Code Generation Control,Exception Handling Control,Compiler Switches
@anchor{gnat_ugn/building_executable_programs_with_gnat id29}@anchor{107}@anchor{gnat_ugn/building_executable_programs_with_gnat units-to-sources-mapping-files}@anchor{e8}
@subsection Units to Sources Mapping Files


@geindex -gnatem (gcc)


@table @asis

@item @code{-gnatem=@emph{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 @code{-gnatem} switch is not a switch that you would use
explicitly. It is intended primarily for use by automatic tools such as
@code{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 @code{%s} appended
for specs and @code{%b} appended for bodies; the second line is the
file name; and the third line is the path name.

Example:

@example
main%b
main.2.ada
/gnat/project1/sources/main.2.ada
@end example

When the switch @code{-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 @code{-gnatem} switches may be specified; however, only the
last one on the command line will be taken into account.

When using a project file, @code{gnatmake} creates a temporary
mapping file and communicates it to the compiler using this switch.
@end table

@node Code Generation Control,,Units to Sources Mapping Files,Compiler Switches
@anchor{gnat_ugn/building_executable_programs_with_gnat code-generation-control}@anchor{108}@anchor{gnat_ugn/building_executable_programs_with_gnat id30}@anchor{109}
@subsection Code Generation Control


The GCC technology provides a wide range of target dependent
@code{-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 @code{-m} switches may be
found in the GCC documentation.

Use of these @code{-m} switches may in some cases result in improved
code performance.

The GNAT technology is tested and qualified without any
@code{-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 @code{-m} switches unless
special needs lead to requirements in this area. In particular,
there is no point in using @code{-m} switches to improve performance
unless you actually see a performance improvement.

@node Linker Switches,Binding with gnatbind,Compiler Switches,Building Executable Programs with GNAT
@anchor{gnat_ugn/building_executable_programs_with_gnat id31}@anchor{10a}@anchor{gnat_ugn/building_executable_programs_with_gnat linker-switches}@anchor{10b}
@section Linker Switches


Linker switches can be specified after @code{-largs} builder switch.

@geindex -fuse-ld=name


@table @asis

@item @code{-fuse-ld=@emph{name}}

Linker to be used. The default is @code{bfd} for @code{ld.bfd},
the alternative being @code{gold} for @code{ld.gold}. The later is
a more recent and faster linker, but only available on GNU/Linux
platforms.
@end table

@node Binding with gnatbind,Linking with gnatlink,Linker Switches,Building Executable Programs with GNAT
@anchor{gnat_ugn/building_executable_programs_with_gnat binding-with-gnatbind}@anchor{c8}@anchor{gnat_ugn/building_executable_programs_with_gnat id32}@anchor{10c}
@section Binding with @code{gnatbind}


@geindex gnatbind

This chapter describes the GNAT binder, @code{gnatbind}, which is used
to bind compiled GNAT objects.

The @code{gnatbind} program performs four separate functions:


@itemize *

@item 
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.

@item 
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.

@item 
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 @code{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.

@item 
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 @code{gnatlink} utility used to link the Ada application.
@end itemize

@menu
* Running gnatbind:: 
* Switches for gnatbind:: 
* Command-Line Access:: 
* Search Paths for gnatbind:: 
* Examples of gnatbind Usage:: 

@end menu

@node Running gnatbind,Switches for gnatbind,,Binding with gnatbind
@anchor{gnat_ugn/building_executable_programs_with_gnat id33}@anchor{10d}@anchor{gnat_ugn/building_executable_programs_with_gnat running-gnatbind}@anchor{10e}
@subsection Running @code{gnatbind}


The form of the @code{gnatbind} command is

@example
$ gnatbind [ switches ] mainprog[.ali] [ switches ]
@end example

where @code{mainprog.adb} is the Ada file containing the main program
unit body. @code{gnatbind} constructs an Ada
package in two files whose names are
@code{b~mainprog.ads}, and @code{b~mainprog.adb}.
For example, if given the
parameter @code{hello.ali}, for a main program contained in file
@code{hello.adb}, the binder output files would be @code{b~hello.ads}
and @code{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 @code{Pack}, whose
@code{.ALI}
file is @code{pack.ali} and whose corresponding source spec file is
@code{pack.ads}, it attempts to locate the source file @code{pack.ads}
(using the same search path conventions as previously described for the
@code{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 @code{ALI} files
match. In other words, any @code{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).

@geindex Source files
@geindex 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 @code{hello.adb} and a
package @code{P}, from file @code{p.ads} and you perform the following
steps:


@itemize *

@item 
Enter @code{gcc -c hello.adb} to compile the main program.

@item 
Enter @code{gcc -c p.ads} to compile package @code{P}.

@item 
Edit file @code{p.ads}.

@item 
Enter @code{gnatbind hello}.
@end itemize

At this point, the file @code{p.ali} contains an out-of-date time stamp
because the file @code{p.ads} has been edited. The attempt at binding
fails, and the binder generates the following error messages:

@example
error: "hello.adb" must be recompiled ("p.ads" has been modified)
error: "p.ads" has been modified and must be recompiled
@end example

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{e,,Example of Binder Output File}.

In most normal usage, the default mode of @code{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 @code{-g} switch is used for
@code{gnatbind} and @code{gnatlink}.

@node Switches for gnatbind,Command-Line Access,Running gnatbind,Binding with gnatbind
@anchor{gnat_ugn/building_executable_programs_with_gnat id34}@anchor{10f}@anchor{gnat_ugn/building_executable_programs_with_gnat switches-for-gnatbind}@anchor{110}
@subsection Switches for @code{gnatbind}


The following switches are available with @code{gnatbind}; details will
be presented in subsequent sections.

@geindex --version (gnatbind)


@table @asis

@item @code{--version}

Display Copyright and version, then exit disregarding all other options.
@end table

@geindex --help (gnatbind)


@table @asis

@item @code{--help}

If @code{--version} was not used, display usage, then exit disregarding
all other options.
@end table

@geindex -a (gnatbind)


@table @asis

@item @code{-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.
@end table

@geindex -aO (gnatbind)


@table @asis

@item @code{-aO}

Specify directory to be searched for ALI files.
@end table

@geindex -aI (gnatbind)


@table @asis

@item @code{-aI}

Specify directory to be searched for source file.
@end table

@geindex -A (gnatbind)


@table @asis

@item @code{-A[=@emph{filename}]}

Output ALI list (to standard output or to the named file).
@end table

@geindex -b (gnatbind)


@table @asis

@item @code{-b}

Generate brief messages to @code{stderr} even if verbose mode set.
@end table

@geindex -c (gnatbind)


@table @asis

@item @code{-c}

Check only, no generation of binder output file.
@end table

@geindex -dnn[k|m] (gnatbind)


@table @asis

@item @code{-d@emph{nn}[k|m]}

This switch can be used to change the default task stack size value
to a specified size @code{nn}, which is expressed in bytes by default, or
in kilobytes when suffixed with @code{k} or in megabytes when suffixed
with @code{m}.
In the absence of a @code{[k|m]} suffix, this switch is equivalent,
in effect, to completing all task specs with

@example
pragma Storage_Size (nn);
@end example

When they do not already have such a pragma.
@end table

@geindex -D (gnatbind)


@table @asis

@item @code{-D@emph{nn}[k|m]}

Set the default secondary stack size to @code{nn}. The suffix indicates whether
the size is in bytes (no suffix), kilobytes (@code{k} suffix) or megabytes
(@code{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.
@end table

@geindex -e (gnatbind)


@table @asis

@item @code{-e}

Output complete list of elaboration-order dependencies.
@end table

@geindex -Ea (gnatbind)


@table @asis

@item @code{-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 @code{GNAT.Traceback} and
@code{GNAT.Traceback.Symbolic} for more information.
Note that on x86 ports, you must not use @code{-fomit-frame-pointer}
@code{gcc} option.
@end table

@geindex -Es (gnatbind)


@table @asis

@item @code{-Es}

Store tracebacks in exception occurrences when the target supports it.
The “s” is for “symbolic”; symbolic tracebacks are enabled.
@end table

@geindex -E (gnatbind)


@table @asis

@item @code{-E}

Currently the same as @code{-Ea}.
@end table

@geindex -f (gnatbind)


@table @asis

@item @code{-f@emph{elab-order}}

Force elaboration order. For further details see @ref{111,,Elaboration Control}
and @ref{f,,Elaboration Order Handling in GNAT}.
@end table

@geindex -F (gnatbind)


@table @asis

@item @code{-F}

Force the checks of elaboration flags. @code{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.
@end table

@geindex -h (gnatbind)


@table @asis

@item @code{-h}

Output usage (help) information.
@end table

@geindex -H (gnatbind)


@table @asis

@item @code{-H}

Legacy elaboration order model enabled. For further details see
@ref{f,,Elaboration Order Handling in GNAT}.
@end table

@geindex -H32 (gnatbind)


@table @asis

@item @code{-H32}

Use 32-bit allocations for @code{__gnat_malloc} (and thus for access types).
For further details see @ref{112,,Dynamic Allocation Control}.
@end table

@geindex -H64 (gnatbind)

@geindex __gnat_malloc


@table @asis

@item @code{-H64}

Use 64-bit allocations for @code{__gnat_malloc} (and thus for access types).
For further details see @ref{112,,Dynamic Allocation Control}.

@geindex -I (gnatbind)

@item @code{-I}

Specify directory to be searched for source and ALI files.

@geindex -I- (gnatbind)

@item @code{-I-}

Do not look for sources in the current directory where @code{gnatbind} was
invoked, and do not look for ALI files in the directory containing the
ALI file named in the @code{gnatbind} command line.

@geindex -l (gnatbind)

@item @code{-l}

Output chosen elaboration order.

@geindex -L (gnatbind)

@item @code{-L@emph{xxx}}

Bind the units for library building. In this case the @code{adainit} and
@code{adafinal} procedures (@ref{a0,,Binding with Non-Ada Main Programs})
are renamed to @code{@emph{xxx}init} and
@code{@emph{xxx}final}.
Implies -n.
(@ref{2a,,GNAT and Libraries}, for more details.)

@geindex -M (gnatbind)

@item @code{-M@emph{xyz}}

Rename generated main program from main to xyz. This option is
supported on cross environments only.

@geindex -m (gnatbind)

@item @code{-m@emph{n}}

Limit number of detected errors or warnings to @code{n}, where @code{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.

@geindex -minimal (gnatbind)

@item @code{-minimal}

Generate a binder file suitable for space-constrained applications. When
active, binder-generated objects not required for program operation are no
longer generated. @strong{Warning:} this option comes with the following
limitations:


@itemize *

@item 
Starting the program’s execution in the debugger will cause it to
stop at the start of the @code{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.

@item 
Programs using GNAT.Compiler_Version will not link.
@end itemize

@geindex -n (gnatbind)

@item @code{-n}

No main program.

@geindex -nostdinc (gnatbind)

@item @code{-nostdinc}

Do not look for sources in the system default directory.

@geindex -nostdlib (gnatbind)

@item @code{-nostdlib}

Do not look for library files in the system default directory.

@geindex --RTS (gnatbind)

@item @code{--RTS=@emph{rts-path}}

Specifies the default location of the run-time library. Same meaning as the
equivalent @code{gnatmake} flag (@ref{ce,,Switches for gnatmake}).

@geindex -o (gnatbind)

@item @code{-o @emph{file}}

Name the output file @code{file} (default is @code{b~`xxx}.adb`).
Note that if this option is used, then linking must be done manually,
gnatlink cannot be used.

@geindex -O (gnatbind)

@item @code{-O[=@emph{filename}]}

Output object list (to standard output or to the named file).

@geindex -p (gnatbind)

@item @code{-p}

Pessimistic (worst-case) elaboration order.

@geindex -P (gnatbind)

@item @code{-P}

Generate binder file suitable for CodePeer.

@geindex -R (gnatbind)

@item @code{-R}

Output closure source list, which includes all non-run-time units that are
included in the bind.

@geindex -Ra (gnatbind)

@item @code{-Ra}

Like @code{-R} but the list includes run-time units.

@geindex -s (gnatbind)

@item @code{-s}

Require all source files to be present.

@geindex -S (gnatbind)

@item @code{-S@emph{xxx}}

Specifies the value to be used when detecting uninitialized scalar
objects with pragma Initialize_Scalars.
The @code{xxx} string specified with the switch is one of:


@itemize *

@item 
@code{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).

@item 
@code{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).

@item 
@code{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).

@item 
@code{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 @code{BF} is given,
then a 32-bit scalar value will be set to the bit patterm @code{16#BFBFBFBF#}.
@end itemize

@geindex GNAT_INIT_SCALARS

In addition, you can specify @code{-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 @code{GNAT_INIT_SCALARS=@emph{yy}}, where @code{yy} is one
of @code{in/lo/hi/@emph{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 @code{in} (invalid values).
@end table

@geindex -static (gnatbind)


@table @asis

@item @code{-static}

Link against a static GNAT run-time.

@geindex -shared (gnatbind)

@item @code{-shared}

Link against a shared GNAT run-time when available.

@geindex -t (gnatbind)

@item @code{-t}

Tolerate time stamp and other consistency errors.

@geindex -T (gnatbind)

@item @code{-T@emph{n}}

Set the time slice value to @code{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 @code{FIFO_Within_Priorities}.

@geindex -u (gnatbind)

@item @code{-u@emph{n}}

Enable dynamic stack usage, with @code{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{113,,Dynamic Stack Usage Analysis} for details.)

@geindex -v (gnatbind)

@item @code{-v}

Verbose mode. Write error messages, header, summary output to
@code{stdout}.

@geindex -V (gnatbind)

@item @code{-V@emph{key}=@emph{value}}

Store the given association of @code{key} to @code{value} in the bind environment.
Values stored this way can be retrieved at run time using
@code{GNAT.Bind_Environment}.

@geindex -w (gnatbind)

@item @code{-w@emph{x}}

Warning mode; @code{x} = s/e for suppress/treat as error.

@geindex -Wx (gnatbind)

@item @code{-Wx@emph{e}}

Override default wide character encoding for standard Text_IO files.

@geindex -x (gnatbind)

@item @code{-x}

Exclude source files (check object consistency only).

@geindex -xdr (gnatbind)

@item @code{-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
@code{Ada.IO_Exceptions.Device_Error} is raised if any attempt is made
at streaming 128-bit integer types with it.

@geindex -Xnnn (gnatbind)

@item @code{-X@emph{nnn}}

Set default exit status value, normally 0 for POSIX compliance.

@geindex -y (gnatbind)

@item @code{-y}

Enable leap seconds support in @code{Ada.Calendar} and its children.

@geindex -z (gnatbind)

@item @code{-z}

No main subprogram.
@end table

You may obtain this listing of switches by running @code{gnatbind} with
no arguments.

@menu
* Consistency-Checking Modes:: 
* Binder Error Message Control:: 
* Elaboration Control:: 
* Output Control:: 
* Dynamic Allocation Control:: 
* Binding with Non-Ada Main Programs:: 
* Binding Programs with No Main Subprogram:: 

@end menu

@node Consistency-Checking Modes,Binder Error Message Control,,Switches for gnatbind
@anchor{gnat_ugn/building_executable_programs_with_gnat consistency-checking-modes}@anchor{114}@anchor{gnat_ugn/building_executable_programs_with_gnat id35}@anchor{115}
@subsubsection Consistency-Checking Modes


As described earlier, by default @code{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.

@quotation

@geindex -s (gnatbind)
@end quotation


@table @asis

@item @code{-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.

@geindex -Wx (gnatbind)

@item @code{-Wx@emph{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
@code{-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.

@geindex -x (gnatbind)

@item @code{-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 @code{gnatmake} because in this
case the checking against sources has already been performed by
@code{gnatmake} in the course of compilation (i.e., before binding).
@end table

@node Binder Error Message Control,Elaboration Control,Consistency-Checking Modes,Switches for gnatbind
@anchor{gnat_ugn/building_executable_programs_with_gnat binder-error-message-control}@anchor{116}@anchor{gnat_ugn/building_executable_programs_with_gnat id36}@anchor{117}
@subsubsection Binder Error Message Control


The following switches provide control over the generation of error
messages from the binder:

@quotation

@geindex -v (gnatbind)
@end quotation


@table @asis

@item @code{-v}

Verbose mode. In the normal mode, brief error messages are generated to
@code{stderr}. If this switch is present, a header is written
to @code{stdout} and any error messages are directed to @code{stdout}.
All that is written to @code{stderr} is a brief summary message.

@geindex -b (gnatbind)

@item @code{-b}

Generate brief error messages to @code{stderr} even if verbose mode is
specified. This is relevant only when used with the
@code{-v} switch.

@geindex -m (gnatbind)

@item @code{-m@emph{n}}

Limits the number of error messages to @code{n}, a decimal integer in the
range 1-999. The binder terminates immediately if this limit is reached.

@geindex -M (gnatbind)

@item @code{-M@emph{xxx}}

Renames the generated main program from @code{main} to @code{xxx}.
This is useful in the case of some cross-building environments, where
the actual main program is separate from the one generated
by @code{gnatbind}.

@geindex -ws (gnatbind)

@geindex Warnings

@item @code{-ws}

Suppress all warning messages.

@geindex -we (gnatbind)

@item @code{-we}

Treat any warning messages as fatal errors.

@geindex -t (gnatbind)

@geindex Time stamp checks
@geindex in binder

@geindex Binder consistency checks

@geindex Consistency checks
@geindex in binder

@item @code{-t}

The binder performs a number of consistency checks including:


@itemize *

@item 
Check that time stamps of a given source unit are consistent

@item 
Check that checksums of a given source unit are consistent

@item 
Check that consistent versions of @code{GNAT} were used for compilation

@item 
Check consistency of configuration pragmas as required
@end itemize

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 @code{-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.

@cartouche
@quotation Note 
This means that @code{-t} should be used only in unusual situations,
with extreme care.
@end quotation
@end cartouche
@end table

@node Elaboration Control,Output Control,Binder Error Message Control,Switches for gnatbind
@anchor{gnat_ugn/building_executable_programs_with_gnat elaboration-control}@anchor{111}@anchor{gnat_ugn/building_executable_programs_with_gnat id37}@anchor{118}
@subsubsection Elaboration Control


The following switches provide additional control over the elaboration
order. For further details see @ref{f,,Elaboration Order Handling in GNAT}.

@geindex -f (gnatbind)


@table @asis

@item @code{-f@emph{elab-order}}

Force elaboration order.

@code{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:

@example
this (spec)
this (body)
that (spec)
that (body)
@end example

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 @code{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.
@end table

@geindex -p (gnatbind)


@table @asis

@item @code{-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
@code{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 @code{-p} switch if dynamic
elaboration checking is used (@code{-gnatE} switch used for compilation).
This is because in the default static elaboration mode, all necessary
@code{Elaborate} and @code{Elaborate_All} pragmas are implicitly inserted.
These implicit pragmas are still respected by the binder in @code{-p}
mode, so a safe elaboration order is assured.

Note that @code{-p} is not intended for production use; it is more for
debugging/experimental use.
@end table

@node Output Control,Dynamic Allocation Control,Elaboration Control,Switches for gnatbind
@anchor{gnat_ugn/building_executable_programs_with_gnat id38}@anchor{119}@anchor{gnat_ugn/building_executable_programs_with_gnat output-control}@anchor{11a}
@subsubsection Output Control


The following switches allow additional control over the output
generated by the binder.

@quotation

@geindex -c (gnatbind)
@end quotation


@table @asis

@item @code{-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.

@geindex -e (gnatbind)

@item @code{-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 @code{stdout}.

@geindex -h (gnatbind)

@item @code{-h}

Output usage information. The output is written to @code{stdout}.

@geindex -K (gnatbind)

@item @code{-K}

Output linker options to @code{stdout}. Includes library search paths,
contents of pragmas Ident and Linker_Options, and libraries added
by @code{gnatbind}.

@geindex -l (gnatbind)

@item @code{-l}

Output chosen elaboration order. The output is written to @code{stdout}.

@geindex -O (gnatbind)

@item @code{-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 @code{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.

@geindex -o (gnatbind)

@item @code{-o @emph{file}}

Set name of output file to @code{file} instead of the normal
@code{b~`mainprog}.adb` default. Note that @code{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.

@geindex -r (gnatbind)

@item @code{-r}

Generate list of @code{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.
@end table

@node Dynamic Allocation Control,Binding with Non-Ada Main Programs,Output Control,Switches for gnatbind
@anchor{gnat_ugn/building_executable_programs_with_gnat dynamic-allocation-control}@anchor{112}@anchor{gnat_ugn/building_executable_programs_with_gnat id39}@anchor{11b}
@subsubsection Dynamic Allocation Control


The heap control switches – @code{-H32} and @code{-H64} –
determine whether dynamic allocation uses 32-bit or 64-bit memory.
They only affect compiler-generated allocations via @code{__gnat_malloc};
explicit calls to @code{malloc} and related functions from the C
run-time library are unaffected.


@table @asis

@item @code{-H32}

Allocate memory on 32-bit heap

@item @code{-H64}

Allocate memory on 64-bit heap.  This is the default
unless explicitly overridden by a @code{'Size} clause on the access type.
@end table

These switches are only effective on VMS platforms.

@node Binding with Non-Ada Main Programs,Binding Programs with No Main Subprogram,Dynamic Allocation Control,Switches for gnatbind
@anchor{gnat_ugn/building_executable_programs_with_gnat binding-with-non-ada-main-programs}@anchor{a0}@anchor{gnat_ugn/building_executable_programs_with_gnat id40}@anchor{11c}
@subsubsection 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 @code{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{2c,,Mixed Language Programming}).
The following switch is used in this situation:

@quotation

@geindex -n (gnatbind)
@end quotation


@table @asis

@item @code{-n}

No main program. The main program is not in Ada.
@end table

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:

@quotation

@geindex adainit


@table @asis

@item @code{adainit}

You must call this routine to initialize the Ada part of the program by
calling the necessary elaboration routines. A call to @code{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.
@end table

@geindex adafinal


@table @asis

@item @code{adafinal}

You must call this routine to perform any library-level finalization
required by the Ada subprograms. A call to @code{adafinal} is required
after the last call to an Ada subprogram, and before the program
terminates.
@end table
@end quotation

@geindex -n (gnatbind)

@geindex Binder
@geindex multiple input files

If the @code{-n} switch
is given, more than one ALI file may appear on
the command line for @code{gnatbind}. The normal @code{closure}
calculation is performed for each of the specified units. Calculating
the closure means finding out the set of units involved by tracing
@emph{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 @code{-o file}.

@geindex -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 @code{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.

@node Binding Programs with No Main Subprogram,,Binding with Non-Ada Main Programs,Switches for gnatbind
@anchor{gnat_ugn/building_executable_programs_with_gnat binding-programs-with-no-main-subprogram}@anchor{11d}@anchor{gnat_ugn/building_executable_programs_with_gnat id41}@anchor{11e}
@subsubsection 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:

@quotation

@geindex -z (gnatbind)
@end quotation


@table @asis

@item @code{-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
@code{-Wx} to override this default).
@end table

@node Command-Line Access,Search Paths for gnatbind,Switches for gnatbind,Binding with gnatbind
@anchor{gnat_ugn/building_executable_programs_with_gnat command-line-access}@anchor{11f}@anchor{gnat_ugn/building_executable_programs_with_gnat id42}@anchor{120}
@subsection Command-Line Access


The package @code{Ada.Command_Line} provides access to the command-line
arguments and program name. In order for this interface to operate
correctly, the two variables

@example
int gnat_argc;
char **gnat_argv;
@end example

@geindex gnat_argv

@geindex gnat_argc

are declared in one of the GNAT library routines. These variables must
be set from the actual @code{argc} and @code{argv} values passed to the
main program. With no @emph{n} present, @code{gnatbind}
generates the C main program to automatically set these variables.
If the @emph{n} switch is used, there is no automatic way to
set these variables. If they are not set, the procedures in
@code{Ada.Command_Line} will not be available, and any attempt to use
them will raise @code{Constraint_Error}. If command line access is
required, your main program must set @code{gnat_argc} and
@code{gnat_argv} from the @code{argc} and @code{argv} values passed to
it.

@node Search Paths for gnatbind,Examples of gnatbind Usage,Command-Line Access,Binding with gnatbind
@anchor{gnat_ugn/building_executable_programs_with_gnat id43}@anchor{121}@anchor{gnat_ugn/building_executable_programs_with_gnat search-paths-for-gnatbind}@anchor{76}
@subsection Search Paths for @code{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 @code{gcc}
(see @ref{73,,Search Paths and the Run-Time Library (RTL)}). For ALI files the
directories searched are:


@itemize *

@item 
The directory containing the ALI file named in the command line, unless
the switch @code{-I-} is specified.

@item 
All directories specified by @code{-I}
switches on the @code{gnatbind}
command line, in the order given.

@geindex ADA_PRJ_OBJECTS_FILE

@item 
Each of the directories listed in the text file whose name is given
by the 
@geindex ADA_PRJ_OBJECTS_FILE
@geindex environment variable; ADA_PRJ_OBJECTS_FILE
@code{ADA_PRJ_OBJECTS_FILE} environment variable.

@geindex ADA_PRJ_OBJECTS_FILE
@geindex environment variable; ADA_PRJ_OBJECTS_FILE
@code{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.

@geindex ADA_OBJECTS_PATH

@item 
Each of the directories listed in the value of the
@geindex ADA_OBJECTS_PATH
@geindex environment variable; ADA_OBJECTS_PATH
@code{ADA_OBJECTS_PATH} environment variable.
Construct this value
exactly as the 
@geindex PATH
@geindex environment variable; PATH
@code{PATH} environment variable: a list of directory
names separated by colons (semicolons when working with the NT version
of GNAT).

@item 
The content of the @code{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 @code{-nostdlib} is
specified. See @ref{72,,Installing a library}
@end itemize

@geindex -I (gnatbind)

@geindex -aI (gnatbind)

@geindex -aO (gnatbind)

In the binder the switch @code{-I}
is used to specify both source and
library file paths. Use @code{-aI}
instead if you want to specify
source paths only, and @code{-aO}
if you want to specify library paths
only. This means that for the binder
@code{-I@emph{dir}} is equivalent to
@code{-aI@emph{dir}}
@code{-aO`@emph{dir}}.
The binder generates the bind file (a C language source file) in the
current working directory.

@geindex Ada

@geindex System

@geindex Interfaces

@geindex GNAT

The packages @code{Ada}, @code{System}, and @code{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.

@node Examples of gnatbind Usage,,Search Paths for gnatbind,Binding with gnatbind
@anchor{gnat_ugn/building_executable_programs_with_gnat examples-of-gnatbind-usage}@anchor{122}@anchor{gnat_ugn/building_executable_programs_with_gnat id44}@anchor{123}
@subsection Examples of @code{gnatbind} Usage


Here are some examples of @code{gnatbind} invovations:

@quotation

@example
gnatbind hello
@end example

The main program @code{Hello} (source program in @code{hello.adb}) is
bound using the standard switch settings. The generated main program is
@code{b~hello.adb}. This is the normal, default use of the binder.

@example
gnatbind hello -o mainprog.adb
@end example

The main program @code{Hello} (source program in @code{hello.adb}) is
bound using the standard switch settings. The generated main program is
@code{mainprog.adb} with the associated spec in
@code{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.
@end quotation

@node Linking with gnatlink,Using the GNU make Utility,Binding with gnatbind,Building Executable Programs with GNAT
@anchor{gnat_ugn/building_executable_programs_with_gnat id45}@anchor{124}@anchor{gnat_ugn/building_executable_programs_with_gnat linking-with-gnatlink}@anchor{c9}
@section Linking with @code{gnatlink}


@geindex gnatlink

This chapter discusses @code{gnatlink}, a tool that links
an Ada program and builds an executable file. This utility
invokes the system linker (via the @code{gcc} command)
with a correct list of object files and library references.
@code{gnatlink} automatically determines the list of files and
references for the Ada part of a program. It uses the binder file
generated by the @code{gnatbind} to determine this list.

@menu
* Running gnatlink:: 
* Switches for gnatlink:: 

@end menu

@node Running gnatlink,Switches for gnatlink,,Linking with gnatlink
@anchor{gnat_ugn/building_executable_programs_with_gnat id46}@anchor{125}@anchor{gnat_ugn/building_executable_programs_with_gnat running-gnatlink}@anchor{126}
@subsection Running @code{gnatlink}


The form of the @code{gnatlink} command is

@example
$ gnatlink [ switches ] mainprog [.ali]
           [ non-Ada objects ] [ linker options ]
@end example

The arguments of @code{gnatlink} (switches, main @code{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 @code{ALI} file.
Any file name @code{F} without the @code{.ali}
extension will be taken as the main @code{ALI} file if a file exists
whose name is the concatenation of @code{F} and @code{.ali}.

@code{mainprog.ali} references the ALI file of the main program.
The @code{.ali} extension of this file can be omitted. From this
reference, @code{gnatlink} locates the corresponding binder file
@code{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 @code{gnatlink} switches and the main
@code{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 @code{Import} pragmas in any Ada units.

@code{linker options} is an optional list of linker specific
switches.
The default linker called by gnatlink is @code{gcc} which in
turn calls the appropriate system linker.

One useful option for the linker is @code{-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 @code{-lmy_lib} or
@code{-Ldir} can be added as is.
For options that are not recognized by
@code{gcc} as linker options, use the @code{gcc} switches
@code{-Xlinker} or @code{-Wl,}.

Refer to the GCC documentation for
details.

Here is an example showing how to generate a linker map:

@example
$ gnatlink my_prog -Wl,-Map,MAPFILE
@end example

Using @code{linker options} it is possible to set the program stack and
heap size.
See @ref{127,,Setting Stack Size from gnatlink} and
@ref{128,,Setting Heap Size from gnatlink}.

@code{gnatlink} determines the list of objects required by the Ada
program and prepends them to the list of objects passed to the linker.
@code{gnatlink} also gathers any arguments set by the use of
@code{pragma Linker_Options} and adds them to the list of arguments
presented to the linker.

@node Switches for gnatlink,,Running gnatlink,Linking with gnatlink
@anchor{gnat_ugn/building_executable_programs_with_gnat id47}@anchor{129}@anchor{gnat_ugn/building_executable_programs_with_gnat switches-for-gnatlink}@anchor{12a}
@subsection Switches for @code{gnatlink}


The following switches are available with the @code{gnatlink} utility:

@geindex --version (gnatlink)


@table @asis

@item @code{--version}

Display Copyright and version, then exit disregarding all other options.
@end table

@geindex --help (gnatlink)


@table @asis

@item @code{--help}

If @code{--version} was not used, display usage, then exit disregarding
all other options.
@end table

@geindex Command line length

@geindex -f (gnatlink)


@table @asis

@item @code{-f}

On some targets, the command line length is limited, and @code{gnatlink}
will generate a separate file for the linker if the list of object files
is too long.
The @code{-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.
@end table

@geindex Debugging information
@geindex including

@geindex -g (gnatlink)


@table @asis

@item @code{-g}

The option to include debugging information causes the Ada bind file (in
other words, @code{b~mainprog.adb}) to be compiled with @code{-g}.
In addition, the binder does not delete the @code{b~mainprog.adb},
@code{b~mainprog.o} and @code{b~mainprog.ali} files.
Without @code{-g}, the binder removes these files by default.
@end table

@geindex -n (gnatlink)


@table @asis

@item @code{-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.
@end table

@geindex -v (gnatlink)


@table @asis

@item @code{-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.
@end table

@geindex -v -v (gnatlink)


@table @asis

@item @code{-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.
@end table

@geindex -o (gnatlink)


@table @asis

@item @code{-o @emph{exec-name}}

@code{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, @code{gnatlink try.ali} creates
an executable called @code{try}.
@end table

@geindex -B (gnatlink)


@table @asis

@item @code{-B@emph{dir}}

Load compiler executables (for example, @code{gnat1}, the Ada compiler)
from @code{dir} instead of the default location. Only use this switch
when multiple versions of the GNAT compiler are available.
See the @code{Directory Options} section in @cite{The_GNU_Compiler_Collection}
for further details. You would normally use the @code{-b} or
@code{-V} switch instead.
@end table

@geindex -M (gnatlink)


@table @asis

@item @code{-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”.
@end table

@geindex -M= (gnatlink)


@table @asis

@item @code{-M=@emph{mapfile}}

When linking an executable, create a map file. The name of the map file is
@code{mapfile}.
@end table

@geindex --GCC=compiler_name (gnatlink)


@table @asis

@item @code{--GCC=@emph{compiler_name}}

Program used for compiling the binder file. The default is
@code{gcc}. You need to use quotes around @code{compiler_name} if
@code{compiler_name} contains spaces or other separator characters.
As an example @code{--GCC="foo -x -y"} will instruct @code{gnatlink} to
use @code{foo -x -y} as your compiler. Note that switch @code{-c} is always
inserted after your command name. Thus in the above example the compiler
command that will be used by @code{gnatlink} will be @code{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 @code{--GCC="foo -x -y"}. But the back end
switches will be used for @code{--GCC="gcc -gnatv"}. If several
@code{--GCC=compiler_name} are used, only the last @code{compiler_name}
is taken into account. However, all the additional switches are also taken
into account. Thus,
@code{--GCC="foo -x -y" --GCC="bar -z -t"} is equivalent to
@code{--GCC="bar -x -y -z -t"}.
@end table

@geindex --LINK= (gnatlink)


@table @asis

@item @code{--LINK=@emph{name}}

@code{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 @code{gcc}. When this switch is used, the
specified linker is called instead of @code{gcc} with exactly the same
parameters that would have been passed to @code{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.
@end table

@node Using the GNU make Utility,,Linking with gnatlink,Building Executable Programs with GNAT
@anchor{gnat_ugn/building_executable_programs_with_gnat id48}@anchor{12b}@anchor{gnat_ugn/building_executable_programs_with_gnat using-the-gnu-make-utility}@anchor{70}
@section Using the GNU @code{make} Utility


@geindex make (GNU)
@geindex 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
@code{gnatmake} utility (@ref{c6,,Building with gnatmake}).

All the examples in this section are specific to the GNU version of
make. Although @code{make} is a standard utility, and the basic language
is the same, these examples use some advanced features found only in
@code{GNU make}.

@menu
* Using gnatmake in a Makefile:: 
* Automatically Creating a List of Directories:: 
* Generating the Command Line Switches:: 
* Overcoming Command Line Length Limits:: 

@end menu

@node Using gnatmake in a Makefile,Automatically Creating a List of Directories,,Using the GNU make Utility
@anchor{gnat_ugn/building_executable_programs_with_gnat id49}@anchor{12c}@anchor{gnat_ugn/building_executable_programs_with_gnat using-gnatmake-in-a-makefile}@anchor{12d}
@subsection Using gnatmake in a Makefile


@c 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
@code{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{12e,,Automatically Creating a List of Directories})
which might help you in case your project has a lot of subdirectories.

@example
## 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@}
@end example

@node Automatically Creating a List of Directories,Generating the Command Line Switches,Using gnatmake in a Makefile,Using the GNU make Utility
@anchor{gnat_ugn/building_executable_programs_with_gnat automatically-creating-a-list-of-directories}@anchor{12e}@anchor{gnat_ugn/building_executable_programs_with_gnat id50}@anchor{12f}
@subsection 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 @code{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 @code{find}, which is standard on all Unix systems. All
the directories found under a given root directory will be added to the
list.

@example
# 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 `@w{`}dir`@w{`} and `@w{`}sort`@w{`} 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@}
@end example

@node Generating the Command Line Switches,Overcoming Command Line Length Limits,Automatically Creating a List of Directories,Using the GNU make Utility
@anchor{gnat_ugn/building_executable_programs_with_gnat generating-the-command-line-switches}@anchor{130}@anchor{gnat_ugn/building_executable_programs_with_gnat id51}@anchor{131}
@subsection Generating the Command Line Switches


Once you have created the list of directories as explained in the
previous section (@ref{12e,,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.

@example
# 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
@end example

@node Overcoming Command Line Length Limits,,Generating the Command Line Switches,Using the GNU make Utility
@anchor{gnat_ugn/building_executable_programs_with_gnat id52}@anchor{132}@anchor{gnat_ugn/building_executable_programs_with_gnat overcoming-command-line-length-limits}@anchor{133}
@subsection 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 @code{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{12e,,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 @code{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.

@example
# 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
@end example

@node GNAT Utility Programs,GNAT and Program Execution,Building Executable Programs with GNAT,Top
@anchor{gnat_ugn/gnat_utility_programs doc}@anchor{134}@anchor{gnat_ugn/gnat_utility_programs gnat-utility-programs}@anchor{b}@anchor{gnat_ugn/gnat_utility_programs id1}@anchor{135}
@chapter GNAT Utility Programs


This chapter describes a number of utility programs:



@itemize *

@item 
@ref{136,,The File Cleanup Utility gnatclean}

@item 
@ref{137,,The GNAT Library Browser gnatls}
@end itemize

Other GNAT utilities are described elsewhere in this manual:


@itemize *

@item 
@ref{42,,Handling Arbitrary File Naming Conventions with gnatname}

@item 
@ref{4c,,File Name Krunching with gnatkr}

@item 
@ref{1d,,Renaming Files with gnatchop}

@item 
@ref{8f,,Preprocessing with gnatprep}
@end itemize

@menu
* The File Cleanup Utility gnatclean:: 
* The GNAT Library Browser gnatls:: 

@end menu

@node The File Cleanup Utility gnatclean,The GNAT Library Browser gnatls,,GNAT Utility Programs
@anchor{gnat_ugn/gnat_utility_programs id2}@anchor{138}@anchor{gnat_ugn/gnat_utility_programs the-file-cleanup-utility-gnatclean}@anchor{136}
@section The File Cleanup Utility @code{gnatclean}


@geindex File cleanup tool

@geindex gnatclean

@code{gnatclean} is a tool that allows the deletion of files produced by the
compiler, binder and linker, including ALI files, object files, tree files,
expanded source files, library files, interface copy source files, binder
generated files and executable files.

@menu
* Running gnatclean:: 
* Switches for gnatclean:: 

@end menu

@node Running gnatclean,Switches for gnatclean,,The File Cleanup Utility gnatclean
@anchor{gnat_ugn/gnat_utility_programs id3}@anchor{139}@anchor{gnat_ugn/gnat_utility_programs running-gnatclean}@anchor{13a}
@subsection Running @code{gnatclean}


The @code{gnatclean} command has the form:

@quotation

@example
$ gnatclean switches names
@end example
@end quotation

where @code{names} is a list of source file names. Suffixes @code{.ads} and
@code{adb} may be omitted. If a project file is specified using switch
@code{-P}, then @code{names} may be completely omitted.

In normal mode, @code{gnatclean} delete the files produced by the compiler and,
if switch @code{-c} is not specified, by the binder and
the linker. In informative-only mode, specified by switch
@code{-n}, the list of files that would have been deleted in
normal mode is listed, but no file is actually deleted.

@node Switches for gnatclean,,Running gnatclean,The File Cleanup Utility gnatclean
@anchor{gnat_ugn/gnat_utility_programs id4}@anchor{13b}@anchor{gnat_ugn/gnat_utility_programs switches-for-gnatclean}@anchor{13c}
@subsection Switches for @code{gnatclean}


@code{gnatclean} recognizes the following switches:

@geindex --version (gnatclean)


@table @asis

@item @code{--version}

Display copyright and version, then exit disregarding all other options.
@end table

@geindex --help (gnatclean)


@table @asis

@item @code{--help}

If @code{--version} was not used, display usage, then exit disregarding
all other options.

@item @code{--subdirs=@emph{subdir}}

Actual object directory of each project file is the subdirectory subdir of the
object directory specified or defaulted in the project file.

@item @code{--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.
@end table

@geindex -c (gnatclean)


@table @asis

@item @code{-c}

Only attempt to delete the files produced by the compiler, not those produced
by the binder or the linker. The files that are not to be deleted are library
files, interface copy files, binder generated files and executable files.
@end table

@geindex -D (gnatclean)


@table @asis

@item @code{-D @emph{dir}}

Indicate that ALI and object files should normally be found in directory @code{dir}.
@end table

@geindex -F (gnatclean)


@table @asis

@item @code{-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.
@end table

@geindex -h (gnatclean)


@table @asis

@item @code{-h}

Output a message explaining the usage of @code{gnatclean}.
@end table

@geindex -n (gnatclean)


@table @asis

@item @code{-n}

Informative-only mode. Do not delete any files. Output the list of the files
that would have been deleted if this switch was not specified.
@end table

@geindex -P (gnatclean)


@table @asis

@item @code{-P@emph{project}}

Use project file @code{project}. Only one such switch can be used.
When cleaning a project file, the files produced by the compilation of the
immediate sources or inherited sources of the project files are to be
deleted. This is not depending on the presence or not of executable names
on the command line.
@end table

@geindex -q (gnatclean)


@table @asis

@item @code{-q}

Quiet output. If there are no errors, do not output anything, except in
verbose mode (switch -v) or in informative-only mode
(switch -n).
@end table

@geindex -r (gnatclean)


@table @asis

@item @code{-r}

When a project file is specified (using switch -P),
clean all imported and extended project files, recursively. If this switch
is not specified, only the files related to the main project file are to be
deleted. This switch has no effect if no project file is specified.
@end table

@geindex -v (gnatclean)


@table @asis

@item @code{-v}

Verbose mode.
@end table

@geindex -vP (gnatclean)


@table @asis

@item @code{-vP@emph{x}}

Indicates the verbosity of the parsing of GNAT project files.
@ref{cf,,Switches Related to Project Files}.
@end table

@geindex -X (gnatclean)


@table @asis

@item @code{-X@emph{name}=@emph{value}}

Indicates that external variable @code{name} has the value @code{value}.
The Project Manager will use this value for occurrences of
@code{external(name)} when parsing the project file.
See @ref{cf,,Switches Related to Project Files}.
@end table

@geindex -aO (gnatclean)


@table @asis

@item @code{-aO@emph{dir}}

When searching for ALI and object files, look in directory @code{dir}.
@end table

@geindex -I (gnatclean)


@table @asis

@item @code{-I@emph{dir}}

Equivalent to @code{-aO@emph{dir}}.
@end table

@geindex -I- (gnatclean)

@geindex Source files
@geindex suppressing search


@table @asis

@item @code{-I-}

Do not look for ALI or object files in the directory
where @code{gnatclean} was invoked.
@end table

@node The GNAT Library Browser gnatls,,The File Cleanup Utility gnatclean,GNAT Utility Programs
@anchor{gnat_ugn/gnat_utility_programs id5}@anchor{13d}@anchor{gnat_ugn/gnat_utility_programs the-gnat-library-browser-gnatls}@anchor{137}
@section The GNAT Library Browser @code{gnatls}


@geindex Library browser

@geindex gnatls

@code{gnatls} is a tool that outputs information about compiled
units. It gives the relationship between objects, unit names and source
files. It can also be used to check the source dependencies of a unit
as well as various characteristics.

@menu
* Running gnatls:: 
* Switches for gnatls:: 
* Example of gnatls Usage:: 

@end menu

@node Running gnatls,Switches for gnatls,,The GNAT Library Browser gnatls
@anchor{gnat_ugn/gnat_utility_programs id6}@anchor{13e}@anchor{gnat_ugn/gnat_utility_programs running-gnatls}@anchor{13f}
@subsection Running @code{gnatls}


The @code{gnatls} command has the form

@quotation

@example
$ gnatls switches object_or_ali_file
@end example
@end quotation

The main argument is the list of object or @code{ali} files
(see @ref{28,,The Ada Library Information Files})
for which information is requested.

In normal mode, without additional option, @code{gnatls} produces a
four-column listing. Each line represents information for a specific
object. The first column gives the full path of the object, the second
column gives the name of the principal unit in this object, the third
column gives the status of the source and the fourth column gives the
full path of the source representing this unit.
Here is a simple example of use:

@quotation

@example
$ gnatls *.o
./demo1.o            demo1            DIF demo1.adb
./demo2.o            demo2             OK demo2.adb
./hello.o            h1                OK hello.adb
./instr-child.o      instr.child      MOK instr-child.adb
./instr.o            instr             OK instr.adb
./tef.o              tef              DIF tef.adb
./text_io_example.o  text_io_example   OK text_io_example.adb
./tgef.o             tgef             DIF tgef.adb
@end example
@end quotation

The first line can be interpreted as follows: the main unit which is
contained in
object file @code{demo1.o} is demo1, whose main source is in
@code{demo1.adb}. Furthermore, the version of the source used for the
compilation of demo1 has been modified (DIF). Each source file has a status
qualifier which can be:


@table @asis

@item @emph{OK (unchanged)}

The version of the source file used for the compilation of the
specified unit corresponds exactly to the actual source file.

@item @emph{MOK (slightly modified)}

The version of the source file used for the compilation of the
specified unit differs from the actual source file but not enough to
require recompilation. If you use gnatmake with the option
@code{-m} (minimal recompilation), a file marked
MOK will not be recompiled.

@item @emph{DIF (modified)}

No version of the source found on the path corresponds to the source
used to build this object.

@item @emph{??? (file not found)}

No source file was found for this unit.

@item @emph{HID (hidden,  unchanged version not first on PATH)}

The version of the source that corresponds exactly to the source used
for compilation has been found on the path but it is hidden by another
version of the same source that has been modified.
@end table

@node Switches for gnatls,Example of gnatls Usage,Running gnatls,The GNAT Library Browser gnatls
@anchor{gnat_ugn/gnat_utility_programs id7}@anchor{140}@anchor{gnat_ugn/gnat_utility_programs switches-for-gnatls}@anchor{141}
@subsection Switches for @code{gnatls}


@code{gnatls} recognizes the following switches:

@geindex --version (gnatls)


@table @asis

@item @code{--version}

Display copyright and version, then exit disregarding all other options.
@end table

@geindex --help (gnatls)


@table @asis

@item @code{--help}

If @code{--version} was not used, display usage, then exit disregarding
all other options.
@end table

@geindex -a (gnatls)


@table @asis

@item @code{-a}

Consider all units, including those of the predefined Ada library.
Especially useful with @code{-d}.
@end table

@geindex -d (gnatls)


@table @asis

@item @code{-d}

List sources from which specified units depend on.
@end table

@geindex -h (gnatls)


@table @asis

@item @code{-h}

Output the list of options.
@end table

@geindex -o (gnatls)


@table @asis

@item @code{-o}

Only output information about object files.
@end table

@geindex -s (gnatls)


@table @asis

@item @code{-s}

Only output information about source files.
@end table

@geindex -u (gnatls)


@table @asis

@item @code{-u}

Only output information about compilation units.
@end table

@geindex -files (gnatls)


@table @asis

@item @code{-files=@emph{file}}

Take as arguments the files listed in text file @code{file}.
Text file @code{file} may contain empty lines that are ignored.
Each nonempty line should contain the name of an existing file.
Several such switches may be specified simultaneously.
@end table

@geindex -aO (gnatls)

@geindex -aI (gnatls)

@geindex -I (gnatls)

@geindex -I- (gnatls)


@table @asis

@item @code{-aO@emph{dir}}, @code{-aI@emph{dir}}, @code{-I@emph{dir}}, @code{-I-}, @code{-nostdinc}

Source path manipulation. Same meaning as the equivalent @code{gnatmake}
flags (@ref{ce,,Switches for gnatmake}).
@end table

@geindex -aP (gnatls)


@table @asis

@item @code{-aP@emph{dir}}

Add @code{dir} at the beginning of the project search dir.
@end table

@geindex --RTS (gnatls)


@table @asis

@item @code{--RTS=@emph{rts-path}}

Specifies the default location of the runtime library. Same meaning as the
equivalent @code{gnatmake} flag (@ref{ce,,Switches for gnatmake}).
@end table

@geindex -v (gnatls)


@table @asis

@item @code{-v}

Verbose mode. Output the complete source, object and project paths. Do not use
the default column layout but instead use long format giving as much as
information possible on each requested units, including special
characteristics such as:


@itemize *

@item 
@emph{Preelaborable}: The unit is preelaborable in the Ada sense.

@item 
@emph{No_Elab_Code}:  No elaboration code has been produced by the compiler for this unit.

@item 
@emph{Pure}: The unit is pure in the Ada sense.

@item 
@emph{Elaborate_Body}: The unit contains a pragma Elaborate_Body.

@item 
@emph{Remote_Types}: The unit contains a pragma Remote_Types.

@item 
@emph{Shared_Passive}: The unit contains a pragma Shared_Passive.

@item 
@emph{Predefined}: This unit is part of the predefined environment and cannot be modified
by the user.

@item 
@emph{Remote_Call_Interface}: The unit contains a pragma Remote_Call_Interface.
@end itemize
@end table

@node Example of gnatls Usage,,Switches for gnatls,The GNAT Library Browser gnatls
@anchor{gnat_ugn/gnat_utility_programs example-of-gnatls-usage}@anchor{142}@anchor{gnat_ugn/gnat_utility_programs id8}@anchor{143}
@subsection Example of @code{gnatls} Usage


Example of using the verbose switch. Note how the source and
object paths are affected by the -I switch.

@quotation

@example
$ gnatls -v -I.. demo1.o

GNATLS 5.03w (20041123-34)
Copyright 1997-2004 Free Software Foundation, Inc.

Source Search Path:
   <Current_Directory>
   ../
   /home/comar/local/adainclude/

Object Search Path:
   <Current_Directory>
   ../
   /home/comar/local/lib/gcc-lib/x86-linux/3.4.3/adalib/

Project Search Path:
   <Current_Directory>
   /home/comar/local/lib/gnat/

./demo1.o
   Unit =>
     Name   => demo1
     Kind   => subprogram body
     Flags  => No_Elab_Code
     Source => demo1.adb    modified
@end example
@end quotation

The following is an example of use of the dependency list.
Note the use of the -s switch
which gives a straight list of source files. This can be useful for
building specialized scripts.

@quotation

@example
$ gnatls -d demo2.o
./demo2.o   demo2        OK demo2.adb
                         OK gen_list.ads
                         OK gen_list.adb
                         OK instr.ads
                         OK instr-child.ads

$ gnatls -d -s -a demo1.o
demo1.adb
/home/comar/local/adainclude/ada.ads
/home/comar/local/adainclude/a-finali.ads
/home/comar/local/adainclude/a-filico.ads
/home/comar/local/adainclude/a-stream.ads
/home/comar/local/adainclude/a-tags.ads
gen_list.ads
gen_list.adb
/home/comar/local/adainclude/gnat.ads
/home/comar/local/adainclude/g-io.ads
instr.ads
/home/comar/local/adainclude/system.ads
/home/comar/local/adainclude/s-exctab.ads
/home/comar/local/adainclude/s-finimp.ads
/home/comar/local/adainclude/s-finroo.ads
/home/comar/local/adainclude/s-secsta.ads
/home/comar/local/adainclude/s-stalib.ads
/home/comar/local/adainclude/s-stoele.ads
/home/comar/local/adainclude/s-stratt.ads
/home/comar/local/adainclude/s-tasoli.ads
/home/comar/local/adainclude/s-unstyp.ads
/home/comar/local/adainclude/unchconv.ads
@end example
@end quotation








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

@node GNAT and Program Execution,Platform-Specific Information,GNAT Utility Programs,Top
@anchor{gnat_ugn/gnat_and_program_execution doc}@anchor{144}@anchor{gnat_ugn/gnat_and_program_execution gnat-and-program-execution}@anchor{c}@anchor{gnat_ugn/gnat_and_program_execution id1}@anchor{145}
@chapter GNAT and Program Execution


This chapter covers several topics:


@itemize *

@item 
@ref{146,,Running and Debugging Ada Programs}

@item 
@ref{147,,Profiling}

@item 
@ref{148,,Improving Performance}

@item 
@ref{149,,Overflow Check Handling in GNAT}

@item 
@ref{14a,,Performing Dimensionality Analysis in GNAT}

@item 
@ref{14b,,Stack Related Facilities}

@item 
@ref{14c,,Memory Management Issues}
@end itemize

@menu
* Running and Debugging Ada Programs:: 
* Profiling:: 
* Improving Performance:: 
* Overflow Check Handling in GNAT:: 
* Performing Dimensionality Analysis in GNAT:: 
* Stack Related Facilities:: 
* Memory Management Issues:: 

@end menu

@node Running and Debugging Ada Programs,Profiling,,GNAT and Program Execution
@anchor{gnat_ugn/gnat_and_program_execution id2}@anchor{146}@anchor{gnat_ugn/gnat_and_program_execution running-and-debugging-ada-programs}@anchor{14d}
@section Running and Debugging Ada Programs


@geindex Debugging

This section discusses how to debug Ada programs.

An incorrect Ada program may be handled in three ways by the GNAT compiler:


@itemize *

@item 
The illegality may be a violation of the static semantics of Ada. In
that case GNAT diagnoses the constructs in the program that are illegal.
It is then a straightforward matter for the user to modify those parts of
the program.

@item 
The illegality may be a violation of the dynamic semantics of Ada. In
that case the program compiles and executes, but may generate incorrect
results, or may terminate abnormally with some exception.

@item 
When presented with a program that contains convoluted errors, GNAT
itself may terminate abnormally without providing full diagnostics on
the incorrect user program.
@end itemize

@geindex Debugger

@geindex gdb

@menu
* The GNAT Debugger GDB:: 
* Running GDB:: 
* Introduction to GDB Commands:: 
* Using Ada Expressions:: 
* Calling User-Defined Subprograms:: 
* Using the next Command in a Function:: 
* Stopping When Ada Exceptions Are Raised:: 
* Ada Tasks:: 
* Debugging Generic Units:: 
* Remote Debugging with gdbserver:: 
* GNAT Abnormal Termination or Failure to Terminate:: 
* Naming Conventions for GNAT Source Files:: 
* Getting Internal Debugging Information:: 
* Stack Traceback:: 
* Pretty-Printers for the GNAT runtime:: 

@end menu

@node The GNAT Debugger GDB,Running GDB,,Running and Debugging Ada Programs
@anchor{gnat_ugn/gnat_and_program_execution id3}@anchor{14e}@anchor{gnat_ugn/gnat_and_program_execution the-gnat-debugger-gdb}@anchor{14f}
@subsection The GNAT Debugger GDB


@code{GDB} is a general purpose, platform-independent debugger that
can be used to debug mixed-language programs compiled with @code{gcc},
and in particular is capable of debugging Ada programs compiled with
GNAT. The latest versions of @code{GDB} are Ada-aware and can handle
complex Ada data structures.

See @cite{Debugging with GDB},
for full details on the usage of @code{GDB}, including a section on
its usage on programs. This manual should be consulted for full
details. The section that follows is a brief introduction to the
philosophy and use of @code{GDB}.

When GNAT programs are compiled, the compiler optionally writes debugging
information into the generated object file, including information on
line numbers, and on declared types and variables. This information is
separate from the generated code. It makes the object files considerably
larger, but it does not add to the size of the actual executable that
will be loaded into memory, and has no impact on run-time performance. The
generation of debug information is triggered by the use of the
@code{-g} switch in the @code{gcc} or @code{gnatmake} command
used to carry out the compilations. It is important to emphasize that
the use of these options does not change the generated code.

The debugging information is written in standard system formats that
are used by many tools, including debuggers and profilers. The format
of the information is typically designed to describe C types and
semantics, but GNAT implements a translation scheme which allows full
details about Ada types and variables to be encoded into these
standard C formats. Details of this encoding scheme may be found in
the file exp_dbug.ads in the GNAT source distribution. However, the
details of this encoding are, in general, of no interest to a user,
since @code{GDB} automatically performs the necessary decoding.

When a program is bound and linked, the debugging information is
collected from the object files, and stored in the executable image of
the program. Again, this process significantly increases the size of
the generated executable file, but it does not increase the size of
the executable program itself. Furthermore, if this program is run in
the normal manner, it runs exactly as if the debug information were
not present, and takes no more actual memory.

However, if the program is run under control of @code{GDB}, the
debugger is activated.  The image of the program is loaded, at which
point it is ready to run.  If a run command is given, then the program
will run exactly as it would have if @code{GDB} were not present. This
is a crucial part of the @code{GDB} design philosophy.  @code{GDB} is
entirely non-intrusive until a breakpoint is encountered.  If no
breakpoint is ever hit, the program will run exactly as it would if no
debugger were present. When a breakpoint is hit, @code{GDB} accesses
the debugging information and can respond to user commands to inspect
variables, and more generally to report on the state of execution.

@node Running GDB,Introduction to GDB Commands,The GNAT Debugger GDB,Running and Debugging Ada Programs
@anchor{gnat_ugn/gnat_and_program_execution id4}@anchor{150}@anchor{gnat_ugn/gnat_and_program_execution running-gdb}@anchor{151}
@subsection Running GDB


This section describes how to initiate the debugger.

The debugger can be launched from a @code{GNAT Studio} menu or
directly from the command line. The description below covers the latter use.
All the commands shown can be used in the @code{GNAT Studio} debug console window,
but there are usually more GUI-based ways to achieve the same effect.

The command to run @code{GDB} is

@quotation

@example
$ gdb program
@end example
@end quotation

where @code{program} is the name of the executable file. This
activates the debugger and results in a prompt for debugger commands.
The simplest command is simply @code{run}, which causes the program to run
exactly as if the debugger were not present. The following section
describes some of the additional commands that can be given to @code{GDB}.

@node Introduction to GDB Commands,Using Ada Expressions,Running GDB,Running and Debugging Ada Programs
@anchor{gnat_ugn/gnat_and_program_execution id5}@anchor{152}@anchor{gnat_ugn/gnat_and_program_execution introduction-to-gdb-commands}@anchor{153}
@subsection Introduction to GDB Commands


@code{GDB} contains a large repertoire of commands.
See @cite{Debugging with GDB} for extensive documentation on the use
of these commands, together with examples of their use. Furthermore,
the command @emph{help} invoked from within GDB activates a simple help
facility which summarizes the available commands and their options.
In this section we summarize a few of the most commonly
used commands to give an idea of what @code{GDB} is about. You should create
a simple program with debugging information and experiment with the use of
these @code{GDB} commands on the program as you read through the
following section.


@itemize *

@item 

@table @asis

@item @code{set args @emph{arguments}}

The @emph{arguments} list above is a list of arguments to be passed to
the program on a subsequent run command, just as though the arguments
had been entered on a normal invocation of the program. The @code{set args}
command is not needed if the program does not require arguments.
@end table

@item 

@table @asis

@item @code{run}

The @code{run} command causes execution of the program to start from
the beginning. If the program is already running, that is to say if
you are currently positioned at a breakpoint, then a prompt will ask
for confirmation that you want to abandon the current execution and
restart.
@end table

@item 

@table @asis

@item @code{breakpoint @emph{location}}

The breakpoint command sets a breakpoint, that is to say a point at which
execution will halt and @code{GDB} will await further
commands. @emph{location} is
either a line number within a file, given in the format @code{file:linenumber},
or it is the name of a subprogram. If you request that a breakpoint be set on
a subprogram that is overloaded, a prompt will ask you to specify on which of
those subprograms you want to breakpoint. You can also
specify that all of them should be breakpointed. If the program is run
and execution encounters the breakpoint, then the program
stops and @code{GDB} signals that the breakpoint was encountered by
printing the line of code before which the program is halted.
@end table

@item 

@table @asis

@item @code{catch exception @emph{name}}

This command causes the program execution to stop whenever exception
@code{name} is raised.  If @code{name} is omitted, then the execution is
suspended when any exception is raised.
@end table

@item 

@table @asis

@item @code{print @emph{expression}}

This will print the value of the given expression. Most simple
Ada expression formats are properly handled by @code{GDB}, so the expression
can contain function calls, variables, operators, and attribute references.
@end table

@item 

@table @asis

@item @code{continue}

Continues execution following a breakpoint, until the next breakpoint or the
termination of the program.
@end table

@item 

@table @asis

@item @code{step}

Executes a single line after a breakpoint. If the next statement
is a subprogram call, execution continues into (the first statement of)
the called subprogram.
@end table

@item 

@table @asis

@item @code{next}

Executes a single line. If this line is a subprogram call, executes and
returns from the call.
@end table

@item 

@table @asis

@item @code{list}

Lists a few lines around the current source location. In practice, it
is usually more convenient to have a separate edit window open with the
relevant source file displayed. Successive applications of this command
print subsequent lines. The command can be given an argument which is a
line number, in which case it displays a few lines around the specified one.
@end table

@item 

@table @asis

@item @code{backtrace}

Displays a backtrace of the call chain. This command is typically
used after a breakpoint has occurred, to examine the sequence of calls that
leads to the current breakpoint. The display includes one line for each
activation record (frame) corresponding to an active subprogram.
@end table

@item 

@table @asis

@item @code{up}

At a breakpoint, @code{GDB} can display the values of variables local
to the current frame. The command @code{up} can be used to
examine the contents of other active frames, by moving the focus up
the stack, that is to say from callee to caller, one frame at a time.
@end table

@item 

@table @asis

@item @code{down}

Moves the focus of @code{GDB} down from the frame currently being
examined to the frame of its callee (the reverse of the previous command),
@end table

@item 

@table @asis

@item @code{frame @emph{n}}

Inspect the frame with the given number. The value 0 denotes the frame
of the current breakpoint, that is to say the top of the call stack.
@end table

@item 

@table @asis

@item @code{kill}

Kills the child process in which the program is running under GDB.
This may be useful for several purposes:


@itemize *

@item 
It allows you to recompile and relink your program, since on many systems
you cannot regenerate an executable file while it is running in a process.

@item 
You can run your program outside the debugger, on systems that do not
permit executing a program outside GDB while breakpoints are set
within GDB.

@item 
It allows you to debug a core dump rather than a running process.
@end itemize
@end table
@end itemize

The above list is a very short introduction to the commands that
@code{GDB} provides. Important additional capabilities, including conditional
breakpoints, the ability to execute command sequences on a breakpoint,
the ability to debug at the machine instruction level and many other
features are described in detail in @cite{Debugging with GDB}.
Note that most commands can be abbreviated
(for example, c for continue, bt for backtrace).

@node Using Ada Expressions,Calling User-Defined Subprograms,Introduction to GDB Commands,Running and Debugging Ada Programs
@anchor{gnat_ugn/gnat_and_program_execution id6}@anchor{154}@anchor{gnat_ugn/gnat_and_program_execution using-ada-expressions}@anchor{155}
@subsection Using Ada Expressions


@geindex Ada expressions (in gdb)

@code{GDB} supports a fairly large subset of Ada expression syntax, with some
extensions. The philosophy behind the design of this subset is

@quotation


@itemize *

@item 
That @code{GDB} should provide basic literals and access to operations for
arithmetic, dereferencing, field selection, indexing, and subprogram calls,
leaving more sophisticated computations to subprograms written into the
program (which therefore may be called from @code{GDB}).

@item 
That type safety and strict adherence to Ada language restrictions
are not particularly relevant in a debugging context.

@item 
That brevity is important to the @code{GDB} user.
@end itemize
@end quotation

Thus, for brevity, the debugger acts as if there were
implicit @code{with} and @code{use} clauses in effect for all user-written
packages, thus making it unnecessary to fully qualify most names with
their packages, regardless of context. Where this causes ambiguity,
@code{GDB} asks the user’s intent.

For details on the supported Ada syntax, see @cite{Debugging with GDB}.

@node Calling User-Defined Subprograms,Using the next Command in a Function,Using Ada Expressions,Running and Debugging Ada Programs
@anchor{gnat_ugn/gnat_and_program_execution calling-user-defined-subprograms}@anchor{156}@anchor{gnat_ugn/gnat_and_program_execution id7}@anchor{157}
@subsection Calling User-Defined Subprograms


An important capability of @code{GDB} is the ability to call user-defined
subprograms while debugging. This is achieved simply by entering
a subprogram call statement in the form:

@quotation

@example
call subprogram-name (parameters)
@end example
@end quotation

The keyword @code{call} can be omitted in the normal case where the
@code{subprogram-name} does not coincide with any of the predefined
@code{GDB} commands.

The effect is to invoke the given subprogram, passing it the
list of parameters that is supplied. The parameters can be expressions and
can include variables from the program being debugged. The
subprogram must be defined
at the library level within your program, and @code{GDB} will call the
subprogram within the environment of your program execution (which
means that the subprogram is free to access or even modify variables
within your program).

The most important use of this facility is in allowing the inclusion of
debugging routines that are tailored to particular data structures
in your program. Such debugging routines can be written to provide a suitably
high-level description of an abstract type, rather than a low-level dump
of its physical layout. After all, the standard
@code{GDB print} command only knows the physical layout of your
types, not their abstract meaning. Debugging routines can provide information
at the desired semantic level and are thus enormously useful.

For example, when debugging GNAT itself, it is crucial to have access to
the contents of the tree nodes used to represent the program internally.
But tree nodes are represented simply by an integer value (which in turn
is an index into a table of nodes).
Using the @code{print} command on a tree node would simply print this integer
value, which is not very useful. But the PN routine (defined in file
treepr.adb in the GNAT sources) takes a tree node as input, and displays
a useful high level representation of the tree node, which includes the
syntactic category of the node, its position in the source, the integers
that denote descendant nodes and parent node, as well as varied
semantic information. To study this example in more detail, you might want to
look at the body of the PN procedure in the stated file.

Another useful application of this capability is to deal with situations of
complex data which are not handled suitably by GDB. For example, if you specify
Convention Fortran for a multi-dimensional array, GDB does not know that
the ordering of array elements has been switched and will not properly
address the array elements. In such a case, instead of trying to print the
elements directly from GDB, you can write a callable procedure that prints
the elements in the desired format.

@node Using the next Command in a Function,Stopping When Ada Exceptions Are Raised,Calling User-Defined Subprograms,Running and Debugging Ada Programs
@anchor{gnat_ugn/gnat_and_program_execution id8}@anchor{158}@anchor{gnat_ugn/gnat_and_program_execution using-the-next-command-in-a-function}@anchor{159}
@subsection Using the @emph{next} Command in a Function


When you use the @code{next} command in a function, the current source
location will advance to the next statement as usual. A special case
arises in the case of a @code{return} statement.

Part of the code for a return statement is the ‘epilogue’ of the function.
This is the code that returns to the caller. There is only one copy of
this epilogue code, and it is typically associated with the last return
statement in the function if there is more than one return. In some
implementations, this epilogue is associated with the first statement
of the function.

The result is that if you use the @code{next} command from a return
statement that is not the last return statement of the function you
may see a strange apparent jump to the last return statement or to
the start of the function. You should simply ignore this odd jump.
The value returned is always that from the first return statement
that was stepped through.

@node Stopping When Ada Exceptions Are Raised,Ada Tasks,Using the next Command in a Function,Running and Debugging Ada Programs
@anchor{gnat_ugn/gnat_and_program_execution id9}@anchor{15a}@anchor{gnat_ugn/gnat_and_program_execution stopping-when-ada-exceptions-are-raised}@anchor{15b}
@subsection Stopping When Ada Exceptions Are Raised


@geindex Exceptions (in gdb)

You can set catchpoints that stop the program execution when your program
raises selected exceptions.


@itemize *

@item 

@table @asis

@item @code{catch exception}

Set a catchpoint that stops execution whenever (any task in the) program
raises any exception.
@end table

@item 

@table @asis

@item @code{catch exception @emph{name}}

Set a catchpoint that stops execution whenever (any task in the) program
raises the exception @emph{name}.
@end table

@item 

@table @asis

@item @code{catch exception unhandled}

Set a catchpoint that stops executing whenever (any task in the) program
raises an exception for which there is no handler.
@end table

@item 

@table @asis

@item @code{info exceptions}, @code{info exceptions @emph{regexp}}

The @code{info exceptions} command permits the user to examine all defined
exceptions within Ada programs. With a regular expression, @emph{regexp}, as
argument, prints out only those exceptions whose name matches @emph{regexp}.
@end table
@end itemize

@geindex Tasks (in gdb)

@node Ada Tasks,Debugging Generic Units,Stopping When Ada Exceptions Are Raised,Running and Debugging Ada Programs
@anchor{gnat_ugn/gnat_and_program_execution ada-tasks}@anchor{15c}@anchor{gnat_ugn/gnat_and_program_execution id10}@anchor{15d}
@subsection Ada Tasks


@code{GDB} allows the following task-related commands:


@itemize *

@item 

@table @asis

@item @code{info tasks}

This command shows a list of current Ada tasks, as in the following example:

@example
(gdb) info tasks
  ID       TID P-ID   Thread Pri State                 Name
   1   8088000   0   807e000  15 Child Activation Wait main_task
   2   80a4000   1   80ae000  15 Accept/Select Wait    b
   3   809a800   1   80a4800  15 Child Activation Wait a
*  4   80ae800   3   80b8000  15 Running               c
@end example

In this listing, the asterisk before the first task indicates it to be the
currently running task. The first column lists the task ID that is used
to refer to tasks in the following commands.
@end table
@end itemize

@geindex Breakpoints and tasks


@itemize *

@item 
@code{break`@w{`}*linespec* `@w{`}task} @emph{taskid}, @code{break} @emph{linespec} @code{task} @emph{taskid} @code{if} …

@quotation

These commands are like the @code{break ... thread ...}.
@emph{linespec} specifies source lines.

Use the qualifier @code{task @emph{taskid}} with a breakpoint command
to specify that you only want @code{GDB} to stop the program when a
particular Ada task reaches this breakpoint. @emph{taskid} is one of the
numeric task identifiers assigned by @code{GDB}, shown in the first
column of the @code{info tasks} display.

If you do not specify @code{task @emph{taskid}} when you set a
breakpoint, the breakpoint applies to @emph{all} tasks of your
program.

You can use the @code{task} qualifier on conditional breakpoints as
well; in this case, place @code{task @emph{taskid}} before the
breakpoint condition (before the @code{if}).
@end quotation
@end itemize

@geindex Task switching (in gdb)


@itemize *

@item 
@code{task @emph{taskno}}

@quotation

This command allows switching to the task referred by @emph{taskno}. In
particular, this allows browsing of the backtrace of the specified
task. It is advisable to switch back to the original task before
continuing execution otherwise the scheduling of the program may be
perturbed.
@end quotation
@end itemize

For more detailed information on the tasking support,
see @cite{Debugging with GDB}.

@geindex Debugging Generic Units

@geindex Generics

@node Debugging Generic Units,Remote Debugging with gdbserver,Ada Tasks,Running and Debugging Ada Programs
@anchor{gnat_ugn/gnat_and_program_execution debugging-generic-units}@anchor{15e}@anchor{gnat_ugn/gnat_and_program_execution id11}@anchor{15f}
@subsection Debugging Generic Units


GNAT always uses code expansion for generic instantiation. This means that
each time an instantiation occurs, a complete copy of the original code is
made, with appropriate substitutions of formals by actuals.

It is not possible to refer to the original generic entities in
@code{GDB}, but it is always possible to debug a particular instance of
a generic, by using the appropriate expanded names. For example, if we have

@quotation

@example
procedure g is

   generic package k is
      procedure kp (v1 : in out integer);
   end k;

   package body k is
      procedure kp (v1 : in out integer) is
      begin
         v1 := v1 + 1;
      end kp;
   end k;

   package k1 is new k;
   package k2 is new k;

   var : integer := 1;

begin
   k1.kp (var);
   k2.kp (var);
   k1.kp (var);
   k2.kp (var);
end;
@end example
@end quotation

Then to break on a call to procedure kp in the k2 instance, simply
use the command:

@quotation

@example
(gdb) break g.k2.kp
@end example
@end quotation

When the breakpoint occurs, you can step through the code of the
instance in the normal manner and examine the values of local variables, as for
other units.

@geindex Remote Debugging with gdbserver

@node Remote Debugging with gdbserver,GNAT Abnormal Termination or Failure to Terminate,Debugging Generic Units,Running and Debugging Ada Programs
@anchor{gnat_ugn/gnat_and_program_execution id12}@anchor{160}@anchor{gnat_ugn/gnat_and_program_execution remote-debugging-with-gdbserver}@anchor{161}
@subsection Remote Debugging with gdbserver


On platforms where gdbserver is supported, it is possible to use this tool
to debug your application remotely.  This can be useful in situations
where the program needs to be run on a target host that is different
from the host used for development, particularly when the target has
a limited amount of resources (either CPU and/or memory).

To do so, start your program using gdbserver on the target machine.
gdbserver then automatically suspends the execution of your program
at its entry point, waiting for a debugger to connect to it.  The
following commands starts an application and tells gdbserver to
wait for a connection with the debugger on localhost port 4444.

@quotation

@example
$ gdbserver localhost:4444 program
Process program created; pid = 5685
Listening on port 4444
@end example
@end quotation

Once gdbserver has started listening, we can tell the debugger to establish
a connection with this gdbserver, and then start the same debugging session
as if the program was being debugged on the same host, directly under
the control of GDB.

@quotation

@example
$ gdb program
(gdb) target remote targethost:4444
Remote debugging using targethost:4444
0x00007f29936d0af0 in ?? () from /lib64/ld-linux-x86-64.so.
(gdb) b foo.adb:3
Breakpoint 1 at 0x401f0c: file foo.adb, line 3.
(gdb) continue
Continuing.

Breakpoint 1, foo () at foo.adb:4
4       end foo;
@end example
@end quotation

It is also possible to use gdbserver to attach to an already running
program, in which case the execution of that program is simply suspended
until the connection between the debugger and gdbserver is established.

For more information on how to use gdbserver, see the @emph{Using the gdbserver Program}
section in @cite{Debugging with GDB}.
GNAT provides support for gdbserver on x86-linux, x86-windows and x86_64-linux.

@geindex Abnormal Termination or Failure to Terminate

@node GNAT Abnormal Termination or Failure to Terminate,Naming Conventions for GNAT Source Files,Remote Debugging with gdbserver,Running and Debugging Ada Programs
@anchor{gnat_ugn/gnat_and_program_execution gnat-abnormal-termination-or-failure-to-terminate}@anchor{162}@anchor{gnat_ugn/gnat_and_program_execution id13}@anchor{163}
@subsection GNAT Abnormal Termination or Failure to Terminate


When presented with programs that contain serious errors in syntax
or semantics,
GNAT may on rare occasions  experience problems in operation, such
as aborting with a
segmentation fault or illegal memory access, raising an internal
exception, terminating abnormally, or failing to terminate at all.
In such cases, you can activate
various features of GNAT that can help you pinpoint the construct in your
program that is the likely source of the problem.

The following strategies are presented in increasing order of
difficulty, corresponding to your experience in using GNAT and your
familiarity with compiler internals.


@itemize *

@item 
Run @code{gcc} with the @code{-gnatf}. This first
switch causes all errors on a given line to be reported. In its absence,
only the first error on a line is displayed.

The @code{-gnatdO} switch causes errors to be displayed as soon as they
are encountered, rather than after compilation is terminated. If GNAT
terminates prematurely or goes into an infinite loop, the last error
message displayed may help to pinpoint the culprit.

@item 
Run @code{gcc} with the @code{-v} (verbose) switch. In this
mode, @code{gcc} produces ongoing information about the progress of the
compilation and provides the name of each procedure as code is
generated. This switch allows you to find which Ada procedure was being
compiled when it encountered a code generation problem.
@end itemize

@geindex -gnatdc switch


@itemize *

@item 
Run @code{gcc} with the @code{-gnatdc} switch. This is a GNAT specific
switch that does for the front-end what @code{-v} does
for the back end. The system prints the name of each unit,
either a compilation unit or nested unit, as it is being analyzed.

@item 
Finally, you can start
@code{gdb} directly on the @code{gnat1} executable. @code{gnat1} is the
front-end of GNAT, and can be run independently (normally it is just
called from @code{gcc}). You can use @code{gdb} on @code{gnat1} as you
would on a C program (but @ref{14f,,The GNAT Debugger GDB} for caveats). The
@code{where} command is the first line of attack; the variable
@code{lineno} (seen by @code{print lineno}), used by the second phase of
@code{gnat1} and by the @code{gcc} backend, indicates the source line at
which the execution stopped, and @code{input_file name} indicates the name of
the source file.
@end itemize

@node Naming Conventions for GNAT Source Files,Getting Internal Debugging Information,GNAT Abnormal Termination or Failure to Terminate,Running and Debugging Ada Programs
@anchor{gnat_ugn/gnat_and_program_execution id14}@anchor{164}@anchor{gnat_ugn/gnat_and_program_execution naming-conventions-for-gnat-source-files}@anchor{165}
@subsection Naming Conventions for GNAT Source Files


In order to examine the workings of the GNAT system, the following
brief description of its organization may be helpful:


@itemize *

@item 
Files with prefix @code{sc} contain the lexical scanner.

@item 
All files prefixed with @code{par} are components of the parser. The
numbers correspond to chapters of the Ada Reference Manual. For example,
parsing of select statements can be found in @code{par-ch9.adb}.

@item 
All files prefixed with @code{sem} perform semantic analysis. The
numbers correspond to chapters of the Ada standard. For example, all
issues involving context clauses can be found in @code{sem_ch10.adb}. In
addition, some features of the language require sufficient special processing
to justify their own semantic files: sem_aggr for aggregates, sem_disp for
dynamic dispatching, etc.

@item 
All files prefixed with @code{exp} perform normalization and
expansion of the intermediate representation (abstract syntax tree, or AST).
these files use the same numbering scheme as the parser and semantics files.
For example, the construction of record initialization procedures is done in
@code{exp_ch3.adb}.

@item 
The files prefixed with @code{bind} implement the binder, which
verifies the consistency of the compilation, determines an order of
elaboration, and generates the bind file.

@item 
The files @code{atree.ads} and @code{atree.adb} detail the low-level
data structures used by the front-end.

@item 
The files @code{sinfo.ads} and @code{sinfo.adb} detail the structure of
the abstract syntax tree as produced by the parser.

@item 
The files @code{einfo.ads} and @code{einfo.adb} detail the attributes of
all entities, computed during semantic analysis.

@item 
Library management issues are dealt with in files with prefix
@code{lib}.

@geindex Annex A (in Ada Reference Manual)

@item 
Ada files with the prefix @code{a-} are children of @code{Ada}, as
defined in Annex A.

@geindex Annex B (in Ada reference Manual)

@item 
Files with prefix @code{i-} are children of @code{Interfaces}, as
defined in Annex B.

@geindex System (package in Ada Reference Manual)

@item 
Files with prefix @code{s-} are children of @code{System}. This includes
both language-defined children and GNAT run-time routines.

@geindex GNAT (package)

@item 
Files with prefix @code{g-} are children of @code{GNAT}. These are useful
general-purpose packages, fully documented in their specs. All
the other @code{.c} files are modifications of common @code{gcc} files.
@end itemize

@node Getting Internal Debugging Information,Stack Traceback,Naming Conventions for GNAT Source Files,Running and Debugging Ada Programs
@anchor{gnat_ugn/gnat_and_program_execution getting-internal-debugging-information}@anchor{166}@anchor{gnat_ugn/gnat_and_program_execution id15}@anchor{167}
@subsection Getting Internal Debugging Information


Most compilers have internal debugging switches and modes. GNAT
does also, except GNAT internal debugging switches and modes are not
secret. A summary and full description of all the compiler and binder
debug flags are in the file @code{debug.adb}. You must obtain the
sources of the compiler to see the full detailed effects of these flags.

The switches that print the source of the program (reconstructed from
the internal tree) are of general interest for user programs, as are the
options to print
the full internal tree, and the entity table (the symbol table
information). The reconstructed source provides a readable version of the
program after the front-end has completed analysis and  expansion,
and is useful when studying the performance of specific constructs.
For example, constraint checks are indicated, complex aggregates
are replaced with loops and assignments, and tasking primitives
are replaced with run-time calls.

@geindex traceback

@geindex stack traceback

@geindex stack unwinding

@node Stack Traceback,Pretty-Printers for the GNAT runtime,Getting Internal Debugging Information,Running and Debugging Ada Programs
@anchor{gnat_ugn/gnat_and_program_execution id16}@anchor{168}@anchor{gnat_ugn/gnat_and_program_execution stack-traceback}@anchor{169}
@subsection Stack Traceback


Traceback is a mechanism to display the sequence of subprogram calls that
leads to a specified execution point in a program. Often (but not always)
the execution point is an instruction at which an exception has been raised.
This mechanism is also known as @emph{stack unwinding} because it obtains
its information by scanning the run-time stack and recovering the activation
records of all active subprograms. Stack unwinding is one of the most
important tools for program debugging.

The first entry stored in traceback corresponds to the deepest calling level,
that is to say the subprogram currently executing the instruction
from which we want to obtain the traceback.

Note that there is no runtime performance penalty when stack traceback
is enabled, and no exception is raised during program execution.

@geindex traceback
@geindex non-symbolic

@menu
* Non-Symbolic Traceback:: 
* Symbolic Traceback:: 

@end menu

@node Non-Symbolic Traceback,Symbolic Traceback,,Stack Traceback
@anchor{gnat_ugn/gnat_and_program_execution id17}@anchor{16a}@anchor{gnat_ugn/gnat_and_program_execution non-symbolic-traceback}@anchor{16b}
@subsubsection Non-Symbolic Traceback


Note: this feature is not supported on all platforms. See
@code{GNAT.Traceback} spec in @code{g-traceb.ads}
for a complete list of supported platforms.

@subsubheading Tracebacks From an Unhandled Exception


A runtime non-symbolic traceback is a list of addresses of call instructions.
To enable this feature you must use the @code{-E}
@code{gnatbind} option. With this option a stack traceback is stored as part
of exception information. You can retrieve this information using the
@code{addr2line} tool.

Here is a simple example:

@quotation

@example
procedure STB is

   procedure P1 is
   begin
      raise Constraint_Error;
   end P1;

   procedure P2 is
   begin
      P1;
   end P2;

begin
   P2;
end STB;
@end example

@example
$ gnatmake stb -bargs -E
$ stb

Execution terminated by unhandled exception
Exception name: CONSTRAINT_ERROR
Message: stb.adb:5
Call stack traceback locations:
0x401373 0x40138b 0x40139c 0x401335 0x4011c4 0x4011f1 0x77e892a4
@end example
@end quotation

As we see the traceback lists a sequence of addresses for the unhandled
exception @code{CONSTRAINT_ERROR} raised in procedure P1. It is easy to
guess that this exception come from procedure P1. To translate these
addresses into the source lines where the calls appear, the
@code{addr2line} tool, described below, is invaluable. The use of this tool
requires the program to be compiled with debug information.

@quotation

@example
$ gnatmake -g stb -bargs -E
$ stb

Execution terminated by unhandled exception
Exception name: CONSTRAINT_ERROR
Message: stb.adb:5
Call stack traceback locations:
0x401373 0x40138b 0x40139c 0x401335 0x4011c4 0x4011f1 0x77e892a4

$ addr2line --exe=stb 0x401373 0x40138b 0x40139c 0x401335 0x4011c4
   0x4011f1 0x77e892a4

00401373 at d:/stb/stb.adb:5
0040138B at d:/stb/stb.adb:10
0040139C at d:/stb/stb.adb:14
00401335 at d:/stb/b~stb.adb:104
004011C4 at /build/.../crt1.c:200
004011F1 at /build/.../crt1.c:222
77E892A4 in ?? at ??:0
@end example
@end quotation

The @code{addr2line} tool has several other useful options:

@quotation


@multitable {xxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{--functions}

@tab

to get the function name corresponding to any location

@item

@code{--demangle=gnat}

@tab

to use the gnat decoding mode for the function names.
Note that for binutils version 2.9.x the option is
simply @code{--demangle}.

@end multitable


@example
$ addr2line --exe=stb --functions --demangle=gnat 0x401373 0x40138b
   0x40139c 0x401335 0x4011c4 0x4011f1

00401373 in stb.p1 at d:/stb/stb.adb:5
0040138B in stb.p2 at d:/stb/stb.adb:10
0040139C in stb at d:/stb/stb.adb:14
00401335 in main at d:/stb/b~stb.adb:104
004011C4 in <__mingw_CRTStartup> at /build/.../crt1.c:200
004011F1 in <mainCRTStartup> at /build/.../crt1.c:222
@end example
@end quotation

From this traceback we can see that the exception was raised in
@code{stb.adb} at line 5, which was reached from a procedure call in
@code{stb.adb} at line 10, and so on. The @code{b~std.adb} is the binder file,
which contains the call to the main program.
@ref{10e,,Running gnatbind}. The remaining entries are assorted runtime routines,
and the output will vary from platform to platform.

It is also possible to use @code{GDB} with these traceback addresses to debug
the program. For example, we can break at a given code location, as reported
in the stack traceback:

@quotation

@example
$ gdb -nw stb
@end example
@end quotation

Furthermore, this feature is not implemented inside Windows DLL. Only
the non-symbolic traceback is reported in this case.

@quotation

@example
(gdb) break *0x401373
Breakpoint 1 at 0x401373: file stb.adb, line 5.
@end example
@end quotation

It is important to note that the stack traceback addresses
do not change when debug information is included. This is particularly useful
because it makes it possible to release software without debug information (to
minimize object size), get a field report that includes a stack traceback
whenever an internal bug occurs, and then be able to retrieve the sequence
of calls with the same program compiled with debug information.

@subsubheading Tracebacks From Exception Occurrences


Non-symbolic tracebacks are obtained by using the @code{-E} binder argument.
The stack traceback is attached to the exception information string, and can
be retrieved in an exception handler within the Ada program, by means of the
Ada facilities defined in @code{Ada.Exceptions}. Here is a simple example:

@quotation

@example
with Ada.Text_IO;
with Ada.Exceptions;

procedure STB is

   use Ada;
   use Ada.Exceptions;

   procedure P1 is
      K : Positive := 1;
   begin
      K := K - 1;
   exception
      when E : others =>
         Text_IO.Put_Line (Exception_Information (E));
   end P1;

   procedure P2 is
   begin
      P1;
   end P2;

begin
   P2;
end STB;
@end example
@end quotation

This program will output:

@quotation

@example
$ stb

Exception name: CONSTRAINT_ERROR
Message: stb.adb:12
Call stack traceback locations:
0x4015e4 0x401633 0x401644 0x401461 0x4011c4 0x4011f1 0x77e892a4
@end example
@end quotation

@subsubheading Tracebacks From Anywhere in a Program


It is also possible to retrieve a stack traceback from anywhere in a
program. For this you need to
use the @code{GNAT.Traceback} API. This package includes a procedure called
@code{Call_Chain} that computes a complete stack traceback, as well as useful
display procedures described below. It is not necessary to use the
@code{-E} @code{gnatbind} option in this case, because the stack traceback mechanism
is invoked explicitly.

In the following example we compute a traceback at a specific location in
the program, and we display it using @code{GNAT.Debug_Utilities.Image} to
convert addresses to strings:

@quotation

@example
with Ada.Text_IO;
with GNAT.Traceback;
with GNAT.Debug_Utilities;

procedure STB is

   use Ada;
   use GNAT;
   use GNAT.Traceback;

   procedure P1 is
      TB  : Tracebacks_Array (1 .. 10);
      --  We are asking for a maximum of 10 stack frames.
      Len : Natural;
      --  Len will receive the actual number of stack frames returned.
   begin
      Call_Chain (TB, Len);

      Text_IO.Put ("In STB.P1 : ");

      for K in 1 .. Len loop
         Text_IO.Put (Debug_Utilities.Image (TB (K)));
         Text_IO.Put (' ');
      end loop;

      Text_IO.New_Line;
   end P1;

   procedure P2 is
   begin
      P1;
   end P2;

begin
   P2;
end STB;
@end example

@example
$ gnatmake -g stb
$ stb

In STB.P1 : 16#0040_F1E4# 16#0040_14F2# 16#0040_170B# 16#0040_171C#
16#0040_1461# 16#0040_11C4# 16#0040_11F1# 16#77E8_92A4#
@end example
@end quotation

You can then get further information by invoking the @code{addr2line}
tool as described earlier (note that the hexadecimal addresses
need to be specified in C format, with a leading ‘0x’).

@geindex traceback
@geindex symbolic

@node Symbolic Traceback,,Non-Symbolic Traceback,Stack Traceback
@anchor{gnat_ugn/gnat_and_program_execution id18}@anchor{16c}@anchor{gnat_ugn/gnat_and_program_execution symbolic-traceback}@anchor{16d}
@subsubsection Symbolic Traceback


A symbolic traceback is a stack traceback in which procedure names are
associated with each code location.

Note that this feature is not supported on all platforms. See
@code{GNAT.Traceback.Symbolic} spec in @code{g-trasym.ads} for a complete
list of currently supported platforms.

Note that the symbolic traceback requires that the program be compiled
with debug information. If it is not compiled with debug information
only the non-symbolic information will be valid.

@subsubheading Tracebacks From Exception Occurrences


Here is an example:

@quotation

@example
with Ada.Text_IO;
with GNAT.Traceback.Symbolic;

procedure STB is

   procedure P1 is
   begin
      raise Constraint_Error;
   end P1;

   procedure P2 is
   begin
      P1;
   end P2;

   procedure P3 is
   begin
      P2;
   end P3;

begin
   P3;
exception
   when E : others =>
      Ada.Text_IO.Put_Line (GNAT.Traceback.Symbolic.Symbolic_Traceback (E));
end STB;
@end example

@example
$ gnatmake -g .\stb -bargs -E
$ stb

0040149F in stb.p1 at stb.adb:8
004014B7 in stb.p2 at stb.adb:13
004014CF in stb.p3 at stb.adb:18
004015DD in ada.stb at stb.adb:22
00401461 in main at b~stb.adb:168
004011C4 in __mingw_CRTStartup at crt1.c:200
004011F1 in mainCRTStartup at crt1.c:222
77E892A4 in ?? at ??:0
@end example
@end quotation

In the above example the @code{.\} syntax in the @code{gnatmake} command
is currently required by @code{addr2line} for files that are in
the current working directory.
Moreover, the exact sequence of linker options may vary from platform
to platform.
The above @code{-largs} section is for Windows platforms. By contrast,
under Unix there is no need for the @code{-largs} section.
Differences across platforms are due to details of linker implementation.

@subsubheading Tracebacks From Anywhere in a Program


It is possible to get a symbolic stack traceback
from anywhere in a program, just as for non-symbolic tracebacks.
The first step is to obtain a non-symbolic
traceback, and then call @code{Symbolic_Traceback} to compute the symbolic
information. Here is an example:

@quotation

@example
with Ada.Text_IO;
with GNAT.Traceback;
with GNAT.Traceback.Symbolic;

procedure STB is

   use Ada;
   use GNAT.Traceback;
   use GNAT.Traceback.Symbolic;

   procedure P1 is
      TB  : Tracebacks_Array (1 .. 10);
      --  We are asking for a maximum of 10 stack frames.
      Len : Natural;
      --  Len will receive the actual number of stack frames returned.
   begin
      Call_Chain (TB, Len);
      Text_IO.Put_Line (Symbolic_Traceback (TB (1 .. Len)));
   end P1;

   procedure P2 is
   begin
      P1;
   end P2;

begin
   P2;
end STB;
@end example
@end quotation

@subsubheading Automatic Symbolic Tracebacks


Symbolic tracebacks may also be enabled by using the -Es switch to gnatbind (as
in @code{gprbuild -g ... -bargs -Es}).
This will cause the Exception_Information to contain a symbolic traceback,
which will also be printed if an unhandled exception terminates the
program.

@node Pretty-Printers for the GNAT runtime,,Stack Traceback,Running and Debugging Ada Programs
@anchor{gnat_ugn/gnat_and_program_execution id19}@anchor{16e}@anchor{gnat_ugn/gnat_and_program_execution pretty-printers-for-the-gnat-runtime}@anchor{16f}
@subsection Pretty-Printers for the GNAT runtime


As discussed in @cite{Calling User-Defined Subprograms}, GDB’s
@code{print} command only knows about the physical layout of program data
structures and therefore normally displays only low-level dumps, which
are often hard to understand.

An example of this is when trying to display the contents of an Ada
standard container, such as @code{Ada.Containers.Ordered_Maps.Map}:

@quotation

@example
with Ada.Containers.Ordered_Maps;

procedure PP is
   package Int_To_Nat is
      new Ada.Containers.Ordered_Maps (Integer, Natural);

   Map : Int_To_Nat.Map;
begin
   Map.Insert (1, 10);
   Map.Insert (2, 20);
   Map.Insert (3, 30);

   Map.Clear; --  BREAK HERE
end PP;
@end example
@end quotation

When this program is built with debugging information and run under
GDB up to the @code{Map.Clear} statement, trying to print @code{Map} will
yield information that is only relevant to the developers of our standard
containers:

@quotation

@example
(gdb) print map
$1 = (
  tree => (
    first => 0x64e010,
    last => 0x64e070,
    root => 0x64e040,
    length => 3,
    tc => (
      busy => 0,
      lock => 0
    )
  )
)
@end example
@end quotation

Fortunately, GDB has a feature called pretty-printers@footnote{http://docs.adacore.com/gdb-docs/html/gdb.html#Pretty_002dPrinter-Introduction},
which allows customizing how GDB displays data structures. The GDB
shipped with GNAT embeds such pretty-printers for the most common
containers in the standard library.  To enable them, either run the
following command manually under GDB or add it to your @code{.gdbinit} file:

@quotation

@example
python import gnatdbg; gnatdbg.setup()
@end example
@end quotation

Once this is done, GDB’s @code{print} command will automatically use
these pretty-printers when appropriate. Using the previous example:

@quotation

@example
(gdb) print map
$1 = pp.int_to_nat.map of length 3 = @{
  [1] = 10,
  [2] = 20,
  [3] = 30
@}
@end example
@end quotation

Pretty-printers are invoked each time GDB tries to display a value,
including when displaying the arguments of a called subprogram (in
GDB’s @code{backtrace} command) or when printing the value returned by a
function (in GDB’s @code{finish} command).

To display a value without involving pretty-printers, @code{print} can be
invoked with its @code{/r} option:

@quotation

@example
(gdb) print/r map
$1 = (
  tree => (...
@end example
@end quotation

Finer control of pretty-printers is also possible: see GDB's online documentation@footnote{http://docs.adacore.com/gdb-docs/html/gdb.html#Pretty_002dPrinter-Commands}
for more information.

@geindex Profiling

@node Profiling,Improving Performance,Running and Debugging Ada Programs,GNAT and Program Execution
@anchor{gnat_ugn/gnat_and_program_execution id20}@anchor{170}@anchor{gnat_ugn/gnat_and_program_execution profiling}@anchor{147}
@section Profiling


This section describes how to use the @code{gprof} profiler tool on Ada programs.

@geindex gprof

@geindex Profiling

@menu
* Profiling an Ada Program with gprof:: 

@end menu

@node Profiling an Ada Program with gprof,,,Profiling
@anchor{gnat_ugn/gnat_and_program_execution id21}@anchor{171}@anchor{gnat_ugn/gnat_and_program_execution profiling-an-ada-program-with-gprof}@anchor{172}
@subsection Profiling an Ada Program with gprof


This section is not meant to be an exhaustive documentation of @code{gprof}.
Full documentation for it can be found in the @cite{GNU Profiler User’s Guide}
documentation that is part of this GNAT distribution.

Profiling a program helps determine the parts of a program that are executed
most often, and are therefore the most time-consuming.

@code{gprof} is the standard GNU profiling tool; it has been enhanced to
better handle Ada programs and multitasking.
It is currently supported on the following platforms


@itemize *

@item 
linux x86/x86_64

@item 
windows x86
@end itemize

In order to profile a program using @code{gprof}, several steps are needed:


@enumerate 

@item 
Instrument the code, which requires a full recompilation of the project with the
proper switches.

@item 
Execute the program under the analysis conditions, i.e. with the desired
input.

@item 
Analyze the results using the @code{gprof} tool.
@end enumerate

The following sections detail the different steps, and indicate how
to interpret the results.

@menu
* Compilation for profiling:: 
* Program execution:: 
* Running gprof:: 
* Interpretation of profiling results:: 

@end menu

@node Compilation for profiling,Program execution,,Profiling an Ada Program with gprof
@anchor{gnat_ugn/gnat_and_program_execution compilation-for-profiling}@anchor{173}@anchor{gnat_ugn/gnat_and_program_execution id22}@anchor{174}
@subsubsection Compilation for profiling


@geindex -pg (gcc)
@geindex for profiling

@geindex -pg (gnatlink)
@geindex for profiling

In order to profile a program the first step is to tell the compiler
to generate the necessary profiling information. The compiler switch to be used
is @code{-pg}, which must be added to other compilation switches. This
switch needs to be specified both during compilation and link stages, and can
be specified once when using gnatmake:

@quotation

@example
$ gnatmake -f -pg -P my_project
@end example
@end quotation

Note that only the objects that were compiled with the @code{-pg} switch will
be profiled; if you need to profile your whole project, use the @code{-f}
gnatmake switch to force full recompilation.

@node Program execution,Running gprof,Compilation for profiling,Profiling an Ada Program with gprof
@anchor{gnat_ugn/gnat_and_program_execution id23}@anchor{175}@anchor{gnat_ugn/gnat_and_program_execution program-execution}@anchor{176}
@subsubsection Program execution


Once the program has been compiled for profiling, you can run it as usual.

The only constraint imposed by profiling is that the program must terminate
normally. An interrupted program (via a Ctrl-C, kill, etc.) will not be
properly analyzed.

Once the program completes execution, a data file called @code{gmon.out} is
generated in the directory where the program was launched from. If this file
already exists, it will be overwritten.

@node Running gprof,Interpretation of profiling results,Program execution,Profiling an Ada Program with gprof
@anchor{gnat_ugn/gnat_and_program_execution id24}@anchor{177}@anchor{gnat_ugn/gnat_and_program_execution running-gprof}@anchor{178}
@subsubsection Running gprof


The @code{gprof} tool is called as follow:

@quotation

@example
$ gprof my_prog gmon.out
@end example
@end quotation

or simply:

@quotation

@example
$  gprof my_prog
@end example
@end quotation

The complete form of the gprof command line is the following:

@quotation

@example
$ gprof [switches] [executable [data-file]]
@end example
@end quotation

@code{gprof} supports numerous switches. The order of these
switch does not matter. The full list of options can be found in
the GNU Profiler User’s Guide documentation that comes with this documentation.

The following is the subset of those switches that is most relevant:

@geindex --demangle (gprof)


@table @asis

@item @code{--demangle[=@emph{style}]}, @code{--no-demangle}

These options control whether symbol names should be demangled when
printing output.  The default is to demangle C++ symbols.  The
@code{--no-demangle} option may be used to turn off demangling. Different
compilers have different mangling styles.  The optional demangling style
argument can be used to choose an appropriate demangling style for your
compiler, in particular Ada symbols generated by GNAT can be demangled using
@code{--demangle=gnat}.
@end table

@geindex -e (gprof)


@table @asis

@item @code{-e @emph{function_name}}

The @code{-e @emph{function}} option tells @code{gprof} not to print
information about the function @code{function_name} (and its
children…) in the call graph.  The function will still be listed
as a child of any functions that call it, but its index number will be
shown as @code{[not printed]}.  More than one @code{-e} option may be
given; only one @code{function_name} may be indicated with each @code{-e}
option.
@end table

@geindex -E (gprof)


@table @asis

@item @code{-E @emph{function_name}}

The @code{-E @emph{function}} option works like the @code{-e} option, but
execution time spent in the function (and children who were not called from
anywhere else), will not be used to compute the percentages-of-time for
the call graph.  More than one @code{-E} option may be given; only one
@code{function_name} may be indicated with each @code{-E`} option.
@end table

@geindex -f (gprof)


@table @asis

@item @code{-f @emph{function_name}}

The @code{-f @emph{function}} option causes @code{gprof} to limit the
call graph to the function @code{function_name} and its children (and
their children…).  More than one @code{-f} option may be given;
only one @code{function_name} may be indicated with each @code{-f}
option.
@end table

@geindex -F (gprof)


@table @asis

@item @code{-F @emph{function_name}}

The @code{-F @emph{function}} option works like the @code{-f} option, but
only time spent in the function and its children (and their
children…) will be used to determine total-time and
percentages-of-time for the call graph.  More than one @code{-F} option
may be given; only one @code{function_name} may be indicated with each
@code{-F} option.  The @code{-F} option overrides the @code{-E} option.
@end table

@node Interpretation of profiling results,,Running gprof,Profiling an Ada Program with gprof
@anchor{gnat_ugn/gnat_and_program_execution id25}@anchor{179}@anchor{gnat_ugn/gnat_and_program_execution interpretation-of-profiling-results}@anchor{17a}
@subsubsection Interpretation of profiling results


The results of the profiling analysis are represented by two arrays: the
‘flat profile’ and the ‘call graph’. Full documentation of those outputs
can be found in the GNU Profiler User’s Guide.

The flat profile shows the time spent in each function of the program, and how
many time it has been called. This allows you to locate easily the most
time-consuming functions.

The call graph shows, for each subprogram, the subprograms that call it,
and the subprograms that it calls. It also provides an estimate of the time
spent in each of those callers/called subprograms.

@node Improving Performance,Overflow Check Handling in GNAT,Profiling,GNAT and Program Execution
@anchor{gnat_ugn/gnat_and_program_execution id26}@anchor{148}@anchor{gnat_ugn/gnat_and_program_execution improving-performance}@anchor{17b}
@section Improving Performance


@geindex Improving performance

This section presents several topics related to program performance.
It first describes some of the tradeoffs that need to be considered
and some of the techniques for making your program run faster.

It then documents the unused subprogram/data elimination feature,
which can reduce the size of program executables.

@menu
* Performance Considerations:: 
* Text_IO Suggestions:: 
* Reducing Size of Executables with Unused Subprogram/Data Elimination:: 

@end menu

@node Performance Considerations,Text_IO Suggestions,,Improving Performance
@anchor{gnat_ugn/gnat_and_program_execution id27}@anchor{17c}@anchor{gnat_ugn/gnat_and_program_execution performance-considerations}@anchor{17d}
@subsection Performance Considerations


The GNAT system provides a number of options that allow a trade-off
between


@itemize *

@item 
performance of the generated code

@item 
speed of compilation

@item 
minimization of dependences and recompilation

@item 
the degree of run-time checking.
@end itemize

The defaults (if no options are selected) aim at improving the speed
of compilation and minimizing dependences, at the expense of performance
of the generated code:


@itemize *

@item 
no optimization

@item 
no inlining of subprogram calls

@item 
all run-time checks enabled except overflow and elaboration checks
@end itemize

These options are suitable for most program development purposes. This
section describes how you can modify these choices, and also provides
some guidelines on debugging optimized code.

@menu
* Controlling Run-Time Checks:: 
* Use of Restrictions:: 
* Optimization Levels:: 
* Debugging Optimized Code:: 
* Inlining of Subprograms:: 
* Floating Point Operations:: 
* Vectorization of loops:: 
* Other Optimization Switches:: 
* Optimization and Strict Aliasing:: 
* Aliased Variables and Optimization:: 
* Atomic Variables and Optimization:: 
* Passive Task Optimization:: 

@end menu

@node Controlling Run-Time Checks,Use of Restrictions,,Performance Considerations
@anchor{gnat_ugn/gnat_and_program_execution controlling-run-time-checks}@anchor{17e}@anchor{gnat_ugn/gnat_and_program_execution id28}@anchor{17f}
@subsubsection Controlling Run-Time Checks


By default, GNAT generates all run-time checks, except stack overflow
checks, and checks for access before elaboration on subprogram
calls. The latter are not required in default mode, because all
necessary checking is done at compile time.

@geindex -gnatp (gcc)

@geindex -gnato (gcc)

The gnat switch, @code{-gnatp} allows this default to be modified. See
@ref{ea,,Run-Time Checks}.

Our experience is that the default is suitable for most development
purposes.

Elaboration checks are off by default, and also not needed by default, since
GNAT uses a static elaboration analysis approach that avoids the need for
run-time checking. This manual contains a full chapter discussing the issue
of elaboration checks, and if the default is not satisfactory for your use,
you should read this chapter.

For validity checks, the minimal checks required by the Ada Reference
Manual (for case statements and assignments to array elements) are on
by default. These can be suppressed by use of the @code{-gnatVn} switch.
Note that in Ada 83, there were no validity checks, so if the Ada 83 mode
is acceptable (or when comparing GNAT performance with an Ada 83 compiler),
it may be reasonable to routinely use @code{-gnatVn}. Validity checks
are also suppressed entirely if @code{-gnatp} is used.

@geindex Overflow checks

@geindex Checks
@geindex overflow

@geindex Suppress

@geindex Unsuppress

@geindex pragma Suppress

@geindex pragma Unsuppress

Note that the setting of the switches controls the default setting of
the checks. They may be modified using either @code{pragma Suppress} (to
remove checks) or @code{pragma Unsuppress} (to add back suppressed
checks) in the program source.

@node Use of Restrictions,Optimization Levels,Controlling Run-Time Checks,Performance Considerations
@anchor{gnat_ugn/gnat_and_program_execution id29}@anchor{180}@anchor{gnat_ugn/gnat_and_program_execution use-of-restrictions}@anchor{181}
@subsubsection Use of Restrictions


The use of pragma Restrictions allows you to control which features are
permitted in your program. Apart from the obvious point that if you avoid
relatively expensive features like finalization (enforceable by the use
of pragma Restrictions (No_Finalization), the use of this pragma does not
affect the generated code in most cases.

One notable exception to this rule is that the possibility of task abort
results in some distributed overhead, particularly if finalization or
exception handlers are used. The reason is that certain sections of code
have to be marked as non-abortable.

If you use neither the @code{abort} statement, nor asynchronous transfer
of control (@code{select ... then abort}), then this distributed overhead
is removed, which may have a general positive effect in improving
overall performance.  Especially code involving frequent use of tasking
constructs and controlled types will show much improved performance.
The relevant restrictions pragmas are

@quotation

@example
pragma Restrictions (No_Abort_Statements);
pragma Restrictions (Max_Asynchronous_Select_Nesting => 0);
@end example
@end quotation

It is recommended that these restriction pragmas be used if possible. Note
that this also means that you can write code without worrying about the
possibility of an immediate abort at any point.

@node Optimization Levels,Debugging Optimized Code,Use of Restrictions,Performance Considerations
@anchor{gnat_ugn/gnat_and_program_execution id30}@anchor{182}@anchor{gnat_ugn/gnat_and_program_execution optimization-levels}@anchor{ed}
@subsubsection Optimization Levels


@geindex -O (gcc)

Without any optimization option,
the compiler’s goal is to reduce the cost of
compilation and to make debugging produce the expected results.
Statements are independent: if you stop the program with a breakpoint between
statements, you can then assign a new value to any variable or change
the program counter to any other statement in the subprogram and get exactly
the results you would expect from the source code.

Turning on optimization makes the compiler attempt to improve the
performance and/or code size at the expense of compilation time and
possibly the ability to debug the program.

If you use multiple
-O options, with or without level numbers,
the last such option is the one that is effective.

The default is optimization off. This results in the fastest compile
times, but GNAT makes absolutely no attempt to optimize, and the
generated programs are considerably larger and slower than when
optimization is enabled. You can use the
@code{-O} switch (the permitted forms are @code{-O0}, @code{-O1}
@code{-O2}, @code{-O3}, and @code{-Os})
to @code{gcc} to control the optimization level:


@itemize *

@item 

@table @asis

@item @code{-O0}

No optimization (the default);
generates unoptimized code but has
the fastest compilation time.

Note that many other compilers do substantial optimization even
if ‘no optimization’ is specified. With gcc, it is very unusual
to use @code{-O0} for production if execution time is of any concern,
since @code{-O0} means (almost) no optimization. This difference
between gcc and other compilers should be kept in mind when
doing performance comparisons.
@end table

@item 

@table @asis

@item @code{-O1}

Moderate optimization;
optimizes reasonably well but does not
degrade compilation time significantly.
@end table

@item 

@table @asis

@item @code{-O2}

Full optimization;
generates highly optimized code and has
the slowest compilation time.
@end table

@item 

@table @asis

@item @code{-O3}

Full optimization as in @code{-O2};
also uses more aggressive automatic inlining of subprograms within a unit
(@ref{100,,Inlining of Subprograms}) and attempts to vectorize loops.
@end table

@item 

@table @asis

@item @code{-Os}

Optimize space usage (code and data) of resulting program.
@end table
@end itemize

Higher optimization levels perform more global transformations on the
program and apply more expensive analysis algorithms in order to generate
faster and more compact code. The price in compilation time, and the
resulting improvement in execution time,
both depend on the particular application and the hardware environment.
You should experiment to find the best level for your application.

Since the precise set of optimizations done at each level will vary from
release to release (and sometime from target to target), it is best to think
of the optimization settings in general terms.
See the @emph{Options That Control Optimization} section in
@cite{Using the GNU Compiler Collection (GCC)}
for details about
the @code{-O} settings and a number of @code{-f} options that
individually enable or disable specific optimizations.

Unlike some other compilation systems, @code{gcc} has
been tested extensively at all optimization levels. There are some bugs
which appear only with optimization turned on, but there have also been
bugs which show up only in @emph{unoptimized} code. Selecting a lower
level of optimization does not improve the reliability of the code
generator, which in practice is highly reliable at all optimization
levels.

Note regarding the use of @code{-O3}: The use of this optimization level
ought not to be automatically preferred over that of level @code{-O2},
since it often results in larger executables which may run more slowly.
See further discussion of this point in @ref{100,,Inlining of Subprograms}.

@node Debugging Optimized Code,Inlining of Subprograms,Optimization Levels,Performance Considerations
@anchor{gnat_ugn/gnat_and_program_execution debugging-optimized-code}@anchor{183}@anchor{gnat_ugn/gnat_and_program_execution id31}@anchor{184}
@subsubsection Debugging Optimized Code


@geindex Debugging optimized code

@geindex Optimization and debugging

Although it is possible to do a reasonable amount of debugging at
nonzero optimization levels,
the higher the level the more likely that
source-level constructs will have been eliminated by optimization.
For example, if a loop is strength-reduced, the loop
control variable may be completely eliminated and thus cannot be
displayed in the debugger.
This can only happen at @code{-O2} or @code{-O3}.
Explicit temporary variables that you code might be eliminated at
level @code{-O1} or higher.

@geindex -g (gcc)

The use of the @code{-g} switch,
which is needed for source-level debugging,
affects the size of the program executable on disk,
and indeed the debugging information can be quite large.
However, it has no effect on the generated code (and thus does not
degrade performance)

Since the compiler generates debugging tables for a compilation unit before
it performs optimizations, the optimizing transformations may invalidate some
of the debugging data.  You therefore need to anticipate certain
anomalous situations that may arise while debugging optimized code.
These are the most common cases:


@itemize *

@item 
@emph{The ‘hopping Program Counter’:}  Repeated @code{step} or @code{next}
commands show
the PC bouncing back and forth in the code.  This may result from any of
the following optimizations:


@itemize -

@item 
@emph{Common subexpression elimination:} using a single instance of code for a
quantity that the source computes several times.  As a result you
may not be able to stop on what looks like a statement.

@item 
@emph{Invariant code motion:} moving an expression that does not change within a
loop, to the beginning of the loop.

@item 
@emph{Instruction scheduling:} moving instructions so as to
overlap loads and stores (typically) with other code, or in
general to move computations of values closer to their uses. Often
this causes you to pass an assignment statement without the assignment
happening and then later bounce back to the statement when the
value is actually needed.  Placing a breakpoint on a line of code
and then stepping over it may, therefore, not always cause all the
expected side-effects.
@end itemize

@item 
@emph{The ‘big leap’:} More commonly known as @emph{cross-jumping}, in which
two identical pieces of code are merged and the program counter suddenly
jumps to a statement that is not supposed to be executed, simply because
it (and the code following) translates to the same thing as the code
that @emph{was} supposed to be executed.  This effect is typically seen in
sequences that end in a jump, such as a @code{goto}, a @code{return}, or
a @code{break} in a C @code{switch} statement.

@item 
@emph{The ‘roving variable’:} The symptom is an unexpected value in a variable.
There are various reasons for this effect:


@itemize -

@item 
In a subprogram prologue, a parameter may not yet have been moved to its
‘home’.

@item 
A variable may be dead, and its register re-used.  This is
probably the most common cause.

@item 
As mentioned above, the assignment of a value to a variable may
have been moved.

@item 
A variable may be eliminated entirely by value propagation or
other means.  In this case, GCC may incorrectly generate debugging
information for the variable
@end itemize

In general, when an unexpected value appears for a local variable or parameter
you should first ascertain if that value was actually computed by
your program, as opposed to being incorrectly reported by the debugger.
Record fields or
array elements in an object designated by an access value
are generally less of a problem, once you have ascertained that the access
value is sensible.
Typically, this means checking variables in the preceding code and in the
calling subprogram to verify that the value observed is explainable from other
values (one must apply the procedure recursively to those
other values); or re-running the code and stopping a little earlier
(perhaps before the call) and stepping to better see how the variable obtained
the value in question; or continuing to step @emph{from} the point of the
strange value to see if code motion had simply moved the variable’s
assignments later.
@end itemize

In light of such anomalies, a recommended technique is to use @code{-O0}
early in the software development cycle, when extensive debugging capabilities
are most needed, and then move to @code{-O1} and later @code{-O2} as
the debugger becomes less critical.
Whether to use the @code{-g} switch in the release version is
a release management issue.
Note that if you use @code{-g} you can then use the @code{strip} program
on the resulting executable,
which removes both debugging information and global symbols.

@node Inlining of Subprograms,Floating Point Operations,Debugging Optimized Code,Performance Considerations
@anchor{gnat_ugn/gnat_and_program_execution id32}@anchor{185}@anchor{gnat_ugn/gnat_and_program_execution inlining-of-subprograms}@anchor{100}
@subsubsection Inlining of Subprograms


A call to a subprogram in the current unit is inlined if all the
following conditions are met:


@itemize *

@item 
The optimization level is at least @code{-O1}.

@item 
The called subprogram is suitable for inlining: It must be small enough
and not contain something that @code{gcc} cannot support in inlined
subprograms.

@geindex pragma Inline

@geindex Inline

@item 
Any one of the following applies: @code{pragma Inline} is applied to the
subprogram; the subprogram is local to the unit and called once from
within it; the subprogram is small and optimization level @code{-O2} is
specified; optimization level @code{-O3} is specified.
@end itemize

Calls to subprograms in @emph{with}ed units are normally not inlined.
To achieve actual inlining (that is, replacement of the call by the code
in the body of the subprogram), the following conditions must all be true:


@itemize *

@item 
The optimization level is at least @code{-O1}.

@item 
The called subprogram is suitable for inlining: It must be small enough
and not contain something that @code{gcc} cannot support in inlined
subprograms.

@item 
There is a @code{pragma Inline} for the subprogram.

@item 
The @code{-gnatn} switch is used on the command line.
@end itemize

Even if all these conditions are met, it may not be possible for
the compiler to inline the call, due to the length of the body,
or features in the body that make it impossible for the compiler
to do the inlining.

Note that specifying the @code{-gnatn} switch causes additional
compilation dependencies. Consider the following:

@quotation

@example
package R is
   procedure Q;
   pragma Inline (Q);
end R;
package body R is
   ...
end R;

with R;
procedure Main is
begin
   ...
   R.Q;
end Main;
@end example
@end quotation

With the default behavior (no @code{-gnatn} switch specified), the
compilation of the @code{Main} procedure depends only on its own source,
@code{main.adb}, and the spec of the package in file @code{r.ads}. This
means that editing the body of @code{R} does not require recompiling
@code{Main}.

On the other hand, the call @code{R.Q} is not inlined under these
circumstances. If the @code{-gnatn} switch is present when @code{Main}
is compiled, the call will be inlined if the body of @code{Q} is small
enough, but now @code{Main} depends on the body of @code{R} in
@code{r.adb} as well as on the spec. This means that if this body is edited,
the main program must be recompiled. Note that this extra dependency
occurs whether or not the call is in fact inlined by @code{gcc}.

The use of front end inlining with @code{-gnatN} generates similar
additional dependencies.

@geindex -fno-inline (gcc)

Note: The @code{-fno-inline} switch overrides all other conditions and ensures that
no inlining occurs, unless requested with pragma Inline_Always for @code{gcc}
back-ends. The extra dependences resulting from @code{-gnatn} will still be active,
even if this switch is used to suppress the resulting inlining actions.

@geindex -fno-inline-functions (gcc)

Note: The @code{-fno-inline-functions} switch can be used to prevent
automatic inlining of subprograms if @code{-O3} is used.

@geindex -fno-inline-small-functions (gcc)

Note: The @code{-fno-inline-small-functions} switch can be used to prevent
automatic inlining of small subprograms if @code{-O2} is used.

@geindex -fno-inline-functions-called-once (gcc)

Note: The @code{-fno-inline-functions-called-once} switch
can be used to prevent inlining of subprograms local to the unit
and called once from within it if @code{-O1} is used.

Note regarding the use of @code{-O3}: @code{-gnatn} is made up of two
sub-switches @code{-gnatn1} and @code{-gnatn2} that can be directly
specified in lieu of it, @code{-gnatn} being translated into one of them
based on the optimization level. With @code{-O2} or below, @code{-gnatn}
is equivalent to @code{-gnatn1} which activates pragma @code{Inline} with
moderate inlining across modules. With @code{-O3}, @code{-gnatn} is
equivalent to @code{-gnatn2} which activates pragma @code{Inline} with
full inlining across modules. If you have used pragma @code{Inline} in
appropriate cases, then it is usually much better to use @code{-O2}
and @code{-gnatn} and avoid the use of @code{-O3} which has the additional
effect of inlining subprograms you did not think should be inlined. We have
found that the use of @code{-O3} may slow down the compilation and increase
the code size by performing excessive inlining, leading to increased
instruction cache pressure from the increased code size and thus minor
performance improvements. So the bottom line here is that you should not
automatically assume that @code{-O3} is better than @code{-O2}, and
indeed you should use @code{-O3} only if tests show that it actually
improves performance for your program.

@node Floating Point Operations,Vectorization of loops,Inlining of Subprograms,Performance Considerations
@anchor{gnat_ugn/gnat_and_program_execution floating-point-operations}@anchor{186}@anchor{gnat_ugn/gnat_and_program_execution id33}@anchor{187}
@subsubsection Floating Point Operations


@geindex Floating-Point Operations

On almost all targets, GNAT maps Float and Long_Float to the 32-bit and
64-bit standard IEEE floating-point representations, and operations will
use standard IEEE arithmetic as provided by the processor. On most, but
not all, architectures, the attribute Machine_Overflows is False for these
types, meaning that the semantics of overflow is implementation-defined.
In the case of GNAT, these semantics correspond to the normal IEEE
treatment of infinities and NaN (not a number) values. For example,
1.0 / 0.0 yields plus infinitiy and 0.0 / 0.0 yields a NaN. By
avoiding explicit overflow checks, the performance is greatly improved
on many targets. However, if required, floating-point overflow can be
enabled by the use of the pragma Check_Float_Overflow.

Another consideration that applies specifically to x86 32-bit
architectures is which form of floating-point arithmetic is used.
By default the operations use the old style x86 floating-point,
which implements an 80-bit extended precision form (on these
architectures the type Long_Long_Float corresponds to that form).
In addition, generation of efficient code in this mode means that
the extended precision form will be used for intermediate results.
This may be helpful in improving the final precision of a complex
expression. However it means that the results obtained on the x86
will be different from those on other architectures, and for some
algorithms, the extra intermediate precision can be detrimental.

In addition to this old-style floating-point, all modern x86 chips
implement an alternative floating-point operation model referred
to as SSE2. In this model there is no extended form, and furthermore
execution performance is significantly enhanced. To force GNAT to use
this more modern form, use both of the switches:

@quotation

-msse2 -mfpmath=sse
@end quotation

A unit compiled with these switches will automatically use the more
efficient SSE2 instruction set for Float and Long_Float operations.
Note that the ABI has the same form for both floating-point models,
so it is permissible to mix units compiled with and without these
switches.

@node Vectorization of loops,Other Optimization Switches,Floating Point Operations,Performance Considerations
@anchor{gnat_ugn/gnat_and_program_execution id34}@anchor{188}@anchor{gnat_ugn/gnat_and_program_execution vectorization-of-loops}@anchor{189}
@subsubsection Vectorization of loops


@geindex Optimization Switches

You can take advantage of the auto-vectorizer present in the @code{gcc}
back end to vectorize loops with GNAT.  The corresponding command line switch
is @code{-ftree-vectorize} but, as it is enabled by default at @code{-O3}
and other aggressive optimizations helpful for vectorization also are enabled
by default at this level, using @code{-O3} directly is recommended.

You also need to make sure that the target architecture features a supported
SIMD instruction set.  For example, for the x86 architecture, you should at
least specify @code{-msse2} to get significant vectorization (but you don’t
need to specify it for x86-64 as it is part of the base 64-bit architecture).
Similarly, for the PowerPC architecture, you should specify @code{-maltivec}.

The preferred loop form for vectorization is the @code{for} iteration scheme.
Loops with a @code{while} iteration scheme can also be vectorized if they are
very simple, but the vectorizer will quickly give up otherwise.  With either
iteration scheme, the flow of control must be straight, in particular no
@code{exit} statement may appear in the loop body.  The loop may however
contain a single nested loop, if it can be vectorized when considered alone:

@quotation

@example
A : array (1..4, 1..4) of Long_Float;
S : array (1..4) of Long_Float;

procedure Sum is
begin
   for I in A'Range(1) loop
      for J in A'Range(2) loop
         S (I) := S (I) + A (I, J);
      end loop;
   end loop;
end Sum;
@end example
@end quotation

The vectorizable operations depend on the targeted SIMD instruction set, but
the adding and some of the multiplying operators are generally supported, as
well as the logical operators for modular types. Note that compiling
with @code{-gnatp} might well reveal cases where some checks do thwart
vectorization.

Type conversions may also prevent vectorization if they involve semantics that
are not directly supported by the code generator or the SIMD instruction set.
A typical example is direct conversion from floating-point to integer types.
The solution in this case is to use the following idiom:

@quotation

@example
Integer (S'Truncation (F))
@end example
@end quotation

if @code{S} is the subtype of floating-point object @code{F}.

In most cases, the vectorizable loops are loops that iterate over arrays.
All kinds of array types are supported, i.e. constrained array types with
static bounds:

@quotation

@example
type Array_Type is array (1 .. 4) of Long_Float;
@end example
@end quotation

constrained array types with dynamic bounds:

@quotation

@example
type Array_Type is array (1 .. Q.N) of Long_Float;

type Array_Type is array (Q.K .. 4) of Long_Float;

type Array_Type is array (Q.K .. Q.N) of Long_Float;
@end example
@end quotation

or unconstrained array types:

@quotation

@example
type Array_Type is array (Positive range <>) of Long_Float;
@end example
@end quotation

The quality of the generated code decreases when the dynamic aspect of the
array type increases, the worst code being generated for unconstrained array
types.  This is so because, the less information the compiler has about the
bounds of the array, the more fallback code it needs to generate in order to
fix things up at run time.

It is possible to specify that a given loop should be subject to vectorization
preferably to other optimizations by means of pragma @code{Loop_Optimize}:

@quotation

@example
pragma Loop_Optimize (Vector);
@end example
@end quotation

placed immediately within the loop will convey the appropriate hint to the
compiler for this loop.

It is also possible to help the compiler generate better vectorized code
for a given loop by asserting that there are no loop-carried dependencies
in the loop.  Consider for example the procedure:

@quotation

@example
type Arr is array (1 .. 4) of Long_Float;

procedure Add (X, Y : not null access Arr; R : not null access Arr) is
begin
  for I in Arr'Range loop
    R(I) := X(I) + Y(I);
  end loop;
end;
@end example
@end quotation

By default, the compiler cannot unconditionally vectorize the loop because
assigning to a component of the array designated by R in one iteration could
change the value read from the components of the array designated by X or Y
in a later iteration.  As a result, the compiler will generate two versions
of the loop in the object code, one vectorized and the other not vectorized,
as well as a test to select the appropriate version at run time.  This can
be overcome by another hint:

@quotation

@example
pragma Loop_Optimize (Ivdep);
@end example
@end quotation

placed immediately within the loop will tell the compiler that it can safely
omit the non-vectorized version of the loop as well as the run-time test.

@node Other Optimization Switches,Optimization and Strict Aliasing,Vectorization of loops,Performance Considerations
@anchor{gnat_ugn/gnat_and_program_execution id35}@anchor{18a}@anchor{gnat_ugn/gnat_and_program_execution other-optimization-switches}@anchor{18b}
@subsubsection Other Optimization Switches


@geindex Optimization Switches

Since GNAT uses the @code{gcc} back end, all the specialized
@code{gcc} optimization switches are potentially usable. These switches
have not been extensively tested with GNAT but can generally be expected
to work. Examples of switches in this category are @code{-funroll-loops}
and the various target-specific @code{-m} options (in particular, it has
been observed that @code{-march=xxx} can significantly improve performance
on appropriate machines). For full details of these switches, see
the @emph{Submodel Options} section in the @emph{Hardware Models and Configurations}
chapter of @cite{Using the GNU Compiler Collection (GCC)}.

@node Optimization and Strict Aliasing,Aliased Variables and Optimization,Other Optimization Switches,Performance Considerations
@anchor{gnat_ugn/gnat_and_program_execution id36}@anchor{18c}@anchor{gnat_ugn/gnat_and_program_execution optimization-and-strict-aliasing}@anchor{e4}
@subsubsection Optimization and Strict Aliasing


@geindex Aliasing

@geindex Strict Aliasing

@geindex No_Strict_Aliasing

The strong typing capabilities of Ada allow an optimizer to generate
efficient code in situations where other languages would be forced to
make worst case assumptions preventing such optimizations. Consider
the following example:

@quotation

@example
procedure R is
   type Int1 is new Integer;
   type Int2 is new Integer;
   type Int1A is access Int1;
   type Int2A is access Int2;
   Int1V : Int1A;
   Int2V : Int2A;
   ...

begin
   ...
   for J in Data'Range loop
      if Data (J) = Int1V.all then
         Int2V.all := Int2V.all + 1;
      end if;
   end loop;
   ...
end R;
@end example
@end quotation

In this example, since the variable @code{Int1V} can only access objects
of type @code{Int1}, and @code{Int2V} can only access objects of type
@code{Int2}, there is no possibility that the assignment to
@code{Int2V.all} affects the value of @code{Int1V.all}. This means that
the compiler optimizer can “know” that the value @code{Int1V.all} is constant
for all iterations of the loop and avoid the extra memory reference
required to dereference it each time through the loop.

This kind of optimization, called strict aliasing analysis, is
triggered by specifying an optimization level of @code{-O2} or
higher or @code{-Os} and allows GNAT to generate more efficient code
when access values are involved.

However, although this optimization is always correct in terms of
the formal semantics of the Ada Reference Manual, difficulties can
arise if features like @code{Unchecked_Conversion} are used to break
the typing system. Consider the following complete program example:

@quotation

@example
package p1 is
   type int1 is new integer;
   type int2 is new integer;
   type a1 is access int1;
   type a2 is access int2;
end p1;

with p1; use p1;
package p2 is
   function to_a2 (Input : a1) return a2;
end p2;

with Unchecked_Conversion;
package body p2 is
   function to_a2 (Input : a1) return a2 is
      function to_a2u is
        new Unchecked_Conversion (a1, a2);
   begin
      return to_a2u (Input);
   end to_a2;
end p2;

with p2; use p2;
with p1; use p1;
with Text_IO; use Text_IO;
procedure m is
   v1 : a1 := new int1;
   v2 : a2 := to_a2 (v1);
begin
   v1.all := 1;
   v2.all := 0;
   put_line (int1'image (v1.all));
end;
@end example
@end quotation

This program prints out 0 in @code{-O0} or @code{-O1}
mode, but it prints out 1 in @code{-O2} mode. That’s
because in strict aliasing mode, the compiler can and
does assume that the assignment to @code{v2.all} could not
affect the value of @code{v1.all}, since different types
are involved.

This behavior is not a case of non-conformance with the standard, since
the Ada RM specifies that an unchecked conversion where the resulting
bit pattern is not a correct value of the target type can result in an
abnormal value and attempting to reference an abnormal value makes the
execution of a program erroneous.  That’s the case here since the result
does not point to an object of type @code{int2}.  This means that the
effect is entirely unpredictable.

However, although that explanation may satisfy a language
lawyer, in practice an applications programmer expects an
unchecked conversion involving pointers to create true
aliases and the behavior of printing 1 seems plain wrong.
In this case, the strict aliasing optimization is unwelcome.

Indeed the compiler recognizes this possibility, and the
unchecked conversion generates a warning:

@quotation

@example
p2.adb:5:07: warning: possible aliasing problem with type "a2"
p2.adb:5:07: warning: use -fno-strict-aliasing switch for references
p2.adb:5:07: warning:  or use "pragma No_Strict_Aliasing (a2);"
@end example
@end quotation

Unfortunately the problem is recognized when compiling the body of
package @code{p2}, but the actual “bad” code is generated while
compiling the body of @code{m} and this latter compilation does not see
the suspicious @code{Unchecked_Conversion}.

As implied by the warning message, there are approaches you can use to
avoid the unwanted strict aliasing optimization in a case like this.

One possibility is to simply avoid the use of @code{-O2}, but
that is a bit drastic, since it throws away a number of useful
optimizations that do not involve strict aliasing assumptions.

A less drastic approach is to compile the program using the
option @code{-fno-strict-aliasing}. Actually it is only the
unit containing the dereferencing of the suspicious pointer
that needs to be compiled. So in this case, if we compile
unit @code{m} with this switch, then we get the expected
value of zero printed. Analyzing which units might need
the switch can be painful, so a more reasonable approach
is to compile the entire program with options @code{-O2}
and @code{-fno-strict-aliasing}. If the performance is
satisfactory with this combination of options, then the
advantage is that the entire issue of possible “wrong”
optimization due to strict aliasing is avoided.

To avoid the use of compiler switches, the configuration
pragma @code{No_Strict_Aliasing} with no parameters may be
used to specify that for all access types, the strict
aliasing optimization should be suppressed.

However, these approaches are still overkill, in that they causes
all manipulations of all access values to be deoptimized. A more
refined approach is to concentrate attention on the specific
access type identified as problematic.

First, if a careful analysis of uses of the pointer shows
that there are no possible problematic references, then
the warning can be suppressed by bracketing the
instantiation of @code{Unchecked_Conversion} to turn
the warning off:

@quotation

@example
pragma Warnings (Off);
function to_a2u is
  new Unchecked_Conversion (a1, a2);
pragma Warnings (On);
@end example
@end quotation

Of course that approach is not appropriate for this particular
example, since indeed there is a problematic reference. In this
case we can take one of two other approaches.

The first possibility is to move the instantiation of unchecked
conversion to the unit in which the type is declared. In
this example, we would move the instantiation of
@code{Unchecked_Conversion} from the body of package
@code{p2} to the spec of package @code{p1}. Now the
warning disappears. That’s because any use of the
access type knows there is a suspicious unchecked
conversion, and the strict aliasing optimization
is automatically suppressed for the type.

If it is not practical to move the unchecked conversion to the same unit
in which the destination access type is declared (perhaps because the
source type is not visible in that unit), you may use pragma
@code{No_Strict_Aliasing} for the type. This pragma must occur in the
same declarative sequence as the declaration of the access type:

@quotation

@example
type a2 is access int2;
pragma No_Strict_Aliasing (a2);
@end example
@end quotation

Here again, the compiler now knows that the strict aliasing optimization
should be suppressed for any reference to type @code{a2} and the
expected behavior is obtained.

Finally, note that although the compiler can generate warnings for
simple cases of unchecked conversions, there are tricker and more
indirect ways of creating type incorrect aliases which the compiler
cannot detect. Examples are the use of address overlays and unchecked
conversions involving composite types containing access types as
components. In such cases, no warnings are generated, but there can
still be aliasing problems. One safe coding practice is to forbid the
use of address clauses for type overlaying, and to allow unchecked
conversion only for primitive types. This is not really a significant
restriction since any possible desired effect can be achieved by
unchecked conversion of access values.

The aliasing analysis done in strict aliasing mode can certainly
have significant benefits. We have seen cases of large scale
application code where the time is increased by up to 5% by turning
this optimization off. If you have code that includes significant
usage of unchecked conversion, you might want to just stick with
@code{-O1} and avoid the entire issue. If you get adequate
performance at this level of optimization level, that’s probably
the safest approach. If tests show that you really need higher
levels of optimization, then you can experiment with @code{-O2}
and @code{-O2 -fno-strict-aliasing} to see how much effect this
has on size and speed of the code. If you really need to use
@code{-O2} with strict aliasing in effect, then you should
review any uses of unchecked conversion of access types,
particularly if you are getting the warnings described above.

@node Aliased Variables and Optimization,Atomic Variables and Optimization,Optimization and Strict Aliasing,Performance Considerations
@anchor{gnat_ugn/gnat_and_program_execution aliased-variables-and-optimization}@anchor{18d}@anchor{gnat_ugn/gnat_and_program_execution id37}@anchor{18e}
@subsubsection Aliased Variables and Optimization


@geindex Aliasing

There are scenarios in which programs may
use low level techniques to modify variables
that otherwise might be considered to be unassigned. For example,
a variable can be passed to a procedure by reference, which takes
the address of the parameter and uses the address to modify the
variable’s value, even though it is passed as an IN parameter.
Consider the following example:

@quotation

@example
procedure P is
   Max_Length : constant Natural := 16;
   type Char_Ptr is access all Character;

   procedure Get_String(Buffer: Char_Ptr; Size : Integer);
   pragma Import (C, Get_String, "get_string");

   Name : aliased String (1 .. Max_Length) := (others => ' ');
   Temp : Char_Ptr;

   function Addr (S : String) return Char_Ptr is
      function To_Char_Ptr is
        new Ada.Unchecked_Conversion (System.Address, Char_Ptr);
   begin
      return To_Char_Ptr (S (S'First)'Address);
   end;

begin
   Temp := Addr (Name);
   Get_String (Temp, Max_Length);
end;
@end example
@end quotation

where Get_String is a C function that uses the address in Temp to
modify the variable @code{Name}. This code is dubious, and arguably
erroneous, and the compiler would be entitled to assume that
@code{Name} is never modified, and generate code accordingly.

However, in practice, this would cause some existing code that
seems to work with no optimization to start failing at high
levels of optimzization.

What the compiler does for such cases is to assume that marking
a variable as aliased indicates that some “funny business” may
be going on. The optimizer recognizes the aliased keyword and
inhibits optimizations that assume the value cannot be assigned.
This means that the above example will in fact “work” reliably,
that is, it will produce the expected results.

@node Atomic Variables and Optimization,Passive Task Optimization,Aliased Variables and Optimization,Performance Considerations
@anchor{gnat_ugn/gnat_and_program_execution atomic-variables-and-optimization}@anchor{18f}@anchor{gnat_ugn/gnat_and_program_execution id38}@anchor{190}
@subsubsection Atomic Variables and Optimization


@geindex Atomic

There are two considerations with regard to performance when
atomic variables are used.

First, the RM only guarantees that access to atomic variables
be atomic, it has nothing to say about how this is achieved,
though there is a strong implication that this should not be
achieved by explicit locking code. Indeed GNAT will never
generate any locking code for atomic variable access (it will
simply reject any attempt to make a variable or type atomic
if the atomic access cannot be achieved without such locking code).

That being said, it is important to understand that you cannot
assume that the entire variable will always be accessed. Consider
this example:

@quotation

@example
type R is record
   A,B,C,D : Character;
end record;
for R'Size use 32;
for R'Alignment use 4;

RV : R;
pragma Atomic (RV);
X : Character;
...
X := RV.B;
@end example
@end quotation

You cannot assume that the reference to @code{RV.B}
will read the entire 32-bit
variable with a single load instruction. It is perfectly legitimate if
the hardware allows it to do a byte read of just the B field. This read
is still atomic, which is all the RM requires. GNAT can and does take
advantage of this, depending on the architecture and optimization level.
Any assumption to the contrary is non-portable and risky. Even if you
examine the assembly language and see a full 32-bit load, this might
change in a future version of the compiler.

If your application requires that all accesses to @code{RV} in this
example be full 32-bit loads, you need to make a copy for the access
as in:

@quotation

@example
declare
   RV_Copy : constant R := RV;
begin
   X := RV_Copy.B;
end;
@end example
@end quotation

Now the reference to RV must read the whole variable.
Actually one can imagine some compiler which figures
out that the whole copy is not required (because only
the B field is actually accessed), but GNAT
certainly won’t do that, and we don’t know of any
compiler that would not handle this right, and the
above code will in practice work portably across
all architectures (that permit the Atomic declaration).

The second issue with atomic variables has to do with
the possible requirement of generating synchronization
code. For more details on this, consult the sections on
the pragmas Enable/Disable_Atomic_Synchronization in the
GNAT Reference Manual. If performance is critical, and
such synchronization code is not required, it may be
useful to disable it.

@node Passive Task Optimization,,Atomic Variables and Optimization,Performance Considerations
@anchor{gnat_ugn/gnat_and_program_execution id39}@anchor{191}@anchor{gnat_ugn/gnat_and_program_execution passive-task-optimization}@anchor{192}
@subsubsection Passive Task Optimization


@geindex Passive Task

A passive task is one which is sufficiently simple that
in theory a compiler could recognize it an implement it
efficiently without creating a new thread. The original design
of Ada 83 had in mind this kind of passive task optimization, but
only a few Ada 83 compilers attempted it. The problem was that
it was difficult to determine the exact conditions under which
the optimization was possible. The result is a very fragile
optimization where a very minor change in the program can
suddenly silently make a task non-optimizable.

With the revisiting of this issue in Ada 95, there was general
agreement that this approach was fundamentally flawed, and the
notion of protected types was introduced. When using protected
types, the restrictions are well defined, and you KNOW that the
operations will be optimized, and furthermore this optimized
performance is fully portable.

Although it would theoretically be possible for GNAT to attempt to
do this optimization, but it really doesn’t make sense in the
context of Ada 95, and none of the Ada 95 compilers implement
this optimization as far as we know. In particular GNAT never
attempts to perform this optimization.

In any new Ada 95 code that is written, you should always
use protected types in place of tasks that might be able to
be optimized in this manner.
Of course this does not help if you have legacy Ada 83 code
that depends on this optimization, but it is unusual to encounter
a case where the performance gains from this optimization
are significant.

Your program should work correctly without this optimization. If
you have performance problems, then the most practical
approach is to figure out exactly where these performance problems
arise, and update those particular tasks to be protected types. Note
that typically clients of the tasks who call entries, will not have
to be modified, only the task definition itself.

@node Text_IO Suggestions,Reducing Size of Executables with Unused Subprogram/Data Elimination,Performance Considerations,Improving Performance
@anchor{gnat_ugn/gnat_and_program_execution id40}@anchor{193}@anchor{gnat_ugn/gnat_and_program_execution text-io-suggestions}@anchor{194}
@subsection @code{Text_IO} Suggestions


@geindex Text_IO and performance

The @code{Ada.Text_IO} package has fairly high overheads due in part to
the requirement of maintaining page and line counts. If performance
is critical, a recommendation is to use @code{Stream_IO} instead of
@code{Text_IO} for volume output, since this package has less overhead.

If @code{Text_IO} must be used, note that by default output to the standard
output and standard error files is unbuffered (this provides better
behavior when output statements are used for debugging, or if the
progress of a program is observed by tracking the output, e.g. by
using the Unix @emph{tail -f} command to watch redirected output.

If you are generating large volumes of output with @code{Text_IO} and
performance is an important factor, use a designated file instead
of the standard output file, or change the standard output file to
be buffered using @code{Interfaces.C_Streams.setvbuf}.

@node Reducing Size of Executables with Unused Subprogram/Data Elimination,,Text_IO Suggestions,Improving Performance
@anchor{gnat_ugn/gnat_and_program_execution id41}@anchor{195}@anchor{gnat_ugn/gnat_and_program_execution reducing-size-of-executables-with-unused-subprogram-data-elimination}@anchor{196}
@subsection Reducing Size of Executables with Unused Subprogram/Data Elimination


@geindex Uunused subprogram/data elimination

This section describes how you can eliminate unused subprograms and data from
your executable just by setting options at compilation time.

@menu
* About unused subprogram/data elimination:: 
* Compilation options:: 
* Example of unused subprogram/data elimination:: 

@end menu

@node About unused subprogram/data elimination,Compilation options,,Reducing Size of Executables with Unused Subprogram/Data Elimination
@anchor{gnat_ugn/gnat_and_program_execution about-unused-subprogram-data-elimination}@anchor{197}@anchor{gnat_ugn/gnat_and_program_execution id42}@anchor{198}
@subsubsection About unused subprogram/data elimination


By default, an executable contains all code and data of its composing objects
(directly linked or coming from statically linked libraries), even data or code
never used by this executable.

This feature will allow you to eliminate such unused code from your
executable, making it smaller (in disk and in memory).

This functionality is available on all Linux platforms except for the IA-64
architecture and on all cross platforms using the ELF binary file format.
In both cases GNU binutils version 2.16 or later are required to enable it.

@node Compilation options,Example of unused subprogram/data elimination,About unused subprogram/data elimination,Reducing Size of Executables with Unused Subprogram/Data Elimination
@anchor{gnat_ugn/gnat_and_program_execution compilation-options}@anchor{199}@anchor{gnat_ugn/gnat_and_program_execution id43}@anchor{19a}
@subsubsection Compilation options


The operation of eliminating the unused code and data from the final executable
is directly performed by the linker.

@geindex -ffunction-sections (gcc)

@geindex -fdata-sections (gcc)

In order to do this, it has to work with objects compiled with the
following options:
@code{-ffunction-sections} @code{-fdata-sections}.

These options are usable with C and Ada files.
They will place respectively each
function or data in a separate section in the resulting object file.

Once the objects and static libraries are created with these options, the
linker can perform the dead code elimination. You can do this by setting
the @code{-Wl,--gc-sections} option to gcc command or in the
@code{-largs} section of @code{gnatmake}. This will perform a
garbage collection of code and data never referenced.

If the linker performs a partial link (@code{-r} linker option), then you
will need to provide the entry point using the @code{-e} / @code{--entry}
linker option.

Note that objects compiled without the @code{-ffunction-sections} and
@code{-fdata-sections} options can still be linked with the executable.
However, no dead code elimination will be performed on those objects (they will
be linked as is).

The GNAT static library is now compiled with -ffunction-sections and
-fdata-sections on some platforms. This allows you to eliminate the unused code
and data of the GNAT library from your executable.

@node Example of unused subprogram/data elimination,,Compilation options,Reducing Size of Executables with Unused Subprogram/Data Elimination
@anchor{gnat_ugn/gnat_and_program_execution example-of-unused-subprogram-data-elimination}@anchor{19b}@anchor{gnat_ugn/gnat_and_program_execution id44}@anchor{19c}
@subsubsection Example of unused subprogram/data elimination


Here is a simple example:

@quotation

@example
with Aux;

procedure Test is
begin
   Aux.Used (10);
end Test;

package Aux is
   Used_Data   : Integer;
   Unused_Data : Integer;

   procedure Used   (Data : Integer);
   procedure Unused (Data : Integer);
end Aux;

package body Aux is
   procedure Used (Data : Integer) is
   begin
      Used_Data := Data;
   end Used;

   procedure Unused (Data : Integer) is
   begin
      Unused_Data := Data;
   end Unused;
end Aux;
@end example
@end quotation

@code{Unused} and @code{Unused_Data} are never referenced in this code
excerpt, and hence they may be safely removed from the final executable.

@quotation

@example
$ gnatmake test

$ nm test | grep used
020015f0 T aux__unused
02005d88 B aux__unused_data
020015cc T aux__used
02005d84 B aux__used_data

$ gnatmake test -cargs -fdata-sections -ffunction-sections \\
     -largs -Wl,--gc-sections

$ nm test | grep used
02005350 T aux__used
0201ffe0 B aux__used_data
@end example
@end quotation

It can be observed that the procedure @code{Unused} and the object
@code{Unused_Data} are removed by the linker when using the
appropriate options.

@geindex Overflow checks

@geindex Checks (overflow)

@node Overflow Check Handling in GNAT,Performing Dimensionality Analysis in GNAT,Improving Performance,GNAT and Program Execution
@anchor{gnat_ugn/gnat_and_program_execution id45}@anchor{149}@anchor{gnat_ugn/gnat_and_program_execution overflow-check-handling-in-gnat}@anchor{19d}
@section Overflow Check Handling in GNAT


This section explains how to control the handling of overflow checks.

@menu
* Background:: 
* Management of Overflows in GNAT:: 
* Specifying the Desired Mode:: 
* Default Settings:: 
* Implementation Notes:: 

@end menu

@node Background,Management of Overflows in GNAT,,Overflow Check Handling in GNAT
@anchor{gnat_ugn/gnat_and_program_execution background}@anchor{19e}@anchor{gnat_ugn/gnat_and_program_execution id46}@anchor{19f}
@subsection Background


Overflow checks are checks that the compiler may make to ensure
that intermediate results are not out of range. For example:

@quotation

@example
A : Integer;
...
A := A + 1;
@end example
@end quotation

If @code{A} has the value @code{Integer'Last}, then the addition may cause
overflow since the result is out of range of the type @code{Integer}.
In this case @code{Constraint_Error} will be raised if checks are
enabled.

A trickier situation arises in examples like the following:

@quotation

@example
A, C : Integer;
...
A := (A + 1) + C;
@end example
@end quotation

where @code{A} is @code{Integer'Last} and @code{C} is @code{-1}.
Now the final result of the expression on the right hand side is
@code{Integer'Last} which is in range, but the question arises whether the
intermediate addition of @code{(A + 1)} raises an overflow error.

The (perhaps surprising) answer is that the Ada language
definition does not answer this question. Instead it leaves
it up to the implementation to do one of two things if overflow
checks are enabled.


@itemize *

@item 
raise an exception (@code{Constraint_Error}), or

@item 
yield the correct mathematical result which is then used in
subsequent operations.
@end itemize

If the compiler chooses the first approach, then the assignment of this
example will indeed raise @code{Constraint_Error} if overflow checking is
enabled, or result in erroneous execution if overflow checks are suppressed.

But if the compiler
chooses the second approach, then it can perform both additions yielding
the correct mathematical result, which is in range, so no exception
will be raised, and the right result is obtained, regardless of whether
overflow checks are suppressed.

Note that in the first example an
exception will be raised in either case, since if the compiler
gives the correct mathematical result for the addition, it will
be out of range of the target type of the assignment, and thus
fails the range check.

This lack of specified behavior in the handling of overflow for
intermediate results is a source of non-portability, and can thus
be problematic when programs are ported. Most typically this arises
in a situation where the original compiler did not raise an exception,
and then the application is moved to a compiler where the check is
performed on the intermediate result and an unexpected exception is
raised.

Furthermore, when using Ada 2012’s preconditions and other
assertion forms, another issue arises. Consider:

@quotation

@example
procedure P (A, B : Integer) with
  Pre => A + B <= Integer'Last;
@end example
@end quotation

One often wants to regard arithmetic in a context like this from
a mathematical point of view. So for example, if the two actual parameters
for a call to @code{P} are both @code{Integer'Last}, then
the precondition should be regarded as False. If we are executing
in a mode with run-time checks enabled for preconditions, then we would
like this precondition to fail, rather than raising an exception
because of the intermediate overflow.

However, the language definition leaves the specification of
whether the above condition fails (raising @code{Assert_Error}) or
causes an intermediate overflow (raising @code{Constraint_Error})
up to the implementation.

The situation is worse in a case such as the following:

@quotation

@example
procedure Q (A, B, C : Integer) with
  Pre => A + B + C <= Integer'Last;
@end example
@end quotation

Consider the call

@quotation

@example
Q (A => Integer'Last, B => 1, C => -1);
@end example
@end quotation

From a mathematical point of view the precondition
is True, but at run time we may (but are not guaranteed to) get an
exception raised because of the intermediate overflow (and we really
would prefer this precondition to be considered True at run time).

@node Management of Overflows in GNAT,Specifying the Desired Mode,Background,Overflow Check Handling in GNAT
@anchor{gnat_ugn/gnat_and_program_execution id47}@anchor{1a0}@anchor{gnat_ugn/gnat_and_program_execution management-of-overflows-in-gnat}@anchor{1a1}
@subsection Management of Overflows in GNAT


To deal with the portability issue, and with the problem of
mathematical versus run-time interpretation of the expressions in
assertions, GNAT provides comprehensive control over the handling
of intermediate overflow. GNAT can operate in three modes, and
furthemore, permits separate selection of operating modes for
the expressions within assertions (here the term ‘assertions’
is used in the technical sense, which includes preconditions and so forth)
and for expressions appearing outside assertions.

The three modes are:


@itemize *

@item 
@emph{Use base type for intermediate operations} (@code{STRICT})

In this mode, all intermediate results for predefined arithmetic
operators are computed using the base type, and the result must
be in range of the base type. If this is not the
case then either an exception is raised (if overflow checks are
enabled) or the execution is erroneous (if overflow checks are suppressed).
This is the normal default mode.

@item 
@emph{Most intermediate overflows avoided} (@code{MINIMIZED})

In this mode, the compiler attempts to avoid intermediate overflows by
using a larger integer type, typically @code{Long_Long_Integer},
as the type in which arithmetic is
performed for predefined arithmetic operators. This may be slightly more
expensive at
run time (compared to suppressing intermediate overflow checks), though
the cost is negligible on modern 64-bit machines. For the examples given
earlier, no intermediate overflows would have resulted in exceptions,
since the intermediate results are all in the range of
@code{Long_Long_Integer} (typically 64-bits on nearly all implementations
of GNAT). In addition, if checks are enabled, this reduces the number of
checks that must be made, so this choice may actually result in an
improvement in space and time behavior.

However, there are cases where @code{Long_Long_Integer} is not large
enough, consider the following example:

@quotation

@example
procedure R (A, B, C, D : Integer) with
  Pre => (A**2 * B**2) / (C**2 * D**2) <= 10;
@end example
@end quotation

where @code{A} = @code{B} = @code{C} = @code{D} = @code{Integer'Last}.
Now the intermediate results are
out of the range of @code{Long_Long_Integer} even though the final result
is in range and the precondition is True (from a mathematical point
of view). In such a case, operating in this mode, an overflow occurs
for the intermediate computation (which is why this mode
says @emph{most} intermediate overflows are avoided). In this case,
an exception is raised if overflow checks are enabled, and the
execution is erroneous if overflow checks are suppressed.

@item 
@emph{All intermediate overflows avoided} (@code{ELIMINATED})

In this mode, the compiler  avoids all intermediate overflows
by using arbitrary precision arithmetic as required. In this
mode, the above example with @code{A**2 * B**2} would
not cause intermediate overflow, because the intermediate result
would be evaluated using sufficient precision, and the result
of evaluating the precondition would be True.

This mode has the advantage of avoiding any intermediate
overflows, but at the expense of significant run-time overhead,
including the use of a library (included automatically in this
mode) for multiple-precision arithmetic.

This mode provides cleaner semantics for assertions, since now
the run-time behavior emulates true arithmetic behavior for the
predefined arithmetic operators, meaning that there is never a
conflict between the mathematical view of the assertion, and its
run-time behavior.

Note that in this mode, the behavior is unaffected by whether or
not overflow checks are suppressed, since overflow does not occur.
It is possible for gigantic intermediate expressions to raise
@code{Storage_Error} as a result of attempting to compute the
results of such expressions (e.g. @code{Integer'Last ** Integer'Last})
but overflow is impossible.
@end itemize

Note that these modes apply only to the evaluation of predefined
arithmetic, membership, and comparison operators for signed integer
arithmetic.

For fixed-point arithmetic, checks can be suppressed. But if checks
are enabled
then fixed-point values are always checked for overflow against the
base type for intermediate expressions (that is such checks always
operate in the equivalent of @code{STRICT} mode).

For floating-point, on nearly all architectures, @code{Machine_Overflows}
is False, and IEEE infinities are generated, so overflow exceptions
are never raised. If you want to avoid infinities, and check that
final results of expressions are in range, then you can declare a
constrained floating-point type, and range checks will be carried
out in the normal manner (with infinite values always failing all
range checks).

@node Specifying the Desired Mode,Default Settings,Management of Overflows in GNAT,Overflow Check Handling in GNAT
@anchor{gnat_ugn/gnat_and_program_execution id48}@anchor{1a2}@anchor{gnat_ugn/gnat_and_program_execution specifying-the-desired-mode}@anchor{e9}
@subsection Specifying the Desired Mode


@geindex pragma Overflow_Mode

The desired mode of for handling intermediate overflow can be specified using
either the @code{Overflow_Mode} pragma or an equivalent compiler switch.
The pragma has the form

@quotation

@example
pragma Overflow_Mode ([General =>] MODE [, [Assertions =>] MODE]);
@end example
@end quotation

where @code{MODE} is one of


@itemize *

@item 
@code{STRICT}:  intermediate overflows checked (using base type)

@item 
@code{MINIMIZED}: minimize intermediate overflows

@item 
@code{ELIMINATED}: eliminate intermediate overflows
@end itemize

The case is ignored, so @code{MINIMIZED}, @code{Minimized} and
@code{minimized} all have the same effect.

If only the @code{General} parameter is present, then the given @code{MODE} applies
to expressions both within and outside assertions. If both arguments
are present, then @code{General} applies to expressions outside assertions,
and @code{Assertions} applies to expressions within assertions. For example:

@quotation

@example
pragma Overflow_Mode
  (General => Minimized, Assertions => Eliminated);
@end example
@end quotation

specifies that general expressions outside assertions be evaluated
in ‘minimize intermediate overflows’ mode, and expressions within
assertions be evaluated in ‘eliminate intermediate overflows’ mode.
This is often a reasonable choice, avoiding excessive overhead
outside assertions, but assuring a high degree of portability
when importing code from another compiler, while incurring
the extra overhead for assertion expressions to ensure that
the behavior at run time matches the expected mathematical
behavior.

The @code{Overflow_Mode} pragma has the same scoping and placement
rules as pragma @code{Suppress}, so it can occur either as a
configuration pragma, specifying a default for the whole
program, or in a declarative scope, where it applies to the
remaining declarations and statements in that scope.

Note that pragma @code{Overflow_Mode} does not affect whether
overflow checks are enabled or suppressed. It only controls the
method used to compute intermediate values. To control whether
overflow checking is enabled or suppressed, use pragma @code{Suppress}
or @code{Unsuppress} in the usual manner.

@geindex -gnato? (gcc)

@geindex -gnato?? (gcc)

Additionally, a compiler switch @code{-gnato?} or @code{-gnato??}
can be used to control the checking mode default (which can be subsequently
overridden using pragmas).

Here @code{?} is one of the digits @code{1} through @code{3}:

@quotation


@multitable {xxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@code{1}

@tab

use base type for intermediate operations (@code{STRICT})

@item

@code{2}

@tab

minimize intermediate overflows (@code{MINIMIZED})

@item

@code{3}

@tab

eliminate intermediate overflows (@code{ELIMINATED})

@end multitable

@end quotation

As with the pragma, if only one digit appears then it applies to all
cases; if two digits are given, then the first applies outside
assertions, and the second within assertions. Thus the equivalent
of the example pragma above would be
@code{-gnato23}.

If no digits follow the @code{-gnato}, then it is equivalent to
@code{-gnato11},
causing all intermediate operations to be computed using the base
type (@code{STRICT} mode).

@node Default Settings,Implementation Notes,Specifying the Desired Mode,Overflow Check Handling in GNAT
@anchor{gnat_ugn/gnat_and_program_execution default-settings}@anchor{1a3}@anchor{gnat_ugn/gnat_and_program_execution id49}@anchor{1a4}
@subsection Default Settings


The default mode for overflow checks is

@quotation

@example
General => Strict
@end example
@end quotation

which causes all computations both inside and outside assertions to use
the base type.

This retains compatibility with previous versions of
GNAT which suppressed overflow checks by default and always
used the base type for computation of intermediate results.

@c Sphinx allows no emphasis within :index: role. As a workaround we
@c point the index to "switch" and use emphasis for "-gnato".

The 
@geindex -gnato (gcc)
switch @code{-gnato} (with no digits following)
is equivalent to

@quotation

@example
General => Strict
@end example
@end quotation

which causes overflow checking of all intermediate overflows
both inside and outside assertions against the base type.

The pragma @code{Suppress (Overflow_Check)} disables overflow
checking, but it has no effect on the method used for computing
intermediate results.

The pragma @code{Unsuppress (Overflow_Check)} enables overflow
checking, but it has no effect on the method used for computing
intermediate results.

@node Implementation Notes,,Default Settings,Overflow Check Handling in GNAT
@anchor{gnat_ugn/gnat_and_program_execution id50}@anchor{1a5}@anchor{gnat_ugn/gnat_and_program_execution implementation-notes}@anchor{1a6}
@subsection Implementation Notes


In practice on typical 64-bit machines, the @code{MINIMIZED} mode is
reasonably efficient, and can be generally used. It also helps
to ensure compatibility with code imported from some other
compiler to GNAT.

Setting all intermediate overflows checking (@code{CHECKED} mode)
makes sense if you want to
make sure that your code is compatible with any other possible
Ada implementation. This may be useful in ensuring portability
for code that is to be exported to some other compiler than GNAT.

The Ada standard allows the reassociation of expressions at
the same precedence level if no parentheses are present. For
example, @code{A+B+C} parses as though it were @code{(A+B)+C}, but
the compiler can reintepret this as @code{A+(B+C)}, possibly
introducing or eliminating an overflow exception. The GNAT
compiler never takes advantage of this freedom, and the
expression @code{A+B+C} will be evaluated as @code{(A+B)+C}.
If you need the other order, you can write the parentheses
explicitly @code{A+(B+C)} and GNAT will respect this order.

The use of @code{ELIMINATED} mode will cause the compiler to
automatically include an appropriate arbitrary precision
integer arithmetic package. The compiler will make calls
to this package, though only in cases where it cannot be
sure that @code{Long_Long_Integer} is sufficient to guard against
intermediate overflows. This package does not use dynamic
allocation, but it does use the secondary stack, so an
appropriate secondary stack package must be present (this
is always true for standard full Ada, but may require
specific steps for restricted run times such as ZFP).

Although @code{ELIMINATED} mode causes expressions to use arbitrary
precision arithmetic, avoiding overflow, the final result
must be in an appropriate range. This is true even if the
final result is of type @code{[Long_[Long_]]Integer'Base}, which
still has the same bounds as its associated constrained
type at run-time.

Currently, the @code{ELIMINATED} mode is only available on target
platforms for which @code{Long_Long_Integer} is 64-bits (nearly all GNAT
platforms).

@node Performing Dimensionality Analysis in GNAT,Stack Related Facilities,Overflow Check Handling in GNAT,GNAT and Program Execution
@anchor{gnat_ugn/gnat_and_program_execution id51}@anchor{14a}@anchor{gnat_ugn/gnat_and_program_execution performing-dimensionality-analysis-in-gnat}@anchor{1a7}
@section Performing Dimensionality Analysis in GNAT


@geindex Dimensionality analysis

The GNAT compiler supports dimensionality checking. The user can
specify physical units for objects, and the compiler will verify that uses
of these objects are compatible with their dimensions, in a fashion that is
familiar to engineering practice. The dimensions of algebraic expressions
(including powers with static exponents) are computed from their constituents.

@geindex Dimension_System aspect

@geindex Dimension aspect

This feature depends on Ada 2012 aspect specifications, and is available from
version 7.0.1 of GNAT onwards.
The GNAT-specific aspect @code{Dimension_System}
allows you to define a system of units; the aspect @code{Dimension}
then allows the user to declare dimensioned quantities within a given system.
(These aspects are described in the @emph{Implementation Defined Aspects}
chapter of the @emph{GNAT Reference Manual}).

The major advantage of this model is that it does not require the declaration of
multiple operators for all possible combinations of types: it is only necessary
to use the proper subtypes in object declarations.

@geindex System.Dim.Mks package (GNAT library)

@geindex MKS_Type type

The simplest way to impose dimensionality checking on a computation is to make
use of one of the instantiations of the package @code{System.Dim.Generic_Mks}, which
are part of the GNAT library. This generic package defines a floating-point
type @code{MKS_Type}, for which a sequence of dimension names are specified,
together with their conventional abbreviations.  The following should be read
together with the full specification of the package, in file
@code{s-digemk.ads}.

@quotation

@geindex s-digemk.ads file

@example
type Mks_Type is new Float_Type
  with
   Dimension_System => (
     (Unit_Name => Meter,    Unit_Symbol => 'm',   Dim_Symbol => 'L'),
     (Unit_Name => Kilogram, Unit_Symbol => "kg",  Dim_Symbol => 'M'),
     (Unit_Name => Second,   Unit_Symbol => 's',   Dim_Symbol => 'T'),
     (Unit_Name => Ampere,   Unit_Symbol => 'A',   Dim_Symbol => 'I'),
     (Unit_Name => Kelvin,   Unit_Symbol => 'K',   Dim_Symbol => "Theta"),
     (Unit_Name => Mole,     Unit_Symbol => "mol", Dim_Symbol => 'N'),
     (Unit_Name => Candela,  Unit_Symbol => "cd",  Dim_Symbol => 'J'));
@end example
@end quotation

The package then defines a series of subtypes that correspond to these
conventional units. For example:

@quotation

@example
subtype Length is Mks_Type
  with
   Dimension => (Symbol => 'm', Meter  => 1, others => 0);
@end example
@end quotation

and similarly for @code{Mass}, @code{Time}, @code{Electric_Current},
@code{Thermodynamic_Temperature}, @code{Amount_Of_Substance}, and
@code{Luminous_Intensity} (the standard set of units of the SI system).

The package also defines conventional names for values of each unit, for
example:

@quotation

@example
m   : constant Length           := 1.0;
kg  : constant Mass             := 1.0;
s   : constant Time             := 1.0;
A   : constant Electric_Current := 1.0;
@end example
@end quotation

as well as useful multiples of these units:

@quotation

@example
 cm  : constant Length := 1.0E-02;
 g   : constant Mass   := 1.0E-03;
 min : constant Time   := 60.0;
 day : constant Time   := 60.0 * 24.0 * min;
...
@end example
@end quotation

There are three instantiations of @code{System.Dim.Generic_Mks} defined in the
GNAT library:


@itemize *

@item 
@code{System.Dim.Float_Mks} based on @code{Float} defined in @code{s-diflmk.ads}.

@item 
@code{System.Dim.Long_Mks} based on @code{Long_Float} defined in @code{s-dilomk.ads}.

@item 
@code{System.Dim.Mks} based on @code{Long_Long_Float} defined in @code{s-dimmks.ads}.
@end itemize

Using one of these packages, you can then define a derived unit by providing
the aspect that specifies its dimensions within the MKS system, as well as the
string to be used for output of a value of that unit:

@quotation

@example
subtype Acceleration is Mks_Type
  with Dimension => ("m/sec^2",
                     Meter => 1,
                     Second => -2,
                     others => 0);
@end example
@end quotation

Here is a complete example of use:

@quotation

@example
with System.Dim.MKS; use System.Dim.Mks;
with System.Dim.Mks_IO; use System.Dim.Mks_IO;
with Text_IO; use Text_IO;
procedure Free_Fall is
  subtype Acceleration is Mks_Type
    with Dimension => ("m/sec^2", 1, 0, -2, others => 0);
  G : constant acceleration := 9.81 * m / (s ** 2);
  T : Time := 10.0*s;
  Distance : Length;

begin
  Put ("Gravitational constant: ");
  Put (G, Aft => 2, Exp => 0); Put_Line ("");
  Distance := 0.5 * G * T ** 2;
  Put ("distance travelled in 10 seconds of free fall ");
  Put (Distance, Aft => 2, Exp => 0);
  Put_Line ("");
end Free_Fall;
@end example
@end quotation

Execution of this program yields:

@quotation

@example
Gravitational constant:  9.81 m/sec^2
distance travelled in 10 seconds of free fall 490.50 m
@end example
@end quotation

However, incorrect assignments such as:

@quotation

@example
Distance := 5.0;
Distance := 5.0 * kg;
@end example
@end quotation

are rejected with the following diagnoses:

@quotation

@example
Distance := 5.0;
   >>> dimensions mismatch in assignment
   >>> left-hand side has dimension [L]
   >>> right-hand side is dimensionless

Distance := 5.0 * kg:
   >>> dimensions mismatch in assignment
   >>> left-hand side has dimension [L]
   >>> right-hand side has dimension [M]
@end example
@end quotation

The dimensions of an expression are properly displayed, even if there is
no explicit subtype for it. If we add to the program:

@quotation

@example
Put ("Final velocity: ");
Put (G * T, Aft =>2, Exp =>0);
Put_Line ("");
@end example
@end quotation

then the output includes:

@quotation

@example
Final velocity: 98.10 m.s**(-1)
@end example

@geindex Dimensionable type

@geindex Dimensioned subtype
@end quotation

The type @code{Mks_Type} is said to be a @emph{dimensionable type} since it has a
@code{Dimension_System} aspect, and the subtypes @code{Length}, @code{Mass}, etc.,
are said to be @emph{dimensioned subtypes} since each one has a @code{Dimension}
aspect.

@quotation

@geindex Dimension Vector (for a dimensioned subtype)

@geindex Dimension aspect

@geindex Dimension_System aspect
@end quotation

The @code{Dimension} aspect of a dimensioned subtype @code{S} defines a mapping
from the base type’s Unit_Names to integer (or, more generally, rational)
values. This mapping is the @emph{dimension vector} (also referred to as the
@emph{dimensionality}) for that subtype, denoted by @code{DV(S)}, and thus for each
object of that subtype. Intuitively, the value specified for each
@code{Unit_Name} is the exponent associated with that unit; a zero value
means that the unit is not used. For example:

@quotation

@example
declare
   Acc : Acceleration;
   ...
begin
   ...
end;
@end example
@end quotation

Here @code{DV(Acc)} = @code{DV(Acceleration)} =
@code{(Meter=>1, Kilogram=>0, Second=>-2, Ampere=>0, Kelvin=>0, Mole=>0, Candela=>0)}.
Symbolically, we can express this as @code{Meter / Second**2}.

The dimension vector of an arithmetic expression is synthesized from the
dimension vectors of its components, with compile-time dimensionality checks
that help prevent mismatches such as using an @code{Acceleration} where a
@code{Length} is required.

The dimension vector of the result of an arithmetic expression @emph{expr}, or
@code{DV(@emph{expr})}, is defined as follows, assuming conventional
mathematical definitions for the vector operations that are used:


@itemize *

@item 
If @emph{expr} is of the type @emph{universal_real}, or is not of a dimensioned subtype,
then @emph{expr} is dimensionless; @code{DV(@emph{expr})} is the empty vector.

@item 
@code{DV(@emph{op expr})}, where @emph{op} is a unary operator, is @code{DV(@emph{expr})}

@item 
@code{DV(@emph{expr1 op expr2})} where @emph{op} is “+” or “-” is @code{DV(@emph{expr1})}
provided that @code{DV(@emph{expr1})} = @code{DV(@emph{expr2})}.
If this condition is not met then the construct is illegal.

@item 
@code{DV(@emph{expr1} * @emph{expr2})} is @code{DV(@emph{expr1})} + @code{DV(@emph{expr2})},
and @code{DV(@emph{expr1} / @emph{expr2})} = @code{DV(@emph{expr1})} - @code{DV(@emph{expr2})}.
In this context if one of the @emph{expr}s is dimensionless then its empty
dimension vector is treated as @code{(others => 0)}.

@item 
@code{DV(@emph{expr} ** @emph{power})} is @emph{power} * @code{DV(@emph{expr})},
provided that @emph{power} is a static rational value. If this condition is not
met then the construct is illegal.
@end itemize

Note that, by the above rules, it is illegal to use binary “+” or “-” to
combine a dimensioned and dimensionless value.  Thus an expression such as
@code{acc-10.0} is illegal, where @code{acc} is an object of subtype
@code{Acceleration}.

The dimensionality checks for relationals use the same rules as
for “+” and “-“, except when comparing to a literal; thus

@quotation

@example
acc > len
@end example
@end quotation

is equivalent to

@quotation

@example
acc-len > 0.0
@end example
@end quotation

and is thus illegal, but

@quotation

@example
acc > 10.0
@end example
@end quotation

is accepted with a warning. Analogously a conditional expression requires the
same dimension vector for each branch (with no exception for literals).

The dimension vector of a type conversion @code{T(@emph{expr})} is defined
as follows, based on the nature of @code{T}:


@itemize *

@item 
If @code{T} is a dimensioned subtype then @code{DV(T(@emph{expr}))} is @code{DV(T)}
provided that either @emph{expr} is dimensionless or
@code{DV(T)} = @code{DV(@emph{expr})}. The conversion is illegal
if @emph{expr} is dimensioned and @code{DV(@emph{expr})} /= @code{DV(T)}.
Note that vector equality does not require that the corresponding
Unit_Names be the same.

As a consequence of the above rule, it is possible to convert between
different dimension systems that follow the same international system
of units, with the seven physical components given in the standard order
(length, mass, time, etc.). Thus a length in meters can be converted to
a length in inches (with a suitable conversion factor) but cannot be
converted, for example, to a mass in pounds.

@item 
If @code{T} is the base type for @emph{expr} (and the dimensionless root type of
the dimension system), then @code{DV(T(@emph{expr}))} is @code{DV(expr)}.
Thus, if @emph{expr} is of a dimensioned subtype of @code{T}, the conversion may
be regarded as a “view conversion” that preserves dimensionality.

This rule makes it possible to write generic code that can be instantiated
with compatible dimensioned subtypes.  The generic unit will contain
conversions that will consequently be present in instantiations, but
conversions to the base type will preserve dimensionality and make it
possible to write generic code that is correct with respect to
dimensionality.

@item 
Otherwise (i.e., @code{T} is neither a dimensioned subtype nor a dimensionable
base type), @code{DV(T(@emph{expr}))} is the empty vector. Thus a dimensioned
value can be explicitly converted to a non-dimensioned subtype, which
of course then escapes dimensionality analysis.
@end itemize

The dimension vector for a type qualification @code{T'(@emph{expr})} is the same
as for the type conversion @code{T(@emph{expr})}.

An assignment statement

@quotation

@example
Source := Target;
@end example
@end quotation

requires @code{DV(Source)} = @code{DV(Target)}, and analogously for parameter
passing (the dimension vector for the actual parameter must be equal to the
dimension vector for the formal parameter).

@node Stack Related Facilities,Memory Management Issues,Performing Dimensionality Analysis in GNAT,GNAT and Program Execution
@anchor{gnat_ugn/gnat_and_program_execution id52}@anchor{14b}@anchor{gnat_ugn/gnat_and_program_execution stack-related-facilities}@anchor{1a8}
@section Stack Related Facilities


This section describes some useful tools associated with stack
checking and analysis. In
particular, it deals with dynamic and static stack usage measurements.

@menu
* Stack Overflow Checking:: 
* Static Stack Usage Analysis:: 
* Dynamic Stack Usage Analysis:: 

@end menu

@node Stack Overflow Checking,Static Stack Usage Analysis,,Stack Related Facilities
@anchor{gnat_ugn/gnat_and_program_execution id53}@anchor{1a9}@anchor{gnat_ugn/gnat_and_program_execution stack-overflow-checking}@anchor{e5}
@subsection Stack Overflow Checking


@geindex Stack Overflow Checking

@geindex -fstack-check (gcc)

For most operating systems, @code{gcc} does not perform stack overflow
checking by default. This means that if the main environment task or
some other task exceeds the available stack space, then unpredictable
behavior will occur. Most native systems offer some level of protection by
adding a guard page at the end of each task stack. This mechanism is usually
not enough for dealing properly with stack overflow situations because
a large local variable could “jump” above the guard page.
Furthermore, when the
guard page is hit, there may not be any space left on the stack for executing
the exception propagation code. Enabling stack checking avoids
such situations.

To activate stack checking, compile all units with the @code{gcc} option
@code{-fstack-check}. For example:

@quotation

@example
$ gcc -c -fstack-check package1.adb
@end example
@end quotation

Units compiled with this option will generate extra instructions to check
that any use of the stack (for procedure calls or for declaring local
variables in declare blocks) does not exceed the available stack space.
If the space is exceeded, then a @code{Storage_Error} exception is raised.

For declared tasks, the default stack size is defined by the GNAT runtime,
whose size may be modified at bind time through the @code{-d} bind switch
(@ref{110,,Switches for gnatbind}). Task specific stack sizes may be set using the
@code{Storage_Size} pragma.

For the environment task, the stack size is determined by the operating system.
Consequently, to modify the size of the environment task please refer to your
operating system documentation.

@node Static Stack Usage Analysis,Dynamic Stack Usage Analysis,Stack Overflow Checking,Stack Related Facilities
@anchor{gnat_ugn/gnat_and_program_execution id54}@anchor{1aa}@anchor{gnat_ugn/gnat_and_program_execution static-stack-usage-analysis}@anchor{e6}
@subsection Static Stack Usage Analysis


@geindex Static Stack Usage Analysis

@geindex -fstack-usage

A unit compiled with @code{-fstack-usage} will generate an extra file
that specifies
the maximum amount of stack used, on a per-function basis.
The file has the same
basename as the target object file with a @code{.su} extension.
Each line of this file is made up of three fields:


@itemize *

@item 
The name of the function.

@item 
A number of bytes.

@item 
One or more qualifiers: @code{static}, @code{dynamic}, @code{bounded}.
@end itemize

The second field corresponds to the size of the known part of the function
frame.

The qualifier @code{static} means that the function frame size
is purely static.
It usually means that all local variables have a static size.
In this case, the second field is a reliable measure of the function stack
utilization.

The qualifier @code{dynamic} means that the function frame size is not static.
It happens mainly when some local variables have a dynamic size. When this
qualifier appears alone, the second field is not a reliable measure
of the function stack analysis. When it is qualified with  @code{bounded}, it
means that the second field is a reliable maximum of the function stack
utilization.

A unit compiled with @code{-Wstack-usage} will issue a warning for each
subprogram whose stack usage might be larger than the specified amount of
bytes.  The wording is in keeping with the qualifier documented above.

@node Dynamic Stack Usage Analysis,,Static Stack Usage Analysis,Stack Related Facilities
@anchor{gnat_ugn/gnat_and_program_execution dynamic-stack-usage-analysis}@anchor{113}@anchor{gnat_ugn/gnat_and_program_execution id55}@anchor{1ab}
@subsection Dynamic Stack Usage Analysis


It is possible to measure the maximum amount of stack used by a task, by
adding a switch to @code{gnatbind}, as:

@quotation

@example
$ gnatbind -u0 file
@end example
@end quotation

With this option, at each task termination, its stack usage is output on
@code{stderr}.
Note that this switch is not compatible with tools like
Valgrind and DrMemory; they will report errors.

It is not always convenient to output the stack usage when the program
is still running. Hence, it is possible to delay this output until program
termination. for a given number of tasks specified as the argument of the
@code{-u} option. For instance:

@quotation

@example
$ gnatbind -u100 file
@end example
@end quotation

will buffer the stack usage information of the first 100 tasks to terminate and
output this info at program termination. Results are displayed in four
columns:

@quotation

@example
Index | Task Name | Stack Size | Stack Usage
@end example
@end quotation

where:


@itemize *

@item 
@emph{Index} is a number associated with each task.

@item 
@emph{Task Name} is the name of the task analyzed.

@item 
@emph{Stack Size} is the maximum size for the stack.

@item 
@emph{Stack Usage} is the measure done by the stack analyzer.
In order to prevent overflow, the stack
is not entirely analyzed, and it’s not possible to know exactly how
much has actually been used.
@end itemize

By default the environment task stack, the stack that contains the main unit,
is not processed. To enable processing of the environment task stack, the
environment variable GNAT_STACK_LIMIT needs to be set to the maximum size of
the environment task stack. This amount is given in kilobytes. For example:

@quotation

@example
$ set GNAT_STACK_LIMIT 1600
@end example
@end quotation

would specify to the analyzer that the environment task stack has a limit
of 1.6 megabytes. Any stack usage beyond this will be ignored by the analysis.

The package @code{GNAT.Task_Stack_Usage} provides facilities to get
stack-usage reports at run time. See its body for the details.

@node Memory Management Issues,,Stack Related Facilities,GNAT and Program Execution
@anchor{gnat_ugn/gnat_and_program_execution id56}@anchor{14c}@anchor{gnat_ugn/gnat_and_program_execution memory-management-issues}@anchor{1ac}
@section Memory Management Issues


This section describes some useful memory pools provided in the GNAT library
and in particular the GNAT Debug Pool facility, which can be used to detect
incorrect uses of access values (including ‘dangling references’).


@menu
* Some Useful Memory Pools:: 
* The GNAT Debug Pool Facility:: 

@end menu

@node Some Useful Memory Pools,The GNAT Debug Pool Facility,,Memory Management Issues
@anchor{gnat_ugn/gnat_and_program_execution id57}@anchor{1ad}@anchor{gnat_ugn/gnat_and_program_execution some-useful-memory-pools}@anchor{1ae}
@subsection Some Useful Memory Pools


@geindex Memory Pool

@geindex storage
@geindex pool

The @code{System.Pool_Global} package offers the Unbounded_No_Reclaim_Pool
storage pool. Allocations use the standard system call @code{malloc} while
deallocations use the standard system call @code{free}. No reclamation is
performed when the pool goes out of scope. For performance reasons, the
standard default Ada allocators/deallocators do not use any explicit storage
pools but if they did, they could use this storage pool without any change in
behavior. That is why this storage pool is used  when the user
manages to make the default implicit allocator explicit as in this example:

@quotation

@example
type T1 is access Something;
 -- no Storage pool is defined for T2

type T2 is access Something_Else;
for T2'Storage_Pool use T1'Storage_Pool;
-- the above is equivalent to
for T2'Storage_Pool use System.Pool_Global.Global_Pool_Object;
@end example
@end quotation

The @code{System.Pool_Local} package offers the @code{Unbounded_Reclaim_Pool} storage
pool. The allocation strategy is similar to @code{Pool_Local}
except that the all
storage allocated with this pool is reclaimed when the pool object goes out of
scope. This pool provides a explicit mechanism similar to the implicit one
provided by several Ada 83 compilers for allocations performed through a local
access type and whose purpose was to reclaim memory when exiting the
scope of a given local access. As an example, the following program does not
leak memory even though it does not perform explicit deallocation:

@quotation

@example
with System.Pool_Local;
procedure Pooloc1 is
   procedure Internal is
      type A is access Integer;
      X : System.Pool_Local.Unbounded_Reclaim_Pool;
      for A'Storage_Pool use X;
      v : A;
   begin
      for I in  1 .. 50 loop
         v := new Integer;
      end loop;
   end Internal;
begin
   for I in  1 .. 100 loop
      Internal;
   end loop;
end Pooloc1;
@end example
@end quotation

The @code{System.Pool_Size} package implements the @code{Stack_Bounded_Pool} used when
@code{Storage_Size} is specified for an access type.
The whole storage for the pool is
allocated at once, usually on the stack at the point where the access type is
elaborated. It is automatically reclaimed when exiting the scope where the
access type is defined. This package is not intended to be used directly by the
user and it is implicitly used for each such declaration:

@quotation

@example
type T1 is access Something;
for T1'Storage_Size use 10_000;
@end example
@end quotation

@node The GNAT Debug Pool Facility,,Some Useful Memory Pools,Memory Management Issues
@anchor{gnat_ugn/gnat_and_program_execution id58}@anchor{1af}@anchor{gnat_ugn/gnat_and_program_execution the-gnat-debug-pool-facility}@anchor{1b0}
@subsection The GNAT Debug Pool Facility


@geindex Debug Pool

@geindex storage
@geindex pool
@geindex memory corruption

The use of unchecked deallocation and unchecked conversion can easily
lead to incorrect memory references. The problems generated by such
references are usually difficult to tackle because the symptoms can be
very remote from the origin of the problem. In such cases, it is
very helpful to detect the problem as early as possible. This is the
purpose of the Storage Pool provided by @code{GNAT.Debug_Pools}.

In order to use the GNAT specific debugging pool, the user must
associate a debug pool object with each of the access types that may be
related to suspected memory problems. See Ada Reference Manual 13.11.

@quotation

@example
type Ptr is access Some_Type;
Pool : GNAT.Debug_Pools.Debug_Pool;
for Ptr'Storage_Pool use Pool;
@end example
@end quotation

@code{GNAT.Debug_Pools} is derived from a GNAT-specific kind of
pool: the @code{Checked_Pool}. Such pools, like standard Ada storage pools,
allow the user to redefine allocation and deallocation strategies. They
also provide a checkpoint for each dereference, through the use of
the primitive operation @code{Dereference} which is implicitly called at
each dereference of an access value.

Once an access type has been associated with a debug pool, operations on
values of the type may raise four distinct exceptions,
which correspond to four potential kinds of memory corruption:


@itemize *

@item 
@code{GNAT.Debug_Pools.Accessing_Not_Allocated_Storage}

@item 
@code{GNAT.Debug_Pools.Accessing_Deallocated_Storage}

@item 
@code{GNAT.Debug_Pools.Freeing_Not_Allocated_Storage}

@item 
@code{GNAT.Debug_Pools.Freeing_Deallocated_Storage}
@end itemize

For types associated with a Debug_Pool, dynamic allocation is performed using
the standard GNAT allocation routine. References to all allocated chunks of
memory are kept in an internal dictionary. Several deallocation strategies are
provided, whereupon the user can choose to release the memory to the system,
keep it allocated for further invalid access checks, or fill it with an easily
recognizable pattern for debug sessions. The memory pattern is the old IBM
hexadecimal convention: @code{16#DEADBEEF#}.

See the documentation in the file g-debpoo.ads for more information on the
various strategies.

Upon each dereference, a check is made that the access value denotes a
properly allocated memory location. Here is a complete example of use of
@code{Debug_Pools}, that includes typical instances of  memory corruption:

@quotation

@example
with Gnat.Io; use Gnat.Io;
with Unchecked_Deallocation;
with Unchecked_Conversion;
with GNAT.Debug_Pools;
with System.Storage_Elements;
with Ada.Exceptions; use Ada.Exceptions;
procedure Debug_Pool_Test is

   type T is access Integer;
   type U is access all T;

   P : GNAT.Debug_Pools.Debug_Pool;
   for T'Storage_Pool use P;

   procedure Free is new Unchecked_Deallocation (Integer, T);
   function UC is new Unchecked_Conversion (U, T);
   A, B : aliased T;

   procedure Info is new GNAT.Debug_Pools.Print_Info(Put_Line);

begin
   Info (P);
   A := new Integer;
   B := new Integer;
   B := A;
   Info (P);
   Free (A);
   begin
      Put_Line (Integer'Image(B.all));
   exception
      when E : others => Put_Line ("raised: " & Exception_Name (E));
   end;
   begin
      Free (B);
   exception
      when E : others => Put_Line ("raised: " & Exception_Name (E));
   end;
   B := UC(A'Access);
   begin
      Put_Line (Integer'Image(B.all));
   exception
      when E : others => Put_Line ("raised: " & Exception_Name (E));
   end;
   begin
      Free (B);
   exception
      when E : others => Put_Line ("raised: " & Exception_Name (E));
   end;
   Info (P);
end Debug_Pool_Test;
@end example
@end quotation

The debug pool mechanism provides the following precise diagnostics on the
execution of this erroneous program:

@quotation

@example
Debug Pool info:
  Total allocated bytes :  0
  Total deallocated bytes :  0
  Current Water Mark:  0
  High Water Mark:  0

Debug Pool info:
  Total allocated bytes :  8
  Total deallocated bytes :  0
  Current Water Mark:  8
  High Water Mark:  8

raised: GNAT.DEBUG_POOLS.ACCESSING_DEALLOCATED_STORAGE
raised: GNAT.DEBUG_POOLS.FREEING_DEALLOCATED_STORAGE
raised: GNAT.DEBUG_POOLS.ACCESSING_NOT_ALLOCATED_STORAGE
raised: GNAT.DEBUG_POOLS.FREEING_NOT_ALLOCATED_STORAGE
Debug Pool info:
  Total allocated bytes :  8
  Total deallocated bytes :  4
  Current Water Mark:  4
  High Water Mark:  8
@end example
@end quotation


@c -- Non-breaking space in running text
@c -- E.g. Ada |nbsp| 95

@node Platform-Specific Information,Example of Binder Output File,GNAT and Program Execution,Top
@anchor{gnat_ugn/platform_specific_information doc}@anchor{1b1}@anchor{gnat_ugn/platform_specific_information id1}@anchor{1b2}@anchor{gnat_ugn/platform_specific_information platform-specific-information}@anchor{d}
@chapter Platform-Specific Information


This appendix contains information relating to the implementation
of run-time libraries on various platforms and also covers
topics related to the GNAT implementation on Windows and Mac OS.

@menu
* Run-Time Libraries:: 
* Specifying a Run-Time Library:: 
* GNU/Linux Topics:: 
* Microsoft Windows Topics:: 
* Mac OS Topics:: 

@end menu

@node Run-Time Libraries,Specifying a Run-Time Library,,Platform-Specific Information
@anchor{gnat_ugn/platform_specific_information id2}@anchor{1b3}@anchor{gnat_ugn/platform_specific_information run-time-libraries}@anchor{1b4}
@section Run-Time Libraries


@geindex Tasking and threads libraries

@geindex Threads libraries and tasking

@geindex Run-time libraries (platform-specific information)

The GNAT run-time implementation may vary with respect to both the
underlying threads library and the exception-handling scheme.
For threads support, the default run-time will bind to the thread
package of the underlying operating system.

For exception handling, either or both of two models are supplied:

@quotation

@geindex Zero-Cost Exceptions

@geindex ZCX (Zero-Cost Exceptions)
@end quotation


@itemize *

@item 
@strong{Zero-Cost Exceptions} (“ZCX”),
which uses binder-generated tables that
are interrogated at run time to locate a handler.

@geindex setjmp/longjmp Exception Model

@geindex SJLJ (setjmp/longjmp Exception Model)

@item 
@strong{setjmp / longjmp} (‘SJLJ’),
which uses dynamically-set data to establish
the set of handlers
@end itemize

Most programs should experience a substantial speed improvement by
being compiled with a ZCX run-time.
This is especially true for
tasking applications or applications with many exception handlers.
Note however that the ZCX run-time does not support asynchronous abort
of tasks (@code{abort} and @code{select-then-abort} constructs) and will instead
implement abort by polling points in the runtime. You can also add additional
polling points explicitly if needed in your application via @code{pragma
Abort_Defer}.

This section summarizes which combinations of threads and exception support
are supplied on various GNAT platforms.

@menu
* Summary of Run-Time Configurations:: 

@end menu

@node Summary of Run-Time Configurations,,,Run-Time Libraries
@anchor{gnat_ugn/platform_specific_information id3}@anchor{1b5}@anchor{gnat_ugn/platform_specific_information summary-of-run-time-configurations}@anchor{1b6}
@subsection Summary of Run-Time Configurations



@multitable {xxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxx} {xxxxxxxxxxxxxx} 
@headitem

Platform

@tab

Run-Time

@tab

Tasking

@tab

Exceptions

@item

GNU/Linux

@tab

rts-native
(default)

@tab

pthread library

@tab

ZCX

@item

rts-sjlj

@tab

pthread library

@tab

SJLJ

@item

Windows

@tab

rts-native
(default)

@tab

native Win32 threads

@tab

ZCX

@item

rts-sjlj

@tab

native Win32 threads

@tab

SJLJ

@item

Mac OS

@tab

rts-native

@tab

pthread library

@tab

ZCX

@end multitable


@node Specifying a Run-Time Library,GNU/Linux Topics,Run-Time Libraries,Platform-Specific Information
@anchor{gnat_ugn/platform_specific_information id4}@anchor{1b7}@anchor{gnat_ugn/platform_specific_information specifying-a-run-time-library}@anchor{1b8}
@section Specifying a Run-Time Library


The @code{adainclude} subdirectory containing the sources of the GNAT
run-time library, and the @code{adalib} subdirectory containing the
@code{ALI} files and the static and/or shared GNAT library, are located
in the gcc target-dependent area:

@quotation

@example
target=$prefix/lib/gcc/gcc-*dumpmachine*/gcc-*dumpversion*/
@end example
@end quotation

As indicated above, on some platforms several run-time libraries are supplied.
These libraries are installed in the target dependent area and
contain a complete source and binary subdirectory. The detailed description
below explains the differences between the different libraries in terms of
their thread support.

The default run-time library (when GNAT is installed) is @emph{rts-native}.
This default run-time is selected by the means of soft links.
For example on x86-linux:

@c --
@c --  $(target-dir)
@c --      |
@c --      +--- adainclude----------+
@c --      |                        |
@c --      +--- adalib-----------+  |
@c --      |                     |  |
@c --      +--- rts-native       |  |
@c --      |    |                |  |
@c --      |    +--- adainclude <---+
@c --      |    |                |
@c --      |    +--- adalib <----+
@c --      |
@c --      +--- rts-sjlj
@c --           |
@c --           +--- adainclude
@c --           |
@c --           +--- adalib


@example
               $(target-dir)
              __/ /      \ \___
      _______/   /        \    \_________________
     /          /          \                     \
    /          /            \                     \
ADAINCLUDE  ADALIB      rts-native             rts-sjlj
   :          :            /    \                 /   \
   :          :           /      \               /     \
   :          :          /        \             /       \
   :          :         /          \           /         \
   +-------------> adainclude     adalib   adainclude   adalib
              :                     ^
              :                     :
              +---------------------+

              Run-Time Library Directory Structure
   (Upper-case names and dotted/dashed arrows represent soft links)
@end example

If the @emph{rts-sjlj} library is to be selected on a permanent basis,
these soft links can be modified with the following commands:

@quotation

@example
$ cd $target
$ rm -f adainclude adalib
$ ln -s rts-sjlj/adainclude adainclude
$ ln -s rts-sjlj/adalib adalib
@end example
@end quotation

Alternatively, you can specify @code{rts-sjlj/adainclude} in the file
@code{$target/ada_source_path} and @code{rts-sjlj/adalib} in
@code{$target/ada_object_path}.

@geindex --RTS option

Selecting another run-time library temporarily can be
achieved by using the @code{--RTS} switch, e.g., @code{--RTS=sjlj}
@anchor{gnat_ugn/platform_specific_information choosing-the-scheduling-policy}@anchor{1b9}
@geindex SCHED_FIFO scheduling policy

@geindex SCHED_RR scheduling policy

@geindex SCHED_OTHER scheduling policy

@menu
* Choosing the Scheduling Policy:: 

@end menu

@node Choosing the Scheduling Policy,,,Specifying a Run-Time Library
@anchor{gnat_ugn/platform_specific_information id5}@anchor{1ba}
@subsection Choosing the Scheduling Policy


When using a POSIX threads implementation, you have a choice of several
scheduling policies: @code{SCHED_FIFO}, @code{SCHED_RR} and @code{SCHED_OTHER}.

Typically, the default is @code{SCHED_OTHER}, while using @code{SCHED_FIFO}
or @code{SCHED_RR} requires special (e.g., root) privileges.

@geindex pragma Time_Slice

@geindex -T0 option

@geindex pragma Task_Dispatching_Policy

By default, GNAT uses the @code{SCHED_OTHER} policy. To specify
@code{SCHED_FIFO},
you can use one of the following:


@itemize *

@item 
@code{pragma Time_Slice (0.0)}

@item 
the corresponding binder option @code{-T0}

@item 
@code{pragma Task_Dispatching_Policy (FIFO_Within_Priorities)}
@end itemize

To specify @code{SCHED_RR},
you should use @code{pragma Time_Slice} with a
value greater than 0.0, or else use the corresponding @code{-T}
binder option.

To make sure a program is running as root, you can put something like
this in a library package body in your application:

@quotation

@example
function geteuid return Integer;
pragma Import (C, geteuid, "geteuid");
Ignore : constant Boolean :=
  (if geteuid = 0 then True else raise Program_Error with "must be root");
@end example
@end quotation

It gets the effective user id, and if it’s not 0 (i.e. root), it raises
Program_Error. Note that if you re running the code in a container, this may
not be sufficient, as you may have sufficient priviledge on the container,
but not on the host machine running the container, so check that you also
have sufficient priviledge for running the container image.

@geindex Linux

@geindex GNU/Linux

@node GNU/Linux Topics,Microsoft Windows Topics,Specifying a Run-Time Library,Platform-Specific Information
@anchor{gnat_ugn/platform_specific_information gnu-linux-topics}@anchor{1bb}@anchor{gnat_ugn/platform_specific_information id6}@anchor{1bc}
@section GNU/Linux Topics


This section describes topics that are specific to GNU/Linux platforms.
@anchor{gnat_ugn/platform_specific_information required-packages-on-gnu-linux}@anchor{1bd}
@menu
* Required Packages on GNU/Linux:: 
* A GNU/Linux Debug Quirk:: 

@end menu

@node Required Packages on GNU/Linux,A GNU/Linux Debug Quirk,,GNU/Linux Topics
@anchor{gnat_ugn/platform_specific_information a-gnu-linux-debug-quirk}@anchor{1be}@anchor{gnat_ugn/platform_specific_information id7}@anchor{1bf}
@subsection Required Packages on GNU/Linux


GNAT requires the C library developer’s package to be installed.
The name of of that package depends on your GNU/Linux distribution:


@itemize *

@item 
RedHat, SUSE: @code{glibc-devel};

@item 
Debian, Ubuntu: @code{libc6-dev} (normally installed by default).
@end itemize

If using the 32-bit version of GNAT on a 64-bit version of GNU/Linux,
you’ll need the 32-bit version of the following packages:


@itemize *

@item 
RedHat, SUSE: @code{glibc.i686}, @code{glibc-devel.i686}, @code{ncurses-libs.i686}

@item 
Debian, Ubuntu: @code{libc6:i386}, @code{libc6-dev:i386}, @code{lib32ncursesw5}
@end itemize

Other GNU/Linux distributions might be choosing a different name
for those packages.

@node A GNU/Linux Debug Quirk,,Required Packages on GNU/Linux,GNU/Linux Topics
@anchor{gnat_ugn/platform_specific_information id8}@anchor{1c0}
@subsection A GNU/Linux Debug Quirk


On SuSE 15, some kernels have a defect causing issues when debugging
programs using threads or Ada tasks. Due to the lack of documentation
found regarding this kernel issue, we can only provide limited
information about which kernels are impacted: kernel version 5.3.18 is
known to be impacted, and kernels in the 5.14 range or newer are
believed to fix this problem.

The bug affects the debugging of 32-bit processes on a 64-bit system.
Symptoms can vary: Unexpected @code{SIGABRT} signals being received by
the program, “The futex facility returned an unexpected error code”
error message, and inferior programs hanging indefinitely range among
the symptoms most commonly observed.

@geindex Windows

@node Microsoft Windows Topics,Mac OS Topics,GNU/Linux Topics,Platform-Specific Information
@anchor{gnat_ugn/platform_specific_information id9}@anchor{1c1}@anchor{gnat_ugn/platform_specific_information microsoft-windows-topics}@anchor{1c2}
@section Microsoft Windows Topics


This section describes topics that are specific to the Microsoft Windows
platforms.


@menu
* Using GNAT on Windows:: 
* Using a network installation of GNAT:: 
* CONSOLE and WINDOWS subsystems:: 
* Temporary Files:: 
* Disabling Command Line Argument Expansion:: 
* Windows Socket Timeouts:: 
* Mixed-Language Programming on Windows:: 
* Windows Specific Add-Ons:: 

@end menu

@node Using GNAT on Windows,Using a network installation of GNAT,,Microsoft Windows Topics
@anchor{gnat_ugn/platform_specific_information id10}@anchor{1c3}@anchor{gnat_ugn/platform_specific_information using-gnat-on-windows}@anchor{1c4}
@subsection Using GNAT on Windows


One of the strengths of the GNAT technology is that its tool set
(@code{gcc}, @code{gnatbind}, @code{gnatlink}, @code{gnatmake}, the
@code{gdb} debugger, etc.) is used in the same way regardless of the
platform.

On Windows this tool set is complemented by a number of Microsoft-specific
tools that have been provided to facilitate interoperability with Windows
when this is required. With these tools:


@itemize *

@item 
You can build applications using the @code{CONSOLE} or @code{WINDOWS}
subsystems.

@item 
You can use any Dynamically Linked Library (DLL) in your Ada code (both
relocatable and non-relocatable DLLs are supported).

@item 
You can build Ada DLLs for use in other applications. These applications
can be written in a language other than Ada (e.g., C, C++, etc). Again both
relocatable and non-relocatable Ada DLLs are supported.

@item 
You can include Windows resources in your Ada application.

@item 
You can use or create COM/DCOM objects.
@end itemize

Immediately below are listed all known general GNAT-for-Windows restrictions.
Other restrictions about specific features like Windows Resources and DLLs
are listed in separate sections below.


@itemize *

@item 
It is not possible to use @code{GetLastError} and @code{SetLastError}
when tasking, protected records, or exceptions are used. In these
cases, in order to implement Ada semantics, the GNAT run-time system
calls certain Win32 routines that set the last error variable to 0 upon
success. It should be possible to use @code{GetLastError} and
@code{SetLastError} when tasking, protected record, and exception
features are not used, but it is not guaranteed to work.

@item 
It is not possible to link against Microsoft C++ libraries except for
import libraries. Interfacing must be done by the mean of DLLs.

@item 
It is possible to link against Microsoft C libraries. Yet the preferred
solution is to use C/C++ compiler that comes with GNAT, since it
doesn’t require having two different development environments and makes the
inter-language debugging experience smoother.

@item 
When the compilation environment is located on FAT32 drives, users may
experience recompilations of the source files that have not changed if
Daylight Saving Time (DST) state has changed since the last time files
were compiled. NTFS drives do not have this problem.

@item 
No components of the GNAT toolset use any entries in the Windows
registry. The only entries that can be created are file associations and
PATH settings, provided the user has chosen to create them at installation
time, as well as some minimal book-keeping information needed to correctly
uninstall or integrate different GNAT products.
@end itemize

@node Using a network installation of GNAT,CONSOLE and WINDOWS subsystems,Using GNAT on Windows,Microsoft Windows Topics
@anchor{gnat_ugn/platform_specific_information id11}@anchor{1c5}@anchor{gnat_ugn/platform_specific_information using-a-network-installation-of-gnat}@anchor{1c6}
@subsection Using a network installation of GNAT


Make sure the system on which GNAT is installed is accessible from the
current machine, i.e., the install location is shared over the network.
Shared resources are accessed on Windows by means of UNC paths, which
have the format @code{\\\\server\\sharename\\path}

In order to use such a network installation, simply add the UNC path of the
@code{bin} directory of your GNAT installation in front of your PATH. For
example, if GNAT is installed in @code{\GNAT} directory of a share location
called @code{c-drive} on a machine @code{LOKI}, the following command will
make it available:

@quotation

@example
$ path \\loki\c-drive\gnat\bin;%path%`
@end example
@end quotation

Be aware that every compilation using the network installation results in the
transfer of large amounts of data across the network and will likely cause
serious performance penalty.

@node CONSOLE and WINDOWS subsystems,Temporary Files,Using a network installation of GNAT,Microsoft Windows Topics
@anchor{gnat_ugn/platform_specific_information console-and-windows-subsystems}@anchor{1c7}@anchor{gnat_ugn/platform_specific_information id12}@anchor{1c8}
@subsection CONSOLE and WINDOWS subsystems


@geindex CONSOLE Subsystem

@geindex WINDOWS Subsystem

@geindex -mwindows

There are two main subsystems under Windows. The @code{CONSOLE} subsystem
(which is the default subsystem) will always create a console when
launching the application. This is not something desirable when the
application has a Windows GUI. To get rid of this console the
application must be using the @code{WINDOWS} subsystem. To do so
the @code{-mwindows} linker option must be specified.

@quotation

@example
$ gnatmake winprog -largs -mwindows
@end example
@end quotation

@node Temporary Files,Disabling Command Line Argument Expansion,CONSOLE and WINDOWS subsystems,Microsoft Windows Topics
@anchor{gnat_ugn/platform_specific_information id13}@anchor{1c9}@anchor{gnat_ugn/platform_specific_information temporary-files}@anchor{1ca}
@subsection Temporary Files


@geindex Temporary files

It is possible to control where temporary files gets created by setting
the 
@geindex TMP
@geindex environment variable; TMP
@code{TMP} environment variable. The file will be created:


@itemize *

@item 
Under the directory pointed to by the 
@geindex TMP
@geindex environment variable; TMP
@code{TMP} environment variable if
this directory exists.

@item 
Under @code{c:\temp}, if the 
@geindex TMP
@geindex environment variable; TMP
@code{TMP} environment variable is not
set (or not pointing to a directory) and if this directory exists.

@item 
Under the current working directory otherwise.
@end itemize

This allows you to determine exactly where the temporary
file will be created. This is particularly useful in networked
environments where you may not have write access to some
directories.

@node Disabling Command Line Argument Expansion,Windows Socket Timeouts,Temporary Files,Microsoft Windows Topics
@anchor{gnat_ugn/platform_specific_information disabling-command-line-argument-expansion}@anchor{1cb}
@subsection Disabling Command Line Argument Expansion


@geindex Command Line Argument Expansion

By default, an executable compiled for the Windows platform will do
the following postprocessing on the arguments passed on the command
line:


@itemize *

@item 
If the argument contains the characters @code{*} and/or @code{?}, then
file expansion will be attempted. For example, if the current directory
contains @code{a.txt} and @code{b.txt}, then when calling:

@example
$ my_ada_program *.txt
@end example

The following arguments will effectively be passed to the main program
(for example when using @code{Ada.Command_Line.Argument}):

@example
Ada.Command_Line.Argument (1) -> "a.txt"
Ada.Command_Line.Argument (2) -> "b.txt"
@end example

@item 
Filename expansion can be disabled for a given argument by using single
quotes. Thus, calling:

@example
$ my_ada_program '*.txt'
@end example

will result in:

@example
Ada.Command_Line.Argument (1) -> "*.txt"
@end example
@end itemize

Note that if the program is launched from a shell such as Cygwin Bash
then quote removal might be performed by the shell.

In some contexts it might be useful to disable this feature (for example if
the program performs its own argument expansion). In order to do this, a C
symbol needs to be defined and set to @code{0}. You can do this by
adding the following code fragment in one of your Ada units:

@example
Do_Argv_Expansion : Integer := 0;
pragma Export (C, Do_Argv_Expansion, "__gnat_do_argv_expansion");
@end example

The results of previous examples will be respectively:

@example
Ada.Command_Line.Argument (1) -> "*.txt"
@end example

and:

@example
Ada.Command_Line.Argument (1) -> "'*.txt'"
@end example

@node Windows Socket Timeouts,Mixed-Language Programming on Windows,Disabling Command Line Argument Expansion,Microsoft Windows Topics
@anchor{gnat_ugn/platform_specific_information windows-socket-timeouts}@anchor{1cc}
@subsection Windows Socket Timeouts


Microsoft Windows desktops older than @code{8.0} and Microsoft Windows Servers
older than @code{2019} set a socket timeout 500 milliseconds longer than the value
set by setsockopt with @code{SO_RCVTIMEO} and @code{SO_SNDTIMEO} options. The GNAT
runtime makes a correction for the difference in the corresponding Windows
versions. For Windows Server starting with version @code{2019}, the user must
provide a manifest file for the GNAT runtime to be able to recognize that
the Windows version does not need the timeout correction. The manifest file
should be located in the same directory as the executable file, and its file
name must match the executable name suffixed by @code{.manifest}. For example,
if the executable name is @code{sock_wto.exe}, then the manifest file name
has to be @code{sock_wto.exe.manifest}. The manifest file must contain at
least the following data:

@example
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
   <!-- Windows Vista -->
   <supportedOS Id="@{e2011457-1546-43c5-a5fe-008deee3d3f0@}"/>
   <!-- Windows 7 -->
   <supportedOS Id="@{35138b9a-5d96-4fbd-8e2d-a2440225f93a@}"/>
   <!-- Windows 8 -->
   <supportedOS Id="@{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38@}"/>
   <!-- Windows 8.1 -->
   <supportedOS Id="@{1f676c76-80e1-4239-95bb-83d0f6d0da78@}"/>
   <!-- Windows 10 -->
   <supportedOS Id="@{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a@}"/>
</application>
</compatibility>
</assembly>
@end example

Without the manifest file, the socket timeout is going to be overcorrected on
these Windows Server versions and the actual time is going to be 500
milliseconds shorter than what was set with GNAT.Sockets.Set_Socket_Option.
Note that on Microsoft Windows versions where correction is necessary, there
is no way to set a socket timeout shorter than 500 ms. If a socket timeout
shorter than 500 ms is needed on these Windows versions, a call to
Check_Selector should be added before any socket read or write operations.

@node Mixed-Language Programming on Windows,Windows Specific Add-Ons,Windows Socket Timeouts,Microsoft Windows Topics
@anchor{gnat_ugn/platform_specific_information id14}@anchor{1cd}@anchor{gnat_ugn/platform_specific_information mixed-language-programming-on-windows}@anchor{1ce}
@subsection Mixed-Language Programming on Windows


Developing pure Ada applications on Windows is no different than on
other GNAT-supported platforms. However, when developing or porting an
application that contains a mix of Ada and C/C++, the choice of your
Windows C/C++ development environment conditions your overall
interoperability strategy.

If you use @code{gcc} or Microsoft C to compile the non-Ada part of
your application, there are no Windows-specific restrictions that
affect the overall interoperability with your Ada code. If you do want
to use the Microsoft tools for your C++ code, you have two choices:


@itemize *

@item 
Encapsulate your C++ code in a DLL to be linked with your Ada
application. In this case, use the Microsoft or whatever environment to
build the DLL and use GNAT to build your executable
(@ref{1cf,,Using DLLs with GNAT}).

@item 
Or you can encapsulate your Ada code in a DLL to be linked with the
other part of your application. In this case, use GNAT to build the DLL
(@ref{1d0,,Building DLLs with GNAT Project files}) and use the Microsoft
or whatever environment to build your executable.
@end itemize

In addition to the description about C main in
@ref{2c,,Mixed Language Programming} section, if the C main uses a
stand-alone library it is required on x86-windows to
setup the SEH context. For this the C main must looks like this:

@quotation

@example
/* main.c */
extern void adainit (void);
extern void adafinal (void);
extern void __gnat_initialize(void*);
extern void call_to_ada (void);

int main (int argc, char *argv[])
@{
  int SEH [2];

  /* Initialize the SEH context */
  __gnat_initialize (&SEH);

  adainit();

  /* Then call Ada services in the stand-alone library */

  call_to_ada();

  adafinal();
@}
@end example
@end quotation

Note that this is not needed on x86_64-windows where the Windows
native SEH support is used.

@menu
* Windows Calling Conventions:: 
* Introduction to Dynamic Link Libraries (DLLs): Introduction to Dynamic Link Libraries DLLs. 
* Using DLLs with GNAT:: 
* Building DLLs with GNAT Project files:: 
* Building DLLs with GNAT:: 
* Building DLLs with gnatdll:: 
* Ada DLLs and Finalization:: 
* Creating a Spec for Ada DLLs:: 
* GNAT and Windows Resources:: 
* Using GNAT DLLs from Microsoft Visual Studio Applications:: 
* Debugging a DLL:: 
* Setting Stack Size from gnatlink:: 
* Setting Heap Size from gnatlink:: 

@end menu

@node Windows Calling Conventions,Introduction to Dynamic Link Libraries DLLs,,Mixed-Language Programming on Windows
@anchor{gnat_ugn/platform_specific_information id15}@anchor{1d1}@anchor{gnat_ugn/platform_specific_information windows-calling-conventions}@anchor{1d2}
@subsubsection Windows Calling Conventions


@geindex Stdcall

@geindex APIENTRY

This section pertain only to Win32. On Win64 there is a single native
calling convention. All convention specifiers are ignored on this
platform.

When a subprogram @code{F} (caller) calls a subprogram @code{G}
(callee), there are several ways to push @code{G}‘s parameters on the
stack and there are several possible scenarios to clean up the stack
upon @code{G}‘s return. A calling convention is an agreed upon software
protocol whereby the responsibilities between the caller (@code{F}) and
the callee (@code{G}) are clearly defined. Several calling conventions
are available for Windows:


@itemize *

@item 
@code{C} (Microsoft defined)

@item 
@code{Stdcall} (Microsoft defined)

@item 
@code{Win32} (GNAT specific)

@item 
@code{DLL} (GNAT specific)
@end itemize

@menu
* C Calling Convention:: 
* Stdcall Calling Convention:: 
* Win32 Calling Convention:: 
* DLL Calling Convention:: 

@end menu

@node C Calling Convention,Stdcall Calling Convention,,Windows Calling Conventions
@anchor{gnat_ugn/platform_specific_information c-calling-convention}@anchor{1d3}@anchor{gnat_ugn/platform_specific_information id16}@anchor{1d4}
@subsubsection @code{C} Calling Convention


This is the default calling convention used when interfacing to C/C++
routines compiled with either @code{gcc} or Microsoft Visual C++.

In the @code{C} calling convention subprogram parameters are pushed on the
stack by the caller from right to left. The caller itself is in charge of
cleaning up the stack after the call. In addition, the name of a routine
with @code{C} calling convention is mangled by adding a leading underscore.

The name to use on the Ada side when importing (or exporting) a routine
with @code{C} calling convention is the name of the routine. For
instance the C function:

@quotation

@example
int get_val (long);
@end example
@end quotation

should be imported from Ada as follows:

@quotation

@example
function Get_Val (V : Interfaces.C.long) return Interfaces.C.int;
pragma Import (C, Get_Val, External_Name => "get_val");
@end example
@end quotation

Note that in this particular case the @code{External_Name} parameter could
have been omitted since, when missing, this parameter is taken to be the
name of the Ada entity in lower case. When the @code{Link_Name} parameter
is missing, as in the above example, this parameter is set to be the
@code{External_Name} with a leading underscore.

When importing a variable defined in C, you should always use the @code{C}
calling convention unless the object containing the variable is part of a
DLL (in which case you should use the @code{Stdcall} calling
convention, @ref{1d5,,Stdcall Calling Convention}).

@node Stdcall Calling Convention,Win32 Calling Convention,C Calling Convention,Windows Calling Conventions
@anchor{gnat_ugn/platform_specific_information id17}@anchor{1d6}@anchor{gnat_ugn/platform_specific_information stdcall-calling-convention}@anchor{1d5}
@subsubsection @code{Stdcall} Calling Convention


This convention, which was the calling convention used for Pascal
programs, is used by Microsoft for all the routines in the Win32 API for
efficiency reasons. It must be used to import any routine for which this
convention was specified.

In the @code{Stdcall} calling convention subprogram parameters are pushed
on the stack by the caller from right to left. The callee (and not the
caller) is in charge of cleaning the stack on routine exit. In addition,
the name of a routine with @code{Stdcall} calling convention is mangled by
adding a leading underscore (as for the @code{C} calling convention) and a
trailing @code{@@@emph{nn}}, where @code{nn} is the overall size (in
bytes) of the parameters passed to the routine.

The name to use on the Ada side when importing a C routine with a
@code{Stdcall} calling convention is the name of the C routine. The leading
underscore and trailing @code{@@@emph{nn}} are added automatically by
the compiler. For instance the Win32 function:

@quotation

@example
APIENTRY int get_val (long);
@end example
@end quotation

should be imported from Ada as follows:

@quotation

@example
function Get_Val (V : Interfaces.C.long) return Interfaces.C.int;
pragma Import (Stdcall, Get_Val);
--  On the x86 a long is 4 bytes, so the Link_Name is "_get_val@@4"
@end example
@end quotation

As for the @code{C} calling convention, when the @code{External_Name}
parameter is missing, it is taken to be the name of the Ada entity in lower
case. If instead of writing the above import pragma you write:

@quotation

@example
function Get_Val (V : Interfaces.C.long) return Interfaces.C.int;
pragma Import (Stdcall, Get_Val, External_Name => "retrieve_val");
@end example
@end quotation

then the imported routine is @code{_retrieve_val@@4}. However, if instead
of specifying the @code{External_Name} parameter you specify the
@code{Link_Name} as in the following example:

@quotation

@example
function Get_Val (V : Interfaces.C.long) return Interfaces.C.int;
pragma Import (Stdcall, Get_Val, Link_Name => "retrieve_val");
@end example
@end quotation

then the imported routine is @code{retrieve_val}, that is, there is no
decoration at all. No leading underscore and no Stdcall suffix
@code{@@@emph{nn}}.

This is especially important as in some special cases a DLL’s entry
point name lacks a trailing @code{@@@emph{nn}} while the exported
name generated for a call has it.

It is also possible to import variables defined in a DLL by using an
import pragma for a variable. As an example, if a DLL contains a
variable defined as:

@quotation

@example
int my_var;
@end example
@end quotation

then, to access this variable from Ada you should write:

@quotation

@example
My_Var : Interfaces.C.int;
pragma Import (Stdcall, My_Var);
@end example
@end quotation

Note that to ease building cross-platform bindings this convention
will be handled as a @code{C} calling convention on non-Windows platforms.

@node Win32 Calling Convention,DLL Calling Convention,Stdcall Calling Convention,Windows Calling Conventions
@anchor{gnat_ugn/platform_specific_information id18}@anchor{1d7}@anchor{gnat_ugn/platform_specific_information win32-calling-convention}@anchor{1d8}
@subsubsection @code{Win32} Calling Convention


This convention, which is GNAT-specific is fully equivalent to the
@code{Stdcall} calling convention described above.

@node DLL Calling Convention,,Win32 Calling Convention,Windows Calling Conventions
@anchor{gnat_ugn/platform_specific_information dll-calling-convention}@anchor{1d9}@anchor{gnat_ugn/platform_specific_information id19}@anchor{1da}
@subsubsection @code{DLL} Calling Convention


This convention, which is GNAT-specific is fully equivalent to the
@code{Stdcall} calling convention described above.

@node Introduction to Dynamic Link Libraries DLLs,Using DLLs with GNAT,Windows Calling Conventions,Mixed-Language Programming on Windows
@anchor{gnat_ugn/platform_specific_information id20}@anchor{1db}@anchor{gnat_ugn/platform_specific_information introduction-to-dynamic-link-libraries-dlls}@anchor{1dc}
@subsubsection Introduction to Dynamic Link Libraries (DLLs)


@geindex DLL

A Dynamically Linked Library (DLL) is a library that can be shared by
several applications running under Windows. A DLL can contain any number of
routines and variables.

One advantage of DLLs is that you can change and enhance them without
forcing all the applications that depend on them to be relinked or
recompiled. However, you should be aware than all calls to DLL routines are
slower since, as you will understand below, such calls are indirect.

To illustrate the remainder of this section, suppose that an application
wants to use the services of a DLL @code{API.dll}. To use the services
provided by @code{API.dll} you must statically link against the DLL or
an import library which contains a jump table with an entry for each
routine and variable exported by the DLL. In the Microsoft world this
import library is called @code{API.lib}. When using GNAT this import
library is called either @code{libAPI.dll.a}, @code{libapi.dll.a},
@code{libAPI.a} or @code{libapi.a} (names are case insensitive).

After you have linked your application with the DLL or the import library
and you run your application, here is what happens:


@itemize *

@item 
Your application is loaded into memory.

@item 
The DLL @code{API.dll} is mapped into the address space of your
application. This means that:


@itemize -

@item 
The DLL will use the stack of the calling thread.

@item 
The DLL will use the virtual address space of the calling process.

@item 
The DLL will allocate memory from the virtual address space of the calling
process.

@item 
Handles (pointers) can be safely exchanged between routines in the DLL
routines and routines in the application using the DLL.
@end itemize

@item 
The entries in the jump table (from the import library @code{libAPI.dll.a}
or @code{API.lib} or automatically created when linking against a DLL)
which is part of your application are initialized with the addresses
of the routines and variables in @code{API.dll}.

@item 
If present in @code{API.dll}, routines @code{DllMain} or
@code{DllMainCRTStartup} are invoked. These routines typically contain
the initialization code needed for the well-being of the routines and
variables exported by the DLL.
@end itemize

There is an additional point which is worth mentioning. In the Windows
world there are two kind of DLLs: relocatable and non-relocatable
DLLs. Non-relocatable DLLs can only be loaded at a very specific address
in the target application address space. If the addresses of two
non-relocatable DLLs overlap and these happen to be used by the same
application, a conflict will occur and the application will run
incorrectly. Hence, when possible, it is always preferable to use and
build relocatable DLLs. Both relocatable and non-relocatable DLLs are
supported by GNAT. Note that the @code{-s} linker option (see GNU Linker
User’s Guide) removes the debugging symbols from the DLL but the DLL can
still be relocated.

As a side note, an interesting difference between Microsoft DLLs and
Unix shared libraries, is the fact that on most Unix systems all public
routines are exported by default in a Unix shared library, while under
Windows it is possible (but not required) to list exported routines in
a definition file (see @ref{1dd,,The Definition File}).

@node Using DLLs with GNAT,Building DLLs with GNAT Project files,Introduction to Dynamic Link Libraries DLLs,Mixed-Language Programming on Windows
@anchor{gnat_ugn/platform_specific_information id21}@anchor{1de}@anchor{gnat_ugn/platform_specific_information using-dlls-with-gnat}@anchor{1cf}
@subsubsection Using DLLs with GNAT


To use the services of a DLL, say @code{API.dll}, in your Ada application
you must have:


@itemize *

@item 
The Ada spec for the routines and/or variables you want to access in
@code{API.dll}. If not available this Ada spec must be built from the C/C++
header files provided with the DLL.

@item 
The import library (@code{libAPI.dll.a} or @code{API.lib}). As previously
mentioned an import library is a statically linked library containing the
import table which will be filled at load time to point to the actual
@code{API.dll} routines. Sometimes you don’t have an import library for the
DLL you want to use. The following sections will explain how to build
one. Note that this is optional.

@item 
The actual DLL, @code{API.dll}.
@end itemize

Once you have all the above, to compile an Ada application that uses the
services of @code{API.dll} and whose main subprogram is @code{My_Ada_App},
you simply issue the command

@quotation

@example
$ gnatmake my_ada_app -largs -lAPI
@end example
@end quotation

The argument @code{-largs -lAPI} at the end of the @code{gnatmake} command
tells the GNAT linker to look for an import library. The linker will
look for a library name in this specific order:


@itemize *

@item 
@code{libAPI.dll.a}

@item 
@code{API.dll.a}

@item 
@code{libAPI.a}

@item 
@code{API.lib}

@item 
@code{libAPI.dll}

@item 
@code{API.dll}
@end itemize

The first three are the GNU style import libraries. The third is the
Microsoft style import libraries. The last two are the actual DLL names.

Note that if the Ada package spec for @code{API.dll} contains the
following pragma

@quotation

@example
pragma Linker_Options ("-lAPI");
@end example
@end quotation

you do not have to add @code{-largs -lAPI} at the end of the
@code{gnatmake} command.

If any one of the items above is missing you will have to create it
yourself. The following sections explain how to do so using as an
example a fictitious DLL called @code{API.dll}.

@menu
* Creating an Ada Spec for the DLL Services:: 
* Creating an Import Library:: 

@end menu

@node Creating an Ada Spec for the DLL Services,Creating an Import Library,,Using DLLs with GNAT
@anchor{gnat_ugn/platform_specific_information creating-an-ada-spec-for-the-dll-services}@anchor{1df}@anchor{gnat_ugn/platform_specific_information id22}@anchor{1e0}
@subsubsection Creating an Ada Spec for the DLL Services


A DLL typically comes with a C/C++ header file which provides the
definitions of the routines and variables exported by the DLL. The Ada
equivalent of this header file is a package spec that contains definitions
for the imported entities. If the DLL you intend to use does not come with
an Ada spec you have to generate one such spec yourself. For example if
the header file of @code{API.dll} is a file @code{api.h} containing the
following two definitions:

@quotation

@example
int some_var;
int get (char *);
@end example
@end quotation

then the equivalent Ada spec could be:

@quotation

@example
with Interfaces.C.Strings;
package API is
   use Interfaces;

   Some_Var : C.int;
   function Get (Str : C.Strings.Chars_Ptr) return C.int;

private
   pragma Import (C, Get);
   pragma Import (DLL, Some_Var);
end API;
@end example
@end quotation

@node Creating an Import Library,,Creating an Ada Spec for the DLL Services,Using DLLs with GNAT
@anchor{gnat_ugn/platform_specific_information creating-an-import-library}@anchor{1e1}@anchor{gnat_ugn/platform_specific_information id23}@anchor{1e2}
@subsubsection Creating an Import Library


@geindex Import library

If a Microsoft-style import library @code{API.lib} or a GNAT-style
import library @code{libAPI.dll.a} or @code{libAPI.a} is available
with @code{API.dll} you can skip this section. You can also skip this
section if @code{API.dll} or @code{libAPI.dll} is built with GNU tools
as in this case it is possible to link directly against the
DLL. Otherwise read on.

@geindex Definition file
@anchor{gnat_ugn/platform_specific_information the-definition-file}@anchor{1dd}
@subsubheading The Definition File


As previously mentioned, and unlike Unix systems, the list of symbols
that are exported from a DLL must be provided explicitly in Windows.
The main goal of a definition file is precisely that: list the symbols
exported by a DLL. A definition file (usually a file with a @code{.def}
suffix) has the following structure:

@quotation

@example
[LIBRARY `@w{`}name`@w{`}]
[DESCRIPTION `@w{`}string`@w{`}]
EXPORTS
   `@w{`}symbol1`@w{`}
   `@w{`}symbol2`@w{`}
   ...
@end example
@end quotation


@table @asis

@item @emph{LIBRARY name}

This section, which is optional, gives the name of the DLL.

@item @emph{DESCRIPTION string}

This section, which is optional, gives a description string that will be
embedded in the import library.

@item @emph{EXPORTS}

This section gives the list of exported symbols (procedures, functions or
variables). For instance in the case of @code{API.dll} the @code{EXPORTS}
section of @code{API.def} looks like:

@example
EXPORTS
   some_var
   get
@end example
@end table

Note that you must specify the correct suffix (@code{@@@emph{nn}})
(see @ref{1d2,,Windows Calling Conventions}) for a Stdcall
calling convention function in the exported symbols list.

There can actually be other sections in a definition file, but these
sections are not relevant to the discussion at hand.
@anchor{gnat_ugn/platform_specific_information create-def-file-automatically}@anchor{1e3}
@subsubheading Creating a Definition File Automatically


You can automatically create the definition file @code{API.def}
(see @ref{1dd,,The Definition File}) from a DLL.
For that use the @code{dlltool} program as follows:

@quotation

@example
$ dlltool API.dll -z API.def --export-all-symbols
@end example

Note that if some routines in the DLL have the @code{Stdcall} convention
(@ref{1d2,,Windows Calling Conventions}) with stripped @code{@@@emph{nn}}
suffix then you’ll have to edit @code{api.def} to add it, and specify
@code{-k} to @code{gnatdll} when creating the import library.

Here are some hints to find the right @code{@@@emph{nn}} suffix.


@itemize -

@item 
If you have the Microsoft import library (.lib), it is possible to get
the right symbols by using Microsoft @code{dumpbin} tool (see the
corresponding Microsoft documentation for further details).

@example
$ dumpbin /exports api.lib
@end example

@item 
If you have a message about a missing symbol at link time the compiler
tells you what symbol is expected. You just have to go back to the
definition file and add the right suffix.
@end itemize
@end quotation
@anchor{gnat_ugn/platform_specific_information gnat-style-import-library}@anchor{1e4}
@subsubheading GNAT-Style Import Library


To create a static import library from @code{API.dll} with the GNAT tools
you should create the .def file, then use @code{gnatdll} tool
(see @ref{1e5,,Using gnatdll}) as follows:

@quotation

@example
$ gnatdll -e API.def -d API.dll
@end example

@code{gnatdll} takes as input a definition file @code{API.def} and the
name of the DLL containing the services listed in the definition file
@code{API.dll}. The name of the static import library generated is
computed from the name of the definition file as follows: if the
definition file name is @code{xyz.def}, the import library name will
be @code{libxyz.a}. Note that in the previous example option
@code{-e} could have been removed because the name of the definition
file (before the @code{.def} suffix) is the same as the name of the
DLL (@ref{1e5,,Using gnatdll} for more information about @code{gnatdll}).
@end quotation
@anchor{gnat_ugn/platform_specific_information msvs-style-import-library}@anchor{1e6}
@subsubheading Microsoft-Style Import Library


A Microsoft import library is needed only if you plan to make an
Ada DLL available to applications developed with Microsoft
tools (@ref{1ce,,Mixed-Language Programming on Windows}).

To create a Microsoft-style import library for @code{API.dll} you
should create the .def file, then build the actual import library using
Microsoft’s @code{lib} utility:

@quotation

@example
$ lib -machine:IX86 -def:API.def -out:API.lib
@end example

If you use the above command the definition file @code{API.def} must
contain a line giving the name of the DLL:

@example
LIBRARY      "API"
@end example

See the Microsoft documentation for further details about the usage of
@code{lib}.
@end quotation

@node Building DLLs with GNAT Project files,Building DLLs with GNAT,Using DLLs with GNAT,Mixed-Language Programming on Windows
@anchor{gnat_ugn/platform_specific_information building-dlls-with-gnat-project-files}@anchor{1d0}@anchor{gnat_ugn/platform_specific_information id24}@anchor{1e7}
@subsubsection Building DLLs with GNAT Project files


@geindex DLLs
@geindex building

There is nothing specific to Windows in the build process.
See the @emph{Library Projects} section in the @emph{GNAT Project Manager}
chapter of the @emph{GPRbuild User’s Guide}.

Due to a system limitation, it is not possible under Windows to create threads
when inside the @code{DllMain} routine which is used for auto-initialization
of shared libraries, so it is not possible to have library level tasks in SALs.

@node Building DLLs with GNAT,Building DLLs with gnatdll,Building DLLs with GNAT Project files,Mixed-Language Programming on Windows
@anchor{gnat_ugn/platform_specific_information building-dlls-with-gnat}@anchor{1e8}@anchor{gnat_ugn/platform_specific_information id25}@anchor{1e9}
@subsubsection Building DLLs with GNAT


@geindex DLLs
@geindex building

This section explain how to build DLLs using the GNAT built-in DLL
support. With the following procedure it is straight forward to build
and use DLLs with GNAT.


@itemize *

@item 
Building object files.
The first step is to build all objects files that are to be included
into the DLL. This is done by using the standard @code{gnatmake} tool.

@item 
Building the DLL.
To build the DLL you must use the @code{gcc} @code{-shared} and
@code{-shared-libgcc} options. It is quite simple to use this method:

@example
$ gcc -shared -shared-libgcc -o api.dll obj1.o obj2.o ...
@end example

It is important to note that in this case all symbols found in the
object files are automatically exported. It is possible to restrict
the set of symbols to export by passing to @code{gcc} a definition
file (see @ref{1dd,,The Definition File}).
For example:

@example
$ gcc -shared -shared-libgcc -o api.dll api.def obj1.o obj2.o ...
@end example

If you use a definition file you must export the elaboration procedures
for every package that required one. Elaboration procedures are named
using the package name followed by “_E”.

@item 
Preparing DLL to be used.
For the DLL to be used by client programs the bodies must be hidden
from it and the .ali set with read-only attribute. This is very important
otherwise GNAT will recompile all packages and will not actually use
the code in the DLL. For example:

@example
$ mkdir apilib
$ copy *.ads *.ali api.dll apilib
$ attrib +R apilib\\*.ali
@end example
@end itemize

At this point it is possible to use the DLL by directly linking
against it. Note that you must use the GNAT shared runtime when using
GNAT shared libraries. This is achieved by using the @code{-shared} binder
option.

@quotation

@example
$ gnatmake main -Iapilib -bargs -shared -largs -Lapilib -lAPI
@end example
@end quotation

@node Building DLLs with gnatdll,Ada DLLs and Finalization,Building DLLs with GNAT,Mixed-Language Programming on Windows
@anchor{gnat_ugn/platform_specific_information building-dlls-with-gnatdll}@anchor{1ea}@anchor{gnat_ugn/platform_specific_information id26}@anchor{1eb}
@subsubsection Building DLLs with gnatdll


@geindex DLLs
@geindex building

Note that it is preferred to use GNAT Project files
(@ref{1d0,,Building DLLs with GNAT Project files}) or the built-in GNAT
DLL support (@ref{1e8,,Building DLLs with GNAT}) or to build DLLs.

This section explains how to build DLLs containing Ada code using
@code{gnatdll}. These DLLs will be referred to as Ada DLLs in the
remainder of this section.

The steps required to build an Ada DLL that is to be used by Ada as well as
non-Ada applications are as follows:


@itemize *

@item 
You need to mark each Ada entity exported by the DLL with a @code{C} or
@code{Stdcall} calling convention to avoid any Ada name mangling for the
entities exported by the DLL
(see @ref{1ec,,Exporting Ada Entities}). You can
skip this step if you plan to use the Ada DLL only from Ada applications.

@item 
Your Ada code must export an initialization routine which calls the routine
@code{adainit} generated by @code{gnatbind} to perform the elaboration of
the Ada code in the DLL (@ref{1ed,,Ada DLLs and Elaboration}). The initialization
routine exported by the Ada DLL must be invoked by the clients of the DLL
to initialize the DLL.

@item 
When useful, the DLL should also export a finalization routine which calls
routine @code{adafinal} generated by @code{gnatbind} to perform the
finalization of the Ada code in the DLL (@ref{1ee,,Ada DLLs and Finalization}).
The finalization routine exported by the Ada DLL must be invoked by the
clients of the DLL when the DLL services are no further needed.

@item 
You must provide a spec for the services exported by the Ada DLL in each
of the programming languages to which you plan to make the DLL available.

@item 
You must provide a definition file listing the exported entities
(@ref{1dd,,The Definition File}).

@item 
Finally you must use @code{gnatdll} to produce the DLL and the import
library (@ref{1e5,,Using gnatdll}).
@end itemize

Note that a relocatable DLL stripped using the @code{strip}
binutils tool will not be relocatable anymore. To build a DLL without
debug information pass @code{-largs -s} to @code{gnatdll}. This
restriction does not apply to a DLL built using a Library Project.
See the @emph{Library Projects} section in the @emph{GNAT Project Manager}
chapter of the @emph{GPRbuild User’s Guide}.

@c Limitations_When_Using_Ada_DLLs_from Ada:

@menu
* Limitations When Using Ada DLLs from Ada:: 
* Exporting Ada Entities:: 
* Ada DLLs and Elaboration:: 

@end menu

@node Limitations When Using Ada DLLs from Ada,Exporting Ada Entities,,Building DLLs with gnatdll
@anchor{gnat_ugn/platform_specific_information limitations-when-using-ada-dlls-from-ada}@anchor{1ef}
@subsubsection Limitations When Using Ada DLLs from Ada


When using Ada DLLs from Ada applications there is a limitation users
should be aware of. Because on Windows the GNAT run-time is not in a DLL of
its own, each Ada DLL includes a part of the GNAT run-time. Specifically,
each Ada DLL includes the services of the GNAT run-time that are necessary
to the Ada code inside the DLL. As a result, when an Ada program uses an
Ada DLL there are two independent GNAT run-times: one in the Ada DLL and
one in the main program.

It is therefore not possible to exchange GNAT run-time objects between the
Ada DLL and the main Ada program. Example of GNAT run-time objects are file
handles (e.g., @code{Text_IO.File_Type}), tasks types, protected objects
types, etc.

It is completely safe to exchange plain elementary, array or record types,
Windows object handles, etc.

@node Exporting Ada Entities,Ada DLLs and Elaboration,Limitations When Using Ada DLLs from Ada,Building DLLs with gnatdll
@anchor{gnat_ugn/platform_specific_information exporting-ada-entities}@anchor{1ec}@anchor{gnat_ugn/platform_specific_information id27}@anchor{1f0}
@subsubsection Exporting Ada Entities


@geindex Export table

Building a DLL is a way to encapsulate a set of services usable from any
application. As a result, the Ada entities exported by a DLL should be
exported with the @code{C} or @code{Stdcall} calling conventions to avoid
any Ada name mangling. As an example here is an Ada package
@code{API}, spec and body, exporting two procedures, a function, and a
variable:

@quotation

@example
with Interfaces.C; use Interfaces;
package API is
   Count : C.int := 0;
   function Factorial (Val : C.int) return C.int;

   procedure Initialize_API;
   procedure Finalize_API;
   --  Initialization & Finalization routines. More in the next section.
private
   pragma Export (C, Initialize_API);
   pragma Export (C, Finalize_API);
   pragma Export (C, Count);
   pragma Export (C, Factorial);
end API;
@end example

@example
package body API is
   function Factorial (Val : C.int) return C.int is
      Fact : C.int := 1;
   begin
      Count := Count + 1;
      for K in 1 .. Val loop
         Fact := Fact * K;
      end loop;
      return Fact;
   end Factorial;

   procedure Initialize_API is
      procedure Adainit;
      pragma Import (C, Adainit);
   begin
      Adainit;
   end Initialize_API;

   procedure Finalize_API is
      procedure Adafinal;
      pragma Import (C, Adafinal);
   begin
      Adafinal;
   end Finalize_API;
end API;
@end example
@end quotation

If the Ada DLL you are building will only be used by Ada applications
you do not have to export Ada entities with a @code{C} or @code{Stdcall}
convention. As an example, the previous package could be written as
follows:

@quotation

@example
package API is
   Count : Integer := 0;
   function Factorial (Val : Integer) return Integer;

   procedure Initialize_API;
   procedure Finalize_API;
   --  Initialization and Finalization routines.
end API;
@end example

@example
package body API is
   function Factorial (Val : Integer) return Integer is
      Fact : Integer := 1;
   begin
      Count := Count + 1;
      for K in 1 .. Val loop
         Fact := Fact * K;
      end loop;
      return Fact;
   end Factorial;

   ...
   --  The remainder of this package body is unchanged.
end API;
@end example
@end quotation

Note that if you do not export the Ada entities with a @code{C} or
@code{Stdcall} convention you will have to provide the mangled Ada names
in the definition file of the Ada DLL
(@ref{1f1,,Creating the Definition File}).

@node Ada DLLs and Elaboration,,Exporting Ada Entities,Building DLLs with gnatdll
@anchor{gnat_ugn/platform_specific_information ada-dlls-and-elaboration}@anchor{1ed}@anchor{gnat_ugn/platform_specific_information id28}@anchor{1f2}
@subsubsection Ada DLLs and Elaboration


@geindex DLLs and elaboration

The DLL that you are building contains your Ada code as well as all the
routines in the Ada library that are needed by it. The first thing a
user of your DLL must do is elaborate the Ada code
(@ref{f,,Elaboration Order Handling in GNAT}).

To achieve this you must export an initialization routine
(@code{Initialize_API} in the previous example), which must be invoked
before using any of the DLL services. This elaboration routine must call
the Ada elaboration routine @code{adainit} generated by the GNAT binder
(@ref{a0,,Binding with Non-Ada Main Programs}). See the body of
@code{Initialize_Api} for an example. Note that the GNAT binder is
automatically invoked during the DLL build process by the @code{gnatdll}
tool (@ref{1e5,,Using gnatdll}).

When a DLL is loaded, Windows systematically invokes a routine called
@code{DllMain}. It would therefore be possible to call @code{adainit}
directly from @code{DllMain} without having to provide an explicit
initialization routine. Unfortunately, it is not possible to call
@code{adainit} from the @code{DllMain} if your program has library level
tasks because access to the @code{DllMain} entry point is serialized by
the system (that is, only a single thread can execute ‘through’ it at a
time), which means that the GNAT run-time will deadlock waiting for the
newly created task to complete its initialization.

@node Ada DLLs and Finalization,Creating a Spec for Ada DLLs,Building DLLs with gnatdll,Mixed-Language Programming on Windows
@anchor{gnat_ugn/platform_specific_information ada-dlls-and-finalization}@anchor{1ee}@anchor{gnat_ugn/platform_specific_information id29}@anchor{1f3}
@subsubsection Ada DLLs and Finalization


@geindex DLLs and finalization

When the services of an Ada DLL are no longer needed, the client code should
invoke the DLL finalization routine, if available. The DLL finalization
routine is in charge of releasing all resources acquired by the DLL. In the
case of the Ada code contained in the DLL, this is achieved by calling
routine @code{adafinal} generated by the GNAT binder
(@ref{a0,,Binding with Non-Ada Main Programs}).
See the body of @code{Finalize_Api} for an
example. As already pointed out the GNAT binder is automatically invoked
during the DLL build process by the @code{gnatdll} tool
(@ref{1e5,,Using gnatdll}).

@node Creating a Spec for Ada DLLs,GNAT and Windows Resources,Ada DLLs and Finalization,Mixed-Language Programming on Windows
@anchor{gnat_ugn/platform_specific_information creating-a-spec-for-ada-dlls}@anchor{1f4}@anchor{gnat_ugn/platform_specific_information id30}@anchor{1f5}
@subsubsection Creating a Spec for Ada DLLs


To use the services exported by the Ada DLL from another programming
language (e.g., C), you have to translate the specs of the exported Ada
entities in that language. For instance in the case of @code{API.dll},
the corresponding C header file could look like:

@quotation

@example
extern int *_imp__count;
#define count (*_imp__count)
int factorial (int);
@end example
@end quotation

It is important to understand that when building an Ada DLL to be used by
other Ada applications, you need two different specs for the packages
contained in the DLL: one for building the DLL and the other for using
the DLL. This is because the @code{DLL} calling convention is needed to
use a variable defined in a DLL, but when building the DLL, the variable
must have either the @code{Ada} or @code{C} calling convention. As an
example consider a DLL comprising the following package @code{API}:

@quotation

@example
package API is
   Count : Integer := 0;
   ...
   --  Remainder of the package omitted.
end API;
@end example
@end quotation

After producing a DLL containing package @code{API}, the spec that
must be used to import @code{API.Count} from Ada code outside of the
DLL is:

@quotation

@example
package API is
   Count : Integer;
   pragma Import (DLL, Count);
end API;
@end example
@end quotation

@menu
* Creating the Definition File:: 
* Using gnatdll:: 

@end menu

@node Creating the Definition File,Using gnatdll,,Creating a Spec for Ada DLLs
@anchor{gnat_ugn/platform_specific_information creating-the-definition-file}@anchor{1f1}@anchor{gnat_ugn/platform_specific_information id31}@anchor{1f6}
@subsubsection Creating the Definition File


The definition file is the last file needed to build the DLL. It lists
the exported symbols. As an example, the definition file for a DLL
containing only package @code{API} (where all the entities are exported
with a @code{C} calling convention) is:

@quotation

@example
EXPORTS
    count
    factorial
    finalize_api
    initialize_api
@end example
@end quotation

If the @code{C} calling convention is missing from package @code{API},
then the definition file contains the mangled Ada names of the above
entities, which in this case are:

@quotation

@example
EXPORTS
    api__count
    api__factorial
    api__finalize_api
    api__initialize_api
@end example
@end quotation

@node Using gnatdll,,Creating the Definition File,Creating a Spec for Ada DLLs
@anchor{gnat_ugn/platform_specific_information id32}@anchor{1f7}@anchor{gnat_ugn/platform_specific_information using-gnatdll}@anchor{1e5}
@subsubsection Using @code{gnatdll}


@geindex gnatdll

@code{gnatdll} is a tool to automate the DLL build process once all the Ada
and non-Ada sources that make up your DLL have been compiled.
@code{gnatdll} is actually in charge of two distinct tasks: build the
static import library for the DLL and the actual DLL. The form of the
@code{gnatdll} command is

@quotation

@example
$ gnatdll [ switches ] list-of-files [ -largs opts ]
@end example
@end quotation

where @code{list-of-files} is a list of ALI and object files. The object
file list must be the exact list of objects corresponding to the non-Ada
sources whose services are to be included in the DLL. The ALI file list
must be the exact list of ALI files for the corresponding Ada sources
whose services are to be included in the DLL. If @code{list-of-files} is
missing, only the static import library is generated.

You may specify any of the following switches to @code{gnatdll}:

@quotation

@geindex -a (gnatdll)
@end quotation


@table @asis

@item @code{-a[@emph{address}]}

Build a non-relocatable DLL at @code{address}. If @code{address} is not
specified the default address @code{0x11000000} will be used. By default,
when this switch is missing, @code{gnatdll} builds relocatable DLL. We
advise the reader to build relocatable DLL.

@geindex -b (gnatdll)

@item @code{-b @emph{address}}

Set the relocatable DLL base address. By default the address is
@code{0x11000000}.

@geindex -bargs (gnatdll)

@item @code{-bargs @emph{opts}}

Binder options. Pass @code{opts} to the binder.

@geindex -d (gnatdll)

@item @code{-d @emph{dllfile}}

@code{dllfile} is the name of the DLL. This switch must be present for
@code{gnatdll} to do anything. The name of the generated import library is
obtained algorithmically from @code{dllfile} as shown in the following
example: if @code{dllfile} is @code{xyz.dll}, the import library name is
@code{libxyz.dll.a}. The name of the definition file to use (if not specified
by option @code{-e}) is obtained algorithmically from @code{dllfile}
as shown in the following example:
if @code{dllfile} is @code{xyz.dll}, the definition
file used is @code{xyz.def}.

@geindex -e (gnatdll)

@item @code{-e @emph{deffile}}

@code{deffile} is the name of the definition file.

@geindex -g (gnatdll)

@item @code{-g}

Generate debugging information. This information is stored in the object
file and copied from there to the final DLL file by the linker,
where it can be read by the debugger. You must use the
@code{-g} switch if you plan on using the debugger or the symbolic
stack traceback.

@geindex -h (gnatdll)

@item @code{-h}

Help mode. Displays @code{gnatdll} switch usage information.

@geindex -I (gnatdll)

@item @code{-I@emph{dir}}

Direct @code{gnatdll} to search the @code{dir} directory for source and
object files needed to build the DLL.
(@ref{73,,Search Paths and the Run-Time Library (RTL)}).

@geindex -k (gnatdll)

@item @code{-k}

Removes the @code{@@@emph{nn}} suffix from the import library’s exported
names, but keeps them for the link names. You must specify this
option if you want to use a @code{Stdcall} function in a DLL for which
the @code{@@@emph{nn}} suffix has been removed. This is the case for most
of the Windows NT DLL for example. This option has no effect when
@code{-n} option is specified.

@geindex -l (gnatdll)

@item @code{-l @emph{file}}

The list of ALI and object files used to build the DLL are listed in
@code{file}, instead of being given in the command line. Each line in
@code{file} contains the name of an ALI or object file.

@geindex -n (gnatdll)

@item @code{-n}

No Import. Do not create the import library.

@geindex -q (gnatdll)

@item @code{-q}

Quiet mode. Do not display unnecessary messages.

@geindex -v (gnatdll)

@item @code{-v}

Verbose mode. Display extra information.

@geindex -largs (gnatdll)

@item @code{-largs @emph{opts}}

Linker options. Pass @code{opts} to the linker.
@end table

@subsubheading @code{gnatdll} Example


As an example the command to build a relocatable DLL from @code{api.adb}
once @code{api.adb} has been compiled and @code{api.def} created is

@quotation

@example
$ gnatdll -d api.dll api.ali
@end example
@end quotation

The above command creates two files: @code{libapi.dll.a} (the import
library) and @code{api.dll} (the actual DLL). If you want to create
only the DLL, just type:

@quotation

@example
$ gnatdll -d api.dll -n api.ali
@end example
@end quotation

Alternatively if you want to create just the import library, type:

@quotation

@example
$ gnatdll -d api.dll
@end example
@end quotation

@subsubheading @code{gnatdll} behind the Scenes


This section details the steps involved in creating a DLL. @code{gnatdll}
does these steps for you. Unless you are interested in understanding what
goes on behind the scenes, you should skip this section.

We use the previous example of a DLL containing the Ada package @code{API},
to illustrate the steps necessary to build a DLL. The starting point is a
set of objects that will make up the DLL and the corresponding ALI
files. In the case of this example this means that @code{api.o} and
@code{api.ali} are available. To build a relocatable DLL, @code{gnatdll} does
the following:


@itemize *

@item 
@code{gnatdll} builds the base file (@code{api.base}). A base file gives
the information necessary to generate relocation information for the
DLL.

@example
$ gnatbind -n api
$ gnatlink api -o api.jnk -mdll -Wl,--base-file,api.base
@end example

In addition to the base file, the @code{gnatlink} command generates an
output file @code{api.jnk} which can be discarded. The @code{-mdll} switch
asks @code{gnatlink} to generate the routines @code{DllMain} and
@code{DllMainCRTStartup} that are called by the Windows loader when the DLL
is loaded into memory.

@item 
@code{gnatdll} uses @code{dlltool} (see @ref{1f8,,Using dlltool}) to build the
export table (@code{api.exp}). The export table contains the relocation
information in a form which can be used during the final link to ensure
that the Windows loader is able to place the DLL anywhere in memory.

@example
$ dlltool --dllname api.dll --def api.def --base-file api.base \\
          --output-exp api.exp
@end example

@item 
@code{gnatdll} builds the base file using the new export table. Note that
@code{gnatbind} must be called once again since the binder generated file
has been deleted during the previous call to @code{gnatlink}.

@example
$ gnatbind -n api
$ gnatlink api -o api.jnk api.exp -mdll
      -Wl,--base-file,api.base
@end example

@item 
@code{gnatdll} builds the new export table using the new base file and
generates the DLL import library @code{libAPI.dll.a}.

@example
$ dlltool --dllname api.dll --def api.def --base-file api.base \\
          --output-exp api.exp --output-lib libAPI.a
@end example

@item 
Finally @code{gnatdll} builds the relocatable DLL using the final export
table.

@example
$ gnatbind -n api
$ gnatlink api api.exp -o api.dll -mdll
@end example
@end itemize
@anchor{gnat_ugn/platform_specific_information using-dlltool}@anchor{1f8}
@subsubheading Using @code{dlltool}


@code{dlltool} is the low-level tool used by @code{gnatdll} to build
DLLs and static import libraries. This section summarizes the most
common @code{dlltool} switches. The form of the @code{dlltool} command
is

@quotation

@example
$ dlltool [`switches`]
@end example
@end quotation

@code{dlltool} switches include:

@geindex --base-file (dlltool)


@table @asis

@item @code{--base-file @emph{basefile}}

Read the base file @code{basefile} generated by the linker. This switch
is used to create a relocatable DLL.
@end table

@geindex --def (dlltool)


@table @asis

@item @code{--def @emph{deffile}}

Read the definition file.
@end table

@geindex --dllname (dlltool)


@table @asis

@item @code{--dllname @emph{name}}

Gives the name of the DLL. This switch is used to embed the name of the
DLL in the static import library generated by @code{dlltool} with switch
@code{--output-lib}.
@end table

@geindex -k (dlltool)


@table @asis

@item @code{-k}

Kill @code{@@@emph{nn}} from exported names
(@ref{1d2,,Windows Calling Conventions}
for a discussion about @code{Stdcall}-style symbols.
@end table

@geindex --help (dlltool)


@table @asis

@item @code{--help}

Prints the @code{dlltool} switches with a concise description.
@end table

@geindex --output-exp (dlltool)


@table @asis

@item @code{--output-exp @emph{exportfile}}

Generate an export file @code{exportfile}. The export file contains the
export table (list of symbols in the DLL) and is used to create the DLL.
@end table

@geindex --output-lib (dlltool)


@table @asis

@item @code{--output-lib @emph{libfile}}

Generate a static import library @code{libfile}.
@end table

@geindex -v (dlltool)


@table @asis

@item @code{-v}

Verbose mode.
@end table

@geindex --as (dlltool)


@table @asis

@item @code{--as @emph{assembler-name}}

Use @code{assembler-name} as the assembler. The default is @code{as}.
@end table

@node GNAT and Windows Resources,Using GNAT DLLs from Microsoft Visual Studio Applications,Creating a Spec for Ada DLLs,Mixed-Language Programming on Windows
@anchor{gnat_ugn/platform_specific_information gnat-and-windows-resources}@anchor{1f9}@anchor{gnat_ugn/platform_specific_information id33}@anchor{1fa}
@subsubsection GNAT and Windows Resources


@geindex Resources
@geindex windows

Resources are an easy way to add Windows specific objects to your
application. The objects that can be added as resources include:


@itemize *

@item 
menus

@item 
accelerators

@item 
dialog boxes

@item 
string tables

@item 
bitmaps

@item 
cursors

@item 
icons

@item 
fonts

@item 
version information
@end itemize

For example, a version information resource can be defined as follow and
embedded into an executable or DLL:

A version information resource can be used to embed information into an
executable or a DLL. These information can be viewed using the file properties
from the Windows Explorer. Here is an example of a version information
resource:

@quotation

@example
1 VERSIONINFO
FILEVERSION     1,0,0,0
PRODUCTVERSION  1,0,0,0
BEGIN
  BLOCK "StringFileInfo"
  BEGIN
    BLOCK "080904E4"
    BEGIN
      VALUE "CompanyName", "My Company Name"
      VALUE "FileDescription", "My application"
      VALUE "FileVersion", "1.0"
      VALUE "InternalName", "my_app"
      VALUE "LegalCopyright", "My Name"
      VALUE "OriginalFilename", "my_app.exe"
      VALUE "ProductName", "My App"
      VALUE "ProductVersion", "1.0"
    END
  END

  BLOCK "VarFileInfo"
  BEGIN
    VALUE "Translation", 0x809, 1252
  END
END
@end example
@end quotation

The value @code{0809} (langID) is for the U.K English language and
@code{04E4} (charsetID), which is equal to @code{1252} decimal, for
multilingual.

This section explains how to build, compile and use resources. Note that this
section does not cover all resource objects, for a complete description see
the corresponding Microsoft documentation.

@menu
* Building Resources:: 
* Compiling Resources:: 
* Using Resources:: 

@end menu

@node Building Resources,Compiling Resources,,GNAT and Windows Resources
@anchor{gnat_ugn/platform_specific_information building-resources}@anchor{1fb}@anchor{gnat_ugn/platform_specific_information id34}@anchor{1fc}
@subsubsection Building Resources


@geindex Resources
@geindex building

A resource file is an ASCII file. By convention resource files have an
@code{.rc} extension.
The easiest way to build a resource file is to use Microsoft tools
such as @code{imagedit.exe} to build bitmaps, icons and cursors and
@code{dlgedit.exe} to build dialogs.
It is always possible to build an @code{.rc} file yourself by writing a
resource script.

It is not our objective to explain how to write a resource file. A
complete description of the resource script language can be found in the
Microsoft documentation.

@node Compiling Resources,Using Resources,Building Resources,GNAT and Windows Resources
@anchor{gnat_ugn/platform_specific_information compiling-resources}@anchor{1fd}@anchor{gnat_ugn/platform_specific_information id35}@anchor{1fe}
@subsubsection Compiling Resources


@geindex rc

@geindex windres

@geindex Resources
@geindex compiling

This section describes how to build a GNAT-compatible (COFF) object file
containing the resources. This is done using the Resource Compiler
@code{windres} as follows:

@quotation

@example
$ windres -i myres.rc -o myres.o
@end example
@end quotation

By default @code{windres} will run @code{gcc} to preprocess the @code{.rc}
file. You can specify an alternate preprocessor (usually named
@code{cpp.exe}) using the @code{windres} @code{--preprocessor}
parameter. A list of all possible options may be obtained by entering
the command @code{windres} @code{--help}.

It is also possible to use the Microsoft resource compiler @code{rc.exe}
to produce a @code{.res} file (binary resource file). See the
corresponding Microsoft documentation for further details. In this case
you need to use @code{windres} to translate the @code{.res} file to a
GNAT-compatible object file as follows:

@quotation

@example
$ windres -i myres.res -o myres.o
@end example
@end quotation

@node Using Resources,,Compiling Resources,GNAT and Windows Resources
@anchor{gnat_ugn/platform_specific_information id36}@anchor{1ff}@anchor{gnat_ugn/platform_specific_information using-resources}@anchor{200}
@subsubsection Using Resources


@geindex Resources
@geindex using

To include the resource file in your program just add the
GNAT-compatible object file for the resource(s) to the linker
arguments. With @code{gnatmake} this is done by using the @code{-largs}
option:

@quotation

@example
$ gnatmake myprog -largs myres.o
@end example
@end quotation

@node Using GNAT DLLs from Microsoft Visual Studio Applications,Debugging a DLL,GNAT and Windows Resources,Mixed-Language Programming on Windows
@anchor{gnat_ugn/platform_specific_information using-gnat-dll-from-msvs}@anchor{201}@anchor{gnat_ugn/platform_specific_information using-gnat-dlls-from-microsoft-visual-studio-applications}@anchor{202}
@subsubsection Using GNAT DLLs from Microsoft Visual Studio Applications


@geindex Microsoft Visual Studio
@geindex use with GNAT DLLs

This section describes a common case of mixed GNAT/Microsoft Visual Studio
application development, where the main program is developed using MSVS, and
is linked with a DLL developed using GNAT. Such a mixed application should
be developed following the general guidelines outlined above; below is the
cookbook-style sequence of steps to follow:


@enumerate 

@item 
First develop and build the GNAT shared library using a library project
(let’s assume the project is @code{mylib.gpr}, producing the library @code{libmylib.dll}):
@end enumerate

@quotation

@example
$ gprbuild -p mylib.gpr
@end example
@end quotation


@enumerate 2

@item 
Produce a .def file for the symbols you need to interface with, either by
hand or automatically with possibly some manual adjustments
(see @ref{1e3,,Creating Definition File Automatically}):
@end enumerate

@quotation

@example
$ dlltool libmylib.dll -z libmylib.def --export-all-symbols
@end example
@end quotation


@enumerate 3

@item 
Make sure that MSVS command-line tools are accessible on the path.

@item 
Create the Microsoft-style import library (see @ref{1e6,,MSVS-Style Import Library}):
@end enumerate

@quotation

@example
$ lib -machine:IX86 -def:libmylib.def -out:libmylib.lib
@end example
@end quotation

If you are using a 64-bit toolchain, the above becomes…

@quotation

@example
$ lib -machine:X64 -def:libmylib.def -out:libmylib.lib
@end example
@end quotation


@enumerate 5

@item 
Build the C main
@end enumerate

@quotation

@example
$ cl /O2 /MD main.c libmylib.lib
@end example
@end quotation


@enumerate 6

@item 
Before running the executable, make sure you have set the PATH to the DLL,
or copy the DLL into into the directory containing the .exe.
@end enumerate

@node Debugging a DLL,Setting Stack Size from gnatlink,Using GNAT DLLs from Microsoft Visual Studio Applications,Mixed-Language Programming on Windows
@anchor{gnat_ugn/platform_specific_information debugging-a-dll}@anchor{203}@anchor{gnat_ugn/platform_specific_information id37}@anchor{204}
@subsubsection Debugging a DLL


@geindex DLL debugging

Debugging a DLL is similar to debugging a standard program. But
we have to deal with two different executable parts: the DLL and the
program that uses it. We have the following four possibilities:


@itemize *

@item 
The program and the DLL are built with GCC/GNAT.

@item 
The program is built with foreign tools and the DLL is built with
GCC/GNAT.

@item 
The program is built with GCC/GNAT and the DLL is built with
foreign tools.
@end itemize

In this section we address only cases one and two above.
There is no point in trying to debug
a DLL with GNU/GDB, if there is no GDB-compatible debugging
information in it. To do so you must use a debugger compatible with the
tools suite used to build the DLL.

@menu
* Program and DLL Both Built with GCC/GNAT:: 
* Program Built with Foreign Tools and DLL Built with GCC/GNAT:: 

@end menu

@node Program and DLL Both Built with GCC/GNAT,Program Built with Foreign Tools and DLL Built with GCC/GNAT,,Debugging a DLL
@anchor{gnat_ugn/platform_specific_information id38}@anchor{205}@anchor{gnat_ugn/platform_specific_information program-and-dll-both-built-with-gcc-gnat}@anchor{206}
@subsubsection Program and DLL Both Built with GCC/GNAT


This is the simplest case. Both the DLL and the program have @code{GDB}
compatible debugging information. It is then possible to break anywhere in
the process. Let’s suppose here that the main procedure is named
@code{ada_main} and that in the DLL there is an entry point named
@code{ada_dll}.

The DLL (@ref{1dc,,Introduction to Dynamic Link Libraries (DLLs)}) and
program must have been built with the debugging information (see GNAT -g
switch). Here are the step-by-step instructions for debugging it:


@itemize *

@item 
Launch @code{GDB} on the main program.

@example
$ gdb -nw ada_main
@end example

@item 
Start the program and stop at the beginning of the main procedure

@example
(gdb) start
@end example

This step is required to be able to set a breakpoint inside the DLL. As long
as the program is not run, the DLL is not loaded. This has the
consequence that the DLL debugging information is also not loaded, so it is not
possible to set a breakpoint in the DLL.

@item 
Set a breakpoint inside the DLL

@example
(gdb) break ada_dll
(gdb) cont
@end example
@end itemize

At this stage a breakpoint is set inside the DLL. From there on
you can use the standard approach to debug the whole program
(@ref{14d,,Running and Debugging Ada Programs}).

@node Program Built with Foreign Tools and DLL Built with GCC/GNAT,,Program and DLL Both Built with GCC/GNAT,Debugging a DLL
@anchor{gnat_ugn/platform_specific_information id39}@anchor{207}@anchor{gnat_ugn/platform_specific_information program-built-with-foreign-tools-and-dll-built-with-gcc-gnat}@anchor{208}
@subsubsection Program Built with Foreign Tools and DLL Built with GCC/GNAT


In this case things are slightly more complex because it is not possible to
start the main program and then break at the beginning to load the DLL and the
associated DLL debugging information. It is not possible to break at the
beginning of the program because there is no @code{GDB} debugging information,
and therefore there is no direct way of getting initial control. This
section addresses this issue by describing some methods that can be used
to break somewhere in the DLL to debug it.

First suppose that the main procedure is named @code{main} (this is for
example some C code built with Microsoft Visual C) and that there is a
DLL named @code{test.dll} containing an Ada entry point named
@code{ada_dll}.

The DLL (see @ref{1dc,,Introduction to Dynamic Link Libraries (DLLs)}) must have
been built with debugging information (see the GNAT @code{-g} option).

@subsubheading Debugging the DLL Directly



@itemize *

@item 
Find out the executable starting address

@example
$ objdump --file-header main.exe
@end example

The starting address is reported on the last line. For example:

@example
main.exe:     file format pei-i386
architecture: i386, flags 0x0000010a:
EXEC_P, HAS_DEBUG, D_PAGED
start address 0x00401010
@end example

@item 
Launch the debugger on the executable.

@example
$ gdb main.exe
@end example

@item 
Set a breakpoint at the starting address, and launch the program.

@example
$ (gdb) break *0x00401010
$ (gdb) run
@end example

The program will stop at the given address.

@item 
Set a breakpoint on a DLL subroutine.

@example
(gdb) break ada_dll.adb:45
@end example

Or if you want to break using a symbol on the DLL, you need first to
select the Ada language (language used by the DLL).

@example
(gdb) set language ada
(gdb) break ada_dll
@end example

@item 
Continue the program.

@example
(gdb) cont
@end example

This will run the program until it reaches the breakpoint that has been
set. From that point you can use the standard way to debug a program
as described in (@ref{14d,,Running and Debugging Ada Programs}).
@end itemize

It is also possible to debug the DLL by attaching to a running process.

@subsubheading Attaching to a Running Process


@geindex DLL debugging
@geindex attach to process

With @code{GDB} it is always possible to debug a running process by
attaching to it. It is possible to debug a DLL this way. The limitation
of this approach is that the DLL must run long enough to perform the
attach operation. It may be useful for instance to insert a time wasting
loop in the code of the DLL to meet this criterion.


@itemize *

@item 
Launch the main program @code{main.exe}.

@example
$ main
@end example

@item 
Use the Windows @emph{Task Manager} to find the process ID. Let’s say
that the process PID for @code{main.exe} is 208.

@item 
Launch gdb.

@example
$ gdb
@end example

@item 
Attach to the running process to be debugged.

@example
(gdb) attach 208
@end example

@item 
Load the process debugging information.

@example
(gdb) symbol-file main.exe
@end example

@item 
Break somewhere in the DLL.

@example
(gdb) break ada_dll
@end example

@item 
Continue process execution.

@example
(gdb) cont
@end example
@end itemize

This last step will resume the process execution, and stop at
the breakpoint we have set. From there you can use the standard
approach to debug a program as described in
@ref{14d,,Running and Debugging Ada Programs}.

@node Setting Stack Size from gnatlink,Setting Heap Size from gnatlink,Debugging a DLL,Mixed-Language Programming on Windows
@anchor{gnat_ugn/platform_specific_information id40}@anchor{209}@anchor{gnat_ugn/platform_specific_information setting-stack-size-from-gnatlink}@anchor{127}
@subsubsection Setting Stack Size from @code{gnatlink}


It is possible to specify the program stack size at link time. On modern
versions of Windows, starting with XP, this is mostly useful to set the size of
the main stack (environment task). The other task stacks are set with pragma
Storage_Size or with the @emph{gnatbind -d} command.

Since older versions of Windows (2000, NT4, etc.) do not allow setting the
reserve size of individual tasks, the link-time stack size applies to all
tasks, and pragma Storage_Size has no effect.
In particular, Stack Overflow checks are made against this
link-time specified size.

This setting can be done with @code{gnatlink} using either of the following:


@itemize *

@item 
@code{-Xlinker} linker option

@example
$ gnatlink hello -Xlinker --stack=0x10000,0x1000
@end example

This sets the stack reserve size to 0x10000 bytes and the stack commit
size to 0x1000 bytes.

@item 
@code{-Wl} linker option

@example
$ gnatlink hello -Wl,--stack=0x1000000
@end example

This sets the stack reserve size to 0x1000000 bytes. Note that with
@code{-Wl} option it is not possible to set the stack commit size
because the comma is a separator for this option.
@end itemize

@node Setting Heap Size from gnatlink,,Setting Stack Size from gnatlink,Mixed-Language Programming on Windows
@anchor{gnat_ugn/platform_specific_information id41}@anchor{20a}@anchor{gnat_ugn/platform_specific_information setting-heap-size-from-gnatlink}@anchor{128}
@subsubsection Setting Heap Size from @code{gnatlink}


Under Windows systems, it is possible to specify the program heap size from
@code{gnatlink} using either of the following:


@itemize *

@item 
@code{-Xlinker} linker option

@example
$ gnatlink hello -Xlinker --heap=0x10000,0x1000
@end example

This sets the heap reserve size to 0x10000 bytes and the heap commit
size to 0x1000 bytes.

@item 
@code{-Wl} linker option

@example
$ gnatlink hello -Wl,--heap=0x1000000
@end example

This sets the heap reserve size to 0x1000000 bytes. Note that with
@code{-Wl} option it is not possible to set the heap commit size
because the comma is a separator for this option.
@end itemize

@node Windows Specific Add-Ons,,Mixed-Language Programming on Windows,Microsoft Windows Topics
@anchor{gnat_ugn/platform_specific_information win32-specific-addons}@anchor{20b}@anchor{gnat_ugn/platform_specific_information windows-specific-add-ons}@anchor{20c}
@subsection Windows Specific Add-Ons


This section describes the Windows specific add-ons.

@menu
* Win32Ada:: 
* wPOSIX:: 

@end menu

@node Win32Ada,wPOSIX,,Windows Specific Add-Ons
@anchor{gnat_ugn/platform_specific_information id42}@anchor{20d}@anchor{gnat_ugn/platform_specific_information win32ada}@anchor{20e}
@subsubsection Win32Ada


Win32Ada is a binding for the Microsoft Win32 API. This binding can be
easily installed from the provided installer. To use the Win32Ada
binding you need to use a project file, and adding a single with_clause
will give you full access to the Win32Ada binding sources and ensure
that the proper libraries are passed to the linker.

@quotation

@example
with "win32ada";
project P is
   for Sources use ...;
end P;
@end example
@end quotation

To build the application you just need to call gprbuild for the
application’s project, here p.gpr:

@quotation

@example
gprbuild p.gpr
@end example
@end quotation

@node wPOSIX,,Win32Ada,Windows Specific Add-Ons
@anchor{gnat_ugn/platform_specific_information id43}@anchor{20f}@anchor{gnat_ugn/platform_specific_information wposix}@anchor{210}
@subsubsection wPOSIX


wPOSIX is a minimal POSIX binding whose goal is to help with building
cross-platforms applications. This binding is not complete though, as
the Win32 API does not provide the necessary support for all POSIX APIs.

To use the wPOSIX binding you need to use a project file, and adding
a single with_clause will give you full access to the wPOSIX binding
sources and ensure that the proper libraries are passed to the linker.

@quotation

@example
with "wposix";
project P is
   for Sources use ...;
end P;
@end example
@end quotation

To build the application you just need to call gprbuild for the
application’s project, here p.gpr:

@quotation

@example
gprbuild p.gpr
@end example
@end quotation

@node Mac OS Topics,,Microsoft Windows Topics,Platform-Specific Information
@anchor{gnat_ugn/platform_specific_information id44}@anchor{211}@anchor{gnat_ugn/platform_specific_information mac-os-topics}@anchor{212}
@section Mac OS Topics


@geindex OS X

This section describes topics that are specific to Apple’s OS X
platform.

@menu
* Codesigning the Debugger:: 

@end menu

@node Codesigning the Debugger,,,Mac OS Topics
@anchor{gnat_ugn/platform_specific_information codesigning-the-debugger}@anchor{213}
@subsection Codesigning the Debugger


The Darwin Kernel requires the debugger to have special permissions
before it is allowed to control other processes. These permissions
are granted by codesigning the GDB executable. Without these
permissions, the debugger will report error messages such as:

@example
Starting program: /x/y/foo
Unable to find Mach task port for process-id 28885: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))
@end example

Codesigning requires a certificate.  The following procedure explains
how to create one:


@itemize *

@item 
Start the Keychain Access application (in
/Applications/Utilities/Keychain Access.app)

@item 
Select the Keychain Access -> Certificate Assistant ->
Create a Certificate… menu

@item 
Then:


@itemize *

@item 
Choose a name for the new certificate (this procedure will use
“gdb-cert” as an example)

@item 
Set “Identity Type” to “Self Signed Root”

@item 
Set “Certificate Type” to “Code Signing”

@item 
Activate the “Let me override defaults” option
@end itemize

@item 
Click several times on “Continue” until the “Specify a Location
For The Certificate” screen appears, then set “Keychain” to “System”

@item 
Click on “Continue” until the certificate is created

@item 
Finally, in the view, double-click on the new certificate,
and set “When using this certificate” to “Always Trust”

@item 
Exit the Keychain Access application and restart the computer
(this is unfortunately required)
@end itemize

Once a certificate has been created, the debugger can be codesigned
as follow. In a Terminal, run the following command:

@quotation

@example
$ codesign -f -s  "gdb-cert"  <gnat_install_prefix>/bin/gdb
@end example
@end quotation

where “gdb-cert” should be replaced by the actual certificate
name chosen above, and <gnat_install_prefix> should be replaced by
the location where you installed GNAT.  Also, be sure that users are
in the Unix group @code{_developer}.

@node Example of Binder Output File,Elaboration Order Handling in GNAT,Platform-Specific Information,Top
@anchor{gnat_ugn/example_of_binder_output doc}@anchor{214}@anchor{gnat_ugn/example_of_binder_output example-of-binder-output-file}@anchor{e}@anchor{gnat_ugn/example_of_binder_output id1}@anchor{215}
@chapter Example of Binder Output File


@geindex Binder output (example)

This Appendix displays the source code for the output file
generated by @emph{gnatbind} for a simple ‘Hello World’ program.
Comments have been added for clarification purposes.

@example
--  The package is called Ada_Main unless this name is actually used
--  as a unit name in the partition, in which case some other unique
--  name is used.

pragma Ada_95;
with System;
package ada_main is
   pragma Warnings (Off);

   --  The main program saves the parameters (argument count,
   --  argument values, environment pointer) in global variables
   --  for later access by other units including
   --  Ada.Command_Line.

   gnat_argc : Integer;
   gnat_argv : System.Address;
   gnat_envp : System.Address;

   --  The actual variables are stored in a library routine. This
   --  is useful for some shared library situations, where there
   --  are problems if variables are not in the library.

   pragma Import (C, gnat_argc);
   pragma Import (C, gnat_argv);
   pragma Import (C, gnat_envp);

   --  The exit status is similarly an external location

   gnat_exit_status : Integer;
   pragma Import (C, gnat_exit_status);

   GNAT_Version : constant String :=
                    "GNAT Version: Pro 7.4.0w (20141119-49)" & ASCII.NUL;
   pragma Export (C, GNAT_Version, "__gnat_version");

   Ada_Main_Program_Name : constant String := "_ada_hello" & ASCII.NUL;
   pragma Export (C, Ada_Main_Program_Name, "__gnat_ada_main_program_name");

   --  This is the generated adainit routine that performs
   --  initialization at the start of execution. In the case
   --  where Ada is the main program, this main program makes
   --  a call to adainit at program startup.

   procedure adainit;
   pragma Export (C, adainit, "adainit");

   --  This is the generated adafinal routine that performs
   --  finalization at the end of execution. In the case where
   --  Ada is the main program, this main program makes a call
   --  to adafinal at program termination.

   procedure adafinal;
   pragma Export (C, adafinal, "adafinal");

   --  This routine is called at the start of execution. It is
   --  a dummy routine that is used by the debugger to breakpoint
   --  at the start of execution.

   --  This is the actual generated main program (it would be
   --  suppressed if the no main program switch were used). As
   --  required by standard system conventions, this program has
   --  the external name main.

   function main
     (argc : Integer;
      argv : System.Address;
      envp : System.Address)
      return Integer;
   pragma Export (C, main, "main");

   --  The following set of constants give the version
   --  identification values for every unit in the bound
   --  partition. This identification is computed from all
   --  dependent semantic units, and corresponds to the
   --  string that would be returned by use of the
   --  Body_Version or Version attributes.

   --  The following Export pragmas export the version numbers
   --  with symbolic names ending in B (for body) or S
   --  (for spec) so that they can be located in a link. The
   --  information provided here is sufficient to track down
   --  the exact versions of units used in a given build.

   type Version_32 is mod 2 ** 32;
   u00001 : constant Version_32 := 16#8ad6e54a#;
   pragma Export (C, u00001, "helloB");
   u00002 : constant Version_32 := 16#fbff4c67#;
   pragma Export (C, u00002, "system__standard_libraryB");
   u00003 : constant Version_32 := 16#1ec6fd90#;
   pragma Export (C, u00003, "system__standard_libraryS");
   u00004 : constant Version_32 := 16#3ffc8e18#;
   pragma Export (C, u00004, "adaS");
   u00005 : constant Version_32 := 16#28f088c2#;
   pragma Export (C, u00005, "ada__text_ioB");
   u00006 : constant Version_32 := 16#f372c8ac#;
   pragma Export (C, u00006, "ada__text_ioS");
   u00007 : constant Version_32 := 16#2c143749#;
   pragma Export (C, u00007, "ada__exceptionsB");
   u00008 : constant Version_32 := 16#f4f0cce8#;
   pragma Export (C, u00008, "ada__exceptionsS");
   u00009 : constant Version_32 := 16#a46739c0#;
   pragma Export (C, u00009, "ada__exceptions__last_chance_handlerB");
   u00010 : constant Version_32 := 16#3aac8c92#;
   pragma Export (C, u00010, "ada__exceptions__last_chance_handlerS");
   u00011 : constant Version_32 := 16#1d274481#;
   pragma Export (C, u00011, "systemS");
   u00012 : constant Version_32 := 16#a207fefe#;
   pragma Export (C, u00012, "system__soft_linksB");
   u00013 : constant Version_32 := 16#467d9556#;
   pragma Export (C, u00013, "system__soft_linksS");
   u00014 : constant Version_32 := 16#b01dad17#;
   pragma Export (C, u00014, "system__parametersB");
   u00015 : constant Version_32 := 16#630d49fe#;
   pragma Export (C, u00015, "system__parametersS");
   u00016 : constant Version_32 := 16#b19b6653#;
   pragma Export (C, u00016, "system__secondary_stackB");
   u00017 : constant Version_32 := 16#b6468be8#;
   pragma Export (C, u00017, "system__secondary_stackS");
   u00018 : constant Version_32 := 16#39a03df9#;
   pragma Export (C, u00018, "system__storage_elementsB");
   u00019 : constant Version_32 := 16#30e40e85#;
   pragma Export (C, u00019, "system__storage_elementsS");
   u00020 : constant Version_32 := 16#41837d1e#;
   pragma Export (C, u00020, "system__stack_checkingB");
   u00021 : constant Version_32 := 16#93982f69#;
   pragma Export (C, u00021, "system__stack_checkingS");
   u00022 : constant Version_32 := 16#393398c1#;
   pragma Export (C, u00022, "system__exception_tableB");
   u00023 : constant Version_32 := 16#b33e2294#;
   pragma Export (C, u00023, "system__exception_tableS");
   u00024 : constant Version_32 := 16#ce4af020#;
   pragma Export (C, u00024, "system__exceptionsB");
   u00025 : constant Version_32 := 16#75442977#;
   pragma Export (C, u00025, "system__exceptionsS");
   u00026 : constant Version_32 := 16#37d758f1#;
   pragma Export (C, u00026, "system__exceptions__machineS");
   u00027 : constant Version_32 := 16#b895431d#;
   pragma Export (C, u00027, "system__exceptions_debugB");
   u00028 : constant Version_32 := 16#aec55d3f#;
   pragma Export (C, u00028, "system__exceptions_debugS");
   u00029 : constant Version_32 := 16#570325c8#;
   pragma Export (C, u00029, "system__img_intB");
   u00030 : constant Version_32 := 16#1ffca443#;
   pragma Export (C, u00030, "system__img_intS");
   u00031 : constant Version_32 := 16#b98c3e16#;
   pragma Export (C, u00031, "system__tracebackB");
   u00032 : constant Version_32 := 16#831a9d5a#;
   pragma Export (C, u00032, "system__tracebackS");
   u00033 : constant Version_32 := 16#9ed49525#;
   pragma Export (C, u00033, "system__traceback_entriesB");
   u00034 : constant Version_32 := 16#1d7cb2f1#;
   pragma Export (C, u00034, "system__traceback_entriesS");
   u00035 : constant Version_32 := 16#8c33a517#;
   pragma Export (C, u00035, "system__wch_conB");
   u00036 : constant Version_32 := 16#065a6653#;
   pragma Export (C, u00036, "system__wch_conS");
   u00037 : constant Version_32 := 16#9721e840#;
   pragma Export (C, u00037, "system__wch_stwB");
   u00038 : constant Version_32 := 16#2b4b4a52#;
   pragma Export (C, u00038, "system__wch_stwS");
   u00039 : constant Version_32 := 16#92b797cb#;
   pragma Export (C, u00039, "system__wch_cnvB");
   u00040 : constant Version_32 := 16#09eddca0#;
   pragma Export (C, u00040, "system__wch_cnvS");
   u00041 : constant Version_32 := 16#6033a23f#;
   pragma Export (C, u00041, "interfacesS");
   u00042 : constant Version_32 := 16#ece6fdb6#;
   pragma Export (C, u00042, "system__wch_jisB");
   u00043 : constant Version_32 := 16#899dc581#;
   pragma Export (C, u00043, "system__wch_jisS");
   u00044 : constant Version_32 := 16#10558b11#;
   pragma Export (C, u00044, "ada__streamsB");
   u00045 : constant Version_32 := 16#2e6701ab#;
   pragma Export (C, u00045, "ada__streamsS");
   u00046 : constant Version_32 := 16#db5c917c#;
   pragma Export (C, u00046, "ada__io_exceptionsS");
   u00047 : constant Version_32 := 16#12c8cd7d#;
   pragma Export (C, u00047, "ada__tagsB");
   u00048 : constant Version_32 := 16#ce72c228#;
   pragma Export (C, u00048, "ada__tagsS");
   u00049 : constant Version_32 := 16#c3335bfd#;
   pragma Export (C, u00049, "system__htableB");
   u00050 : constant Version_32 := 16#99e5f76b#;
   pragma Export (C, u00050, "system__htableS");
   u00051 : constant Version_32 := 16#089f5cd0#;
   pragma Export (C, u00051, "system__string_hashB");
   u00052 : constant Version_32 := 16#3bbb9c15#;
   pragma Export (C, u00052, "system__string_hashS");
   u00053 : constant Version_32 := 16#807fe041#;
   pragma Export (C, u00053, "system__unsigned_typesS");
   u00054 : constant Version_32 := 16#d27be59e#;
   pragma Export (C, u00054, "system__val_lluB");
   u00055 : constant Version_32 := 16#fa8db733#;
   pragma Export (C, u00055, "system__val_lluS");
   u00056 : constant Version_32 := 16#27b600b2#;
   pragma Export (C, u00056, "system__val_utilB");
   u00057 : constant Version_32 := 16#b187f27f#;
   pragma Export (C, u00057, "system__val_utilS");
   u00058 : constant Version_32 := 16#d1060688#;
   pragma Export (C, u00058, "system__case_utilB");
   u00059 : constant Version_32 := 16#392e2d56#;
   pragma Export (C, u00059, "system__case_utilS");
   u00060 : constant Version_32 := 16#84a27f0d#;
   pragma Export (C, u00060, "interfaces__c_streamsB");
   u00061 : constant Version_32 := 16#8bb5f2c0#;
   pragma Export (C, u00061, "interfaces__c_streamsS");
   u00062 : constant Version_32 := 16#6db6928f#;
   pragma Export (C, u00062, "system__crtlS");
   u00063 : constant Version_32 := 16#4e6a342b#;
   pragma Export (C, u00063, "system__file_ioB");
   u00064 : constant Version_32 := 16#ba56a5e4#;
   pragma Export (C, u00064, "system__file_ioS");
   u00065 : constant Version_32 := 16#b7ab275c#;
   pragma Export (C, u00065, "ada__finalizationB");
   u00066 : constant Version_32 := 16#19f764ca#;
   pragma Export (C, u00066, "ada__finalizationS");
   u00067 : constant Version_32 := 16#95817ed8#;
   pragma Export (C, u00067, "system__finalization_rootB");
   u00068 : constant Version_32 := 16#52d53711#;
   pragma Export (C, u00068, "system__finalization_rootS");
   u00069 : constant Version_32 := 16#769e25e6#;
   pragma Export (C, u00069, "interfaces__cB");
   u00070 : constant Version_32 := 16#4a38bedb#;
   pragma Export (C, u00070, "interfaces__cS");
   u00071 : constant Version_32 := 16#07e6ee66#;
   pragma Export (C, u00071, "system__os_libB");
   u00072 : constant Version_32 := 16#d7b69782#;
   pragma Export (C, u00072, "system__os_libS");
   u00073 : constant Version_32 := 16#1a817b8e#;
   pragma Export (C, u00073, "system__stringsB");
   u00074 : constant Version_32 := 16#639855e7#;
   pragma Export (C, u00074, "system__stringsS");
   u00075 : constant Version_32 := 16#e0b8de29#;
   pragma Export (C, u00075, "system__file_control_blockS");
   u00076 : constant Version_32 := 16#b5b2aca1#;
   pragma Export (C, u00076, "system__finalization_mastersB");
   u00077 : constant Version_32 := 16#69316dc1#;
   pragma Export (C, u00077, "system__finalization_mastersS");
   u00078 : constant Version_32 := 16#57a37a42#;
   pragma Export (C, u00078, "system__address_imageB");
   u00079 : constant Version_32 := 16#bccbd9bb#;
   pragma Export (C, u00079, "system__address_imageS");
   u00080 : constant Version_32 := 16#7268f812#;
   pragma Export (C, u00080, "system__img_boolB");
   u00081 : constant Version_32 := 16#e8fe356a#;
   pragma Export (C, u00081, "system__img_boolS");
   u00082 : constant Version_32 := 16#d7aac20c#;
   pragma Export (C, u00082, "system__ioB");
   u00083 : constant Version_32 := 16#8365b3ce#;
   pragma Export (C, u00083, "system__ioS");
   u00084 : constant Version_32 := 16#6d4d969a#;
   pragma Export (C, u00084, "system__storage_poolsB");
   u00085 : constant Version_32 := 16#e87cc305#;
   pragma Export (C, u00085, "system__storage_poolsS");
   u00086 : constant Version_32 := 16#e34550ca#;
   pragma Export (C, u00086, "system__pool_globalB");
   u00087 : constant Version_32 := 16#c88d2d16#;
   pragma Export (C, u00087, "system__pool_globalS");
   u00088 : constant Version_32 := 16#9d39c675#;
   pragma Export (C, u00088, "system__memoryB");
   u00089 : constant Version_32 := 16#445a22b5#;
   pragma Export (C, u00089, "system__memoryS");
   u00090 : constant Version_32 := 16#6a859064#;
   pragma Export (C, u00090, "system__storage_pools__subpoolsB");
   u00091 : constant Version_32 := 16#e3b008dc#;
   pragma Export (C, u00091, "system__storage_pools__subpoolsS");
   u00092 : constant Version_32 := 16#63f11652#;
   pragma Export (C, u00092, "system__storage_pools__subpools__finalizationB");
   u00093 : constant Version_32 := 16#fe2f4b3a#;
   pragma Export (C, u00093, "system__storage_pools__subpools__finalizationS");

   --  BEGIN ELABORATION ORDER
   --  ada%s
   --  interfaces%s
   --  system%s
   --  system.case_util%s
   --  system.case_util%b
   --  system.htable%s
   --  system.img_bool%s
   --  system.img_bool%b
   --  system.img_int%s
   --  system.img_int%b
   --  system.io%s
   --  system.io%b
   --  system.parameters%s
   --  system.parameters%b
   --  system.crtl%s
   --  interfaces.c_streams%s
   --  interfaces.c_streams%b
   --  system.standard_library%s
   --  system.exceptions_debug%s
   --  system.exceptions_debug%b
   --  system.storage_elements%s
   --  system.storage_elements%b
   --  system.stack_checking%s
   --  system.stack_checking%b
   --  system.string_hash%s
   --  system.string_hash%b
   --  system.htable%b
   --  system.strings%s
   --  system.strings%b
   --  system.os_lib%s
   --  system.traceback_entries%s
   --  system.traceback_entries%b
   --  ada.exceptions%s
   --  system.soft_links%s
   --  system.unsigned_types%s
   --  system.val_llu%s
   --  system.val_util%s
   --  system.val_util%b
   --  system.val_llu%b
   --  system.wch_con%s
   --  system.wch_con%b
   --  system.wch_cnv%s
   --  system.wch_jis%s
   --  system.wch_jis%b
   --  system.wch_cnv%b
   --  system.wch_stw%s
   --  system.wch_stw%b
   --  ada.exceptions.last_chance_handler%s
   --  ada.exceptions.last_chance_handler%b
   --  system.address_image%s
   --  system.exception_table%s
   --  system.exception_table%b
   --  ada.io_exceptions%s
   --  ada.tags%s
   --  ada.streams%s
   --  ada.streams%b
   --  interfaces.c%s
   --  system.exceptions%s
   --  system.exceptions%b
   --  system.exceptions.machine%s
   --  system.finalization_root%s
   --  system.finalization_root%b
   --  ada.finalization%s
   --  ada.finalization%b
   --  system.storage_pools%s
   --  system.storage_pools%b
   --  system.finalization_masters%s
   --  system.storage_pools.subpools%s
   --  system.storage_pools.subpools.finalization%s
   --  system.storage_pools.subpools.finalization%b
   --  system.memory%s
   --  system.memory%b
   --  system.standard_library%b
   --  system.pool_global%s
   --  system.pool_global%b
   --  system.file_control_block%s
   --  system.file_io%s
   --  system.secondary_stack%s
   --  system.file_io%b
   --  system.storage_pools.subpools%b
   --  system.finalization_masters%b
   --  interfaces.c%b
   --  ada.tags%b
   --  system.soft_links%b
   --  system.os_lib%b
   --  system.secondary_stack%b
   --  system.address_image%b
   --  system.traceback%s
   --  ada.exceptions%b
   --  system.traceback%b
   --  ada.text_io%s
   --  ada.text_io%b
   --  hello%b
   --  END ELABORATION ORDER

end ada_main;
@end example

@example
pragma Ada_95;
--  The following source file name pragmas allow the generated file
--  names to be unique for different main programs. They are needed
--  since the package name will always be Ada_Main.

pragma Source_File_Name (ada_main, Spec_File_Name => "b~hello.ads");
pragma Source_File_Name (ada_main, Body_File_Name => "b~hello.adb");

pragma Suppress (Overflow_Check);
with Ada.Exceptions;

--  Generated package body for Ada_Main starts here

package body ada_main is
   pragma Warnings (Off);

   --  These values are reference counter associated to units which have
   --  been elaborated. It is also used to avoid elaborating the
   --  same unit twice.

   E72 : Short_Integer; pragma Import (Ada, E72, "system__os_lib_E");
   E13 : Short_Integer; pragma Import (Ada, E13, "system__soft_links_E");
   E23 : Short_Integer; pragma Import (Ada, E23, "system__exception_table_E");
   E46 : Short_Integer; pragma Import (Ada, E46, "ada__io_exceptions_E");
   E48 : Short_Integer; pragma Import (Ada, E48, "ada__tags_E");
   E45 : Short_Integer; pragma Import (Ada, E45, "ada__streams_E");
   E70 : Short_Integer; pragma Import (Ada, E70, "interfaces__c_E");
   E25 : Short_Integer; pragma Import (Ada, E25, "system__exceptions_E");
   E68 : Short_Integer; pragma Import (Ada, E68, "system__finalization_root_E");
   E66 : Short_Integer; pragma Import (Ada, E66, "ada__finalization_E");
   E85 : Short_Integer; pragma Import (Ada, E85, "system__storage_pools_E");
   E77 : Short_Integer; pragma Import (Ada, E77, "system__finalization_masters_E");
   E91 : Short_Integer; pragma Import (Ada, E91, "system__storage_pools__subpools_E");
   E87 : Short_Integer; pragma Import (Ada, E87, "system__pool_global_E");
   E75 : Short_Integer; pragma Import (Ada, E75, "system__file_control_block_E");
   E64 : Short_Integer; pragma Import (Ada, E64, "system__file_io_E");
   E17 : Short_Integer; pragma Import (Ada, E17, "system__secondary_stack_E");
   E06 : Short_Integer; pragma Import (Ada, E06, "ada__text_io_E");

   Local_Priority_Specific_Dispatching : constant String := "";
   Local_Interrupt_States : constant String := "";

   Is_Elaborated : Boolean := False;

   procedure finalize_library is
   begin
      E06 := E06 - 1;
      declare
         procedure F1;
         pragma Import (Ada, F1, "ada__text_io__finalize_spec");
      begin
         F1;
      end;
      E77 := E77 - 1;
      E91 := E91 - 1;
      declare
         procedure F2;
         pragma Import (Ada, F2, "system__file_io__finalize_body");
      begin
         E64 := E64 - 1;
         F2;
      end;
      declare
         procedure F3;
         pragma Import (Ada, F3, "system__file_control_block__finalize_spec");
      begin
         E75 := E75 - 1;
         F3;
      end;
      E87 := E87 - 1;
      declare
         procedure F4;
         pragma Import (Ada, F4, "system__pool_global__finalize_spec");
      begin
         F4;
      end;
      declare
         procedure F5;
         pragma Import (Ada, F5, "system__storage_pools__subpools__finalize_spec");
      begin
         F5;
      end;
      declare
         procedure F6;
         pragma Import (Ada, F6, "system__finalization_masters__finalize_spec");
      begin
         F6;
      end;
      declare
         procedure Reraise_Library_Exception_If_Any;
         pragma Import (Ada, Reraise_Library_Exception_If_Any, "__gnat_reraise_library_exception_if_any");
      begin
         Reraise_Library_Exception_If_Any;
      end;
   end finalize_library;

   -------------
   -- adainit --
   -------------

   procedure adainit is

      Main_Priority : Integer;
      pragma Import (C, Main_Priority, "__gl_main_priority");
      Time_Slice_Value : Integer;
      pragma Import (C, Time_Slice_Value, "__gl_time_slice_val");
      WC_Encoding : Character;
      pragma Import (C, WC_Encoding, "__gl_wc_encoding");
      Locking_Policy : Character;
      pragma Import (C, Locking_Policy, "__gl_locking_policy");
      Queuing_Policy : Character;
      pragma Import (C, Queuing_Policy, "__gl_queuing_policy");
      Task_Dispatching_Policy : Character;
      pragma Import (C, Task_Dispatching_Policy, "__gl_task_dispatching_policy");
      Priority_Specific_Dispatching : System.Address;
      pragma Import (C, Priority_Specific_Dispatching, "__gl_priority_specific_dispatching");
      Num_Specific_Dispatching : Integer;
      pragma Import (C, Num_Specific_Dispatching, "__gl_num_specific_dispatching");
      Main_CPU : Integer;
      pragma Import (C, Main_CPU, "__gl_main_cpu");
      Interrupt_States : System.Address;
      pragma Import (C, Interrupt_States, "__gl_interrupt_states");
      Num_Interrupt_States : Integer;
      pragma Import (C, Num_Interrupt_States, "__gl_num_interrupt_states");
      Unreserve_All_Interrupts : Integer;
      pragma Import (C, Unreserve_All_Interrupts, "__gl_unreserve_all_interrupts");
      Detect_Blocking : Integer;
      pragma Import (C, Detect_Blocking, "__gl_detect_blocking");
      Default_Stack_Size : Integer;
      pragma Import (C, Default_Stack_Size, "__gl_default_stack_size");
      Leap_Seconds_Support : Integer;
      pragma Import (C, Leap_Seconds_Support, "__gl_leap_seconds_support");

      procedure Runtime_Initialize;
      pragma Import (C, Runtime_Initialize, "__gnat_runtime_initialize");

      Finalize_Library_Objects : No_Param_Proc;
      pragma Import (C, Finalize_Library_Objects, "__gnat_finalize_library_objects");

   --  Start of processing for adainit

   begin

      --  Record various information for this partition.  The values
      --  are derived by the binder from information stored in the ali
      --  files by the compiler.

      if Is_Elaborated then
         return;
      end if;
      Is_Elaborated := True;
      Main_Priority := -1;
      Time_Slice_Value := -1;
      WC_Encoding := 'b';
      Locking_Policy := ' ';
      Queuing_Policy := ' ';
      Task_Dispatching_Policy := ' ';
      Priority_Specific_Dispatching :=
        Local_Priority_Specific_Dispatching'Address;
      Num_Specific_Dispatching := 0;
      Main_CPU := -1;
      Interrupt_States := Local_Interrupt_States'Address;
      Num_Interrupt_States := 0;
      Unreserve_All_Interrupts := 0;
      Detect_Blocking := 0;
      Default_Stack_Size := -1;
      Leap_Seconds_Support := 0;

      Runtime_Initialize;

      Finalize_Library_Objects := finalize_library'access;

      --  Now we have the elaboration calls for all units in the partition.
      --  The Elab_Spec and Elab_Body attributes generate references to the
      --  implicit elaboration procedures generated by the compiler for
      --  each unit that requires elaboration. Increment a counter of
      --  reference for each unit.

      System.Soft_Links'Elab_Spec;
      System.Exception_Table'Elab_Body;
      E23 := E23 + 1;
      Ada.Io_Exceptions'Elab_Spec;
      E46 := E46 + 1;
      Ada.Tags'Elab_Spec;
      Ada.Streams'Elab_Spec;
      E45 := E45 + 1;
      Interfaces.C'Elab_Spec;
      System.Exceptions'Elab_Spec;
      E25 := E25 + 1;
      System.Finalization_Root'Elab_Spec;
      E68 := E68 + 1;
      Ada.Finalization'Elab_Spec;
      E66 := E66 + 1;
      System.Storage_Pools'Elab_Spec;
      E85 := E85 + 1;
      System.Finalization_Masters'Elab_Spec;
      System.Storage_Pools.Subpools'Elab_Spec;
      System.Pool_Global'Elab_Spec;
      E87 := E87 + 1;
      System.File_Control_Block'Elab_Spec;
      E75 := E75 + 1;
      System.File_Io'Elab_Body;
      E64 := E64 + 1;
      E91 := E91 + 1;
      System.Finalization_Masters'Elab_Body;
      E77 := E77 + 1;
      E70 := E70 + 1;
      Ada.Tags'Elab_Body;
      E48 := E48 + 1;
      System.Soft_Links'Elab_Body;
      E13 := E13 + 1;
      System.Os_Lib'Elab_Body;
      E72 := E72 + 1;
      System.Secondary_Stack'Elab_Body;
      E17 := E17 + 1;
      Ada.Text_Io'Elab_Spec;
      Ada.Text_Io'Elab_Body;
      E06 := E06 + 1;
   end adainit;

   --------------
   -- adafinal --
   --------------

   procedure adafinal is
      procedure s_stalib_adafinal;
      pragma Import (C, s_stalib_adafinal, "system__standard_library__adafinal");

      procedure Runtime_Finalize;
      pragma Import (C, Runtime_Finalize, "__gnat_runtime_finalize");

   begin
      if not Is_Elaborated then
         return;
      end if;
      Is_Elaborated := False;
      Runtime_Finalize;
      s_stalib_adafinal;
   end adafinal;

   --  We get to the main program of the partition by using
   --  pragma Import because if we try to with the unit and
   --  call it Ada style, then not only do we waste time
   --  recompiling it, but also, we don't really know the right
   --  switches (e.g.@@: identifier character set) to be used
   --  to compile it.

   procedure Ada_Main_Program;
   pragma Import (Ada, Ada_Main_Program, "_ada_hello");

   ----------
   -- main --
   ----------

   --  main is actually a function, as in the ANSI C standard,
   --  defined to return the exit status. The three parameters
   --  are the argument count, argument values and environment
   --  pointer.

   function main
     (argc : Integer;
      argv : System.Address;
      envp : System.Address)
      return Integer
   is
      --  The initialize routine performs low level system
      --  initialization using a standard library routine which
      --  sets up signal handling and performs any other
      --  required setup. The routine can be found in file
      --  a-init.c.

      procedure initialize;
      pragma Import (C, initialize, "__gnat_initialize");

      --  The finalize routine performs low level system
      --  finalization using a standard library routine. The
      --  routine is found in file a-final.c and in the standard
      --  distribution is a dummy routine that does nothing, so
      --  really this is a hook for special user finalization.

      procedure finalize;
      pragma Import (C, finalize, "__gnat_finalize");

      --  The following is to initialize the SEH exceptions

      SEH : aliased array (1 .. 2) of Integer;

      Ensure_Reference : aliased System.Address := Ada_Main_Program_Name'Address;
      pragma Volatile (Ensure_Reference);

   --  Start of processing for main

   begin
      --  Save global variables

      gnat_argc := argc;
      gnat_argv := argv;
      gnat_envp := envp;

      --  Call low level system initialization

      Initialize (SEH'Address);

      --  Call our generated Ada initialization routine

      adainit;

      --  Now we call the main program of the partition

      Ada_Main_Program;

      --  Perform Ada finalization

      adafinal;

      --  Perform low level system finalization

      Finalize;

      --  Return the proper exit status
      return (gnat_exit_status);
   end;

--  This section is entirely comments, so it has no effect on the
--  compilation of the Ada_Main package. It provides the list of
--  object files and linker options, as well as some standard
--  libraries needed for the link. The gnatlink utility parses
--  this b~hello.adb file to read these comment lines to generate
--  the appropriate command line arguments for the call to the
--  system linker. The BEGIN/END lines are used for sentinels for
--  this parsing operation.

--  The exact file names will of course depend on the environment,
--  host/target and location of files on the host system.

-- BEGIN Object file/option list
   --   ./hello.o
   --   -L./
   --   -L/usr/local/gnat/lib/gcc-lib/i686-pc-linux-gnu/2.8.1/adalib/
   --   /usr/local/gnat/lib/gcc-lib/i686-pc-linux-gnu/2.8.1/adalib/libgnat.a
-- END Object file/option list

end ada_main;
@end example

The Ada code in the above example is exactly what is generated by the
binder. We have added comments to more clearly indicate the function
of each part of the generated @code{Ada_Main} package.

The code is standard Ada in all respects, and can be processed by any
tools that handle Ada. In particular, it is possible to use the debugger
in Ada mode to debug the generated @code{Ada_Main} package. For example,
suppose that for reasons that you do not understand, your program is crashing
during elaboration of the body of @code{Ada.Text_IO}. To locate this bug,
you can place a breakpoint on the call:

@quotation

@example
Ada.Text_Io'Elab_Body;
@end example
@end quotation

and trace the elaboration routine for this package to find out where
the problem might be (more usually of course you would be debugging
elaboration code in your own application).

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

@node Elaboration Order Handling in GNAT,Inline Assembler,Example of Binder Output File,Top
@anchor{gnat_ugn/elaboration_order_handling_in_gnat doc}@anchor{216}@anchor{gnat_ugn/elaboration_order_handling_in_gnat elaboration-order-handling-in-gnat}@anchor{f}@anchor{gnat_ugn/elaboration_order_handling_in_gnat id1}@anchor{217}
@chapter Elaboration Order Handling in GNAT


@geindex Order of elaboration

@geindex Elaboration control

This appendix describes the handling of elaboration code in Ada and GNAT, and
discusses how the order of elaboration of program units can be controlled in
GNAT, either automatically or with explicit programming features.

@menu
* Elaboration Code:: 
* Elaboration Order:: 
* Checking the Elaboration Order:: 
* Controlling the Elaboration Order in Ada:: 
* Controlling the Elaboration Order in GNAT:: 
* Mixing Elaboration Models:: 
* ABE Diagnostics:: 
* SPARK Diagnostics:: 
* Elaboration Circularities:: 
* Resolving Elaboration Circularities:: 
* Elaboration-related Compiler Switches:: 
* Summary of Procedures for Elaboration Control:: 
* Inspecting the Chosen Elaboration Order:: 

@end menu

@node Elaboration Code,Elaboration Order,,Elaboration Order Handling in GNAT
@anchor{gnat_ugn/elaboration_order_handling_in_gnat elaboration-code}@anchor{218}@anchor{gnat_ugn/elaboration_order_handling_in_gnat id2}@anchor{219}
@section Elaboration Code


Ada defines the term @emph{execution} as the process by which a construct achieves
its run-time effect. This process is also referred to as @strong{elaboration} for
declarations and @emph{evaluation} for expressions.

The execution model in Ada allows for certain sections of an Ada program to be
executed prior to execution of the program itself, primarily with the intent of
initializing data. These sections are referred to as @strong{elaboration code}.
Elaboration code is executed as follows:


@itemize *

@item 
All partitions of an Ada program are executed in parallel with one another,
possibly in a separate address space, and possibly on a separate computer.

@item 
The execution of a partition involves running the environment task for that
partition.

@item 
The environment task executes all elaboration code (if available) for all
units within that partition. This code is said to be executed at
@strong{elaboration time}.

@item 
The environment task executes the Ada program (if available) for that
partition.
@end itemize

In addition to the Ada terminology, this appendix defines the following terms:


@itemize *

@item 
@emph{Invocation}

The act of calling a subprogram, instantiating a generic, or activating a
task.

@item 
@emph{Scenario}

A construct that is elaborated or invoked by elaboration code is referred to
as an @emph{elaboration scenario} or simply a @strong{scenario}. GNAT recognizes the
following scenarios:


@itemize -

@item 
@code{'Access} of entries, operators, and subprograms

@item 
Activation of tasks

@item 
Calls to entries, operators, and subprograms

@item 
Instantiations of generic templates
@end itemize

@item 
@emph{Target}

A construct elaborated by a scenario is referred to as @emph{elaboration target}
or simply @strong{target}. GNAT recognizes the following targets:


@itemize -

@item 
For @code{'Access} of entries, operators, and subprograms, the target is the
entry, operator, or subprogram being aliased.

@item 
For activation of tasks, the target is the task body

@item 
For calls to entries, operators, and subprograms, the target is the entry,
operator, or subprogram being invoked.

@item 
For instantiations of generic templates, the target is the generic template
being instantiated.
@end itemize
@end itemize

Elaboration code may appear in two distinct contexts:


@itemize *

@item 
@emph{Library level}

A scenario appears at the library level when it is encapsulated by a package
[body] compilation unit, ignoring any other package [body] declarations in
between.

@example
with Server;
package Client is
   procedure Proc;

   package Nested is
      Val : ... := Server.Func;
   end Nested;
end Client;
@end example

In the example above, the call to @code{Server.Func} is an elaboration scenario
because it appears at the library level of package @code{Client}. Note that the
declaration of package @code{Nested} is ignored according to the definition
given above. As a result, the call to @code{Server.Func} will be invoked when
the spec of unit @code{Client} is elaborated.

@item 
@emph{Package body statements}

A scenario appears within the statement sequence of a package body when it is
bounded by the region starting from the @code{begin} keyword of the package body
and ending at the @code{end} keyword of the package body.

@example
package body Client is
   procedure Proc is
   begin
      ...
   end Proc;
begin
   Proc;
end Client;
@end example

In the example above, the call to @code{Proc} is an elaboration scenario because
it appears within the statement sequence of package body @code{Client}. As a
result, the call to @code{Proc} will be invoked when the body of @code{Client} is
elaborated.
@end itemize

@node Elaboration Order,Checking the Elaboration Order,Elaboration Code,Elaboration Order Handling in GNAT
@anchor{gnat_ugn/elaboration_order_handling_in_gnat elaboration-order}@anchor{21a}@anchor{gnat_ugn/elaboration_order_handling_in_gnat id3}@anchor{21b}
@section Elaboration Order


The sequence by which the elaboration code of all units within a partition is
executed is referred to as @strong{elaboration order}.

Within a single unit, elaboration code is executed in sequential order.

@quotation

@example
package body Client is
   Result : ... := Server.Func;

   procedure Proc is
      package Inst is new Server.Gen;
   begin
      Inst.Eval (Result);
   end Proc;
begin
   Proc;
end Client;
@end example
@end quotation

In the example above, the elaboration order within package body @code{Client} is
as follows:


@enumerate 

@item 
The object declaration of @code{Result} is elaborated.


@itemize *

@item 
Function @code{Server.Func} is invoked.
@end itemize

@item 
The subprogram body of @code{Proc} is elaborated.

@item 
Procedure @code{Proc} is invoked.


@itemize *

@item 
Generic unit @code{Server.Gen} is instantiated as @code{Inst}.

@item 
Instance @code{Inst} is elaborated.

@item 
Procedure @code{Inst.Eval} is invoked.
@end itemize
@end enumerate

The elaboration order of all units within a partition depends on the following
factors:


@itemize *

@item 
@emph{with}ed units

@item 
parent units

@item 
purity of units

@item 
preelaborability of units

@item 
presence of elaboration-control pragmas

@item 
invocations performed in elaboration code
@end itemize

A program may have several elaboration orders depending on its structure.

@quotation

@example
package Server is
   function Func (Index : Integer) return Integer;
end Server;
@end example

@example
package body Server is
   Results : array (1 .. 5) of Integer := (1, 2, 3, 4, 5);

   function Func (Index : Integer) return Integer is
   begin
      return Results (Index);
   end Func;
end Server;
@end example

@example
with Server;
package Client is
   Val : constant Integer := Server.Func (3);
end Client;
@end example

@example
with Client;
procedure Main is begin null; end Main;
@end example
@end quotation

The following elaboration order exhibits a fundamental problem referred to as
@emph{access-before-elaboration} or simply @strong{ABE}.

@quotation

@example
spec of Server
spec of Client
body of Server
body of Main
@end example
@end quotation

The elaboration of @code{Server}’s spec materializes function @code{Func}, making it
callable. The elaboration of @code{Client}’s spec elaborates the declaration of
@code{Val}. This invokes function @code{Server.Func}, however the body of
@code{Server.Func} has not been elaborated yet because @code{Server}’s body comes
after @code{Client}’s spec in the elaboration order. As a result, the value of
constant @code{Val} is now undefined.

Without any guarantees from the language, an undetected ABE problem may hinder
proper initialization of data, which in turn may lead to undefined behavior at
run time. To prevent such ABE problems, Ada employs dynamic checks in the same
vein as index or null exclusion checks. A failed ABE check raises exception
@code{Program_Error}.

The following elaboration order avoids the ABE problem and the program can be
successfully elaborated.

@quotation

@example
spec of Server
body of Server
spec of Client
body of Main
@end example
@end quotation

Ada states that a total elaboration order must exist, but it does not define
what this order is. A compiler is thus tasked with choosing a suitable
elaboration order which satisfies the dependencies imposed by @emph{with} clauses,
unit categorization, elaboration-control pragmas, and invocations performed in
elaboration code. Ideally an order that avoids ABE problems should be chosen,
however a compiler may not always find such an order due to complications with
respect to control and data flow.

@node Checking the Elaboration Order,Controlling the Elaboration Order in Ada,Elaboration Order,Elaboration Order Handling in GNAT
@anchor{gnat_ugn/elaboration_order_handling_in_gnat checking-the-elaboration-order}@anchor{21c}@anchor{gnat_ugn/elaboration_order_handling_in_gnat id4}@anchor{21d}
@section Checking the Elaboration Order


To avoid placing the entire elaboration-order burden on the programmer, Ada
provides three lines of defense:


@itemize *

@item 
@emph{Static semantics}

Static semantic rules restrict the possible choice of elaboration order. For
instance, if unit Client @emph{with}s unit Server, then the spec of Server is
always elaborated prior to Client. The same principle applies to child units
- the spec of a parent unit is always elaborated prior to the child unit.

@item 
@emph{Dynamic semantics}

Dynamic checks are performed at run time, to ensure that a target is
elaborated prior to a scenario that invokes it, thus avoiding ABE problems.
A failed run-time check raises exception @code{Program_Error}. The following
restrictions apply:


@itemize -

@item 
@emph{Restrictions on calls}

An entry, operator, or subprogram can be called from elaboration code only
when the corresponding body has been elaborated.

@item 
@emph{Restrictions on instantiations}

A generic unit can be instantiated by elaboration code only when the
corresponding body has been elaborated.

@item 
@emph{Restrictions on task activation}

A task can be activated by elaboration code only when the body of the
associated task type has been elaborated.
@end itemize

The restrictions above can be summarized by the following rule:

@emph{If a target has a body, then this body must be elaborated prior to the
scenario that invokes the target.}

@item 
@emph{Elaboration control}

Pragmas are provided for the programmer to specify the desired elaboration
order.
@end itemize

@node Controlling the Elaboration Order in Ada,Controlling the Elaboration Order in GNAT,Checking the Elaboration Order,Elaboration Order Handling in GNAT
@anchor{gnat_ugn/elaboration_order_handling_in_gnat controlling-the-elaboration-order-in-ada}@anchor{21e}@anchor{gnat_ugn/elaboration_order_handling_in_gnat id5}@anchor{21f}
@section Controlling the Elaboration Order in Ada


Ada provides several idioms and pragmas to aid the programmer with specifying
the desired elaboration order and avoiding ABE problems altogether.


@itemize *

@item 
@emph{Packages without a body}

A library package which does not require a completing body does not suffer
from ABE problems.

@example
package Pack is
   generic
      type Element is private;
   package Containers is
      type Element_Array is array (1 .. 10) of Element;
   end Containers;
end Pack;
@end example

In the example above, package @code{Pack} does not require a body because it
does not contain any constructs which require completion in a body. As a
result, generic @code{Pack.Containers} can be instantiated without encountering
any ABE problems.
@end itemize

@geindex pragma Pure


@itemize *

@item 
@emph{pragma Pure}

Pragma @code{Pure} places sufficient restrictions on a unit to guarantee that no
scenario within the unit can result in an ABE problem.
@end itemize

@geindex pragma Preelaborate


@itemize *

@item 
@emph{pragma Preelaborate}

Pragma @code{Preelaborate} is slightly less restrictive than pragma @code{Pure},
but still strong enough to prevent ABE problems within a unit.
@end itemize

@geindex pragma Elaborate_Body


@itemize *

@item 
@emph{pragma Elaborate_Body}

Pragma @code{Elaborate_Body} requires that the body of a unit is elaborated
immediately after its spec. This restriction guarantees that no client
scenario can invoke a server target before the target body has been
elaborated because the spec and body are effectively “glued” together.

@example
package Server is
   pragma Elaborate_Body;

   function Func return Integer;
end Server;
@end example

@example
package body Server is
   function Func return Integer is
   begin
      ...
   end Func;
end Server;
@end example

@example
with Server;
package Client is
   Val : constant Integer := Server.Func;
end Client;
@end example

In the example above, pragma @code{Elaborate_Body} guarantees the following
elaboration order:

@example
spec of Server
body of Server
spec of Client
@end example

because the spec of @code{Server} must be elaborated prior to @code{Client} by
virtue of the @emph{with} clause, and in addition the body of @code{Server} must be
elaborated immediately after the spec of @code{Server}.

Removing pragma @code{Elaborate_Body} could result in the following incorrect
elaboration order:

@example
spec of Server
spec of Client
body of Server
@end example

where @code{Client} invokes @code{Server.Func}, but the body of @code{Server.Func} has
not been elaborated yet.
@end itemize

The pragmas outlined above allow a server unit to guarantee safe elaboration
use by client units. Thus it is a good rule to mark units as @code{Pure} or
@code{Preelaborate}, and if this is not possible, mark them as @code{Elaborate_Body}.

There are however situations where @code{Pure}, @code{Preelaborate}, and
@code{Elaborate_Body} are not applicable. Ada provides another set of pragmas for
use by client units to help ensure the elaboration safety of server units they
depend on.

@geindex pragma Elaborate (Unit)


@itemize *

@item 
@emph{pragma Elaborate (Unit)}

Pragma @code{Elaborate} can be placed in the context clauses of a unit, after a
@emph{with} clause. It guarantees that both the spec and body of its argument will
be elaborated prior to the unit with the pragma. Note that other unrelated
units may be elaborated in between the spec and the body.

@example
package Server is
   function Func return Integer;
end Server;
@end example

@example
package body Server is
   function Func return Integer is
   begin
      ...
   end Func;
end Server;
@end example

@example
with Server;
pragma Elaborate (Server);
package Client is
   Val : constant Integer := Server.Func;
end Client;
@end example

In the example above, pragma @code{Elaborate} guarantees the following
elaboration order:

@example
spec of Server
body of Server
spec of Client
@end example

Removing pragma @code{Elaborate} could result in the following incorrect
elaboration order:

@example
spec of Server
spec of Client
body of Server
@end example

where @code{Client} invokes @code{Server.Func}, but the body of @code{Server.Func}
has not been elaborated yet.
@end itemize

@geindex pragma Elaborate_All (Unit)


@itemize *

@item 
@emph{pragma Elaborate_All (Unit)}

Pragma @code{Elaborate_All} is placed in the context clauses of a unit, after
a @emph{with} clause. It guarantees that both the spec and body of its argument
will be elaborated prior to the unit with the pragma, as well as all units
@emph{with}ed by the spec and body of the argument, recursively. Note that other
unrelated units may be elaborated in between the spec and the body.

@example
package Math is
   function Factorial (Val : Natural) return Natural;
end Math;
@end example

@example
package body Math is
   function Factorial (Val : Natural) return Natural is
   begin
      ...;
   end Factorial;
end Math;
@end example

@example
package Computer is
   type Operation_Kind is (None, Op_Factorial);

   function Compute
     (Val : Natural;
      Op  : Operation_Kind) return Natural;
end Computer;
@end example

@example
with Math;
package body Computer is
   function Compute
     (Val : Natural;
      Op  : Operation_Kind) return Natural
   is
      if Op = Op_Factorial then
         return Math.Factorial (Val);
      end if;

      return 0;
   end Compute;
end Computer;
@end example

@example
with Computer;
pragma Elaborate_All (Computer);
package Client is
   Val : constant Natural :=
           Computer.Compute (123, Computer.Op_Factorial);
end Client;
@end example

In the example above, pragma @code{Elaborate_All} can result in the following
elaboration order:

@example
spec of Math
body of Math
spec of Computer
body of Computer
spec of Client
@end example

Note that there are several allowable suborders for the specs and bodies of
@code{Math} and @code{Computer}, but the point is that these specs and bodies will
be elaborated prior to @code{Client}.

Removing pragma @code{Elaborate_All} could result in the following incorrect
elaboration order:

@example
spec of Math
spec of Computer
body of Computer
spec of Client
body of Math
@end example

where @code{Client} invokes @code{Computer.Compute}, which in turn invokes
@code{Math.Factorial}, but the body of @code{Math.Factorial} has not been
elaborated yet.
@end itemize

All pragmas shown above can be summarized by the following rule:

@emph{If a client unit elaborates a server target directly or indirectly, then if
the server unit requires a body and does not have pragma Pure, Preelaborate,
or Elaborate_Body, then the client unit should have pragma Elaborate or
Elaborate_All for the server unit.}

If the rule outlined above is not followed, then a program may fall in one of
the following states:


@itemize *

@item 
@emph{No elaboration order exists}

In this case a compiler must diagnose the situation, and refuse to build an
executable program.

@item 
@emph{One or more incorrect elaboration orders exist}

In this case a compiler can build an executable program, but
@code{Program_Error} will be raised when the program is run.

@item 
@emph{Several elaboration orders exist, some correct, some incorrect}

In this case the programmer has not controlled the elaboration order. As a
result, a compiler may or may not pick one of the correct orders, and the
program may or may not raise @code{Program_Error} when it is run. This is the
worst possible state because the program may fail on another compiler, or
even another version of the same compiler.

@item 
@emph{One or more correct orders exist}

In this case a compiler can build an executable program, and the program is
run successfully. This state may be guaranteed by following the outlined
rules, or may be the result of good program architecture.
@end itemize

Note that one additional advantage of using @code{Elaborate} and @code{Elaborate_All}
is that the program continues to stay in the last state (one or more correct
orders exist) even if maintenance changes the bodies of targets.

@node Controlling the Elaboration Order in GNAT,Mixing Elaboration Models,Controlling the Elaboration Order in Ada,Elaboration Order Handling in GNAT
@anchor{gnat_ugn/elaboration_order_handling_in_gnat controlling-the-elaboration-order-in-gnat}@anchor{220}@anchor{gnat_ugn/elaboration_order_handling_in_gnat id6}@anchor{221}
@section Controlling the Elaboration Order in GNAT


In addition to Ada semantics and rules synthesized from them, GNAT offers
three elaboration models to aid the programmer with specifying the correct
elaboration order and to diagnose elaboration problems.

@geindex Dynamic elaboration model


@itemize *

@item 
@emph{Dynamic elaboration model}

This is the most permissive of the three elaboration models and emulates the
behavior specified by the Ada Reference Manual. When the dynamic model is in
effect, GNAT makes the following assumptions:


@itemize -

@item 
All code within all units in a partition is considered to be elaboration
code.

@item 
Some of the invocations in elaboration code may not take place at run time
due to conditional execution.
@end itemize

GNAT performs extensive diagnostics on a unit-by-unit basis for all scenarios
that invoke internal targets. In addition, GNAT generates run-time checks for
all external targets and for all scenarios that may exhibit ABE problems.

The elaboration order is obtained by honoring all @emph{with} clauses, purity and
preelaborability of units, and elaboration-control pragmas. The dynamic model
attempts to take all invocations in elaboration code into account. If an
invocation leads to a circularity, GNAT ignores the invocation based on the
assumptions stated above. An order obtained using the dynamic model may fail
an ABE check at run time when GNAT ignored an invocation.

The dynamic model is enabled with compiler switch @code{-gnatE}.
@end itemize

@geindex Static elaboration model


@itemize *

@item 
@emph{Static elaboration model}

This is the middle ground of the three models. When the static model is in
effect, GNAT makes the following assumptions:


@itemize -

@item 
Only code at the library level and in package body statements within all
units in a partition is considered to be elaboration code.

@item 
All invocations in elaboration will take place at run time, regardless of
conditional execution.
@end itemize

GNAT performs extensive diagnostics on a unit-by-unit basis for all scenarios
that invoke internal targets. In addition, GNAT generates run-time checks for
all external targets and for all scenarios that may exhibit ABE problems.

The elaboration order is obtained by honoring all @emph{with} clauses, purity and
preelaborability of units, presence of elaboration-control pragmas, and all
invocations in elaboration code. An order obtained using the static model is
guaranteed to be ABE problem-free, excluding dispatching calls and
access-to-subprogram types.

The static model is the default model in GNAT.
@end itemize

@geindex SPARK elaboration model


@itemize *

@item 
@emph{SPARK elaboration model}

This is the most conservative of the three models and enforces the SPARK
rules of elaboration as defined in the SPARK Reference Manual, section 7.7.
The SPARK model is in effect only when a scenario and a target reside in a
region subject to @code{SPARK_Mode On}, otherwise the dynamic or static model
is in effect.

The SPARK model is enabled with compiler switch @code{-gnatd.v}.
@end itemize

@geindex Legacy elaboration models


@itemize *

@item 
@emph{Legacy elaboration models}

In addition to the three elaboration models outlined above, GNAT provides the
following legacy models:


@itemize -

@item 
@cite{Legacy elaboration-checking model} available in pre-18.x versions of GNAT.
This model is enabled with compiler switch @code{-gnatH}.

@item 
@cite{Legacy elaboration-order model} available in pre-20.x versions of GNAT.
This model is enabled with binder switch @code{-H}.
@end itemize
@end itemize

@geindex Relaxed elaboration mode

The dynamic, legacy, and static models can be relaxed using compiler switch
@code{-gnatJ}, making them more permissive. Note that in this mode, GNAT
may not diagnose certain elaboration issues or install run-time checks.

@node Mixing Elaboration Models,ABE Diagnostics,Controlling the Elaboration Order in GNAT,Elaboration Order Handling in GNAT
@anchor{gnat_ugn/elaboration_order_handling_in_gnat id7}@anchor{222}@anchor{gnat_ugn/elaboration_order_handling_in_gnat mixing-elaboration-models}@anchor{223}
@section Mixing Elaboration Models


It is possible to mix units compiled with a different elaboration model,
however the following rules must be observed:


@itemize *

@item 
A client unit compiled with the dynamic model can only @emph{with} a server unit
that meets at least one of the following criteria:


@itemize -

@item 
The server unit is compiled with the dynamic model.

@item 
The server unit is a GNAT implementation unit from the @code{Ada}, @code{GNAT},
@code{Interfaces}, or @code{System} hierarchies.

@item 
The server unit has pragma @code{Pure} or @code{Preelaborate}.

@item 
The client unit has an explicit @code{Elaborate_All} pragma for the server
unit.
@end itemize
@end itemize

These rules ensure that elaboration checks are not omitted. If the rules are
violated, the binder emits a warning:

@quotation

@example
warning: "x.ads" has dynamic elaboration checks and with's
warning:   "y.ads" which has static elaboration checks
@end example
@end quotation

The warnings can be suppressed by binder switch @code{-ws}.

@node ABE Diagnostics,SPARK Diagnostics,Mixing Elaboration Models,Elaboration Order Handling in GNAT
@anchor{gnat_ugn/elaboration_order_handling_in_gnat abe-diagnostics}@anchor{224}@anchor{gnat_ugn/elaboration_order_handling_in_gnat id8}@anchor{225}
@section ABE Diagnostics


GNAT performs extensive diagnostics on a unit-by-unit basis for all scenarios
that invoke internal targets, regardless of whether the dynamic, SPARK, or
static model is in effect.

Note that GNAT emits warnings rather than hard errors whenever it encounters an
elaboration problem. This is because the elaboration model in effect may be too
conservative, or a particular scenario may not be invoked due conditional
execution. The warnings can be suppressed selectively with @code{pragma Warnings
(Off)} or globally with compiler switch @code{-gnatwL}.

A @emph{guaranteed ABE} arises when the body of a target is not elaborated early
enough, and causes @emph{all} scenarios that directly invoke the target to fail.

@quotation

@example
package body Guaranteed_ABE is
   function ABE return Integer;

   Val : constant Integer := ABE;

   function ABE return Integer is
   begin
     ...
   end ABE;
end Guaranteed_ABE;
@end example
@end quotation

In the example above, the elaboration of @code{Guaranteed_ABE}’s body elaborates
the declaration of @code{Val}. This invokes function @code{ABE}, however the body of
@code{ABE} has not been elaborated yet. GNAT emits the following diagnostic:

@quotation

@example
4.    Val : constant Integer := ABE;
                                |
   >>> warning: cannot call "ABE" before body seen
   >>> warning: Program_Error will be raised at run time
@end example
@end quotation

A @emph{conditional ABE} arises when the body of a target is not elaborated early
enough, and causes @emph{some} scenarios that directly invoke the target to fail.

@quotation

@example
 1. package body Conditional_ABE is
 2.    procedure Force_Body is null;
 3.
 4.    generic
 5.       with function Func return Integer;
 6.    package Gen is
 7.       Val : constant Integer := Func;
 8.    end Gen;
 9.
10.    function ABE return Integer;
11.
12.    function Cause_ABE return Boolean is
13.       package Inst is new Gen (ABE);
14.    begin
15.       ...
16.    end Cause_ABE;
17.
18.    Val : constant Boolean := Cause_ABE;
19.
20.    function ABE return Integer is
21.    begin
22.       ...
23.    end ABE;
24.
25.    Safe : constant Boolean := Cause_ABE;
26. end Conditional_ABE;
@end example
@end quotation

In the example above, the elaboration of package body @code{Conditional_ABE}
elaborates the declaration of @code{Val}. This invokes function @code{Cause_ABE},
which instantiates generic unit @code{Gen} as @code{Inst}. The elaboration of
@code{Inst} invokes function @code{ABE}, however the body of @code{ABE} has not been
elaborated yet. GNAT emits the following diagnostic:

@quotation

@example
13.       package Inst is new Gen (ABE);
          |
    >>> warning: in instantiation at line 7
    >>> warning: cannot call "ABE" before body seen
    >>> warning: Program_Error may be raised at run time
    >>> warning:   body of unit "Conditional_ABE" elaborated
    >>> warning:   function "Cause_ABE" called at line 18
    >>> warning:   function "ABE" called at line 7, instance at line 13
@end example
@end quotation

Note that the same ABE problem does not occur with the elaboration of
declaration @code{Safe} because the body of function @code{ABE} has already been
elaborated at that point.

@node SPARK Diagnostics,Elaboration Circularities,ABE Diagnostics,Elaboration Order Handling in GNAT
@anchor{gnat_ugn/elaboration_order_handling_in_gnat id9}@anchor{226}@anchor{gnat_ugn/elaboration_order_handling_in_gnat spark-diagnostics}@anchor{227}
@section SPARK Diagnostics


GNAT enforces the SPARK rules of elaboration as defined in the SPARK Reference
Manual section 7.7 when compiler switch @code{-gnatd.v} is in effect. Note
that GNAT emits hard errors whenever it encounters a violation of the SPARK
rules.

@quotation

@example
1. with Server;
2. package body SPARK_Diagnostics with SPARK_Mode is
3.    Val : constant Integer := Server.Func;
                                      |
   >>> call to "Func" during elaboration in SPARK
   >>> unit "SPARK_Diagnostics" requires pragma "Elaborate_All" for "Server"
   >>>   body of unit "SPARK_Model" elaborated
   >>>   function "Func" called at line 3

4. end SPARK_Diagnostics;
@end example
@end quotation

@node Elaboration Circularities,Resolving Elaboration Circularities,SPARK Diagnostics,Elaboration Order Handling in GNAT
@anchor{gnat_ugn/elaboration_order_handling_in_gnat elaboration-circularities}@anchor{228}@anchor{gnat_ugn/elaboration_order_handling_in_gnat id10}@anchor{229}
@section Elaboration Circularities


An @strong{elaboration circularity} occurs whenever the elaboration of a set of
units enters a deadlocked state, where each unit is waiting for another unit
to be elaborated. This situation may be the result of improper use of @emph{with}
clauses, elaboration-control pragmas, or invocations in elaboration code.

The following example exhibits an elaboration circularity.

@quotation

@example
with B; pragma Elaborate (B);
package A is
end A;
@end example

@example
package B is
   procedure Force_Body;
end B;
@end example

@example
with C;
package body B is
   procedure Force_Body is null;

   Elab : constant Integer := C.Func;
end B;
@end example

@example
package C is
   function Func return Integer;
end C;
@end example

@example
with A;
package body C is
   function Func return Integer is
   begin
      ...
   end Func;
end C;
@end example
@end quotation

The binder emits the following diagnostic:

@quotation

@example
error: Elaboration circularity detected
info:
info:    Reason:
info:
info:      unit "a (spec)" depends on its own elaboration
info:
info:    Circularity:
info:
info:      unit "a (spec)" has with clause and pragma Elaborate for unit "b (spec)"
info:      unit "b (body)" is in the closure of pragma Elaborate
info:      unit "b (body)" invokes a construct of unit "c (body)" at elaboration time
info:      unit "c (body)" has with clause for unit "a (spec)"
info:
info:    Suggestions:
info:
info:      remove pragma Elaborate for unit "b (body)" in unit "a (spec)"
info:      use the dynamic elaboration model (compiler switch -gnatE)
@end example
@end quotation

The diagnostic consist of the following sections:


@itemize *

@item 
Reason

This section provides a short explanation describing why the set of units
could not be ordered.

@item 
Circularity

This section enumerates the units comprising the deadlocked set, along with
their interdependencies.

@item 
Suggestions

This section enumerates various tactics for eliminating the circularity.
@end itemize

@node Resolving Elaboration Circularities,Elaboration-related Compiler Switches,Elaboration Circularities,Elaboration Order Handling in GNAT
@anchor{gnat_ugn/elaboration_order_handling_in_gnat id11}@anchor{22a}@anchor{gnat_ugn/elaboration_order_handling_in_gnat resolving-elaboration-circularities}@anchor{22b}
@section Resolving Elaboration Circularities


The most desirable option from the point of view of long-term maintenance is to
rearrange the program so that the elaboration problems are avoided. One useful
technique is to place the elaboration code into separate child packages.
Another is to move some of the initialization code to explicitly invoked
subprograms, where the program controls the order of initialization explicitly.
Although this is the most desirable option, it may be impractical and involve
too much modification, especially in the case of complex legacy code.

When faced with an elaboration circularity, the programmer should also consider
the tactics given in the suggestions section of the circularity diagnostic.
Depending on the units involved in the circularity, their @emph{with} clauses,
purity, preelaborability, presence of elaboration-control pragmas and
invocations at elaboration time, the binder may suggest one or more of the
following tactics to eliminate the circularity:


@itemize *

@item 
Pragma Elaborate elimination

@example
remove pragma Elaborate for unit "..." in unit "..."
@end example

This tactic is suggested when the binder has determined that pragma
@code{Elaborate}:


@itemize -

@item 
Prevents a set of units from being elaborated.

@item 
The removal of the pragma will not eliminate the semantic effects of the
pragma. In other words, the argument of the pragma will still be elaborated
prior to the unit containing the pragma.

@item 
The removal of the pragma will enable the successful ordering of the units.
@end itemize

The programmer should remove the pragma as advised, and rebuild the program.

@item 
Pragma Elaborate_All elimination

@example
remove pragma Elaborate_All for unit "..." in unit "..."
@end example

This tactic is suggested when the binder has determined that pragma
@code{Elaborate_All}:


@itemize -

@item 
Prevents a set of units from being elaborated.

@item 
The removal of the pragma will not eliminate the semantic effects of the
pragma. In other words, the argument of the pragma along with its @emph{with}
closure will still be elaborated prior to the unit containing the pragma.

@item 
The removal of the pragma will enable the successful ordering of the units.
@end itemize

The programmer should remove the pragma as advised, and rebuild the program.

@item 
Pragma Elaborate_All downgrade

@example
change pragma Elaborate_All for unit "..." to Elaborate in unit "..."
@end example

This tactic is always suggested with the pragma @code{Elaborate_All} elimination
tactic. It offers a different alernative of guaranteeing that the argument of
the pragma will still be elaborated prior to the unit containing the pragma.

The programmer should update the pragma as advised, and rebuild the program.

@item 
Pragma Elaborate_Body elimination

@example
remove pragma Elaborate_Body in unit "..."
@end example

This tactic is suggested when the binder has determined that pragma
@code{Elaborate_Body}:


@itemize -

@item 
Prevents a set of units from being elaborated.

@item 
The removal of the pragma will enable the successful ordering of the units.
@end itemize

Note that the binder cannot determine whether the pragma is required for
other purposes, such as guaranteeing the initialization of a variable
declared in the spec by elaboration code in the body.

The programmer should remove the pragma as advised, and rebuild the program.

@item 
Use of pragma Restrictions

@example
use pragma Restrictions (No_Entry_Calls_In_Elaboration_Code)
@end example

This tactic is suggested when the binder has determined that a task
activation at elaboration time:


@itemize -

@item 
Prevents a set of units from being elaborated.
@end itemize

Note that the binder cannot determine with certainty whether the task will
block at elaboration time.

The programmer should create a configuration file, place the pragma within,
update the general compilation arguments, and rebuild the program.

@item 
Use of dynamic elaboration model

@example
use the dynamic elaboration model (compiler switch -gnatE)
@end example

This tactic is suggested when the binder has determined that an invocation at
elaboration time:


@itemize -

@item 
Prevents a set of units from being elaborated.

@item 
The use of the dynamic model will enable the successful ordering of the
units.
@end itemize

The programmer has two options:


@itemize -

@item 
Determine the units involved in the invocation using the detailed
invocation information, and add compiler switch @code{-gnatE} to the
compilation arguments of selected files only. This approach will yield
safer elaboration orders compared to the other option because it will
minimize the opportunities presented to the dynamic model for ignoring
invocations.

@item 
Add compiler switch @code{-gnatE} to the general compilation arguments.
@end itemize

@item 
Use of detailed invocation information

@example
use detailed invocation information (compiler switch -gnatd_F)
@end example

This tactic is always suggested with the use of the dynamic model tactic. It
causes the circularity section of the circularity diagnostic to describe the
flow of elaboration code from a unit to a unit, enumerating all such paths in
the process.

The programmer should analyze this information to determine which units
should be compiled with the dynamic model.

@item 
Forced-dependency elimination

@example
remove the dependency of unit "..." on unit "..." from the argument of switch -f
@end example

This tactic is suggested when the binder has determined that a dependency
present in the forced-elaboration-order file indicated by binder switch
@code{-f}:


@itemize -

@item 
Prevents a set of units from being elaborated.

@item 
The removal of the dependency will enable the successful ordering of the
units.
@end itemize

The programmer should edit the forced-elaboration-order file, remove the
dependency, and rebind the program.

@item 
All forced-dependency elimination

@example
remove switch -f
@end example

This tactic is suggested in case editing the forced-elaboration-order file is
not an option.

The programmer should remove binder switch @code{-f} from the binder
arguments, and rebind.

@item 
Multiple-circularities diagnostic

@example
diagnose all circularities (binder switch -d_C)
@end example

By default, the binder will diagnose only the highest-precedence circularity.
If the program contains multiple circularities, the binder will suggest the
use of binder switch @code{-d_C} in order to obtain the diagnostics of all
circularities.

The programmer should add binder switch @code{-d_C} to the binder
arguments, and rebind.
@end itemize

If none of the tactics suggested by the binder eliminate the elaboration
circularity, the programmer should consider using one of the legacy elaboration
models, in the following order:


@itemize *

@item 
Use the pre-20.x legacy elaboration-order model, with binder switch
@code{-H}.

@item 
Use both pre-18.x and pre-20.x legacy elaboration models, with compiler
switch @code{-gnatH} and binder switch @code{-H}.

@item 
Use the relaxed static-elaboration model, with compiler switches
@code{-gnatH} @code{-gnatJ} and binder switch @code{-H}.

@item 
Use the relaxed dynamic-elaboration model, with compiler switches
@code{-gnatH} @code{-gnatJ} @code{-gnatE} and binder switch
@code{-H}.
@end itemize

@node Elaboration-related Compiler Switches,Summary of Procedures for Elaboration Control,Resolving Elaboration Circularities,Elaboration Order Handling in GNAT
@anchor{gnat_ugn/elaboration_order_handling_in_gnat elaboration-related-compiler-switches}@anchor{22c}@anchor{gnat_ugn/elaboration_order_handling_in_gnat id12}@anchor{22d}
@section Elaboration-related Compiler Switches


GNAT has several switches that affect the elaboration model and consequently
the elaboration order chosen by the binder.

@geindex -gnatE (gnat)


@table @asis

@item @code{-gnatE}

Dynamic elaboration checking mode enabled

When this switch is in effect, GNAT activates the dynamic model.
@end table

@geindex -gnatel (gnat)


@table @asis

@item @code{-gnatel}

Turn on info messages on generated Elaborate[_All] pragmas

This switch is only applicable to the pre-20.x legacy elaboration models.
The post-20.x elaboration model no longer relies on implicitly generated
@code{Elaborate} and @code{Elaborate_All} pragmas to order units.

When this switch is in effect, GNAT will emit the following supplementary
information depending on the elaboration model in effect.


@itemize -

@item 
@emph{Dynamic model}

GNAT will indicate missing @code{Elaborate} and @code{Elaborate_All} pragmas for
all library-level scenarios within the partition.

@item 
@emph{Static model}

GNAT will indicate all scenarios invoked during elaboration. In addition,
it will provide detailed traceback when an implicit @code{Elaborate} or
@code{Elaborate_All} pragma is generated.

@item 
@emph{SPARK model}

GNAT will indicate how an elaboration requirement is met by the context of
a unit. This diagnostic requires compiler switch @code{-gnatd.v}.

@example
1. with Server; pragma Elaborate_All (Server);
2. package Client with SPARK_Mode is
3.    Val : constant Integer := Server.Func;
                                      |
   >>> info: call to "Func" during elaboration in SPARK
   >>> info: "Elaborate_All" requirement for unit "Server" met by pragma at line 1

4. end Client;
@end example
@end itemize
@end table

@geindex -gnatH (gnat)


@table @asis

@item @code{-gnatH}

Legacy elaboration checking mode enabled

When this switch is in effect, GNAT will utilize the pre-18.x elaboration
model.
@end table

@geindex -gnatJ (gnat)


@table @asis

@item @code{-gnatJ}

Relaxed elaboration checking mode enabled

When this switch is in effect, GNAT will not process certain scenarios,
resulting in a more permissive elaboration model. Note that this may
eliminate some diagnostics and run-time checks.
@end table

@geindex -gnatw.f (gnat)


@table @asis

@item @code{-gnatw.f}

Turn on warnings for suspicious Subp’Access

When this switch is in effect, GNAT will treat @code{'Access} of an entry,
operator, or subprogram as a potential call to the target and issue warnings:

@example
 1. package body Attribute_Call is
 2.    function Func return Integer;
 3.    type Func_Ptr is access function return Integer;
 4.
 5.    Ptr : constant Func_Ptr := Func'Access;
                                      |
    >>> warning: "Access" attribute of "Func" before body seen
    >>> warning: possible Program_Error on later references
    >>> warning:   body of unit "Attribute_Call" elaborated
    >>> warning:   "Access" of "Func" taken at line 5

 6.
 7.    function Func return Integer is
 8.    begin
 9.       ...
10.    end Func;
11. end Attribute_Call;
@end example

In the example above, the elaboration of declaration @code{Ptr} is assigned
@code{Func'Access} before the body of @code{Func} has been elaborated.
@end table

@geindex -gnatwl (gnat)


@table @asis

@item @code{-gnatwl}

Turn on warnings for elaboration problems

When this switch is in effect, GNAT emits diagnostics in the form of warnings
concerning various elaboration problems. The warnings are enabled by default.
The switch is provided in case all warnings are suppressed, but elaboration
warnings are still desired.

@item @code{-gnatwL}

Turn off warnings for elaboration problems

When this switch is in effect, GNAT no longer emits any diagnostics in the
form of warnings. Selective suppression of elaboration problems is possible
using @code{pragma Warnings (Off)}.

@example
 1. package body Selective_Suppression is
 2.    function ABE return Integer;
 3.
 4.    Val_1 : constant Integer := ABE;
                                   |
    >>> warning: cannot call "ABE" before body seen
    >>> warning: Program_Error will be raised at run time

 5.
 6.    pragma Warnings (Off);
 7.    Val_2 : constant Integer := ABE;
 8.    pragma Warnings (On);
 9.
10.    function ABE return Integer is
11.    begin
12.       ...
13.    end ABE;
14. end Selective_Suppression;
@end example

Note that suppressing elaboration warnings does not eliminate run-time
checks. The example above will still fail at run time with an ABE.
@end table

@node Summary of Procedures for Elaboration Control,Inspecting the Chosen Elaboration Order,Elaboration-related Compiler Switches,Elaboration Order Handling in GNAT
@anchor{gnat_ugn/elaboration_order_handling_in_gnat id13}@anchor{22e}@anchor{gnat_ugn/elaboration_order_handling_in_gnat summary-of-procedures-for-elaboration-control}@anchor{22f}
@section Summary of Procedures for Elaboration Control


A programmer should first compile the program with the default options, using
none of the binder or compiler switches. If the binder succeeds in finding an
elaboration order, then apart from possible cases involing dispatching calls
and access-to-subprogram types, the program is free of elaboration errors.

If it is important for the program to be portable to compilers other than GNAT,
then the programmer should use compiler switch @code{-gnatel} and consider
the messages about missing or implicitly created @code{Elaborate} and
@code{Elaborate_All} pragmas.

If the binder reports an elaboration circularity, the programmer has several
options:


@itemize *

@item 
Ensure that elaboration warnings are enabled. This will allow the static
model to output trace information of elaboration issues. The trace
information could shed light on previously unforeseen dependencies, as well
as their origins. Elaboration warnings are enabled with compiler switch
@code{-gnatwl}.

@item 
Cosider the tactics given in the suggestions section of the circularity
diagnostic.

@item 
If none of the steps outlined above resolve the circularity, use a more
permissive elaboration model, in the following order:


@itemize -

@item 
Use the pre-20.x legacy elaboration-order model, with binder switch
@code{-H}.

@item 
Use both pre-18.x and pre-20.x legacy elaboration models, with compiler
switch @code{-gnatH} and binder switch @code{-H}.

@item 
Use the relaxed static elaboration model, with compiler switches
@code{-gnatH} @code{-gnatJ} and binder switch @code{-H}.

@item 
Use the relaxed dynamic elaboration model, with compiler switches
@code{-gnatH} @code{-gnatJ} @code{-gnatE} and binder switch
@code{-H}.
@end itemize
@end itemize

@node Inspecting the Chosen Elaboration Order,,Summary of Procedures for Elaboration Control,Elaboration Order Handling in GNAT
@anchor{gnat_ugn/elaboration_order_handling_in_gnat id14}@anchor{230}@anchor{gnat_ugn/elaboration_order_handling_in_gnat inspecting-the-chosen-elaboration-order}@anchor{231}
@section Inspecting the Chosen Elaboration Order


To see the elaboration order chosen by the binder, inspect the contents of file
@cite{b~xxx.adb}. On certain targets, this file appears as @cite{b_xxx.adb}. The
elaboration order appears as a sequence of calls to @code{Elab_Body} and
@code{Elab_Spec}, interspersed with assignments to @cite{Exxx} which indicates that a
particular unit is elaborated. For example:

@quotation

@example
System.Soft_Links'Elab_Body;
E14 := True;
System.Secondary_Stack'Elab_Body;
E18 := True;
System.Exception_Table'Elab_Body;
E24 := True;
Ada.Io_Exceptions'Elab_Spec;
E67 := True;
Ada.Tags'Elab_Spec;
Ada.Streams'Elab_Spec;
E43 := True;
Interfaces.C'Elab_Spec;
E69 := True;
System.Finalization_Root'Elab_Spec;
E60 := True;
System.Os_Lib'Elab_Body;
E71 := True;
System.Finalization_Implementation'Elab_Spec;
System.Finalization_Implementation'Elab_Body;
E62 := True;
Ada.Finalization'Elab_Spec;
E58 := True;
Ada.Finalization.List_Controller'Elab_Spec;
E76 := True;
System.File_Control_Block'Elab_Spec;
E74 := True;
System.File_Io'Elab_Body;
E56 := True;
Ada.Tags'Elab_Body;
E45 := True;
Ada.Text_Io'Elab_Spec;
Ada.Text_Io'Elab_Body;
E07 := True;
@end example
@end quotation

Note also binder switch @code{-l}, which outputs the chosen elaboration
order and provides a more readable form of the above:

@quotation

@example
ada (spec)
interfaces (spec)
system (spec)
system.case_util (spec)
system.case_util (body)
system.concat_2 (spec)
system.concat_2 (body)
system.concat_3 (spec)
system.concat_3 (body)
system.htable (spec)
system.parameters (spec)
system.parameters (body)
system.crtl (spec)
interfaces.c_streams (spec)
interfaces.c_streams (body)
system.restrictions (spec)
system.restrictions (body)
system.standard_library (spec)
system.exceptions (spec)
system.exceptions (body)
system.storage_elements (spec)
system.storage_elements (body)
system.secondary_stack (spec)
system.stack_checking (spec)
system.stack_checking (body)
system.string_hash (spec)
system.string_hash (body)
system.htable (body)
system.strings (spec)
system.strings (body)
system.traceback (spec)
system.traceback (body)
system.traceback_entries (spec)
system.traceback_entries (body)
ada.exceptions (spec)
ada.exceptions.last_chance_handler (spec)
system.soft_links (spec)
system.soft_links (body)
ada.exceptions.last_chance_handler (body)
system.secondary_stack (body)
system.exception_table (spec)
system.exception_table (body)
ada.io_exceptions (spec)
ada.tags (spec)
ada.streams (spec)
interfaces.c (spec)
interfaces.c (body)
system.finalization_root (spec)
system.finalization_root (body)
system.memory (spec)
system.memory (body)
system.standard_library (body)
system.os_lib (spec)
system.os_lib (body)
system.unsigned_types (spec)
system.stream_attributes (spec)
system.stream_attributes (body)
system.finalization_implementation (spec)
system.finalization_implementation (body)
ada.finalization (spec)
ada.finalization (body)
ada.finalization.list_controller (spec)
ada.finalization.list_controller (body)
system.file_control_block (spec)
system.file_io (spec)
system.file_io (body)
system.val_uns (spec)
system.val_util (spec)
system.val_util (body)
system.val_uns (body)
system.wch_con (spec)
system.wch_con (body)
system.wch_cnv (spec)
system.wch_jis (spec)
system.wch_jis (body)
system.wch_cnv (body)
system.wch_stw (spec)
system.wch_stw (body)
ada.tags (body)
ada.exceptions (body)
ada.text_io (spec)
ada.text_io (body)
text_io (spec)
gdbstr (body)
@end example
@end quotation

@node Inline Assembler,GNU Free Documentation License,Elaboration Order Handling in GNAT,Top
@anchor{gnat_ugn/inline_assembler doc}@anchor{232}@anchor{gnat_ugn/inline_assembler id1}@anchor{233}@anchor{gnat_ugn/inline_assembler inline-assembler}@anchor{10}
@chapter Inline Assembler


@geindex Inline Assembler

If you need to write low-level software that interacts directly
with the hardware, Ada provides two ways to incorporate assembly
language code into your program.  First, you can import and invoke
external routines written in assembly language, an Ada feature fully
supported by GNAT.  However, for small sections of code it may be simpler
or more efficient to include assembly language statements directly
in your Ada source program, using the facilities of the implementation-defined
package @code{System.Machine_Code}, which incorporates the gcc
Inline Assembler.  The Inline Assembler approach offers a number of advantages,
including the following:


@itemize *

@item 
No need to use non-Ada tools

@item 
Consistent interface over different targets

@item 
Automatic usage of the proper calling conventions

@item 
Access to Ada constants and variables

@item 
Definition of intrinsic routines

@item 
Possibility of inlining a subprogram comprising assembler code

@item 
Code optimizer can take Inline Assembler code into account
@end itemize

This appendix presents a series of examples to show you how to use
the Inline Assembler.  Although it focuses on the Intel x86,
the general approach applies also to other processors.
It is assumed that you are familiar with Ada
and with assembly language programming.

@menu
* Basic Assembler Syntax:: 
* A Simple Example of Inline Assembler:: 
* Output Variables in Inline Assembler:: 
* Input Variables in Inline Assembler:: 
* Inlining Inline Assembler Code:: 
* Other Asm Functionality:: 

@end menu

@node Basic Assembler Syntax,A Simple Example of Inline Assembler,,Inline Assembler
@anchor{gnat_ugn/inline_assembler basic-assembler-syntax}@anchor{234}@anchor{gnat_ugn/inline_assembler id2}@anchor{235}
@section Basic Assembler Syntax


The assembler used by GNAT and gcc is based not on the Intel assembly
language, but rather on a language that descends from the AT&T Unix
assembler @code{as} (and which is often referred to as ‘AT&T syntax’).
The following table summarizes the main features of @code{as} syntax
and points out the differences from the Intel conventions.
See the gcc @code{as} and @code{gas} (an @code{as} macro
pre-processor) documentation for further information.


@display
@emph{Register names}@w{ }
@display
gcc / @code{as}: Prefix with ‘%’; for example @code{%eax}@w{ }
Intel: No extra punctuation; for example @code{eax}@w{ }
@end display
@end display




@display
@emph{Immediate operand}@w{ }
@display
gcc / @code{as}: Prefix with ‘$’; for example @code{$4}@w{ }
Intel: No extra punctuation; for example @code{4}@w{ }
@end display
@end display




@display
@emph{Address}@w{ }
@display
gcc / @code{as}: Prefix with ‘$’; for example @code{$loc}@w{ }
Intel: No extra punctuation; for example @code{loc}@w{ }
@end display
@end display




@display
@emph{Memory contents}@w{ }
@display
gcc / @code{as}: No extra punctuation; for example @code{loc}@w{ }
Intel: Square brackets; for example @code{[loc]}@w{ }
@end display
@end display




@display
@emph{Register contents}@w{ }
@display
gcc / @code{as}: Parentheses; for example @code{(%eax)}@w{ }
Intel: Square brackets; for example @code{[eax]}@w{ }
@end display
@end display




@display
@emph{Hexadecimal numbers}@w{ }
@display
gcc / @code{as}: Leading ‘0x’ (C language syntax); for example @code{0xA0}@w{ }
Intel: Trailing ‘h’; for example @code{A0h}@w{ }
@end display
@end display




@display
@emph{Operand size}@w{ }
@display
gcc / @code{as}: Explicit in op code; for example @code{movw} to move a 16-bit word@w{ }
Intel: Implicit, deduced by assembler; for example @code{mov}@w{ }
@end display
@end display




@display
@emph{Instruction repetition}@w{ }
@display
gcc / @code{as}: Split into two lines; for example@w{ }
@display
@code{rep}@w{ }
@code{stosl}@w{ }
@end display
Intel: Keep on one line; for example @code{rep stosl}@w{ }
@end display
@end display




@display
@emph{Order of operands}@w{ }
@display
gcc / @code{as}: Source first; for example @code{movw $4, %eax}@w{ }
Intel: Destination first; for example @code{mov eax, 4}@w{ }
@end display
@end display



@node A Simple Example of Inline Assembler,Output Variables in Inline Assembler,Basic Assembler Syntax,Inline Assembler
@anchor{gnat_ugn/inline_assembler a-simple-example-of-inline-assembler}@anchor{236}@anchor{gnat_ugn/inline_assembler id3}@anchor{237}
@section A Simple Example of Inline Assembler


The following example will generate a single assembly language statement,
@code{nop}, which does nothing.  Despite its lack of run-time effect,
the example will be useful in illustrating the basics of
the Inline Assembler facility.

@quotation

@example
with System.Machine_Code; use System.Machine_Code;
procedure Nothing is
begin
   Asm ("nop");
end Nothing;
@end example
@end quotation

@code{Asm} is a procedure declared in package @code{System.Machine_Code};
here it takes one parameter, a @emph{template string} that must be a static
expression and that will form the generated instruction.
@code{Asm} may be regarded as a compile-time procedure that parses
the template string and additional parameters (none here),
from which it generates a sequence of assembly language instructions.

The examples in this chapter will illustrate several of the forms
for invoking @code{Asm}; a complete specification of the syntax
is found in the @code{Machine_Code_Insertions} section of the
@cite{GNAT Reference Manual}.

Under the standard GNAT conventions, the @code{Nothing} procedure
should be in a file named @code{nothing.adb}.
You can build the executable in the usual way:

@quotation

@example
$ gnatmake nothing
@end example
@end quotation

However, the interesting aspect of this example is not its run-time behavior
but rather the generated assembly code.
To see this output, invoke the compiler as follows:

@quotation

@example
$  gcc -c -S -fomit-frame-pointer -gnatp nothing.adb
@end example
@end quotation

where the options are:


@itemize *

@item 

@table @asis

@item @code{-c}

compile only (no bind or link)
@end table

@item 

@table @asis

@item @code{-S}

generate assembler listing
@end table

@item 

@table @asis

@item @code{-fomit-frame-pointer}

do not set up separate stack frames
@end table

@item 

@table @asis

@item @code{-gnatp}

do not add runtime checks
@end table
@end itemize

This gives a human-readable assembler version of the code. The resulting
file will have the same name as the Ada source file, but with a @code{.s}
extension. In our example, the file @code{nothing.s} has the following
contents:

@quotation

@example
.file "nothing.adb"
gcc2_compiled.:
___gnu_compiled_ada:
.text
   .align 4
.globl __ada_nothing
__ada_nothing:
#APP
   nop
#NO_APP
   jmp L1
   .align 2,0x90
L1:
   ret
@end example
@end quotation

The assembly code you included is clearly indicated by
the compiler, between the @code{#APP} and @code{#NO_APP}
delimiters. The character before the ‘APP’ and ‘NOAPP’
can differ on different targets. For example, GNU/Linux uses ‘#APP’ while
on NT you will see ‘/APP’.

If you make a mistake in your assembler code (such as using the
wrong size modifier, or using a wrong operand for the instruction) GNAT
will report this error in a temporary file, which will be deleted when
the compilation is finished.  Generating an assembler file will help
in such cases, since you can assemble this file separately using the
@code{as} assembler that comes with gcc.

Assembling the file using the command

@quotation

@example
$ as nothing.s
@end example
@end quotation

will give you error messages whose lines correspond to the assembler
input file, so you can easily find and correct any mistakes you made.
If there are no errors, @code{as} will generate an object file
@code{nothing.out}.

@node Output Variables in Inline Assembler,Input Variables in Inline Assembler,A Simple Example of Inline Assembler,Inline Assembler
@anchor{gnat_ugn/inline_assembler id4}@anchor{238}@anchor{gnat_ugn/inline_assembler output-variables-in-inline-assembler}@anchor{239}
@section Output Variables in Inline Assembler


The examples in this section, showing how to access the processor flags,
illustrate how to specify the destination operands for assembly language
statements.

@quotation

@example
with Interfaces; use Interfaces;
with Ada.Text_IO; use Ada.Text_IO;
with System.Machine_Code; use System.Machine_Code;
procedure Get_Flags is
   Flags : Unsigned_32;
   use ASCII;
begin
   Asm ("pushfl"          & LF & HT & -- push flags on stack
        "popl %%eax"      & LF & HT & -- load eax with flags
        "movl %%eax, %0",             -- store flags in variable
        Outputs => Unsigned_32'Asm_Output ("=g", Flags));
   Put_Line ("Flags register:" & Flags'Img);
end Get_Flags;
@end example
@end quotation

In order to have a nicely aligned assembly listing, we have separated
multiple assembler statements in the Asm template string with linefeed
(ASCII.LF) and horizontal tab (ASCII.HT) characters.
The resulting section of the assembly output file is:

@quotation

@example
#APP
   pushfl
   popl %eax
   movl %eax, -40(%ebp)
#NO_APP
@end example
@end quotation

It would have been legal to write the Asm invocation as:

@quotation

@example
Asm ("pushfl popl %%eax movl %%eax, %0")
@end example
@end quotation

but in the generated assembler file, this would come out as:

@quotation

@example
#APP
   pushfl popl %eax movl %eax, -40(%ebp)
#NO_APP
@end example
@end quotation

which is not so convenient for the human reader.

We use Ada comments
at the end of each line to explain what the assembler instructions
actually do.  This is a useful convention.

When writing Inline Assembler instructions, you need to precede each register
and variable name with a percent sign.  Since the assembler already requires
a percent sign at the beginning of a register name, you need two consecutive
percent signs for such names in the Asm template string, thus @code{%%eax}.
In the generated assembly code, one of the percent signs will be stripped off.

Names such as @code{%0}, @code{%1}, @code{%2}, etc., denote input or output
variables: operands you later define using @code{Input} or @code{Output}
parameters to @code{Asm}.
An output variable is illustrated in
the third statement in the Asm template string:

@quotation

@example
movl %%eax, %0
@end example
@end quotation

The intent is to store the contents of the eax register in a variable that can
be accessed in Ada.  Simply writing @code{movl %%eax, Flags} would not
necessarily work, since the compiler might optimize by using a register
to hold Flags, and the expansion of the @code{movl} instruction would not be
aware of this optimization.  The solution is not to store the result directly
but rather to advise the compiler to choose the correct operand form;
that is the purpose of the @code{%0} output variable.

Information about the output variable is supplied in the @code{Outputs}
parameter to @code{Asm}:

@quotation

@example
Outputs => Unsigned_32'Asm_Output ("=g", Flags));
@end example
@end quotation

The output is defined by the @code{Asm_Output} attribute of the target type;
the general format is

@quotation

@example
Type'Asm_Output (constraint_string, variable_name)
@end example
@end quotation

The constraint string directs the compiler how
to store/access the associated variable.  In the example

@quotation

@example
Unsigned_32'Asm_Output ("=m", Flags);
@end example
@end quotation

the @code{"m"} (memory) constraint tells the compiler that the variable
@code{Flags} should be stored in a memory variable, thus preventing
the optimizer from keeping it in a register.  In contrast,

@quotation

@example
Unsigned_32'Asm_Output ("=r", Flags);
@end example
@end quotation

uses the @code{"r"} (register) constraint, telling the compiler to
store the variable in a register.

If the constraint is preceded by the equal character ‘=’, it tells
the compiler that the variable will be used to store data into it.

In the @code{Get_Flags} example, we used the @code{"g"} (global) constraint,
allowing the optimizer to choose whatever it deems best.

There are a fairly large number of constraints, but the ones that are
most useful (for the Intel x86 processor) are the following:

@quotation


@multitable {xxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} 
@item

@emph{=}

@tab

output constraint

@item

@emph{g}

@tab

global (i.e., can be stored anywhere)

@item

@emph{m}

@tab

in memory

@item

@emph{I}

@tab

a constant

@item

@emph{a}

@tab

use eax

@item

@emph{b}

@tab

use ebx

@item

@emph{c}

@tab

use ecx

@item

@emph{d}

@tab

use edx

@item

@emph{S}

@tab

use esi

@item

@emph{D}

@tab

use edi

@item

@emph{r}

@tab

use one of eax, ebx, ecx or edx

@item

@emph{q}

@tab

use one of eax, ebx, ecx, edx, esi or edi

@end multitable

@end quotation

The full set of constraints is described in the gcc and @code{as}
documentation; note that it is possible to combine certain constraints
in one constraint string.

You specify the association of an output variable with an assembler operand
through the @code{%@emph{n}} notation, where @emph{n} is a non-negative
integer.  Thus in

@quotation

@example
Asm ("pushfl"          & LF & HT & -- push flags on stack
     "popl %%eax"      & LF & HT & -- load eax with flags
     "movl %%eax, %0",             -- store flags in variable
     Outputs => Unsigned_32'Asm_Output ("=g", Flags));
@end example
@end quotation

@code{%0} will be replaced in the expanded code by the appropriate operand,
whatever
the compiler decided for the @code{Flags} variable.

In general, you may have any number of output variables:


@itemize *

@item 
Count the operands starting at 0; thus @code{%0}, @code{%1}, etc.

@item 
Specify the @code{Outputs} parameter as a parenthesized comma-separated list
of @code{Asm_Output} attributes
@end itemize

For example:

@quotation

@example
Asm ("movl %%eax, %0" & LF & HT &
     "movl %%ebx, %1" & LF & HT &
     "movl %%ecx, %2",
     Outputs => (Unsigned_32'Asm_Output ("=g", Var_A),   --  %0 = Var_A
                 Unsigned_32'Asm_Output ("=g", Var_B),   --  %1 = Var_B
                 Unsigned_32'Asm_Output ("=g", Var_C))); --  %2 = Var_C
@end example
@end quotation

where @code{Var_A}, @code{Var_B}, and @code{Var_C} are variables
in the Ada program.

As a variation on the @code{Get_Flags} example, we can use the constraints
string to direct the compiler to store the eax register into the @code{Flags}
variable, instead of including the store instruction explicitly in the
@code{Asm} template string:

@quotation

@example
with Interfaces; use Interfaces;
with Ada.Text_IO; use Ada.Text_IO;
with System.Machine_Code; use System.Machine_Code;
procedure Get_Flags_2 is
   Flags : Unsigned_32;
   use ASCII;
begin
   Asm ("pushfl"      & LF & HT & -- push flags on stack
        "popl %%eax",             -- save flags in eax
        Outputs => Unsigned_32'Asm_Output ("=a", Flags));
   Put_Line ("Flags register:" & Flags'Img);
end Get_Flags_2;
@end example
@end quotation

The @code{"a"} constraint tells the compiler that the @code{Flags}
variable will come from the eax register. Here is the resulting code:

@quotation

@example
#APP
   pushfl
   popl %eax
#NO_APP
   movl %eax,-40(%ebp)
@end example
@end quotation

The compiler generated the store of eax into Flags after
expanding the assembler code.

Actually, there was no need to pop the flags into the eax register;
more simply, we could just pop the flags directly into the program variable:

@quotation

@example
with Interfaces; use Interfaces;
with Ada.Text_IO; use Ada.Text_IO;
with System.Machine_Code; use System.Machine_Code;
procedure Get_Flags_3 is
   Flags : Unsigned_32;
   use ASCII;
begin
   Asm ("pushfl"  & LF & HT & -- push flags on stack
        "pop %0",             -- save flags in Flags
        Outputs => Unsigned_32'Asm_Output ("=g", Flags));
   Put_Line ("Flags register:" & Flags'Img);
end Get_Flags_3;
@end example
@end quotation

@node Input Variables in Inline Assembler,Inlining Inline Assembler Code,Output Variables in Inline Assembler,Inline Assembler
@anchor{gnat_ugn/inline_assembler id5}@anchor{23a}@anchor{gnat_ugn/inline_assembler input-variables-in-inline-assembler}@anchor{23b}
@section Input Variables in Inline Assembler


The example in this section illustrates how to specify the source operands
for assembly language statements.
The program simply increments its input value by 1:

@quotation

@example
with Interfaces; use Interfaces;
with Ada.Text_IO; use Ada.Text_IO;
with System.Machine_Code; use System.Machine_Code;
procedure Increment is

   function Incr (Value : Unsigned_32) return Unsigned_32 is
      Result : Unsigned_32;
   begin
      Asm ("incl %0",
           Outputs => Unsigned_32'Asm_Output ("=a", Result),
           Inputs  => Unsigned_32'Asm_Input ("a", Value));
      return Result;
   end Incr;

   Value : Unsigned_32;

begin
   Value := 5;
   Put_Line ("Value before is" & Value'Img);
   Value := Incr (Value);
  Put_Line ("Value after is" & Value'Img);
end Increment;
@end example
@end quotation

The @code{Outputs} parameter to @code{Asm} specifies
that the result will be in the eax register and that it is to be stored
in the @code{Result} variable.

The @code{Inputs} parameter looks much like the @code{Outputs} parameter,
but with an @code{Asm_Input} attribute.
The @code{"="} constraint, indicating an output value, is not present.

You can have multiple input variables, in the same way that you can have more
than one output variable.

The parameter count (%0, %1) etc, still starts at the first output statement,
and continues with the input statements.

Just as the @code{Outputs} parameter causes the register to be stored into the
target variable after execution of the assembler statements, so does the
@code{Inputs} parameter cause its variable to be loaded into the register
before execution of the assembler statements.

Thus the effect of the @code{Asm} invocation is:


@itemize *

@item 
load the 32-bit value of @code{Value} into eax

@item 
execute the @code{incl %eax} instruction

@item 
store the contents of eax into the @code{Result} variable
@end itemize

The resulting assembler file (with @code{-O2} optimization) contains:

@quotation

@example
_increment__incr.1:
   subl $4,%esp
   movl 8(%esp),%eax
#APP
   incl %eax
#NO_APP
   movl %eax,%edx
   movl %ecx,(%esp)
   addl $4,%esp
   ret
@end example
@end quotation

@node Inlining Inline Assembler Code,Other Asm Functionality,Input Variables in Inline Assembler,Inline Assembler
@anchor{gnat_ugn/inline_assembler id6}@anchor{23c}@anchor{gnat_ugn/inline_assembler inlining-inline-assembler-code}@anchor{23d}
@section Inlining Inline Assembler Code


For a short subprogram such as the @code{Incr} function in the previous
section, the overhead of the call and return (creating / deleting the stack
frame) can be significant, compared to the amount of code in the subprogram
body.  A solution is to apply Ada’s @code{Inline} pragma to the subprogram,
which directs the compiler to expand invocations of the subprogram at the
point(s) of call, instead of setting up a stack frame for out-of-line calls.
Here is the resulting program:

@quotation

@example
with Interfaces; use Interfaces;
with Ada.Text_IO; use Ada.Text_IO;
with System.Machine_Code; use System.Machine_Code;
procedure Increment_2 is

   function Incr (Value : Unsigned_32) return Unsigned_32 is
      Result : Unsigned_32;
   begin
      Asm ("incl %0",
           Outputs => Unsigned_32'Asm_Output ("=a", Result),
           Inputs  => Unsigned_32'Asm_Input ("a", Value));
      return Result;
   end Incr;
   pragma Inline (Increment);

   Value : Unsigned_32;

begin
   Value := 5;
   Put_Line ("Value before is" & Value'Img);
   Value := Increment (Value);
   Put_Line ("Value after is" & Value'Img);
end Increment_2;
@end example
@end quotation

Compile the program with both optimization (@code{-O2}) and inlining
(@code{-gnatn}) enabled.

The @code{Incr} function is still compiled as usual, but at the
point in @code{Increment} where our function used to be called:

@quotation

@example
pushl %edi
call _increment__incr.1
@end example
@end quotation

the code for the function body directly appears:

@quotation

@example
movl %esi,%eax
#APP
   incl %eax
#NO_APP
   movl %eax,%edx
@end example
@end quotation

thus saving the overhead of stack frame setup and an out-of-line call.

@node Other Asm Functionality,,Inlining Inline Assembler Code,Inline Assembler
@anchor{gnat_ugn/inline_assembler id7}@anchor{23e}@anchor{gnat_ugn/inline_assembler other-asm-functionality}@anchor{23f}
@section Other @code{Asm} Functionality


This section describes two important parameters to the @code{Asm}
procedure: @code{Clobber}, which identifies register usage;
and @code{Volatile}, which inhibits unwanted optimizations.

@menu
* The Clobber Parameter:: 
* The Volatile Parameter:: 

@end menu

@node The Clobber Parameter,The Volatile Parameter,,Other Asm Functionality
@anchor{gnat_ugn/inline_assembler id8}@anchor{240}@anchor{gnat_ugn/inline_assembler the-clobber-parameter}@anchor{241}
@subsection The @code{Clobber} Parameter


One of the dangers of intermixing assembly language and a compiled language
such as Ada is that the compiler needs to be aware of which registers are
being used by the assembly code.  In some cases, such as the earlier examples,
the constraint string is sufficient to indicate register usage (e.g.,
@code{"a"} for
the eax register).  But more generally, the compiler needs an explicit
identification of the registers that are used by the Inline Assembly
statements.

Using a register that the compiler doesn’t know about
could be a side effect of an instruction (like @code{mull}
storing its result in both eax and edx).
It can also arise from explicit register usage in your
assembly code; for example:

@quotation

@example
Asm ("movl %0, %%ebx" & LF & HT &
     "movl %%ebx, %1",
     Outputs => Unsigned_32'Asm_Output ("=g", Var_Out),
     Inputs  => Unsigned_32'Asm_Input  ("g", Var_In));
@end example
@end quotation

where the compiler (since it does not analyze the @code{Asm} template string)
does not know you are using the ebx register.

In such cases you need to supply the @code{Clobber} parameter to @code{Asm},
to identify the registers that will be used by your assembly code:

@quotation

@example
Asm ("movl %0, %%ebx" & LF & HT &
     "movl %%ebx, %1",
     Outputs => Unsigned_32'Asm_Output ("=g", Var_Out),
     Inputs  => Unsigned_32'Asm_Input  ("g", Var_In),
     Clobber => "ebx");
@end example
@end quotation

The Clobber parameter is a static string expression specifying the
register(s) you are using.  Note that register names are @emph{not} prefixed
by a percent sign. Also, if more than one register is used then their names
are separated by commas; e.g., @code{"eax, ebx"}

The @code{Clobber} parameter has several additional uses:


@itemize *

@item 
Use ‘register’ name @code{cc} to indicate that flags might have changed

@item 
Use ‘register’ name @code{memory} if you changed a memory location
@end itemize

@node The Volatile Parameter,,The Clobber Parameter,Other Asm Functionality
@anchor{gnat_ugn/inline_assembler id9}@anchor{242}@anchor{gnat_ugn/inline_assembler the-volatile-parameter}@anchor{243}
@subsection The @code{Volatile} Parameter


@geindex Volatile parameter

Compiler optimizations in the presence of Inline Assembler may sometimes have
unwanted effects.  For example, when an @code{Asm} invocation with an input
variable is inside a loop, the compiler might move the loading of the input
variable outside the loop, regarding it as a one-time initialization.

If this effect is not desired, you can disable such optimizations by setting
the @code{Volatile} parameter to @code{True}; for example:

@quotation

@example
Asm ("movl %0, %%ebx" & LF & HT &
     "movl %%ebx, %1",
     Outputs  => Unsigned_32'Asm_Output ("=g", Var_Out),
     Inputs   => Unsigned_32'Asm_Input  ("g", Var_In),
     Clobber  => "ebx",
     Volatile => True);
@end example
@end quotation

By default, @code{Volatile} is set to @code{False} unless there is no
@code{Outputs} parameter.

Although setting @code{Volatile} to @code{True} prevents unwanted
optimizations, it will also disable other optimizations that might be
important for efficiency. In general, you should set @code{Volatile}
to @code{True} only if the compiler’s optimizations have created
problems.

@node GNU Free Documentation License,Index,Inline Assembler,Top
@anchor{share/gnu_free_documentation_license doc}@anchor{244}@anchor{share/gnu_free_documentation_license gnu-fdl}@anchor{1}@anchor{share/gnu_free_documentation_license gnu-free-documentation-license}@anchor{245}
@chapter GNU Free Documentation License


Version 1.3, 3 November 2008

Copyright  2000, 2001, 2002, 2007, 2008  Free Software Foundation, Inc
@indicateurl{https://fsf.org/}

Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.

@strong{Preamble}

The purpose of this License is to make a manual, textbook, or other
functional and useful document “free” in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or noncommercially.
Secondarily, this License preserves for the author and publisher a way
to get credit for their work, while not being considered responsible
for modifications made by others.

This License is a kind of “copyleft”, which means that derivative
works of the document must themselves be free in the same sense.  It
complements the GNU General Public License, which is a copyleft
license designed for free software.

We have designed this License in order to use it for manuals for free
software, because free software needs free documentation: a free
program should come with manuals providing the same freedoms that the
software does.  But this License is not limited to software manuals;
it can be used for any textual work, regardless of subject matter or
whether it is published as a printed book.  We recommend this License
principally for works whose purpose is instruction or reference.

@strong{1. APPLICABILITY AND DEFINITIONS}

This License applies to any manual or other work, in any medium, that
contains a notice placed by the copyright holder saying it can be
distributed under the terms of this License.  Such a notice grants a
world-wide, royalty-free license, unlimited in duration, to use that
work under the conditions stated herein.  The @strong{Document}, below,
refers to any such manual or work.  Any member of the public is a
licensee, and is addressed as “@strong{you}”.  You accept the license if you
copy, modify or distribute the work in a way requiring permission
under copyright law.

A “@strong{Modified Version}” of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.

A “@strong{Secondary Section}” is a named appendix or a front-matter section of
the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document’s overall subject
(or to related matters) and contains nothing that could fall directly
within that overall subject.  (Thus, if the Document is in part a
textbook of mathematics, a Secondary Section may not explain any
mathematics.)  The relationship could be a matter of historical
connection with the subject or with related matters, or of legal,
commercial, philosophical, ethical or political position regarding
them.

The “@strong{Invariant Sections}” are certain Secondary Sections whose titles
are designated, as being those of Invariant Sections, in the notice
that says that the Document is released under this License.  If a
section does not fit the above definition of Secondary then it is not
allowed to be designated as Invariant.  The Document may contain zero
Invariant Sections.  If the Document does not identify any Invariant
Sections then there are none.

The “@strong{Cover Texts}” are certain short passages of text that are listed,
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
the Document is released under this License.  A Front-Cover Text may
be at most 5 words, and a Back-Cover Text may be at most 25 words.

A “@strong{Transparent}” copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed of
pixels) generic paint programs or (for drawings) some widely available
drawing editor, and that is suitable for input to text formatters or
for automatic translation to a variety of formats suitable for input
to text formatters.  A copy made in an otherwise Transparent file
format whose markup, or absence of markup, has been arranged to thwart
or discourage subsequent modification by readers is not Transparent.
An image format is not Transparent if used for any substantial amount
of text.  A copy that is not “Transparent” is called @strong{Opaque}.

Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format, SGML
or XML using a publicly available DTD, and standard-conforming simple
HTML, PostScript or PDF designed for human modification.  Examples of
transparent image formats include PNG, XCF and JPG.  Opaque formats
include proprietary formats that can be read and edited only by
proprietary word processors, SGML or XML for which the DTD and/or
processing tools are not generally available, and the
machine-generated HTML, PostScript or PDF produced by some word
processors for output purposes only.

The “@strong{Title Page}” means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the material
this License requires to appear in the title page.  For works in
formats which do not have any title page as such, “Title Page” means
the text near the most prominent appearance of the work’s title,
preceding the beginning of the body of the text.

The “@strong{publisher}” means any person or entity that distributes
copies of the Document to the public.

A section “@strong{Entitled XYZ}” means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language.  (Here XYZ stands for a
specific section name mentioned below, such as “@strong{Acknowledgements}”,
“@strong{Dedications}”, “@strong{Endorsements}”, or “@strong{History}”.)
To “@strong{Preserve the Title}”
of such a section when you modify the Document means that it remains a
section “Entitled XYZ” according to this definition.

The Document may include Warranty Disclaimers next to the notice which
states that this License applies to the Document.  These Warranty
Disclaimers are considered to be included by reference in this
License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and has
no effect on the meaning of this License.

@strong{2. VERBATIM COPYING}

You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License applies
to the Document are reproduced in all copies, and that you add no other
conditions whatsoever to those of this License.  You may not use
technical measures to obstruct or control the reading or further
copying of the copies you make or distribute.  However, you may accept
compensation in exchange for copies.  If you distribute a large enough
number of copies you must also follow the conditions in section 3.

You may also lend copies, under the same conditions stated above, and
you may publicly display copies.

@strong{3. COPYING IN QUANTITY}

If you publish printed copies (or copies in media that commonly have
printed covers) of the Document, numbering more than 100, and the
Document’s license notice requires Cover Texts, you must enclose the
copies in covers that carry, clearly and legibly, all these Cover
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover.  Both covers must also clearly and legibly identify
you as the publisher of these copies.  The front cover must present
the full title with all words of the title equally prominent and
visible.  You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve
the title of the Document and satisfy these conditions, can be treated
as verbatim copying in other respects.

If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto adjacent
pages.

If you publish or distribute Opaque copies of the Document numbering
more than 100, you must either include a machine-readable Transparent
copy along with each Opaque copy, or state in or with each Opaque copy
a computer-network location from which the general network-using
public has access to download using public-standard network protocols
a complete Transparent copy of the Document, free of added material.
If you use the latter option, you must take reasonably prudent steps,
when you begin distribution of Opaque copies in quantity, to ensure
that this Transparent copy will remain thus accessible at the stated
location until at least one year after the last time you distribute an
Opaque copy (directly or through your agents or retailers) of that
edition to the public.

It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to give
them a chance to provide you with an updated version of the Document.

@strong{4. MODIFICATIONS}

You may copy and distribute a Modified Version of the Document under
the conditions of sections 2 and 3 above, provided that you release
the Modified Version under precisely this License, with the Modified
Version filling the role of the Document, thus licensing distribution
and modification of the Modified Version to whoever possesses a copy
of it.  In addition, you must do these things in the Modified Version:


@enumerate A

@item 
Use in the Title Page (and on the covers, if any) a title distinct
from that of the Document, and from those of previous versions
(which should, if there were any, be listed in the History section
of the Document).  You may use the same title as a previous version
if the original publisher of that version gives permission.

@item 
List on the Title Page, as authors, one or more persons or entities
responsible for authorship of the modifications in the Modified
Version, together with at least five of the principal authors of the
Document (all of its principal authors, if it has fewer than five),
unless they release you from this requirement.

@item 
State on the Title page the name of the publisher of the
Modified Version, as the publisher.

@item 
Preserve all the copyright notices of the Document.

@item 
Add an appropriate copyright notice for your modifications
adjacent to the other copyright notices.

@item 
Include, immediately after the copyright notices, a license notice
giving the public permission to use the Modified Version under the
terms of this License, in the form shown in the Addendum below.

@item 
Preserve in that license notice the full lists of Invariant Sections
and required Cover Texts given in the Document’s license notice.

@item 
Include an unaltered copy of this License.

@item 
Preserve the section Entitled “History”, Preserve its Title, and add
to it an item stating at least the title, year, new authors, and
publisher of the Modified Version as given on the Title Page.  If
there is no section Entitled “History” in the Document, create one
stating the title, year, authors, and publisher of the Document as
given on its Title Page, then add an item describing the Modified
Version as stated in the previous sentence.

@item 
Preserve the network location, if any, given in the Document for
public access to a Transparent copy of the Document, and likewise
the network locations given in the Document for previous versions
it was based on.  These may be placed in the “History” section.
You may omit a network location for a work that was published at
least four years before the Document itself, or if the original
publisher of the version it refers to gives permission.

@item 
For any section Entitled “Acknowledgements” or “Dedications”,
Preserve the Title of the section, and preserve in the section all
the substance and tone of each of the contributor acknowledgements
and/or dedications given therein.

@item 
Preserve all the Invariant Sections of the Document,
unaltered in their text and in their titles.  Section numbers
or the equivalent are not considered part of the section titles.

@item 
Delete any section Entitled “Endorsements”.  Such a section
may not be included in the Modified Version.

@item 
Do not retitle any existing section to be Entitled “Endorsements”
or to conflict in title with any Invariant Section.

@item 
Preserve any Warranty Disclaimers.
@end enumerate

If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no material
copied from the Document, you may at your option designate some or all
of these sections as invariant.  To do this, add their titles to the
list of Invariant Sections in the Modified Version’s license notice.
These titles must be distinct from any other section titles.

You may add a section Entitled “Endorsements”, provided it contains
nothing but endorsements of your Modified Version by various
parties—for example, statements of peer review or that the text has
been approved by an organization as the authoritative definition of a
standard.

You may add a passage of up to five words as a Front-Cover Text, and a
passage of up to 25 words as a Back-Cover Text, to the end of the list
of Cover Texts in the Modified Version.  Only one passage of
Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity.  If the Document already
includes a cover text for the same cover, previously added by you or
by arrangement made by the same entity you are acting on behalf of,
you may not add another; but you may replace the old one, on explicit
permission from the previous publisher that added the old one.

The author(s) and publisher(s) of the Document do not by this License
give permission to use their names for publicity for or to assert or
imply endorsement of any Modified Version.

@strong{5. COMBINING DOCUMENTS}

You may combine the Document with other documents released under this
License, under the terms defined in section 4 above for modified
versions, provided that you include in the combination all of the
Invariant Sections of all of the original documents, unmodified, and
list them all as Invariant Sections of your combined work in its
license notice, and that you preserve all their Warranty Disclaimers.

The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy.  If there are multiple Invariant Sections with the same name but
different contents, make the title of each such section unique by
adding at the end of it, in parentheses, the name of the original
author or publisher of that section if known, or else a unique number.
Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.

In the combination, you must combine any sections Entitled “History”
in the various original documents, forming one section Entitled
“History”; likewise combine any sections Entitled “Acknowledgements”,
and any sections Entitled “Dedications”.  You must delete all sections
Entitled “Endorsements”.

@strong{6. COLLECTIONS OF DOCUMENTS}

You may make a collection consisting of the Document and other documents
released under this License, and replace the individual copies of this
License in the various documents with a single copy that is included in
the collection, provided that you follow the rules of this License for
verbatim copying of each of the documents in all other respects.

You may extract a single document from such a collection, and distribute
it individually under this License, provided you insert a copy of this
License into the extracted document, and follow this License in all
other respects regarding verbatim copying of that document.

@strong{7. AGGREGATION WITH INDEPENDENT WORKS}

A compilation of the Document or its derivatives with other separate
and independent documents or works, in or on a volume of a storage or
distribution medium, is called an “aggregate” if the copyright
resulting from the compilation is not used to limit the legal rights
of the compilation’s users beyond what the individual works permit.
When the Document is included in an aggregate, this License does not
apply to the other works in the aggregate which are not themselves
derivative works of the Document.

If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half of
the entire aggregate, the Document’s Cover Texts may be placed on
covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic form.
Otherwise they must appear on printed covers that bracket the whole
aggregate.

@strong{8. TRANSLATION}

Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section 4.
Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections.  You may include a
translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also include
the original English version of this License and the original versions
of those notices and disclaimers.  In case of a disagreement between
the translation and the original version of this License or a notice
or disclaimer, the original version will prevail.

If a section in the Document is Entitled “Acknowledgements”,
“Dedications”, or “History”, the requirement (section 4) to Preserve
its Title (section 1) will typically require changing the actual
title.

@strong{9. TERMINATION}

You may not copy, modify, sublicense, or distribute the Document
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense, or distribute it is void, and
will automatically terminate your rights under this License.

However, if you cease all violation of this License, then your license
from a particular copyright holder is reinstated (a) provisionally,
unless and until the copyright holder explicitly and finally
terminates your license, and (b) permanently, if the copyright holder
fails to notify you of the violation by some reasonable means prior to
60 days after the cessation.

Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, receipt of a copy of some or all of the same material does
not give you any rights to use it.

@strong{10. FUTURE REVISIONS OF THIS LICENSE}

The Free Software Foundation may publish new, revised versions
of the GNU Free Documentation License from time to time.  Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.  See
@indicateurl{https://www.gnu.org/copyleft/}.

Each version of the License is given a distinguishing version number.
If the Document specifies that a particular numbered version of this
License “or any later version” applies to it, you have the option of
following the terms and conditions either of that specified version or
of any later version that has been published (not as a draft) by the
Free Software Foundation.  If the Document does not specify a version
number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation.  If the Document
specifies that a proxy can decide which future versions of this
License can be used, that proxy’s public statement of acceptance of a
version permanently authorizes you to choose that version for the
Document.

@strong{11. RELICENSING}

“Massive Multiauthor Collaboration Site” (or “MMC Site”) means any
World Wide Web server that publishes copyrightable works and also
provides prominent facilities for anybody to edit those works.  A
public wiki that anybody can edit is an example of such a server.  A
“Massive Multiauthor Collaboration” (or “MMC”) contained in the
site means any set of copyrightable works thus published on the MMC
site.

“CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0
license published by Creative Commons Corporation, a not-for-profit
corporation with a principal place of business in San Francisco,
California, as well as future copyleft versions of that license
published by that same organization.

“Incorporate” means to publish or republish a Document, in whole or
in part, as part of another Document.

An MMC is “eligible for relicensing” if it is licensed under this
License, and if all works that were first published under this License
somewhere other than this MMC, and subsequently incorporated in whole
or in part into the MMC, (1) had no cover texts or invariant sections,
and (2) were thus incorporated prior to November 1, 2008.

The operator of an MMC Site may republish an MMC contained in the site
under CC-BY-SA on the same site at any time before August 1, 2009,
provided the MMC is eligible for relicensing.

@strong{ADDENDUM: How to use this License for your documents}

To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and
license notices just after the title page:

@quotation

Copyright © YEAR  YOUR NAME.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the section entitled “GNU
Free Documentation License”.
@end quotation

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
replace the “with … Texts.” line with this:

@quotation

with the Invariant Sections being LIST THEIR TITLES, with the
Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
@end quotation

If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.

If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License,
to permit their use in free software.

@node Index,,GNU Free Documentation License,Top
@unnumbered Index


@printindex ge

@anchor{cf}@w{                              }
@anchor{gnat_ugn/gnat_utility_programs switches-related-to-project-files}@w{                              }

@c %**end of body
@bye
