Reference Guide

Chapter 3 47
HP-UX Architecture Conventions
Compiler Conventions
Compiler Conventions
In order to write assembly language procedures that can both call to and
be called from high-level language procedures, it is necessary to
understand the standard procedure-calling convention and other
compiler conventions.
On many computer systems, each high-level language has its own calling
convention. Consequently, calls from one language to another are
sometimes difficult to arrange, except through assembly code. The
architecture generally prescribes very few operations that must be done
to effect a procedure call, and there is often a pair of machine-language
instructions to call a procedure and return from one. PA-RISC
architecture provides no special procedure call or return instructions.
There is, however, a standard procedure-calling convention for all
high-level languages as well as the Assembler. It is tuned for the
architecture, and is designed to make a procedure call with as few
instructions as possible.
Besides defining a uniform call and return sequence for all languages,
the calling convention is important for other reasons. In order to
streamline the calling sequence, the return link is not saved on the stack
unless necessary and the previous stack pointer is rarely saved on the
stack. Therefore, it is not usually possible to obtain a stack trace at an
arbitrary point in the program without some additional static
information about each procedure's stack frame size and usage.
For example, you could not obtain a stack trace while debugging or
analyzing a core dump, or using the TRY/RECOVER feature in HP
Pascal/HP-UX. Obtaining a stack trace is made possible by the stack
unwind mechanism. It uses special unwind descriptors that contain the
exact static information needed for each procedure. These descriptors are
generated automatically by the linker based on information provided by
all high-level compilers as well as the Assembler.
Each descriptor contains the starting and ending address of a
procedure's object code, plus that procedure's stack frame size, and a few
flags indicating, among other things, whether the return link is saved on
the stack. Given the current program counter and stack pointer, the
stack unwind mechanism can determine the calling procedure by finding