diff gcc/ada/doc/gnat_rm/implementation_advice.rst @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 1830386684a0
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gcc/ada/doc/gnat_rm/implementation_advice.rst	Fri Oct 27 22:46:09 2017 +0900
@@ -0,0 +1,1395 @@
+.. _Implementation_Advice:
+
+*********************
+Implementation Advice
+*********************
+
+The main text of the Ada Reference Manual describes the required
+behavior of all Ada compilers, and the GNAT compiler conforms to
+these requirements.
+
+In addition, there are sections throughout the Ada Reference Manual headed
+by the phrase 'Implementation advice'.  These sections are not normative,
+i.e., they do not specify requirements that all compilers must
+follow.  Rather they provide advice on generally desirable behavior.
+They are not requirements, because they describe behavior that cannot
+be provided on all systems, or may be undesirable on some systems.
+
+As far as practical, GNAT follows the implementation advice in
+the Ada Reference Manual.  Each such RM section corresponds to a section
+in this chapter whose title specifies the
+RM section number and paragraph number and the subject of
+the advice.  The contents of each section consists of the RM text within
+quotation marks,
+followed by the GNAT interpretation of the advice.  Most often, this simply says
+'followed', which means that GNAT follows the advice.  However, in a
+number of cases, GNAT deliberately deviates from this advice, in which
+case the text describes what GNAT does and why.
+
+.. index:: Error detection
+
+RM 1.1.3(20): Error Detection
+=============================
+
+  "If an implementation detects the use of an unsupported Specialized Needs
+  Annex feature at run time, it should raise ``Program_Error`` if
+  feasible."
+
+Not relevant.  All specialized needs annex features are either supported,
+or diagnosed at compile time.
+
+.. index:: Child Units
+
+RM 1.1.3(31): Child Units
+=========================
+
+
+  "If an implementation wishes to provide implementation-defined
+  extensions to the functionality of a language-defined library unit, it
+  should normally do so by adding children to the library unit."
+
+Followed.
+
+.. index:: Bounded errors
+
+RM 1.1.5(12): Bounded Errors
+============================
+
+  "If an implementation detects a bounded error or erroneous
+  execution, it should raise ``Program_Error``."
+
+Followed in all cases in which the implementation detects a bounded
+error or erroneous execution.  Not all such situations are detected at
+runtime.
+
+.. index:: Pragmas
+
+.. _RM_2_8_16_Pragmas:
+
+RM 2.8(16): Pragmas
+===================
+
+  "Normally, implementation-defined pragmas should have no semantic effect
+  for error-free programs; that is, if the implementation-defined pragmas
+  are removed from a working program, the program should still be legal,
+  and should still have the same semantics."
+
+The following implementation defined pragmas are exceptions to this
+rule:
+
++--------------------+-------------------+
+| Pragma             | Explanation       |
++====================+===================+
+| *Abort_Defer*      | Affects semantics |
++--------------------+-------------------+
+|*Ada_83*            | Affects legality  |
++--------------------+-------------------+
+|*Assert*            | Affects semantics |
++--------------------+-------------------+
+|*CPP_Class*         | Affects semantics |
++--------------------+-------------------+
+|*CPP_Constructor*   | Affects semantics |
++--------------------+-------------------+
+|*Debug*             | Affects semantics |
++--------------------+-------------------+
+|*Interface_Name*    | Affects semantics |
++--------------------+-------------------+
+|*Machine_Attribute* | Affects semantics |
++--------------------+-------------------+
+|*Unimplemented_Unit*| Affects legality  |
++--------------------+-------------------+
+|*Unchecked_Union*   | Affects semantics |
++--------------------+-------------------+
+
+In each of the above cases, it is essential to the purpose of the pragma
+that this advice not be followed.  For details see
+:ref:`Implementation_Defined_Pragmas`.
+
+RM 2.8(17-19): Pragmas
+======================
+
+  "Normally, an implementation should not define pragmas that can
+  make an illegal program legal, except as follows:
+
+  * A pragma used to complete a declaration, such as a pragma ``Import``;
+
+  * A pragma used to configure the environment by adding, removing, or
+    replacing ``library_items``."
+
+See :ref:`RM_2_8_16_Pragmas`.
+
+.. index:: Character Sets
+
+.. index:: Alternative Character Sets
+
+RM 3.5.2(5): Alternative Character Sets
+=======================================
+
+  "If an implementation supports a mode with alternative interpretations
+  for ``Character`` and ``Wide_Character``, the set of graphic
+  characters of ``Character`` should nevertheless remain a proper
+  subset of the set of graphic characters of ``Wide_Character``.  Any
+  character set 'localizations' should be reflected in the results of
+  the subprograms defined in the language-defined package
+  ``Characters.Handling`` (see A.3) available in such a mode.  In a mode with
+  an alternative interpretation of ``Character``, the implementation should
+  also support a corresponding change in what is a legal
+  ``identifier_letter``."
+
+Not all wide character modes follow this advice, in particular the JIS
+and IEC modes reflect standard usage in Japan, and in these encoding,
+the upper half of the Latin-1 set is not part of the wide-character
+subset, since the most significant bit is used for wide character
+encoding.  However, this only applies to the external forms.  Internally
+there is no such restriction.
+
+.. index:: Integer types
+
+RM 3.5.4(28): Integer Types
+===========================
+
+  "An implementation should support ``Long_Integer`` in addition to
+  ``Integer`` if the target machine supports 32-bit (or longer)
+  arithmetic.  No other named integer subtypes are recommended for package
+  ``Standard``.  Instead, appropriate named integer subtypes should be
+  provided in the library package ``Interfaces`` (see B.2)."
+
+``Long_Integer`` is supported.  Other standard integer types are supported
+so this advice is not fully followed.  These types
+are supported for convenient interface to C, and so that all hardware
+types of the machine are easily available.
+
+RM 3.5.4(29): Integer Types
+===========================
+
+  "An implementation for a two's complement machine should support
+  modular types with a binary modulus up to ``System.Max_Int*2+2``.  An
+  implementation should support a non-binary modules up to ``Integer'Last``."
+
+Followed.
+
+.. index:: Enumeration values
+
+RM 3.5.5(8): Enumeration Values
+===============================
+
+  "For the evaluation of a call on ``S'Pos`` for an enumeration
+  subtype, if the value of the operand does not correspond to the internal
+  code for any enumeration literal of its type (perhaps due to an
+  un-initialized variable), then the implementation should raise
+  ``Program_Error``.  This is particularly important for enumeration
+  types with noncontiguous internal codes specified by an
+  enumeration_representation_clause."
+
+Followed.
+
+.. index:: Float types
+
+RM 3.5.7(17): Float Types
+=========================
+
+  "An implementation should support ``Long_Float`` in addition to
+  ``Float`` if the target machine supports 11 or more digits of
+  precision.  No other named floating point subtypes are recommended for
+  package ``Standard``.  Instead, appropriate named floating point subtypes
+  should be provided in the library package ``Interfaces`` (see B.2)."
+
+``Short_Float`` and ``Long_Long_Float`` are also provided.  The
+former provides improved compatibility with other implementations
+supporting this type.  The latter corresponds to the highest precision
+floating-point type supported by the hardware.  On most machines, this
+will be the same as ``Long_Float``, but on some machines, it will
+correspond to the IEEE extended form.  The notable case is all ia32
+(x86) implementations, where ``Long_Long_Float`` corresponds to
+the 80-bit extended precision format supported in hardware on this
+processor.  Note that the 128-bit format on SPARC is not supported,
+since this is a software rather than a hardware format.
+
+.. index:: Multidimensional arrays
+
+.. index:: Arrays, multidimensional
+
+RM 3.6.2(11): Multidimensional Arrays
+=====================================
+
+  "An implementation should normally represent multidimensional arrays in
+  row-major order, consistent with the notation used for multidimensional
+  array aggregates (see 4.3.3).  However, if a pragma ``Convention``
+  (``Fortran``, ...) applies to a multidimensional array type, then
+  column-major order should be used instead (see B.5, *Interfacing with Fortran*)."
+
+Followed.
+
+.. index:: Duration'Small
+
+RM 9.6(30-31): Duration'Small
+=============================
+
+  "Whenever possible in an implementation, the value of ``Duration'Small``
+  should be no greater than 100 microseconds."
+
+Followed.  (``Duration'Small`` = 10**(-9)).
+
+  "The time base for ``delay_relative_statements`` should be monotonic;
+  it need not be the same time base as used for ``Calendar.Clock``."
+
+Followed.
+
+RM 10.2.1(12): Consistent Representation
+========================================
+
+  "In an implementation, a type declared in a pre-elaborated package should
+  have the same representation in every elaboration of a given version of
+  the package, whether the elaborations occur in distinct executions of
+  the same program, or in executions of distinct programs or partitions
+  that include the given version."
+
+Followed, except in the case of tagged types.  Tagged types involve
+implicit pointers to a local copy of a dispatch table, and these pointers
+have representations which thus depend on a particular elaboration of the
+package.  It is not easy to see how it would be possible to follow this
+advice without severely impacting efficiency of execution.
+
+.. index:: Exception information
+
+RM 11.4.1(19): Exception Information
+====================================
+
+  "``Exception_Message`` by default and ``Exception_Information``
+  should produce information useful for
+  debugging.  ``Exception_Message`` should be short, about one
+  line.  ``Exception_Information`` can be long.  ``Exception_Message``
+  should not include the
+  ``Exception_Name``.  ``Exception_Information`` should include both
+  the ``Exception_Name`` and the ``Exception_Message``."
+
+Followed.  For each exception that doesn't have a specified
+``Exception_Message``, the compiler generates one containing the location
+of the raise statement.  This location has the form 'file_name:line', where
+file_name is the short file name (without path information) and line is the line
+number in the file.  Note that in the case of the Zero Cost Exception
+mechanism, these messages become redundant with the Exception_Information that
+contains a full backtrace of the calling sequence, so they are disabled.
+To disable explicitly the generation of the source location message, use the
+Pragma ``Discard_Names``.
+
+.. index:: Suppression of checks
+
+.. index:: Checks, suppression of
+
+RM 11.5(28): Suppression of Checks
+==================================
+
+  "The implementation should minimize the code executed for checks that
+  have been suppressed."
+
+Followed.
+
+.. index:: Representation clauses
+
+RM 13.1 (21-24): Representation Clauses
+=======================================
+
+  "The recommended level of support for all representation items is
+  qualified as follows:
+
+  An implementation need not support representation items containing
+  nonstatic expressions, except that an implementation should support a
+  representation item for a given entity if each nonstatic expression in
+  the representation item is a name that statically denotes a constant
+  declared before the entity."
+
+Followed.  In fact, GNAT goes beyond the recommended level of support
+by allowing nonstatic expressions in some representation clauses even
+without the need to declare constants initialized with the values of
+such expressions.
+For example:
+
+.. code-block:: ada
+
+    X : Integer;
+    Y : Float;
+    for Y'Address use X'Address;>>
+
+
+  "An implementation need not support a specification for the ``Size``
+  for a given composite subtype, nor the size or storage place for an
+  object (including a component) of a given composite subtype, unless the
+  constraints on the subtype and its composite subcomponents (if any) are
+  all static constraints."
+
+Followed.  Size Clauses are not permitted on nonstatic components, as
+described above.
+
+
+  "An aliased component, or a component whose type is by-reference, should
+  always be allocated at an addressable location."
+
+Followed.
+
+.. index:: Packed types
+
+RM 13.2(6-8): Packed Types
+==========================
+
+  "If a type is packed, then the implementation should try to minimize
+  storage allocated to objects of the type, possibly at the expense of
+  speed of accessing components, subject to reasonable complexity in
+  addressing calculations.
+
+  The recommended level of support pragma ``Pack`` is:
+
+  For a packed record type, the components should be packed as tightly as
+  possible subject to the Sizes of the component subtypes, and subject to
+  any *record_representation_clause* that applies to the type; the
+  implementation may, but need not, reorder components or cross aligned
+  word boundaries to improve the packing.  A component whose ``Size`` is
+  greater than the word size may be allocated an integral number of words."
+
+Followed.  Tight packing of arrays is supported for all component sizes
+up to 64-bits. If the array component size is 1 (that is to say, if
+the component is a boolean type or an enumeration type with two values)
+then values of the type are implicitly initialized to zero. This
+happens both for objects of the packed type, and for objects that have a
+subcomponent of the packed type.
+
+
+  "An implementation should support Address clauses for imported
+  subprograms."
+
+Followed.
+
+.. index:: Address clauses
+
+RM 13.3(14-19): Address Clauses
+===============================
+
+  "For an array ``X``, ``X'Address`` should point at the first
+  component of the array, and not at the array bounds."
+
+Followed.
+
+  "The recommended level of support for the ``Address`` attribute is:
+
+  ``X'Address`` should produce a useful result if ``X`` is an
+  object that is aliased or of a by-reference type, or is an entity whose
+  ``Address`` has been specified."
+
+Followed.  A valid address will be produced even if none of those
+conditions have been met.  If necessary, the object is forced into
+memory to ensure the address is valid.
+
+  "An implementation should support ``Address`` clauses for imported
+  subprograms."
+
+Followed.
+
+  "Objects (including subcomponents) that are aliased or of a by-reference
+  type should be allocated on storage element boundaries."
+
+Followed.
+
+  "If the ``Address`` of an object is specified, or it is imported or exported,
+  then the implementation should not perform optimizations based on
+  assumptions of no aliases."
+
+Followed.
+
+.. index:: Alignment clauses
+
+RM 13.3(29-35): Alignment Clauses
+=================================
+
+  "The recommended level of support for the ``Alignment`` attribute for
+  subtypes is:
+
+  An implementation should support specified Alignments that are factors
+  and multiples of the number of storage elements per word, subject to the
+  following:"
+
+Followed.
+
+  "An implementation need not support specified Alignments for
+  combinations of Sizes and Alignments that cannot be easily
+  loaded and stored by available machine instructions."
+
+Followed.
+
+  "An implementation need not support specified Alignments that are
+  greater than the maximum ``Alignment`` the implementation ever returns by
+  default."
+
+Followed.
+
+  "The recommended level of support for the ``Alignment`` attribute for
+  objects is:
+
+  Same as above, for subtypes, but in addition:"
+
+Followed.
+
+  "For stand-alone library-level objects of statically constrained
+  subtypes, the implementation should support all alignments
+  supported by the target linker.  For example, page alignment is likely to
+  be supported for such objects, but not for subtypes."
+
+Followed.
+
+.. index:: Size clauses
+
+RM 13.3(42-43): Size Clauses
+============================
+
+  "The recommended level of support for the ``Size`` attribute of
+  objects is:
+
+  A ``Size`` clause should be supported for an object if the specified
+  ``Size`` is at least as large as its subtype's ``Size``, and
+  corresponds to a size in storage elements that is a multiple of the
+  object's ``Alignment`` (if the ``Alignment`` is nonzero)."
+
+Followed.
+
+RM 13.3(50-56): Size Clauses
+============================
+
+  "If the ``Size`` of a subtype is specified, and allows for efficient
+  independent addressability (see 9.10) on the target architecture, then
+  the ``Size`` of the following objects of the subtype should equal the
+  ``Size`` of the subtype:
+
+  Aliased objects (including components)."
+
+Followed.
+
+  "`Size` clause on a composite subtype should not affect the
+  internal layout of components."
+
+Followed. But note that this can be overridden by use of the implementation
+pragma Implicit_Packing in the case of packed arrays.
+
+  "The recommended level of support for the ``Size`` attribute of subtypes is:
+
+  The ``Size`` (if not specified) of a static discrete or fixed point
+  subtype should be the number of bits needed to represent each value
+  belonging to the subtype using an unbiased representation, leaving space
+  for a sign bit only if the subtype contains negative values.  If such a
+  subtype is a first subtype, then an implementation should support a
+  specified ``Size`` for it that reflects this representation."
+
+Followed.
+
+  "For a subtype implemented with levels of indirection, the ``Size``
+  should include the size of the pointers, but not the size of what they
+  point at."
+
+Followed.
+
+.. index:: Component_Size clauses
+
+RM 13.3(71-73): Component Size Clauses
+======================================
+
+  "The recommended level of support for the ``Component_Size``
+  attribute is:
+
+  An implementation need not support specified ``Component_Sizes`` that are
+  less than the ``Size`` of the component subtype."
+
+Followed.
+
+  "An implementation should support specified Component_Sizes that
+  are factors and multiples of the word size.  For such
+  Component_Sizes, the array should contain no gaps between
+  components.  For other Component_Sizes (if supported), the array
+  should contain no gaps between components when packing is also
+  specified; the implementation should forbid this combination in cases
+  where it cannot support a no-gaps representation."
+
+Followed.
+
+.. index:: Enumeration representation clauses
+
+.. index:: Representation clauses, enumeration
+
+RM 13.4(9-10): Enumeration Representation Clauses
+=================================================
+
+  "The recommended level of support for enumeration representation clauses
+  is:
+
+  An implementation need not support enumeration representation clauses
+  for boolean types, but should at minimum support the internal codes in
+  the range ``System.Min_Int .. System.Max_Int``."
+
+Followed.
+
+.. index:: Record representation clauses
+
+.. index:: Representation clauses, records
+
+RM 13.5.1(17-22): Record Representation Clauses
+===============================================
+
+  "The recommended level of support for
+  *record_representation_clause*\ s is:
+
+  An implementation should support storage places that can be extracted
+  with a load, mask, shift sequence of machine code, and set with a load,
+  shift, mask, store sequence, given the available machine instructions
+  and run-time model."
+
+Followed.
+
+  "A storage place should be supported if its size is equal to the
+  ``Size`` of the component subtype, and it starts and ends on a
+  boundary that obeys the ``Alignment`` of the component subtype."
+
+Followed.
+
+  "If the default bit ordering applies to the declaration of a given type,
+  then for a component whose subtype's ``Size`` is less than the word
+  size, any storage place that does not cross an aligned word boundary
+  should be supported."
+
+Followed.
+
+  "An implementation may reserve a storage place for the tag field of a
+  tagged type, and disallow other components from overlapping that place."
+
+Followed.  The storage place for the tag field is the beginning of the tagged
+record, and its size is Address'Size.  GNAT will reject an explicit component
+clause for the tag field.
+
+  "An implementation need not support a *component_clause* for a
+  component of an extension part if the storage place is not after the
+  storage places of all components of the parent type, whether or not
+  those storage places had been specified."
+
+Followed.  The above advice on record representation clauses is followed,
+and all mentioned features are implemented.
+
+.. index:: Storage place attributes
+
+RM 13.5.2(5): Storage Place Attributes
+======================================
+
+  "If a component is represented using some form of pointer (such as an
+  offset) to the actual data of the component, and this data is contiguous
+  with the rest of the object, then the storage place attributes should
+  reflect the place of the actual data, not the pointer.  If a component is
+  allocated discontinuously from the rest of the object, then a warning
+  should be generated upon reference to one of its storage place
+  attributes."
+
+Followed.  There are no such components in GNAT.
+
+.. index:: Bit ordering
+
+RM 13.5.3(7-8): Bit Ordering
+============================
+
+  "The recommended level of support for the non-default bit ordering is:
+
+  If ``Word_Size`` = ``Storage_Unit``, then the implementation
+  should support the non-default bit ordering in addition to the default
+  bit ordering."
+
+Followed.  Word size does not equal storage size in this implementation.
+Thus non-default bit ordering is not supported.
+
+.. index:: Address, as private type
+
+RM 13.7(37): Address as Private
+===============================
+
+  "`Address` should be of a private type."
+
+Followed.
+
+.. index:: Operations, on ``Address``
+
+.. index:: Address, operations of
+
+RM 13.7.1(16): Address Operations
+=================================
+
+  "Operations in ``System`` and its children should reflect the target
+  environment semantics as closely as is reasonable.  For example, on most
+  machines, it makes sense for address arithmetic to 'wrap around'.
+  Operations that do not make sense should raise ``Program_Error``."
+
+Followed.  Address arithmetic is modular arithmetic that wraps around.  No
+operation raises ``Program_Error``, since all operations make sense.
+
+.. index:: Unchecked conversion
+
+RM 13.9(14-17): Unchecked Conversion
+====================================
+
+  "The ``Size`` of an array object should not include its bounds; hence,
+  the bounds should not be part of the converted data."
+
+Followed.
+
+  "The implementation should not generate unnecessary run-time checks to
+  ensure that the representation of ``S`` is a representation of the
+  target type.  It should take advantage of the permission to return by
+  reference when possible.  Restrictions on unchecked conversions should be
+  avoided unless required by the target environment."
+
+Followed.  There are no restrictions on unchecked conversion.  A warning is
+generated if the source and target types do not have the same size since
+the semantics in this case may be target dependent.
+
+  "The recommended level of support for unchecked conversions is:
+
+  Unchecked conversions should be supported and should be reversible in
+  the cases where this clause defines the result.  To enable meaningful use
+  of unchecked conversion, a contiguous representation should be used for
+  elementary subtypes, for statically constrained array subtypes whose
+  component subtype is one of the subtypes described in this paragraph,
+  and for record subtypes without discriminants whose component subtypes
+  are described in this paragraph."
+
+Followed.
+
+.. index:: Heap usage, implicit
+
+RM 13.11(23-25): Implicit Heap Usage
+====================================
+
+  "An implementation should document any cases in which it dynamically
+  allocates heap storage for a purpose other than the evaluation of an
+  allocator."
+
+Followed, the only other points at which heap storage is dynamically
+allocated are as follows:
+
+*
+  At initial elaboration time, to allocate dynamically sized global
+  objects.
+
+*
+  To allocate space for a task when a task is created.
+
+*
+  To extend the secondary stack dynamically when needed.  The secondary
+  stack is used for returning variable length results.
+
+..
+
+  "A default (implementation-provided) storage pool for an
+  access-to-constant type should not have overhead to support deallocation of
+  individual objects."
+
+Followed.
+
+  "A storage pool for an anonymous access type should be created at the
+  point of an allocator for the type, and be reclaimed when the designated
+  object becomes inaccessible."
+
+Followed.
+
+.. index:: Unchecked deallocation
+
+RM 13.11.2(17): Unchecked Deallocation
+======================================
+
+  "For a standard storage pool, ``Free`` should actually reclaim the
+  storage."
+
+Followed.
+
+.. index:: Stream oriented attributes
+
+RM 13.13.2(17): Stream Oriented Attributes
+==========================================
+
+  "If a stream element is the same size as a storage element, then the
+  normal in-memory representation should be used by ``Read`` and
+  ``Write`` for scalar objects.  Otherwise, ``Read`` and ``Write``
+  should use the smallest number of stream elements needed to represent
+  all values in the base range of the scalar type."
+
+Followed.  By default, GNAT uses the interpretation suggested by AI-195,
+which specifies using the size of the first subtype.
+However, such an implementation is based on direct binary
+representations and is therefore target- and endianness-dependent.
+To address this issue, GNAT also supplies an alternate implementation
+of the stream attributes ``Read`` and ``Write``,
+which uses the target-independent XDR standard representation
+for scalar types.
+
+.. index:: XDR representation
+
+.. index:: Read attribute
+
+.. index:: Write attribute
+
+.. index:: Stream oriented attributes
+
+The XDR implementation is provided as an alternative body of the
+``System.Stream_Attributes`` package, in the file
+:file:`s-stratt-xdr.adb` in the GNAT library.
+There is no :file:`s-stratt-xdr.ads` file.
+In order to install the XDR implementation, do the following:
+
+* Replace the default implementation of the
+  ``System.Stream_Attributes`` package with the XDR implementation.
+  For example on a Unix platform issue the commands:
+
+  .. code-block:: sh
+
+    $ mv s-stratt.adb s-stratt-default.adb
+    $ mv s-stratt-xdr.adb s-stratt.adb
+
+
+*
+  Rebuild the GNAT run-time library as documented in
+  the *GNAT and Libraries* section of the :title:`GNAT User's Guide`.
+
+RM A.1(52): Names of Predefined Numeric Types
+=============================================
+
+  "If an implementation provides additional named predefined integer types,
+  then the names should end with ``Integer`` as in
+  ``Long_Integer``.  If an implementation provides additional named
+  predefined floating point types, then the names should end with
+  ``Float`` as in ``Long_Float``."
+
+Followed.
+
+.. index:: Ada.Characters.Handling
+
+RM A.3.2(49): ``Ada.Characters.Handling``
+=========================================
+
+  "If an implementation provides a localized definition of ``Character``
+  or ``Wide_Character``, then the effects of the subprograms in
+  ``Characters.Handling`` should reflect the localizations.
+  See also 3.5.2."
+
+Followed.  GNAT provides no such localized definitions.
+
+.. index:: Bounded-length strings
+
+RM A.4.4(106): Bounded-Length String Handling
+=============================================
+
+  "Bounded string objects should not be implemented by implicit pointers
+  and dynamic allocation."
+
+Followed.  No implicit pointers or dynamic allocation are used.
+
+.. index:: Random number generation
+
+RM A.5.2(46-47): Random Number Generation
+=========================================
+
+  "Any storage associated with an object of type ``Generator`` should be
+  reclaimed on exit from the scope of the object."
+
+Followed.
+
+  "If the generator period is sufficiently long in relation to the number
+  of distinct initiator values, then each possible value of
+  ``Initiator`` passed to ``Reset`` should initiate a sequence of
+  random numbers that does not, in a practical sense, overlap the sequence
+  initiated by any other value.  If this is not possible, then the mapping
+  between initiator values and generator states should be a rapidly
+  varying function of the initiator value."
+
+Followed.  The generator period is sufficiently long for the first
+condition here to hold true.
+
+.. index:: Get_Immediate
+
+RM A.10.7(23): ``Get_Immediate``
+================================
+
+  "The ``Get_Immediate`` procedures should be implemented with
+  unbuffered input.  For a device such as a keyboard, input should be
+  available if a key has already been typed, whereas for a disk
+  file, input should always be available except at end of file.  For a file
+  associated with a keyboard-like device, any line-editing features of the
+  underlying operating system should be disabled during the execution of
+  ``Get_Immediate``."
+
+Followed on all targets except VxWorks. For VxWorks, there is no way to
+provide this functionality that does not result in the input buffer being
+flushed before the ``Get_Immediate`` call. A special unit
+``Interfaces.Vxworks.IO`` is provided that contains routines to enable
+this functionality.
+
+.. index:: Export
+
+RM B.1(39-41): Pragma ``Export``
+================================
+
+  "If an implementation supports pragma ``Export`` to a given language,
+  then it should also allow the main subprogram to be written in that
+  language.  It should support some mechanism for invoking the elaboration
+  of the Ada library units included in the system, and for invoking the
+  finalization of the environment task.  On typical systems, the
+  recommended mechanism is to provide two subprograms whose link names are
+  ``adainit`` and ``adafinal``.  ``adainit`` should contain the
+  elaboration code for library units.  ``adafinal`` should contain the
+  finalization code.  These subprograms should have no effect the second
+  and subsequent time they are called."
+
+Followed.
+
+  "Automatic elaboration of pre-elaborated packages should be
+  provided when pragma ``Export`` is supported."
+
+Followed when the main program is in Ada.  If the main program is in a
+foreign language, then
+``adainit`` must be called to elaborate pre-elaborated
+packages.
+
+  "For each supported convention *L* other than ``Intrinsic``, an
+  implementation should support ``Import`` and ``Export`` pragmas
+  for objects of *L*\ -compatible types and for subprograms, and pragma
+  `Convention` for *L*\ -eligible types and for subprograms,
+  presuming the other language has corresponding features.  Pragma
+  ``Convention`` need not be supported for scalar types."
+
+Followed.
+
+.. index:: Package Interfaces
+
+.. index:: Interfaces
+
+RM B.2(12-13): Package ``Interfaces``
+=====================================
+
+  "For each implementation-defined convention identifier, there should be a
+  child package of package Interfaces with the corresponding name.  This
+  package should contain any declarations that would be useful for
+  interfacing to the language (implementation) represented by the
+  convention.  Any declarations useful for interfacing to any language on
+  the given hardware architecture should be provided directly in
+  ``Interfaces``."
+
+Followed.
+
+  "An implementation supporting an interface to C, COBOL, or Fortran should
+  provide the corresponding package or packages described in the following
+  clauses."
+
+Followed.  GNAT provides all the packages described in this section.
+
+.. index:: C, interfacing with
+
+RM B.3(63-71): Interfacing with C
+=================================
+
+  "An implementation should support the following interface correspondences
+  between Ada and C."
+
+Followed.
+
+  "An Ada procedure corresponds to a void-returning C function."
+
+Followed.
+
+  "An Ada function corresponds to a non-void C function."
+
+Followed.
+
+  "An Ada ``in`` scalar parameter is passed as a scalar argument to a C
+  function."
+
+Followed.
+
+  "An Ada ``in`` parameter of an access-to-object type with designated
+  type ``T`` is passed as a ``t*`` argument to a C function,
+  where ``t`` is the C type corresponding to the Ada type ``T``."
+
+Followed.
+
+  "An Ada access ``T`` parameter, or an Ada ``out`` or ``in out``
+  parameter of an elementary type ``T``, is passed as a ``t*``
+  argument to a C function, where ``t`` is the C type corresponding to
+  the Ada type ``T``.  In the case of an elementary ``out`` or
+  ``in out`` parameter, a pointer to a temporary copy is used to
+  preserve by-copy semantics."
+
+Followed.
+
+  "An Ada parameter of a record type ``T``, of any mode, is passed as a
+  ``t*`` argument to a C function, where ``t`` is the C
+  structure corresponding to the Ada type ``T``."
+
+Followed.  This convention may be overridden by the use of the C_Pass_By_Copy
+pragma, or Convention, or by explicitly specifying the mechanism for a given
+call using an extended import or export pragma.
+
+  "An Ada parameter of an array type with component type ``T``, of any
+  mode, is passed as a ``t*`` argument to a C function, where
+  ``t`` is the C type corresponding to the Ada type ``T``."
+
+Followed.
+
+  "An Ada parameter of an access-to-subprogram type is passed as a pointer
+  to a C function whose prototype corresponds to the designated
+  subprogram's specification."
+
+Followed.
+
+.. index:: COBOL, interfacing with
+
+RM B.4(95-98): Interfacing with COBOL
+=====================================
+
+  "An Ada implementation should support the following interface
+  correspondences between Ada and COBOL."
+
+Followed.
+
+  "An Ada access ``T`` parameter is passed as a ``BY REFERENCE`` data item of
+  the COBOL type corresponding to ``T``."
+
+Followed.
+
+  "An Ada in scalar parameter is passed as a ``BY CONTENT`` data item of
+  the corresponding COBOL type."
+
+Followed.
+
+  "Any other Ada parameter is passed as a ``BY REFERENCE`` data item of the
+  COBOL type corresponding to the Ada parameter type; for scalars, a local
+  copy is used if necessary to ensure by-copy semantics."
+
+Followed.
+
+.. index:: Fortran, interfacing with
+
+RM B.5(22-26): Interfacing with Fortran
+=======================================
+
+  "An Ada implementation should support the following interface
+  correspondences between Ada and Fortran:"
+
+Followed.
+
+  "An Ada procedure corresponds to a Fortran subroutine."
+
+Followed.
+
+  "An Ada function corresponds to a Fortran function."
+
+Followed.
+
+  "An Ada parameter of an elementary, array, or record type ``T`` is
+  passed as a ``T`` argument to a Fortran procedure, where ``T`` is
+  the Fortran type corresponding to the Ada type ``T``, and where the
+  INTENT attribute of the corresponding dummy argument matches the Ada
+  formal parameter mode; the Fortran implementation's parameter passing
+  conventions are used.  For elementary types, a local copy is used if
+  necessary to ensure by-copy semantics."
+
+Followed.
+
+  "An Ada parameter of an access-to-subprogram type is passed as a
+  reference to a Fortran procedure whose interface corresponds to the
+  designated subprogram's specification."
+
+Followed.
+
+.. index:: Machine operations
+
+RM C.1(3-5): Access to Machine Operations
+=========================================
+
+  "The machine code or intrinsic support should allow access to all
+  operations normally available to assembly language programmers for the
+  target environment, including privileged instructions, if any."
+
+Followed.
+
+  "The interfacing pragmas (see Annex B) should support interface to
+  assembler; the default assembler should be associated with the
+  convention identifier ``Assembler``."
+
+Followed.
+
+  "If an entity is exported to assembly language, then the implementation
+  should allocate it at an addressable location, and should ensure that it
+  is retained by the linking process, even if not otherwise referenced
+  from the Ada code.  The implementation should assume that any call to a
+  machine code or assembler subprogram is allowed to read or update every
+  object that is specified as exported."
+
+Followed.
+
+RM C.1(10-16): Access to Machine Operations
+===========================================
+
+  "The implementation should ensure that little or no overhead is
+  associated with calling intrinsic and machine-code subprograms."
+
+Followed for both intrinsics and machine-code subprograms.
+
+  "It is recommended that intrinsic subprograms be provided for convenient
+  access to any machine operations that provide special capabilities or
+  efficiency and that are not otherwise available through the language
+  constructs."
+
+Followed.  A full set of machine operation intrinsic subprograms is provided.
+
+  "Atomic read-modify-write operations---e.g., test and set, compare and
+  swap, decrement and test, enqueue/dequeue."
+
+Followed on any target supporting such operations.
+
+  "Standard numeric functions---e.g.:, sin, log."
+
+Followed on any target supporting such operations.
+
+  "String manipulation operations---e.g.:, translate and test."
+
+Followed on any target supporting such operations.
+
+  "Vector operations---e.g.:, compare vector against thresholds."
+
+Followed on any target supporting such operations.
+
+  "Direct operations on I/O ports."
+
+Followed on any target supporting such operations.
+
+.. index:: Interrupt support
+
+RM C.3(28): Interrupt Support
+=============================
+
+  "If the ``Ceiling_Locking`` policy is not in effect, the
+  implementation should provide means for the application to specify which
+  interrupts are to be blocked during protected actions, if the underlying
+  system allows for a finer-grain control of interrupt blocking."
+
+Followed.  The underlying system does not allow for finer-grain control
+of interrupt blocking.
+
+.. index:: Protected procedure handlers
+
+RM C.3.1(20-21): Protected Procedure Handlers
+=============================================
+
+  "Whenever possible, the implementation should allow interrupt handlers to
+  be called directly by the hardware."
+
+Followed on any target where the underlying operating system permits
+such direct calls.
+
+  "Whenever practical, violations of any
+  implementation-defined restrictions should be detected before run time."
+
+Followed.  Compile time warnings are given when possible.
+
+.. index:: Package ``Interrupts``
+
+.. index:: Interrupts
+
+RM C.3.2(25): Package ``Interrupts``
+====================================
+
+  "If implementation-defined forms of interrupt handler procedures are
+  supported, such as protected procedures with parameters, then for each
+  such form of a handler, a type analogous to ``Parameterless_Handler``
+  should be specified in a child package of ``Interrupts``, with the
+  same operations as in the predefined package Interrupts."
+
+Followed.
+
+.. index:: Pre-elaboration requirements
+
+RM C.4(14): Pre-elaboration Requirements
+========================================
+
+  "It is recommended that pre-elaborated packages be implemented in such a
+  way that there should be little or no code executed at run time for the
+  elaboration of entities not already covered by the Implementation
+  Requirements."
+
+Followed.  Executable code is generated in some cases, e.g., loops
+to initialize large arrays.
+
+RM C.5(8): Pragma ``Discard_Names``
+===================================
+
+  "If the pragma applies to an entity, then the implementation should
+  reduce the amount of storage used for storing names associated with that
+  entity."
+
+Followed.
+
+.. index:: Package Task_Attributes
+
+.. index:: Task_Attributes
+
+RM C.7.2(30): The Package Task_Attributes
+=========================================
+
+  "Some implementations are targeted to domains in which memory use at run
+  time must be completely deterministic.  For such implementations, it is
+  recommended that the storage for task attributes will be pre-allocated
+  statically and not from the heap.  This can be accomplished by either
+  placing restrictions on the number and the size of the task's
+  attributes, or by using the pre-allocated storage for the first ``N``
+  attribute objects, and the heap for the others.  In the latter case,
+  ``N`` should be documented."
+
+Not followed.  This implementation is not targeted to such a domain.
+
+.. index:: Locking Policies
+
+RM D.3(17): Locking Policies
+============================
+
+  "The implementation should use names that end with ``_Locking`` for
+  locking policies defined by the implementation."
+
+Followed.  Two implementation-defined locking policies are defined,
+whose names (``Inheritance_Locking`` and
+``Concurrent_Readers_Locking``) follow this suggestion.
+
+.. index:: Entry queuing policies
+
+RM D.4(16): Entry Queuing Policies
+==================================
+
+  "Names that end with ``_Queuing`` should be used
+  for all implementation-defined queuing policies."
+
+Followed.  No such implementation-defined queuing policies exist.
+
+.. index:: Preemptive abort
+
+RM D.6(9-10): Preemptive Abort
+==============================
+
+  "Even though the *abort_statement* is included in the list of
+  potentially blocking operations (see 9.5.1), it is recommended that this
+  statement be implemented in a way that never requires the task executing
+  the *abort_statement* to block."
+
+Followed.
+
+  "On a multi-processor, the delay associated with aborting a task on
+  another processor should be bounded; the implementation should use
+  periodic polling, if necessary, to achieve this."
+
+Followed.
+
+.. index:: Tasking restrictions
+
+RM D.7(21): Tasking Restrictions
+================================
+
+  "When feasible, the implementation should take advantage of the specified
+  restrictions to produce a more efficient implementation."
+
+GNAT currently takes advantage of these restrictions by providing an optimized
+run time when the Ravenscar profile and the GNAT restricted run time set
+of restrictions are specified.  See pragma ``Profile (Ravenscar)`` and
+pragma ``Profile (Restricted)`` for more details.
+
+.. index:: Time, monotonic
+
+RM D.8(47-49): Monotonic Time
+=============================
+
+  "When appropriate, implementations should provide configuration
+  mechanisms to change the value of ``Tick``."
+
+Such configuration mechanisms are not appropriate to this implementation
+and are thus not supported.
+
+  "It is recommended that ``Calendar.Clock`` and ``Real_Time.Clock``
+  be implemented as transformations of the same time base."
+
+Followed.
+
+
+  "It is recommended that the best time base which exists in
+  the underlying system be available to the application through
+  ``Clock``.  `Best` may mean highest accuracy or largest range."
+
+Followed.
+
+.. index:: Partition communication subsystem
+
+.. index:: PCS
+
+RM E.5(28-29): Partition Communication Subsystem
+================================================
+
+  "Whenever possible, the PCS on the called partition should allow for
+  multiple tasks to call the RPC-receiver with different messages and
+  should allow them to block until the corresponding subprogram body
+  returns."
+
+Followed by GLADE, a separately supplied PCS that can be used with
+GNAT.
+
+  "The ``Write`` operation on a stream of type ``Params_Stream_Type``
+  should raise ``Storage_Error`` if it runs out of space trying to
+  write the ``Item`` into the stream."
+
+Followed by GLADE, a separately supplied PCS that can be used with
+GNAT.
+
+.. index:: COBOL support
+
+RM F(7): COBOL Support
+======================
+
+  "If COBOL (respectively, C) is widely supported in the target
+  environment, implementations supporting the Information Systems Annex
+  should provide the child package ``Interfaces.COBOL`` (respectively,
+  ``Interfaces.C``) specified in Annex B and should support a
+  ``convention_identifier`` of COBOL (respectively, C) in the interfacing
+  pragmas (see Annex B), thus allowing Ada programs to interface with
+  programs written in that language."
+
+Followed.
+
+.. index:: Decimal radix support
+
+RM F.1(2): Decimal Radix Support
+================================
+
+  "Packed decimal should be used as the internal representation for objects
+  of subtype ``S`` when ``S``'Machine_Radix = 10."
+
+Not followed.  GNAT ignores ``S``'Machine_Radix and always uses binary
+representations.
+
+.. index:: Numerics
+
+RM G: Numerics
+==============
+
+  "If Fortran (respectively, C) is widely supported in the target
+  environment, implementations supporting the Numerics Annex
+  should provide the child package ``Interfaces.Fortran`` (respectively,
+  ``Interfaces.C``) specified in Annex B and should support a
+  ``convention_identifier`` of Fortran (respectively, C) in the interfacing
+  pragmas (see Annex B), thus allowing Ada programs to interface with
+  programs written in that language."
+
+Followed.
+
+.. index:: Complex types
+
+RM G.1.1(56-58): Complex Types
+==============================
+
+  "Because the usual mathematical meaning of multiplication of a complex
+  operand and a real operand is that of the scaling of both components of
+  the former by the latter, an implementation should not perform this
+  operation by first promoting the real operand to complex type and then
+  performing a full complex multiplication.  In systems that, in the
+  future, support an Ada binding to IEC 559:1989, the latter technique
+  will not generate the required result when one of the components of the
+  complex operand is infinite.  (Explicit multiplication of the infinite
+  component by the zero component obtained during promotion yields a NaN
+  that propagates into the final result.) Analogous advice applies in the
+  case of multiplication of a complex operand and a pure-imaginary
+  operand, and in the case of division of a complex operand by a real or
+  pure-imaginary operand."
+
+Not followed.
+
+  "Similarly, because the usual mathematical meaning of addition of a
+  complex operand and a real operand is that the imaginary operand remains
+  unchanged, an implementation should not perform this operation by first
+  promoting the real operand to complex type and then performing a full
+  complex addition.  In implementations in which the ``Signed_Zeros``
+  attribute of the component type is ``True`` (and which therefore
+  conform to IEC 559:1989 in regard to the handling of the sign of zero in
+  predefined arithmetic operations), the latter technique will not
+  generate the required result when the imaginary component of the complex
+  operand is a negatively signed zero.  (Explicit addition of the negative
+  zero to the zero obtained during promotion yields a positive zero.)
+  Analogous advice applies in the case of addition of a complex operand
+  and a pure-imaginary operand, and in the case of subtraction of a
+  complex operand and a real or pure-imaginary operand."
+
+Not followed.
+
+  "Implementations in which ``Real'Signed_Zeros`` is ``True`` should
+  attempt to provide a rational treatment of the signs of zero results and
+  result components.  As one example, the result of the ``Argument``
+  function should have the sign of the imaginary component of the
+  parameter ``X`` when the point represented by that parameter lies on
+  the positive real axis; as another, the sign of the imaginary component
+  of the ``Compose_From_Polar`` function should be the same as
+  (respectively, the opposite of) that of the ``Argument`` parameter when that
+  parameter has a value of zero and the ``Modulus`` parameter has a
+  nonnegative (respectively, negative) value."
+
+Followed.
+
+.. index:: Complex elementary functions
+
+RM G.1.2(49): Complex Elementary Functions
+==========================================
+
+  "Implementations in which ``Complex_Types.Real'Signed_Zeros`` is
+  ``True`` should attempt to provide a rational treatment of the signs
+  of zero results and result components.  For example, many of the complex
+  elementary functions have components that are odd functions of one of
+  the parameter components; in these cases, the result component should
+  have the sign of the parameter component at the origin.  Other complex
+  elementary functions have zero components whose sign is opposite that of
+  a parameter component at the origin, or is always positive or always
+  negative."
+
+Followed.
+
+.. index:: Accuracy requirements
+
+RM G.2.4(19): Accuracy Requirements
+===================================
+
+  "The versions of the forward trigonometric functions without a
+  ``Cycle`` parameter should not be implemented by calling the
+  corresponding version with a ``Cycle`` parameter of
+  ``2.0*Numerics.Pi``, since this will not provide the required
+  accuracy in some portions of the domain.  For the same reason, the
+  version of ``Log`` without a ``Base`` parameter should not be
+  implemented by calling the corresponding version with a ``Base``
+  parameter of ``Numerics.e``."
+
+Followed.
+
+.. index:: Complex arithmetic accuracy
+
+.. index:: Accuracy, complex arithmetic
+
+RM G.2.6(15): Complex Arithmetic Accuracy
+=========================================
+
+  "The version of the ``Compose_From_Polar`` function without a
+  ``Cycle`` parameter should not be implemented by calling the
+  corresponding version with a ``Cycle`` parameter of
+  ``2.0*Numerics.Pi``, since this will not provide the required
+  accuracy in some portions of the domain."
+
+Followed.
+
+.. index:: Sequential elaboration policy
+
+RM H.6(15/2): Pragma Partition_Elaboration_Policy
+=================================================
+
+  "If the partition elaboration policy is ``Sequential`` and the
+  Environment task becomes permanently blocked during elaboration then the
+  partition is deadlocked and it is recommended that the partition be
+  immediately terminated."
+
+Not followed.