The object code listing consists of the machine instructions and a translation of these instructions into a form that resembles assembler and includes comments, such as source program statement numbers.
The machine instructions are formatted into blocks of code, headed by the statement or line number in the PL/I for MVS™ & VM source program listing. Generally, only executable statements appear in the listing. DECLARE statements are not normally included. The names of PL/I for MVS & VM variables, rather than the addresses that appear in the machine code, are listed. Special mnemonics are used to refer to some items, including test hooks, descriptors, and address constants.
Statements in the object code listing are ordered by block, as they are sequentially encountered in the source program. Statements in the external procedure are given first, followed by the statements in each inner block. As a result, the order of statements frequently differs from that of the source program.
Every object code listing begins with the name of the external procedure. The actual entry point of the external procedure immediately follows the heading comment REAL ENTRY. The subsequent machine code is the prolog for the block, which performs block activation. The comment PROCEDURE BASE marks the end of the prolog. Following this is a translation of the first executable statement in the PL/I for MVS & VM source program. Table 1 summarizes the comment used in the listing.
Comment | Function |
---|---|
BEGIN BLOCK xxx | Indicates the start of the begin block with label xxx |
BEGIN BLOCK NUMBER n | Indicates the start of the begin block with number n |
CALCULATION OF COMMONED EXPRESSION FOLLOWS | Indicates that an expression used more than once in the routine is calculated at this point |
CODE MOVED FROM STATEMENT NUMBER n | Indicates object code moved by the optimization process to a different part of the routine and gives the number of the statement from which it originated |
COMPILER GENERATED SUBROUTINE xxx | Indicates the start of compiler-generated subroutine xxx |
CONTINUATION OF PREVIOUS REGION | Identifies the point at which addressing from the previous routine base recommences |
END BLOCK | Indicates the end of a begin block |
END INTERLANGUAGE PROCEDURE xxx | Identifies the end of an ILC procedure xxx |
END OF COMMON CODE | Identifies the end of code used in running more than one statement |
END OF COMPILER GENERATED SUBROUTINE | Indicates the end of the compiler-generated subroutine |
END PROCEDURE | Identifies the end of a procedure |
END PROGRAM | Indicates the end of the external procedure |
INITIALIZATION CODE FOR xxx | Indicates the start of initialization code for variable xxx |
INITIALIZATION CODE FOR OPTIMIZED LOOP FOLLOWS | Indicates that some of the code that follows was moved from within a loop by the optimization process |
INTERLANGUAGE PROCEDURE xxx | Identifies the start of an implicitly generated ILC procedure xxx |
METHOD OR ORDER OF CALCULATING EXPRESSIONS CHANGED | Indicates that the order of the code following was changed to optimize the object code |
ON-UNIT BLOCK NUMBER n | Indicates the start of an ON-unit block with number n |
ON-UNIT BLOCK END | Indicates the end of the ON-unit block |
PROCEDURE xxx | Identifies the start of the procedure labeled xxx |
PROCEDURE BASE | Identifies the address loaded into the base register for the procedure |
PROGRAM ADDRESSABILITY REGION BASE | Identifies the address where the routine base is updated if the routine size exceeds 4096 bytes and consequently cannot be addressed from one base |
PROLOGUE BASE | Identifies the start of the prolog code common to all entry points into that procedure |
REAL ENTRY | Precedes the actual executable entry point for a procedure |
STATEMENT LABEL xxx | Identifies the position of source program statement label xxx |
STATEMENT NUMBER n | Identifies the start of code generated for statement number n in the source listing |
In certain cases, the compiler uses mnemonics (see Table 2) to identify the type of operand in an instruction and, where applicable, follows the mnemonic by the name of a PL/I for MVS & VM variable.
Mnemonic | Explanation |
---|---|
A..xxx | Address constant for xxx |
ADD..xxx | Aggregate descriptor for xxx |
BASE..xxx | Base address of variable xxx |
BLOCK.n | Identifier created for an otherwise unlabeled block |
CL.n | Compiler-generated label number n |
D..xxx | Descriptor for xxx |
DED..xxx | Data element descriptor for xxx |
HOOK...ENTRY | Debugging tool block entry hook |
HOOK...BLOCK-EXIT | Debugging tool block exit hook |
HOOK...PGM-EXIT | Debugging tool program exit hook |
HOOK...PRE-CALL | Debugging tool pre-call hook |
HOOK...INFO | Additional pre-call hook information |
HOOK...POST-CALL | Debugging tool post call hook |
HOOK...STMT | Debugging tool statement hook |
HOOK...IF-TRUE | Debugging tool IF true hook |
HOOK...IF-FALSE | Debugging tool ELSE hook |
HOOK...WHEN | Debugging tool WHEN true hook |
HOOK...OTHERWISE | Debugging tool OTHERWISE true hook |
HOOK...LABEL | Debugging tool label hook |
HOOK...DO | Debugging tool iterative DO hook |
HOOK...ALLOC | Debugging tool ALLOCATE controlled hook |
WSP.n | Workspace, followed by identifying number n |
L..xxx | Length of variable xxx |
PR..xxx | Pseudoregister vector slot for xxx |
LOCATOR..xxx | Locator for xxx |
RKD..xxx | Record or key descriptor for xxx |
VO..xxx | Virtual origin for xxx (the address where element 0 is held for a one-dimensional array, element 0,0 for a two-dimensional array, and so on) |