A function has four core parts: the name, the parameters, the result,
and the body. The following macros and functions access these parts
of a FUNCTION_DECL
as well as other basic features:
DECL_NAME
¶This macro returns the unqualified name of the function, as an
IDENTIFIER_NODE
. For an instantiation of a function template,
the DECL_NAME
is the unqualified name of the template, not
something like f<int>
. The value of DECL_NAME
is
undefined when used on a constructor, destructor, overloaded operator,
or type-conversion operator, or any function that is implicitly
generated by the compiler. See below for macros that can be used to
distinguish these cases.
DECL_ASSEMBLER_NAME
¶This macro returns the mangled name of the function, also an
IDENTIFIER_NODE
. This name does not contain leading underscores
on systems that prefix all identifiers with underscores. The mangled
name is computed in the same way on all platforms; if special processing
is required to deal with the object file format used on a particular
platform, it is the responsibility of the back end to perform those
modifications. (Of course, the back end should not modify
DECL_ASSEMBLER_NAME
itself.)
Using DECL_ASSEMBLER_NAME
will cause additional memory to be
allocated (for the mangled name of the entity) so it should be used
only when emitting assembly code. It should not be used within the
optimizers to determine whether or not two declarations are the same,
even though some of the existing optimizers do use it in that way.
These uses will be removed over time.
DECL_ARGUMENTS
¶This macro returns the PARM_DECL
for the first argument to the
function. Subsequent PARM_DECL
nodes can be obtained by
following the TREE_CHAIN
links.
DECL_RESULT
¶This macro returns the RESULT_DECL
for the function.
DECL_SAVED_TREE
¶This macro returns the complete body of the function.
TREE_TYPE
¶This macro returns the FUNCTION_TYPE
or METHOD_TYPE
for
the function.
DECL_INITIAL
¶A function that has a definition in the current translation unit will
have a non-NULL
DECL_INITIAL
. However, back ends should not make
use of the particular value given by DECL_INITIAL
.
It should contain a tree of BLOCK
nodes that mirrors the scopes
that variables are bound in the function. Each block contains a list
of decls declared in a basic block, a pointer to a chain of blocks at
the next lower scope level, then a pointer to the next block at the
same level and a backpointer to the parent BLOCK
or
FUNCTION_DECL
. So given a function as follows:
void foo() { int a; { int b; } int c; }
you would get the following:
tree foo = FUNCTION_DECL; tree decl_a = VAR_DECL; tree decl_b = VAR_DECL; tree decl_c = VAR_DECL; tree block_a = BLOCK; tree block_b = BLOCK; tree block_c = BLOCK; BLOCK_VARS(block_a) = decl_a; BLOCK_SUBBLOCKS(block_a) = block_b; BLOCK_CHAIN(block_a) = block_c; BLOCK_SUPERCONTEXT(block_a) = foo; BLOCK_VARS(block_b) = decl_b; BLOCK_SUPERCONTEXT(block_b) = block_a; BLOCK_VARS(block_c) = decl_c; BLOCK_SUPERCONTEXT(block_c) = foo; DECL_INITIAL(foo) = block_a;