function attributes on function pointers
Kalle Olavi Niemitalo
kon@iki.fi
Thu Jun 23 08:30:00 GMT 2011
Ian Lance Taylor <iant@google.com> writes:
> In general, you can use function attributes on function pointers like
> this:
>
> void * (* __attribute__ ((malloc)) my_malloc) (size_t) = malloc;
>
> Unfortunately, this is only supported for some attributes. It will only
> work if the attribute can be attached to a function type rather than to
> a specific function declaration. The malloc attribute is not
> implemented in that way, so this does not work for the malloc attribute.
I tried to work around that limitation by defining a function
that has the malloc attribute and then calls the function pointer:
........................................................................
#include <stddef.h>
extern void* (*my_malloc) (size_t size);
void* __attribute__ ((malloc)) call_my_malloc (size_t size);
void* __attribute__ ((malloc))
call_my_malloc (size_t size)
{
return my_malloc (size);
}
int
gcc_suspects_aliasing (void)
{
int *p = call_my_malloc (sizeof (int));
int *q = call_my_malloc (sizeof (int));
*p = 0;
*q = 0;
++*p;
++*q;
return *p;
}
........................................................................
However, "gcc (Debian 4.4.5-8) 4.4.5" -O2 on x86_64 generates
code that assumes the pointers may alias:
........................................................................
gcc_suspects_aliasing:
.LFB1:
.cfi_startproc
pushq %rbx
.cfi_def_cfa_offset 16
movl $4, %edi
.cfi_offset 3, -16
call *my_malloc(%rip)
movq %rax, %rbx
movl $4, %edi
call *my_malloc(%rip)
movl $0, (%rbx)
movl $0, (%rax)
addl $1, (%rbx)
addl $1, (%rax)
movl (%rbx), %eax
popq %rbx
ret
........................................................................
If I remove the definition of call_my_malloc, so that gcc cannot
inline it, then gcc respects the malloc attribute:
........................................................................
gcc_suspects_aliasing:
.LFB0:
.cfi_startproc
pushq %rbx
.cfi_def_cfa_offset 16
movl $4, %edi
.cfi_offset 3, -16
call call_my_malloc
movl $4, %edi
movq %rax, %rbx
call call_my_malloc
movl $1, (%rbx)
movl $1, (%rax)
movl $1, %eax
popq %rbx
ret
........................................................................
I wonder if this qualifies as a missed-optimization bug,
and whether later versions of gcc do the same.
More information about the Gcc-help
mailing list