\input texinfo   @c -*-texinfo-*-
@c %**start of header
@setfilename gnat_ugn.info
@documentencoding UTF-8
@ifinfo
@*Generated by Sphinx 4.0.2.@*
@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 , Jun 23, 2021

AdaCore

Copyright @copyright{} 2008-2021, 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:: 

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
Compile_Time_Error
Compile_Time_Warning
Compiler_Unit
Compiler_Unit_Warning
Component_Alignment
Convention_Identifier
Debug_Policy
Detect_Blocking
Default_Scalar_Storage_Order
Default_Storage_Pool
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_Run_Time
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
Propagate_Exceptions
Queuing_Policy
Rational
Ravenscar
Rename_Pragma
Restricted_Run_Time
Restrictions
Restrictions_Warnings
Reviewable
Short_Circuit_And_Or
Short_Descriptors
Source_File_Name
Source_File_Name_Project
SPARK_Mode
Style_Checks
Suppress
Suppress_Exception_Locations
Task_Dispatching_Policy
Unevaluated_Use_Of_Old
Universal_Data
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 eithe 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 or complex structures are mapped to System.Address

@item 
identifiers with identical name (except casing) will 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
$ g++ -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 will then compile these Ada specs
in Ada 2005 mode.

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}}.

Note that we recommend when possible to use the @emph{g++} driver to
generate bindings, even for most C headers, since this will in general
generate better Ada specs. For generating bindings for C++ headers, it is
mandatory to use the @emph{g++} command, or @emph{gcc -x c++} which
is equivalent in this case. If @emph{g++} cannot work on your C headers
because of incompatibilities between C and C++, then you can fallback to
@code{gcc} instead.

For an example of better bindings generated from the C++ front-end,
the name of the parameters (when available) are actually ignored by the C
front-end. Consider the following C header:

@example
extern void foo (int variable);
@end example

with the C front-end, @code{variable} is ignored, and the above is handled as:

@example
extern void foo (int);
@end example

generating a generic:

@example
procedure foo (param1 : int);
@end example

with the C++ front-end, the name is available, and we generate:

@example
procedure foo (variable : int);
@end example

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
$ g++ -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
$ g++ -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 environents, 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, the actuals must denote objects of a composite
type, their memory locations must be identical or overlapping, and at least one
of the corresponding formal parameters must be of mode OUT or IN OUT.

@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 -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.
@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 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 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.
@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.

@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.

@menu
* Required Packages on GNU/Linux:: 

@end menu

@node Required Packages on GNU/Linux,,,GNU/Linux Topics
@anchor{gnat_ugn/platform_specific_information id7}@anchor{1bd}@anchor{gnat_ugn/platform_specific_information required-packages-on-gnu-linux}@anchor{1be}
@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.

@geindex Windows

@node Microsoft Windows Topics,Mac OS Topics,GNU/Linux Topics,Platform-Specific Information
@anchor{gnat_ugn/platform_specific_information id8}@anchor{1bf}@anchor{gnat_ugn/platform_specific_information microsoft-windows-topics}@anchor{1c0}
@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 id9}@anchor{1c1}@anchor{gnat_ugn/platform_specific_information using-gnat-on-windows}@anchor{1c2}
@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 id10}@anchor{1c3}@anchor{gnat_ugn/platform_specific_information using-a-network-installation-of-gnat}@anchor{1c4}
@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{1c5}@anchor{gnat_ugn/platform_specific_information id11}@anchor{1c6}
@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 id12}@anchor{1c7}@anchor{gnat_ugn/platform_specific_information temporary-files}@anchor{1c8}
@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{1c9}
@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{1ca}
@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 id13}@anchor{1cb}@anchor{gnat_ugn/platform_specific_information mixed-language-programming-on-windows}@anchor{1cc}
@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{1cd,,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{1ce,,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 id14}@anchor{1cf}@anchor{gnat_ugn/platform_specific_information windows-calling-conventions}@anchor{1d0}
@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{1d1}@anchor{gnat_ugn/platform_specific_information id15}@anchor{1d2}
@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{1d3,,Stdcall Calling Convention}).

