Kyle Moffett wrote:static inline void kfree(void *ptr)
{
if (__builtin_constant_p((ptr == NULL))) {
if (ptr)
kfree_nonnull(ptr);
} else {
kfree_unknown(ptr);
}
}
void kfree_nonnull(void *ptr)
{
/* kfree code here, no null check */
}
void kfree_unknown(void *ptr)
{
if (ptr)
kfree_nonnull(ptr);
}
I still think there is an inconsistency in gcc. If I call your kfree with the following:
void test( char *ptr )
{
char *null = NULL;
kfree(ptr); /* unknown */
*ptr = 'a';
kfree(ptr); /* nonnull */
kfree(null); /* should be optimised away */
}
,the compiler (4.1) generates two calls to kfree_unknown instead of one to kfree_nonnull and one to kfree_unknown. It seems that the __builtin_constant_p((ptr==NULL)) check does not always trigger, even if the compiler 'knows' ptr to be equal to NULL. I posted a nasty hack around this problem yesterday.