Fix radeon kms compiled with clang.

Christiano F. Haesbaert haesbaert at haesbaert.org
Mon Dec 2 06:38:55 PST 2013


On 2 December 2013 04:02, Michel Dänzer <michel at daenzer.net> wrote:
>
> I think it would be better to address this in xorg_list_for_each_entry()
> or in clang instead of working around it in users of
> xorg_list_for_each_entry(). Have there been any efforts along those
> lines?

It is not straight forward, the problem is clang has no typeof, which
xorg needs to build __container_of.

Check how the comment even says the C standard states it is undefined
behaviour. typeof is a gcc extension.

#ifdef HAVE_TYPEOF
#define __container_of(ptr, sample, member) \
    container_of(ptr, typeof(*sample), member)
#else
/* This implementation of __container_of has undefined behavior according
 * to the C standard, but it works in many cases.  If your compiler doesn't
 * support typeof() and fails with this implementation, please try a newer
 * compiler.
 */
#define __container_of(ptr, sample, member)                            \
    (void *)((char *)(ptr)                                             \
            - ((char *)&(sample)->member - (char *)(sample)))
#endif

#define xorg_list_for_each_entry(pos, head, member) \
    for (pos = __container_of((head)->next, pos, member); \
&pos->member != (head); \
pos = __container_of(pos->member.next, pos, member))

>
>
> Anyway, please make sure patches you submit have a Signed-off-by: tag.
>

Ok.


More information about the xorg-driver-ati mailing list