M.3 Implementation Advice
1/2
{implementation
advice (summary of advice)} {documentation
(required of an implementation)} This
International Standard sometimes gives advice about handling certain
target machine dependences. Each Ada implementation must document whether
that advice is followed:
1.a/2
Ramification: Some
of the items in this list require documentation only for implementations
that conform to Specialized Needs Annexes.
2/2
- Program_Error
should be raised when an unsupported Specialized Needs Annex feature
is used at run time. See 1.1.3(20).
3/2
- Implementation-defined
extensions to the functionality of a language-defined library unit should
be provided by adding children to the library unit. See 1.1.3(21).
4/2
- If a bounded
error or erroneous execution is detected, Program_Error should be raised. See 1.1.5(12).
5/2
- Implementation-defined
pragmas should have no semantic effect for error-free programs. See 2.8(16).
6/2
- Implementation-defined
pragmas should not make an illegal program legal, unless they complete
a declaration or configure the library_items
in an environment. See 2.8(19).
7/2
- Long_Integer
should be declared in Standard if the target supports 32-bit arithmetic.
No other named integer subtypes should be declared in Standard. See 3.5.4(28).
8/2
- For a two's
complement target, modular types with a binary modulus up to System.Max_Int*2+2
should be supported. A nonbinary modulus up to Integer'Last should be
supported. See 3.5.4(29).
9/2
- Program_Error
should be raised for the evaluation of S'Pos for an enumeration type,
if the value of the operand does not correspond to the internal code
for any enumeration literal of the type. See 3.5.5(8).
10/2
- Long_Float should
be declared in Standard if the target supports 11 or more digits of precision.
No other named float subtypes should be declared in Standard. See 3.5.7(17).
11/2
- Multidimensional
arrays should be represented in row-major order, unless the array has
convention Fortran. See 3.6.2(11).
12/2
- Tags.Internal_Tag
should return the tag of a type whose innermost master is the master
of the point of the function call.. See
3.9(26.1/2).
13/2
- For a real static
expression with a non-formal type that is not part of a larger static
expression should be rounded the same as the target system. See 4.9(38.1/2).
14/2
- The value of
Duration'Small should be no greater than 100 microseconds. See 9.6(30).
15/2
- The time base
for delay_relative_statements should be monotonic. See 9.6(31).
16/2
- Leap seconds
should be supported if the target system supports them. Otherwise, operations
in Calendar.Formatting should return results consistent with no leap
seconds. See 9.6.1(89/2).
17/2
- When applied
to a generic unit, a program unit pragma that is not a library unit pragma
should apply to each instance of the generic unit for which there is
not an overriding pragma applied directly to the instance. See 10.1.5(10/1).
18/2
- A type declared
in a preelaborated package should have the same representation in every
elaboration of a given version of the package. See 10.2.1(12).
19/2
- Exception_Message
by default should be short, provide information useful for debugging,
and should not include the Exception_Name. See 11.4.1(19).
20/2
- Exception_Information
should provide information useful for debugging, and should include the
Exception_Name and Exception_Message. See
11.4.1(19).
21/2
- Code executed
for checks that have been suppressed should be minimized. See 11.5(28).
22/2
- The recommended
level of support for all representation items should be followed. See 13.1(28/2).
23/2
- Storage allocated
to objects of a packed type should be minimized. See 13.2(6).
24/2
- The recommended
level of support for pragma Pack should be followed. See 13.2(9).
25/2
- For an array
X, X'Address should point at the first component of the array rather
than the array bounds. See 13.3(14).
26/2
- The recommended
level of support for the Address attribute should be followed. See 13.3(19).
27/2
- The recommended
level of support for the Alignment attribute should be followed. See 13.3(36).
28/2
- The Size of
an array object should not include its bounds. See 13.3(42.1/2).
29/2
- If the Size
of a subtype allows for efficient independent addressability, then the
Size of most objects of the subtype should equal the Size of the subtype. See 13.3(53).
30/2
- A Size clause
on a composite subtype should not affect the internal layout of components. See 13.3(54).
31/2
- The recommended
level of support for the Size attribute should be followed. See 13.3(57).
32/2
- The recommended
level of support for the Component_Size attribute should be followed. See 13.3(74).
33/2
- The recommended
level of support for enumeration_representation_clauses
should be followed. See 13.4(10).
34/2
- The recommended
level of support for record_representation_clauses
should be followed. See 13.5.1(22).
35/2
- If a component
is represented using a pointer to the actual data of the component which
is contiguous with the rest of the object, then the storage place attributes
should reflect the place of the actual data. If a component is allocated
discontiguously from the rest of the object, then a warning should be
generated upon reference to one of its storage place attributes. See 13.5.2(5).
36/2
- The recommended
level of support for the nondefault bit ordering should be followed. See 13.5.3(8).
37/2
- Type System.Address
should be a private type. See 13.7(37).
38/2
- Operations in
System and its children should reflect the target environment; operations
that do not make sense should raise Program_Error. See 13.7.1(16).
39/2
- Since the Size
of an array object generally does not include its bounds, the bounds
should not be part of the converted data in an instance of Unchecked_Conversion. See 13.9(14/2).
40/2
- There should
not be unnecessary run-time checks on the result of an Unchecked_Conversion;
the result should be returned by reference when possible. Restrictions
on Unchecked_Conversions should be avoided. See 13.9(15).
41/2
- The recommended
level of support for Unchecked_Conversion should be followed. See 13.9(17).
42/2
- Any cases in
which heap storage is dynamically allocated other than as part of the
evaluation of an allocator should be documented. See 13.11(23).
43/2
- A default storage
pool for an access-to-constant type should not have overhead to support
deallocation of individual objects. See
13.11(24).
44/2
- Usually, a storage
pool for an access discriminant or access parameter should be created
at the point of an allocator, and be reclaimed
when the designated object becomes inaccessible. For other anonymous
access types, the pool should be created at the point where the type
is elaborated and need not support deallocation of individual objects. See 13.11(25).
45/2
- For a standard
storage pool, an instance of Unchecked_Deallocation should actually reclaim
the storage. See 13.11.2(17).
46/2
- The recommended
level of support for the Stream_Size attribute should be followed. See 13.13.2(1.8/2).
47/2
- If not specified,
the value of Stream_Size for an elementary type should be the number
of bits that corresponds to the minimum number of stream elements required
by the first subtype of the type, rounded up to the nearest factor or
multiple of the word size that is also a multiple of the stream element
size. See 13.13.2(1.6/2).
48/2
- If an implementation
provides additional named predefined integer types, then the names should
end with “Integer”. If an implementation provides additional
named predefined floating point types, then the names should end with
“Float”. See A.1(52).
49/2
- Implementation-defined
operations on Wide_Character, Wide_String, Wide_Wide_Character, and Wide_Wide_String
should be child units of Wide_Characters or Wide_Wide_Characters. See A.3.1(7/2).
50/2
- Bounded string
objects should not be implemented by implicit pointers and dynamic allocation. See A.4.4(106).
51/2
- Strings.Hash
should be good a hash function, returning a wide spread of values for
different string values, and similar strings should rarely return the
same value. See A.4.9(12/2).
52/2
- Any storage
associated with an object of type Generator of the random number packages
should be reclaimed on exit from the scope of the object. See A.5.2(46).
53/2
- Each value of
Initiator passed to Reset for the random number packages should initiate
a distinct sequence of random numbers, or, if that is not possible, be
at least a rapidly varying function of the initiator value. See A.5.2(47).
54/2
- Get_Immediate
should be implemented with unbuffered input; input should be available
immediately; line-editing should be disabled. See A.10.7(23).
55/2
- Package Directories.Information
should be provided to retrieve other information about a file. See A.16(124/2).
56/2
- Directories.Start_Search
and Directories.Search should raise Use_Error for malformed patterns. See A.16(125/2).
57/2
- Directories.Rename
should be supported at least when both New_Name and Old_Name are simple
names and New_Name does not identify an existing external file. See A.16(126/2).
58/2
- If the execution
environment supports subprocesses, the current environment variables
should be used to initialize the environment variables of a subprocess. See A.17(32/2).
59/2
- Changes to the
environment variables made outside the control of Environment_Variables
should be reflected immediately. See A.17(33/2).
60/2
- Containers.Hash_Type'Modulus
should be at least 2**32. Containers.Count_Type'Last should be at least
2**31–1. See A.18.1(8/2).
61/2
- The worst-case
time complexity of Element for Containers.Vector should be O(log
N). See A.18.2(256/2).
62/2
- The worst-case
time complexity of Append with Count = 1 when N is less than the
capacity for Containers.Vector should be O(log N). See A.18.2(257).
63/2
- The worst-case
time complexity of Prepend with Count = 1 and Delete_First with Count=1
for Containers.Vectors should be O(N log N). See A.18.2(258/2).
64/2
- The worst-case
time complexity of a call on procedure Sort of an instance of Containers.Vectors.Generic_Sorting
should be O(N**2), and the average time complexity should
be better than O(N**2). See
A.18.2(259/2).
65/2
- Containers.Vectors.Generic_Sorting.Sort
and Containers.Vectors.Generic_Sorting.Merge should minimize copying
of elements. See A.18.2(260/2).
66/2
- Containers.Vectors.Move
should not copy elements, and should minimize copying of internal data
structures. See A.18.2(261/2).
67/2
- If an exception
is propagated from a vector operation, no storage should be lost, nor
any elements removed from a vector unless specified by the operation. See A.18.2(262/2).
68/2
- The worst-case
time complexity of Element, Insert with Count=1, and Delete with Count=1
for Containers.Doubly_Linked_Lists should be O(log N). See A.18.3(160/2).
69/2
- a call on procedure
Sort of an instance of Containers.Doubly_Linked_Lists.Generic_Sorting
should have an average time complexity better than O(N**2)
and worst case no worse than O(N**2). See A.18.3(161/2).
70/2
- Containers.Doubly_Link_Lists.Move
should not copy elements, and should minimize copying of internal data
structures. See A.18.3(162/2).
71/2
- If an exception
is propagated from a list operation, no storage should be lost, nor any
elements removed from a list unless specified by the operation. See A.18.3(163/2).
72/2
- Move for a map
should not copy elements, and should minimize copying of internal data
structures. See A.18.4(83/2).
73/2
- If an exception
is propagated from a map operation, no storage should be lost, nor any
elements removed from a map unless specified by the operation. See A.18.4(84/2).
74/2
- The average
time complexity of Element, Insert, Include, Replace, Delete, Exclude
and Find operations that take a key parameter for Containers.Hashed_Maps
should be O(log N). The average time complexity of the
subprograms of Containers.Hashed_Maps that take a cursor parameter should
be O(1). See A.18.5(62/2).
75/2
- The worst-case
time complexity of Element, Insert, Include, Replace, Delete, Exclude
and Find operations that take a key parameter for Containers.Ordered_Maps
should be O((log N)**2) or better. The worst-case time
complexity of the subprograms of Containers.Ordered_Maps that take a
cursor parameter should be O(1). See A.18.6(95/2).
76/2
- Move for sets
should not copy elements, and should minimize copying of internal data
structures. See A.18.7(104/2).
77/2
- If an exception
is propagated from a set operation, no storage should be lost, nor any
elements removed from a set unless specified by the operation. See A.18.7(105/2).
78/2
- The average
time complexity of the Insert, Include, Replace, Delete, Exclude and
Find operations of Containers.Hashed_Sets that take an element parameter
should be O(log N). The average time complexity of the
subprograms of Containers.Hashed_Sets that take a cursor parameter should
be O(1). The average time complexity of Containers.Hashed_Sets.Reserve_Capacity
should be O(N). See A.18.8(88/2).
79/2
- The worst-case
time complexity of the Insert, Include, Replace, Delete, Exclude and
Find operations of Containers.Ordered_Sets that take an element parameter
should be O((log N)**2). The worst-case time complexity
of the subprograms of Containers.Ordered_Sets that take a cursor parameter
should be O(1). See A.18.9(116/2).
80/2
- Containers.Generic_Array_Sort
and Containers.Generic_Constrained_Array_Sort should have an average
time complexity better than O(N**2) and worst case no worse
than O(N**2). See A.18.16(10/2).
81/2
- Containers.Generic_Array_Sort
and Containers.Generic_Constrained_Array_Sort should minimize copying
of elements. See A.18.16(11/2).
82/2
- If pragma
Export is supported for a language, the main program should be able to
be written in that language. Subprograms named "adainit" and
"adafinal" should be provided for elaboration and finalization
of the environment task. See B.1(39).
83/2
- Automatic elaboration
of preelaborated packages should be provided when pragma
Export is supported. See B.1(40).
84/2
- For each supported
convention L other than Intrinsic, pragmas
Import and Export should be supported for objects of L-compatible
types and for subprograms, and pragma Convention
should be supported for L-eligible types and for subprograms. See B.1(41).
85/2
86/2
- The constants
nul, wide_nul, char16_nul, and char32_nul in package Interfaces.C should
have a representation of zero. See B.3(62.1/2).
87/2
- If C interfacing
is supported, the interface correspondences between Ada and C should
be supported. See B.3(71).
88/2
- If COBOL interfacing
is supported, the interface correspondences between Ada and COBOL should
be supported. See B.4(98).
89/2
- If Fortran interfacing
is supported, the interface correspondences between Ada and Fortran should
be supported. See B.5(26).
90/2
- The machine
code or intrinsics support should allow access to all operations normally
available to assembly language programmers for the target environment. See C.1(3).
91/2
- Interface to
assembler should be supported; the default assembler should be associated
with the convention identifier Assembler. See C.1(4).
92/2
- If an entity
is exported to assembly language, then the implementation should allocate
it at an addressable location even if not otherwise referenced from the
Ada code. A call to a machine code or assembler subprogram should be
treated as if it could read or update every object that is specified
as exported. See C.1(5).
93/2
- Little or no
overhead should be associated with calling intrinsic and machine-code
subprograms. See C.1(10).
94/2
- Intrinsic subprograms
should be provided to access any machine operations that provide special
capabilities or efficiency not normally available. See C.1(16).
95/2
- If the Ceiling_Locking
policy is not in effect and the target system allows for finer-grained
control of interrupt blocking, a means for the application to specify
which interrupts are to be blocked during protected actions should be
provided. See C.3(28/2).
96/2
- Interrupt handlers
should be called directly by the hardware. See C.3.1(20).
97/2
- Violations of
any implementation-defined restrictions on interrupt handlers should
be detected before run time. See C.3.1(21).
98/2
- If implementation-defined
forms of interrupt handler procedures are supported, 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. See C.3.2(25).
99/2
- Preelaborated
packages should be implemented such that little or no code is executed
at run time for the elaboration of entities. See C.4(14).
100/2
- If pragma
Discard_Names applies to an entity, then the amount of storage used for
storing names associated with that entity should be reduced. See C.5(8).
101/2
- A load or store
of a volatile object whose size is a multiple of System.Storage_Unit
and whose alignment is nonzero, should be implemented by accessing exactly
the bits of the object and no others. See
C.6(22/2).
102/2
- A load or store
of an atomic object should be implemented by a single load or store instruction. See C.6(23/2).
103/2
- Finalization
of task attributes and reclamation of associated storage should be performed
as soon as possible after task termination. See C.7.2(30.1/2).
104/2
- If the target
domain requires deterministic memory use at run time, storage for task
attributes should be pre-allocated statically and the number of attributes
pre-allocated should be documented. See
C.7.2(30).
105/2
- Names that end
with “_Locking” should be used for implementation-defined
locking policies. See D.3(17).
106/2
- Names that end
with “_Queuing” should be used for implementation-defined
queuing policies. See D.4(16).
107/2
- The abort_statement
should not require the task executing the statement to block. See D.6(9).
108/2
- On a multi-processor,
the delay associated with aborting a task on another processor should
be bounded. See D.6(10).
109/2
- When feasible,
specified restrictions should be used to produce a more efficient implementation. See D.7(21).
110/2
- When appropriate,
mechanisms to change the value of Tick should be provided. See D.8(47).
111/2
- Calendar.Clock
and Real_Time.Clock should be transformations of the same time base. See D.8(48).
112/2
- The “best”
time base which exists in the underlying system should be available to
the application through Real_Time.Clock. See D.8(49).
113/2
- When appropriate,
implementations should provide configuration mechanisms to change the
value of Execution_Time.CPU_Tick. See D.14(29/2).
114/2
- For a timing
event, the handler should be executed directly by the real-time clock
interrupt mechanism. See D.15(25).
115/2
- The PCS should
allow for multiple tasks to call the RPC-receiver. See E.5(28).
116/2
- The System.RPC.Write
operation should raise Storage_Error if it runs out of space when writing
an item. See E.5(29).
117/2
- If COBOL (respectively,
C) is supported in the target environment, then interfacing to COBOL
(respectively, C) should be supported as specified in Annex
B. See F(7).
118/2
- Packed decimal
should be used as the internal representation for objects of subtype
S when S'Machine_Radix = 10. See F.1(2).
119/2
- If Fortran (respectively,
C) is supported in the target environment, then interfacing to Fortran
(respectively, C) should be supported as specified in Annex
B. See G(7).
120/2
- Mixed real and
complex operations (as well as pure-imaginary and complex operations)
should not be performed by converting the real (resp. pure-imaginary)
operand to complex. See G.1.1(56).
121/2
- If Real'Signed_Zeros
is true for Numerics.Generic_Complex_Types, a rational treatment of the
signs of zero results and result components should be provided. See G.1.1(58).
122/2
- If Complex_Types.Real'Signed_Zeros
is true for Numerics.Generic_Complex_Elementary_Functions, a rational
treatment of the signs of zero results and result components should be
provided. See G.1.2(49).
123/2
- For elementary
functions, the forward trigonometric functions without a Cycle parameter
should not be implemented by calling the corresponding version with a
Cycle parameter. Log without a Base parameter should not be implemented
by calling Log with a Base parameter. See
G.2.4(19).
124/2
- For complex
arithmetic, the Compose_From_Polar function without a Cycle parameter
should not be implemented by calling Compose_From_Polar with a Cycle
parameter. See G.2.6(15).
125/2
- Solve and Inverse
for Numerics.Generic_Real_Arrays should be implemented using established
techniques such as LU decomposition and the result should be refined
by an iteration on the residuals. See G.3.1(88/2).
126/2
- The equality
operator should be used to test that a matrix in Numerics.Generic_Real_Matrix
is symmetric. See G.3.1(90/2).
127/2
- Solve and Inverse
for Numerics.Generic_Complex_Arrays should be implemented using established
techniques and the result should be refined by an iteration on the residuals. See G.3.2(158/2).
128/2
- The equality
and negation operators should be used to test that a matrix is Hermitian. See G.3.2(160/2).
129/2
- Mixed real and
complex operations should not be performed by converting the real operand
to complex. See G.3.2(161/2).
130/2
- The information
produced by pragma Reviewable should be provided
in both a human-readable and machine-readable form, and the latter form
should be documented. See H.3.1(19).
131/2
- Object code
listings should be provided both in a symbolic format and in a numeric
format. See H.3.1(20).
132/2
- If the partition
elaboration policy is Sequential and the Environment task becomes permanently
blocked during elaboration then the partition should be immediately terminated. See H.6(15/2).