C.1 Access to Machine Operations
1
[This clause specifies rules regarding access to
machine instructions from within an Ada program.]
1.a/2
Implementation defined: Implementation-defined
intrinsic subprograms Support for access
to machine instructions.
Implementation Requirements
2
{machine code insertion}
The implementation shall support machine code insertions
(see
13.8) or intrinsic subprograms (see
6.3.1)
(or both). Implementation-defined attributes shall be provided to allow
the use of Ada entities as operands.
Implementation Advice
3
The machine code or intrinsics support should allow
access to all operations normally available to assembly language programmers
for the target environment, including privileged instructions, if any.
3.a.1/2
Implementation Advice:
The machine code or intrinsics support
should allow access to all operations normally available to assembly
language programmers for the target environment.
3.a
Ramification: Of course, on a machine
with protection, an attempt to execute a privileged instruction in user
mode will probably trap. Nonetheless, we want implementations to provide
access to them so that Ada can be used to write systems programs that
run in privileged mode.
4
{interface to assembly
language} {language
(interface to assembly)} {mixed-language
programs} {assembly
language} The interfacing pragmas (see
Annex B) should support interface to assembler;
the default assembler should be associated with the convention identifier
Assembler.
4.a/2
Implementation Advice:
Interface to assembler should be supported;
the default assembler should be associated with the convention identifier
Assembler.
5
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.
5.a/2
Implementation Advice:
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.
Documentation Requirements
6
The implementation shall document the overhead associated
with calling machine-code or intrinsic subprograms, as compared to a
fully-inlined call, and to a regular out-of-line call.
6.a/2
Documentation Requirement:
The overhead of calling machine-code
or intrinsic subprograms.
7
The implementation shall document the types of the
package System.Machine_Code usable for machine code insertions, and the
attributes to be used in machine code insertions for references to Ada
entities.
7.a/2
Documentation Requirement:
The types and attributes used in machine
code insertions.
8
The implementation shall document the subprogram
calling conventions associated with the convention identifiers available
for use with the interfacing pragmas (Ada and Assembler, at a minimum),
including register saving, exception propagation, parameter passing,
and function value returning.
8.a/2
Documentation Requirement:
The subprogram calling conventions for
all supported convention identifiers.
9
For exported and imported subprograms, the implementation
shall document the mapping between the Link_Name string, if specified,
or the Ada designator, if not, and the external link name used for such
a subprogram.
9.a/2
This paragraph
was deleted.Implementation defined:
Implementation-defined aspects of access
to machine operations.
9.b/2
Documentation Requirement:
The mapping between the Link_Name or
Ada designator and the external link name.
Implementation Advice
10
The implementation should ensure that little or no
overhead is associated with calling intrinsic and machine-code subprograms.
10.a/2
Implementation Advice:
Little or no overhead should be associated
with calling intrinsic and machine-code subprograms.
11
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. Examples of
such instructions include:
12
- Atomic read-modify-write operations
— e.g., test and set, compare and swap, decrement and test, enqueue/dequeue.
13
- Standard numeric functions —
e.g., sin, log.
14
- String manipulation operations —
e.g., translate and test.
15
- Vector operations — e.g., compare
vector against thresholds.
16
- Direct operations on I/O ports.
16.a/2
Implementation Advice:
Intrinsic subprograms should be provided
to access any machine operations that provide special capabilities or
efficiency not normally available.