@node Stdcall Calling Convention,Win32 Calling Convention,C Calling Convention,Windows Calling Conventions
@anchor{gnat_ugn/platform_specific_information id16}@anchor{1d4}@anchor{gnat_ugn/platform_specific_information stdcall-calling-convention}@anchor{1d3}
@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 id17}@anchor{1d5}@anchor{gnat_ugn/platform_specific_information win32-calling-convention}@anchor{1d6}
@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{1d7}@anchor{gnat_ugn/platform_specific_information id18}@anchor{1d8}
@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 id19}@anchor{1d9}@anchor{gnat_ugn/platform_specific_information introduction-to-dynamic-link-libraries-dlls}@anchor{1da}
@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{1db,,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 id20}@anchor{1dc}@anchor{gnat_ugn/platform_specific_information using-dlls-with-gnat}@anchor{1cd}
@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{1dd}@anchor{gnat_ugn/platform_specific_information id21}@anchor{1de}
@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{1df}@anchor{gnat_ugn/platform_specific_information id22}@anchor{1e0}
@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{1db}
@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{1d0,,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{1e1}
@subsubheading Creating a Definition File Automatically


You can automatically create the definition file @code{API.def}
(see @ref{1db,,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{1d0,,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{1e2}
@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{1e3,,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{1e3,,Using gnatdll} for more information about @code{gnatdll}).
@end quotation
@anchor{gnat_ugn/platform_specific_information msvs-style-import-library}@anchor{1e4}
@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{1cc,,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{1ce}@anchor{gnat_ugn/platform_specific_information id23}@anchor{1e5}
@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{1e6}@anchor{gnat_ugn/platform_specific_information id24}@anchor{1e7}
@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{1db,,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{1e8}@anchor{gnat_ugn/platform_specific_information id25}@anchor{1e9}
@subsubsection Building DLLs with gnatdll


@geindex DLLs
@geindex building

Note that it is preferred to use GNAT Project files
(@ref{1ce,,Building DLLs with GNAT Project files}) or the built-in GNAT
DLL support (@ref{1e6,,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{1ea,,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{1eb,,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{1ec,,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{1db,,The Definition File}).

@item 
Finally you must use @code{gnatdll} to produce the DLL and the import
library (@ref{1e3,,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{1ed}
@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{1ea}@anchor{gnat_ugn/platform_specific_information id26}@anchor{1ee}
@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{1ef,,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{1eb}@anchor{gnat_ugn/platform_specific_information id27}@anchor{1f0}
@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{1e3,,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{1ec}@anchor{gnat_ugn/platform_specific_information id28}@anchor{1f1}
@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{1e3,,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{1f2}@anchor{gnat_ugn/platform_specific_information id29}@anchor{1f3}
@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{1ef}@anchor{gnat_ugn/platform_specific_information id30}@anchor{1f4}
@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 id31}@anchor{1f5}@anchor{gnat_ugn/platform_specific_information using-gnatdll}@anchor{1e3}
@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{1f6,,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{1f6}
@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{1d0,,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{1f7}@anchor{gnat_ugn/platform_specific_information id32}@anchor{1f8}
@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{1f9}@anchor{gnat_ugn/platform_specific_information id33}@anchor{1fa}
@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{1fb}@anchor{gnat_ugn/platform_specific_information id34}@anchor{1fc}
@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 id35}@anchor{1fd}@anchor{gnat_ugn/platform_specific_information using-resources}@anchor{1fe}
@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{1ff}@anchor{gnat_ugn/platform_specific_information using-gnat-dlls-from-microsoft-visual-studio-applications}@anchor{200}
@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{1e1,,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{1e4,,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{201}@anchor{gnat_ugn/platform_specific_information id36}@anchor{202}
@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 id37}@anchor{203}@anchor{gnat_ugn/platform_specific_information program-and-dll-both-built-with-gcc-gnat}@anchor{204}
@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{1da,,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 id38}@anchor{205}@anchor{gnat_ugn/platform_specific_information program-built-with-foreign-tools-and-dll-built-with-gcc-gnat}@anchor{206}
@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{1da,,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 id39}@anchor{207}@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 id40}@anchor{208}@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{209}@anchor{gnat_ugn/platform_specific_information windows-specific-add-ons}@anchor{20a}
@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 id41}@anchor{20b}@anchor{gnat_ugn/platform_specific_information win32ada}@anchor{20c}
@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 id42}@anchor{20d}@anchor{gnat_ugn/platform_specific_information wposix}@anchor{20e}
@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 id43}@anchor{20f}@anchor{gnat_ugn/platform_specific_information mac-os-topics}@anchor{210}
@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{211}
@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{212}@anchor{gnat_ugn/example_of_binder_output example-of-binder-output-file}@anchor{e}@anchor{gnat_ugn/example_of_binder_output id1}@anchor{213}
@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{214}@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{215}
@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{216}@anchor{gnat_ugn/elaboration_order_handling_in_gnat id2}@anchor{217}
@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{218}@anchor{gnat_ugn/elaboration_order_handling_in_gnat id3}@anchor{219}
@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{21a}@anchor{gnat_ugn/elaboration_order_handling_in_gnat id4}@anchor{21b}
@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{21c}@anchor{gnat_ugn/elaboration_order_handling_in_gnat id5}@anchor{21d}
@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{21e}@anchor{gnat_ugn/elaboration_order_handling_in_gnat id6}@anchor{21f}
@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{220}@anchor{gnat_ugn/elaboration_order_handling_in_gnat mixing-elaboration-models}@anchor{221}
@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{222}@anchor{gnat_ugn/elaboration_order_handling_in_gnat id8}@anchor{223}
@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{224}@anchor{gnat_ugn/elaboration_order_handling_in_gnat spark-diagnostics}@anchor{225}
@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{226}@anchor{gnat_ugn/elaboration_order_handling_in_gnat id10}@anchor{227}
@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{228}@anchor{gnat_ugn/elaboration_order_handling_in_gnat resolving-elaboration-circularities}@anchor{229}
@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{22a}@anchor{gnat_ugn/elaboration_order_handling_in_gnat id12}@anchor{22b}
@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{22c}@anchor{gnat_ugn/elaboration_order_handling_in_gnat summary-of-procedures-for-elaboration-control}@anchor{22d}
@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{22e}@anchor{gnat_ugn/elaboration_order_handling_in_gnat inspecting-the-chosen-elaboration-order}@anchor{22f}
@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{230}@anchor{gnat_ugn/inline_assembler id1}@anchor{231}@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{232}@anchor{gnat_ugn/inline_assembler id2}@anchor{233}
@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{234}@anchor{gnat_ugn/inline_assembler id3}@anchor{235}
@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{236}@anchor{gnat_ugn/inline_assembler output-variables-in-inline-assembler}@anchor{237}
@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{238}@anchor{gnat_ugn/inline_assembler input-variables-in-inline-assembler}@anchor{239}
@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{23a}@anchor{gnat_ugn/inline_assembler inlining-inline-assembler-code}@anchor{23b}
@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{23c}@anchor{gnat_ugn/inline_assembler other-asm-functionality}@anchor{23d}
@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{23e}@anchor{gnat_ugn/inline_assembler the-clobber-parameter}@anchor{23f}
@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{240}@anchor{gnat_ugn/inline_assembler the-volatile-parameter}@anchor{241}
@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{242}@anchor{share/gnu_free_documentation_license gnu-fdl}@anchor{1}@anchor{share/gnu_free_documentation_license gnu-free-documentation-license}@anchor{243}
@chapter GNU Free Documentation License


Version 1.3, 3 November 2008

Copyright  2000, 2001, 2002, 2007, 2008  Free Software Foundation, Inc
@indicateurl{http://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{http://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
