.cfi_startproc is used at the beginning of each function that
should have an entry in
.eh_frame. It initializes some internal
data structures. Don't forget to close the function by
.cfi_sections may be used to specify whether CFI directives
.eh_frame section and/or
If section_list is
.eh_frame is emitted,
if section_list is
.debug_frame is emitted.
To emit both use
.eh_frame, .debug_frame. The default if this
directive is not used is
.cfi_startproc is used along with parameter
it also emits some architecture dependent initial CFI instructions.
.cfi_endproc is used at the end of a function where it closes its
unwind entry previously opened by
.cfi_startproc, and emits it to
.cfi_personality defines personality routine and its encoding.
encoding must be a constant determining how the personality
should be encoded. If it is 255 (
argument is not present, otherwise second argument should be
a constant or a symbol name. When using indirect encodings,
the symbol provided should be the location where personality
can be loaded from, not the personality routine itself.
The default after
no personality routine.
.cfi_lsda defines LSDA and its encoding.
encoding must be a constant determining how the LSDA
should be encoded. If it is 255 (
argument is not present, otherwise second argument should be a constant
or a symbol name. The default after
.cfi_def_cfa defines a rule for computing CFA as: take
address from register and add offset to it.
.cfi_def_cfa_register modifies a rule for computing CFA. From
now on register will be used instead of the old one. Offset
remains the same.
.cfi_def_cfa_offset modifies a rule for computing CFA. Register
remains the same, but offset is new. Note that it is the
absolute offset that will be added to a defined register to compute
.cfi_def_cfa_offset but offset is a relative
value that is added/substracted from the previous offset.
Previous value of register is saved at offset offset from CFA.
Previous value of register is saved at offset offset from
the current CFA register. This is transformed to
using the known displacement of the CFA register from the CFA.
This is often easier to use, because the number will match the
code it's annotating.
Previous value of register1 is saved in register register2.
.cfi_restore says that the rule for register is now the
same as it was at the beginning of the function, after all initial
instruction added by
.cfi_startproc were executed.
From now on the previous value of register can't be restored anymore.
Current value of register is the same like in the previous frame, i.e. no restoration needed.
First save all current rules for all registers by
then totally screw them up by subsequent
.cfi_* directives and when
everything is hopelessly bad, use
.cfi_restore_state to restore
the previous saved state.
Change return column register, i.e. the return address is either directly in register or can be accessed by rules for register.
Mark current function as signal trampoline.
SPARC register window has been saved.
Allows the user to add arbitrary bytes to the unwind info. One might use this to add OS-specific CFI opcodes, or generic CFI opcodes that GAS does not yet support.
The current value of register is label. The value of label
will be encoded in the output file according to encoding; see the
.cfi_personality for details on this encoding.
The usefulness of equating a register to a fixed label is probably limited to the return address register. Here, it can be useful to mark a code segment that has only one return address which is reached by a direct branch and no copy of the return address exists in memory or another register.