|
OpenVMS MACRO-32 Porting and User's Guide
.DISABLE
Disables compiler features over a range of source code.
Format
.DISABLE argument-list
Parameters
argument-list
You can use one or more of the symbolic arguments listed in the
following table:
Option |
Description |
DEBUG
|
Excludes local symbol table information in the object file for use with
the debugger.
|
FLAGGING
|
Deactivates compiler flagging.
|
GLOBAL
|
Disables the assumption that undefined symbols are external symbols.
|
OVERFLOW
|
Deactivates production of overflow trap code for the following opcodes:
ADDx, ADWC, INCx, ADAWI, SUBx, SBWC, DECx, MNEGx, MULx, CVTxy (where x
is greater than y, for example CVTLB), AOBxx, ACBL, and SOBxx.
|
QUADWORD
|
Disables support for quadword literal and address expressions.
|
SUPPRESSION
|
Stops the listing of unreferenced symbols in the symbol table.
|
TRACEBACK
|
Stops providing traceback information to the debugger.
|
.ENABLE
Enables compiler features over a range of source code.
Format
.ENABLE argument-list
Parameters
argument-list
You can use one or more of the symbolic arguments listed in the
following table:
Option |
Description |
DEBUG
1
|
Includes local symbol table information in the object file for use with
the debugger.
|
FLAGGING
|
Activates compiler flagging.
|
GLOBAL
|
Assumes undefined symbols are external symbols.
|
OVERFLOW
|
Activates production of overflow trap code for the following opcodes:
ADDx, ADWC, INCx, ADAWI, SUBx, SBWC, DECx, MNEGx, MULx, CVTxy (where x
is greater than y, for example CVTLB), AOBxx, ACBL, and SOBxx.
|
QUADWORD
|
Provides support for quadword literal and address expressions.
|
SUPPRESSION
|
Provides a listing of unreferenced symbols in the symbol table.
|
TRACEBACK
2
|
Provides traceback information to the debugger.
|
1To take effect, you must compile with /DEBUG or
/ENABLE=DEBUG.
2To take effect, you must compile with /DEBUG or
/ENABLE=TRACEBACK.
.EXCEPTION_ENTRY
Declares the entry point of an exception service routine to the
compiler.
Format
.EXCEPTION_ENTRY [,stack_base]
Parameters
preserve=<>
Register set that forces the compiler to save and restore across the
routine call the contents of registers. By default, the compiler saves
at routine entry and restores at routine exit the full 64-bit contents
of any register that is modified by a routine.
In the case of an .EXCEPTION_ENTRY routine, exception dispatching saves
R2 through R7 on the stack (along with the PC and PSL) and the values
of these registers are restored by the REI instruction executed by the
routine itself. Other registers, if used, are saved in code generated
by the compiler, and all other registers are saved if the
routine issues a CALL or JSB instruction.
stack_base
Register into which the stack pointer (SP) value is moved at routine
entry. At exception entry points, exception dispatching pushes onto the
stack registers R2 through R7, the PC, and the PSL. Note that the Alpha
counterpart for the VAX register known as the PSL is the processor
status (PS) register. The value returned to the register specified in
the stack_base helps an exception service routine
locate the values of these registers.
You can use the macro $INTSTKDEF in SYS$LIBRARY:LIB.MLB to define
symbols for the area on the stack where R2-R7, the PC, and the PSL are
stored. The symbols are:
- INTSTK$Q_R2
- INTSTK$Q_R3
- INTSTK$Q_R4
- INTSTK$Q_R5
- INTSTK$Q_R6
- INTSTK$Q_R7
- INTSTK$Q_PC
- INTSTK$Q_PS
You can then use these symbols in the exception routine, as offsets to
the stack_base value. By using the appropriate symbolic offset with the
stack_base value, the exception routine can access the saved contents
of any of these registers. For example, the exception routine could
examine the PSL to see what access mode was in effect when the
exception was taken.
Description
The .EXCEPTION_ENTRY directive indicates the entry point of an
exception service routine. At routine entry, R3 must contain the
address of the procedure descriptor. The routine must exit with an REI
instruction.
You should declare with the .EXCEPTION_ENTRY directive all of the
following interrupt service routines:
- Interval clock
- Interprocessor interrupt
- System/processor correctable error
- Power failure
- System/processor machine abort
- Software interrupt
.GLOBAL_LABEL
Declares a global label in a routine that is not an entry point to the
routine.
Format
Label: .GLOBAL_LABEL
There are no parameters for this directive.
Description
The .GLOBAL_LABEL directive declares a global label within a routine
that is not a routine entry point. Unless declared with .GLOBAL_LABEL,
global labels in code (specified with "::") are assumed to be entry
point labels, which require declaration. If they are not declared, they
are flagged as errors.
The compiler also allows the address of a global label to be stored
(for instance, by means of PUSHAL instruction). (The compiler flags as
an error any attempt to store a label that has not been declared as a
global label or an entry point.)
By using the .GLOBAL_LABEL directive, the user is acknowledging that
the stored code address will not be the target of a CALL or JSB
instruction. Global labels must appear inside routine boundaries.
Labels declared with the .GLOBAL_LABEL directive can be used as the
newpc argument in calls to the $UNWIND (Unwind Call
Stack) system service because it allows the address of the label to be
stored.
However, there is no provision in the compiler to automatically adjust
the stack pointer at such labels to remove arguments passed on the
stack or compensate for stack alignment. If the call stack is unwound
back to an alternate PC in the calling routine, the stack may still
contain arguments and alignment bytes, and any stack-based references
that expect this adjustment to the caller's original stack depth (which
happened automatically on VAX) will be incorrect.
Code that contains labels declared with this directive that are to be
used as alternate PC targets for $UNWIND must be examined carefully to
ensure correct behavior, with particular emphasis on any references
based on the stack pointer.
.JSB_ENTRY
Declares the entry point of a JSB routine to the compiler. This entry
declaration will save and restore the full 64 bits of any registers
(except R0 and R1) that are modified by the routine and are not
declared as scratch or output. See
also .JSB32_ENTRY.
Format
.JSB_ENTRY [input] [,output] [,scratch] [,preserve]
Parameters
input=<>
Register set that indicates those registers from which the routine
receives input values.
This register set informs the compiler that the registers specified
have meaningful values at routine entry and are unavailable for use as
temporary registers even before the first compiler-detected use of the
registers. Specifying registers in this register set affects compiler
temporary register usage in two cases:
- If you are using the VAXREGS optimization switch. This optimization
allows the compiler to use as temporary registers any of the VAX
registers which are not explicitly being used by the VAX MACRO code.
- If you are explicitly using any of the Alpha registers (R13 and
above).
In either of these cases, if you do not specify a register that is
being used as input in the input argument, the
compiler may use the register as a temporary register, corrupting the
input value.
This register set has no effect on the compiler's default register
preservation behavior. If you are not using the VAXREGS optimization
switch or any of the Alpha registers, the input mask is used only to
document your routine.
output=<>
Register set that indicates those registers to which the routine
assigns values that are returned to the routine's caller. Registers
included in this register set are not saved and restored by the
compiler, even if they are modified by the routine.
This register set also informs the compiler that the registers
specified have meaningful values at routine exit and are unavailable
for use as temporary registers even after the last compiler-detected
use of the registers. Specifying registers in this register set affects
compiler temporary register usage in two cases:
- If you are using the VAXREGS optimization switch. This optimization
allows the compiler to use as temporary registers any of the VAX
registers which are not explicitly being used by the VAX MACRO code.
- If you are explicitly using any of the Alpha registers (R13 and
above).
In either of these cases, if you do not specify a register that is
being used as output in the output argument, the
compiler may use the register as a temporary register, corrupting the
output value.
scratch=<>
Register set that indicates registers that are used within the routine
but which should not be saved and restored at routine entry and exit.
The caller of the routine does not expect to receive output values nor
does it expect the registers to be preserved. Registers included in
this register set are not saved and restored by the compiler, even if
they are modified by the routine.
The compiler may use registers R13 and above as temporary registers if
they are unused in the routine source code. Because R13 through R15
must be preserved, if modified, according to the OpenVMS Alpha calling
standard, the compiler preserves those registers if it uses them.
However, if they appear in the scratch register set
declaration, the compiler will not preserve them if it uses
them as temporary registers. As a result, these registers may be
scratched at routine exit, even if they were not used in the routine
source but are in the scratch set. If the VAXREGS
optimization is used, this applies to registers R2 through R12, as well.
preserve=<>
Register set that indicates those registers that should be preserved
over the routine call. This should include only those registers that
are modified and whose full 64-bit contents should be saved and
restored.
This register set causes registers to be preserved whether or not they
would have been preserved automatically by the compiler. Note that
because R0 and R1 are scratch registers, by calling standard
definition, the compiler never saves and restores them unless you
specify them in this register set.
This register set overrides the output and
scratch register sets. If you specify a register both
in the preserve register set and in the
output or scratch register sets, the
compiler will report the following warning:
%AMAC-W-REGDECCON, register declaration conflict in routine A
|
Note
For procedures declared with the .JSB_ENTRY directive, the MACRO-32
compiler automatically generates a null frame procedure descriptor.
Because no new context is set up by a null frame procedure, a side
effect is that there is no guarantee of completely accurate debugger
information about such procedures in response to SHOW CALLS and SHOW
STACK commands. For example, the line number in the called null
procedure (to which a JSB is done) may be reported as the line number
in the calling procedure from which the JSB is issued.
|
.JSB32_ENTRY
Declares the entry point of a JSB routine to the compiler. This
directive does not preserve any VAX register values (R2 through R12)
unless the PRESERVE parameter is specified. The routine itself may save
and restore registers by pushing them on the stack, but this will not
preserve the upper 32 bits of the registers. See also .JSB_ENTRY.
Warning
The .JSB32_ENTRY directive can be a great time-saver if you
are sure that you can use it. If you use .JSB32_ENTRY in a situation
where the upper 32 bits of a register are being used, it may
cause very obscure and difficult-to-track bugs by corrupting a 64-bit
value that may be several calling levels above the offending routine.
.JSB32_ENTRY should never be used in an AST routine,
condition handler, or any other code that can be executed
asynchronously.
|
Format
.JSB32_ENTRY [input] [,output] [,scratch] [,preserve]
Parameters
input=<>
Register set that indicates those registers from which the routine
receives input values.
For the .JSB32_ENTRY directive, this register set is used only to
document your code.
output=<>
Register set that indicates those registers to which the routine
assigns values that are returned to the routine's caller.
For the .JSB32_ENTRY directive, this register set is used only to
document your code.
scratch=<>
Register set that indicates registers that are used within the routine
but which should not be saved and restored at routine entry and exit.
The caller of the routine does not expect to receive output values nor
does it expect the registers to be preserved.
The scratch argument also pertains to the compiler's
temporary register usage. The compiler may use registers R13 and above
as temporary registers if they are unused in the routine source code.
Because R13 through R15 must be preserved, if modified, according to
the OpenVMS Alpha calling standard, the compiler preserves those
registers if it uses them.
However, if they appear in the scratch register set
declaration, the compiler will not preserve them if it uses
them as temporary registers. As a result, these registers may be
scratched at routine exit, even if they were not used in the routine
source but are in the scratch set.
Because R2 through R12 are not preserved by default, their inclusion in
the scratch is for documentation purposes only.
preserve=<>
Register set that indicates those registers that should be preserved
over the routine call. This should include only those registers that
are modified and whose full 64-bit contents should be saved and
restored.
This register set causes registers to be preserved by the compiler. By
default, no registers are preserved by the .JSB32_ENTRY directive.
This register set overrides the output and
scratch register sets. If you specify a register both
in the preserve register set and in the
output or scratch register sets, the
compiler will report the warning:
%AMAC-W-REGDECCON, register declaration conflict in routine A
Description
The .JSB32_ENTRY directive is an alternative way of declaring a JSB
entry point. It is designed to streamline the declaration of VAX MACRO
routines that operate within a well-defined, bounded application
environment, such as that of a single application or a self-contained
subsystem. For any routine declared with the .JSB32_ENTRY directive,
the compiler does not automatically save or restore any VAX registers
(R2 through R12), therefore leaving the current 32-bit operation
untouched. When you use the .JSB32_ENTRY directive to declare a JSB
entry point, you are responsible for declaring and saving registers
which must be preserved.
If the externally visible entry points of a subsystem can be called
from the 64-bit environment, those entry points should not be declared
with .JSB32_ENTRY. Instead, .JSB_ENTRY (or .CALL_ENTRY) should be used
so that the full 64-bit register values are saved, if necessary.
.LINKAGE_PSECT
Allows the name of the linkage section psect to be changed.
Format
.LINKAGE_PSECT program-section-name
Parameters
program_section_name
Name of the program section. The name can contain up to 31 characters,
including any alphanumeric character and the special characters
underline (_), dollar sign ($), and period (.).
Description
The .LINKAGE_PSECT directive allows you to locate a routine's linkage
section by reference to other psects within the routine. This
facilitates such operations as locking code within memory (see
Section 3.10) and forcing code location. An example of forcing code
location is to explicitly place the psect in the image created by the
linker, using linker options. This would let you use adjacent psects to
find their bounds.
You can use the .LINKAGE_PSECT directive multiple times within a single
source module to set different linkage sections for different routines.
However, note that a routine's linkage section remains the same for the
entire routine. The name of the routine's linkage section is the one
specified in the last .LINKAGE_PSECT directive before the routine's
entry point directive.
The compiler reports a fatal error if different linkage sections are
specified for routines that share code paths.
The .LINKAGE_PSECT directive sets the psect attributes to be the same
as the default linkage psect $LINKAGE. The attributes are the same as
the normal psect default attributes except the linkage psect is set
NOEXE NOWRT.
You can change the linkage section psect attributes using the .PSECT
directive after declaring the psect with .LINKAGE_PSECT.
Example
|
.LINKAGE_PSECT LINK_001
.PSECT LINK_000
LS_START:
.PSECT LINK_002
LS_END:
|
This code allows a program to use LS_START and LS_END in computations
to determine the location and size of the linkage section (LINK_001) of
the routine.
.PRESERVE
Directs the compiler to generate special Alpha assembly code for VAX
MACRO instructions, within portions of the source module, that rely on
VAX guarantees of operation atomicity or granularity.
Format
.[NO]PRESERVE argument-list
Parameters
argument-list
One or more of the symbolic arguments listed in the following table:
Option |
Description |
GRANULARITY
|
Preserves the rules of VAX granularity of writes. Specifying .PRESERVE
GRANULARITY causes the compiler to use Alpha Load-locked and
Store-conditional instruction sequences in code it generates for VAX
instructions that perform byte, word, or unaligned longword writes.
|
ATOMICITY
|
Preserves atomicity of VAX modify operations. Specifying .PRESERVE
ATOMICITY causes the compiler to use Load-locked and Store-conditional
instruction sequences in code it generates for instructions with modify
operands.
|
Description
The .PRESERVE and .NOPRESERVE directives cause the compiler to generate
special Alpha assembly code for VAX MACRO instructions, within portions
of the source module, that rely on VAX guarantees of operation
atomicity or granularity (see Section 2.10).
Use of .PRESERVE or .NOPRESERVE without specifying GRANULARITY or
ATOMICITY will affect both options. When preservation of both
granularity and atomicity is enabled, and the compiler encounters a VAX
coding construct that requires both granularity and atomicity
guarantees, it enforces atomicity over granularity.
Alternatively, you can use the /PRESERVE and /NOPRESERVE compiler
qualifiers to affect the atomicity and granularity in generated code
throughout an entire MACRO source module.
Atomicity is guaranteed for multiprocessing systems as well as
uniprocessing systems when you specify .PRESERVE ATOMICITY.
When the .PRESERVE directive is present, you can use the /RETRY_COUNT
qualifier on the command line to control the number of times the
compiler-generated code retries a granular or atomic update.
Warning
If .PRESERVE ATOMICITY is turned on, any unaligned data references will
result in a fatal reserved operand fault. See Section 2.10.5. If
.PRESERVE GRANULARITY is turned on, unaligned word references to
addresses assumed aligned will also cause a fatal reserved operand
fault.
|
Example
This instruction, when compiled with .PRESERVE GRANULARITY, retries the
insertion of the new word value, if it is interrupted. However, when
compiled with .PRESERVE ATOMICITY, it will also refetch the initial
value and increment it, if interrupted. If both options are specified,
it will do the latter.
|