PowerAda Using Objects Defined by Other Languages
The Import pragma provides a means of addressing objects through an external name. The actual object must be created in some other unit, normally by another language, and this capability allows you to import that object and reference it in Ada. For example, to define an Ada variable to correspond to the C global variable errno in the read-write segment, you could use the declaration:
Error_Value : Integer;
pragma Import( C, Error_Value, "errno");
Note that explicit initialization for imported objects are not allowed. Any implicit initialization (for example, setting access values to null) is not performed for imported objects.
Note: As is the case for imported subprograms, the Link_Name parameter of pragma Import is also available for objects, but should not normally be needed.
Where Parameters are Passed
For a call to an Ada subprogram, the compiler allocates a parameter area on the stack and reserves enough space to hold all the parameters to the subprogram. "Register Usage" shows the registers that are available for passing parameters. For such parameters, space is reserved in the stack but is not initialized. For other parameters, which are not placed into registers, the values are placed on the stack. For more details about how particular kinds of data types are passed to Ada subprograms, generate an assembler listing with the -a
compiler option and refer to the listing.
Register Usage
The PowerPC architecture specifies 32 general-purpose registers, 32 floating-point registers, and several control registers. When calling subprograms specified in Import pragmas, PowerAda programs use the usual PowerPC conventions for register linkage. The register usage during a call to an Ada subprogram is shown in the table below. Registers designated as "preserved" contain the same values when the subprogram ends as when it is entered.
Register | Use | Preserved |
---|---|---|
r0 | Local temporary | No |
r1 | Stack pointer | Yes |
r2 | TOC pointer | Yes |
r3..r10 | Parameters (not floating-point) Non-float function return in r3 |
No |
r11..r12 | Local temporary | No |
r13..r19 | Local temporary | Yes |
r20 | Current task MSR | Yes |
r21..r28 | Local temporary | Yes |
r29 | Pointer for nested subprograms | Yes |
r30 | Local temporary | Yes |
r31 | Auxiliary stack frame pointer | Yes |
fp0 | Local temporary | No |
fp1 .. fp13 | Floating Point Parameter values Float function return in fp1 |
No |
fp14 .. fp31 | Local temporary | Yes |
Note: These conventions may change in subsequent releases or as a result of service. Avoid building strong dependencies on these conventions to prevent possible migration problems. For Linux register usage, consult your Linux documentation.