[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If the target needs to store information on a per-function basis, GCC provides a macro and a couple of variables to allow this. Note, just using statics to store the information is a bad idea, since GCC supports nested functions, so you can be halfway through encoding one function when another one comes along.
GCC defines a data structure called struct function
which
contains all of the data specific to an individual function. This
structure contains a field called machine
whose type is
struct machine_function *
, which can be used by targets to point
to their own specific data.
If a target needs per-function specific data it should define the type
struct machine_function
and also the macro
INIT_EXPANDERS
. This macro should be used to initialise some or
all of the function pointers init_machine_status
,
free_machine_status
and mark_machine_status
. These
pointers are explained below.
One typical use of per-function, target specific data is to create an
RTX to hold the register containing the function's return address. This
RTX can then be used to implement the __builtin_return_address
function, for level 0.
Note - earlier implementations of GCC used a single data area to hold
all of the per-function information. Thus when processing of a nested
function began the old per-function data had to be pushed onto a
stack, and when the processing was finished, it had to be popped off the
stack. GCC used to provide function pointers called
save_machine_status
and restore_machine_status
to handle
the saving and restoring of the target specific information. Since the
single data area approach is no longer used, these pointers are no
longer supported.
The macro and function pointers are described below.
INIT_EXPANDERS
init_machine_status
void (*)(struct function *)
function pointer. If this
pointer is non-NULL it will be called once per function, before function
compilation starts, in order to allow the target to perform any target
specific initialisation of the struct function
structure. It is
intended that this would be used to initialise the machine
of
that structure.
free_machine_status
void (*)(struct function *)
function pointer. If this
pointer is non-NULL it will be called once per function, after the
function has been compiled, in order to allow any memory allocated
during the init_machine_status
function call to be freed.
mark_machine_status
void (*)(struct function *)
function pointer. If this
pointer is non-NULL it will be called once per function in order to mark
any data items in the struct machine_function
structure which
need garbage collection.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |