http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46488

Paulo César Pereira de Andrade <pcpa at mandriva dot com.br> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |pcpa at mandriva dot com.br

--- Comment #34 from Paulo César Pereira de Andrade <pcpa at mandriva dot 
com.br> 2010-11-30 23:15:16 UTC ---
(In reply to comment #32)
> The problem appears to be deeply rooted in the Ring construct, more precisely
> in the HEAD trick.  IIUC the idea is to "attach" a doubly-linked list to
> another structure by means of a "virtual" member overlaid on top of the
> structure; the only thing they actually share is a special APR_RING_ENTRY (the
> APR_RING_HEAD).  But this overlay fundamentally violates the aliasing rules
> even if one try to narrow the accesses to just the shared part.
> 
> Richard, is that how the aliasing rules are implemented in the 4.5.x series? 
> Has this been changed in 4.6.0?

I said in my comment that adding temporaries could correct the issue,
but they do not. I had some different test trees, and reviewing them,
what actually "corrected" in one of the builds was adding a volatile
modifier to APR_RING_HEAD, as in:

#define APR_RING_HEAD(head, elem)                    \
    struct head {                            \
    struct elem * volatile next;                    \
    struct elem * volatile prev;                    \
    }

to better match APR_RING_ENTRY.

Reply via email to