"Richard Guenther" <richard.guenther@gmail.com> wrote on 16/08/2006
12:54:18:
> On 8/16/06, Olga Golovanevsky <OLGA@il.ibm.com> wrote:
> > Dan,
> >
> > Thank you for comments. Preparing fixes.
> >
> > Daniel Berlin <dberlin@dberlin.org> wrote on 15/08/2006 15:54:46:
> >
> > >
> > > Please instead use call_expr_flags (<CALL_EXPR>) & ECF_MALLOC
> >
> > thank you for tip. I only wonder whether ECF_MALLOC stands for all
> > allocation functions, i.e. malloc, calloc, realloc, xmalloc, or only
for
> > malloc?
>
> It only says the function has malloc behavior in that it returns a
> pointer that
> does not alias with any other memory. So
>
> /* Nonzero if this is a call to malloc or a related function. */
> #define ECF_MALLOC 4
>
> is not really useful documentation ;) flags_from_decl_or_type has
> the slightly
> more informative
>
> /* The function exp may have the `malloc' attribute. */
> if (DECL_IS_MALLOC (exp))
> flags |= ECF_MALLOC;
>
ok, I see.
So DECL_IS_MALLOC is actually defines family of functions that return
pointer.
if (TREE_CODE (*node) == FUNCTION_DECL
&& POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (*node))))
DECL_IS_MALLOC (*node) = 1;
I can use it for rough identification, but in order to analyze closely
I still need this ugly
if (strcmp (IDENTIFIER_POINTER (DECL_NAME (fn_decl)),
"malloc") == 0)
unless you say me there is more elegant way.
I need to distinguish between these functions because their trees
have different structures, and I need to go inside and analyze their
arguments.
(For example, calloc has two parameters, and malloc only one)