On Fri, Nov 22, 2013 at 12:21 PM, Richard Biener <richard.guent...@gmail.com> wrote: > On Thu, Nov 21, 2013 at 11:46 PM, Andrew MacLeod <amacl...@redhat.com> wrote: >> I'd like to check in this code from the C11 branch so that it is present in >> 4.9. >> >> Its adds a target hook which can be used to override the default alignment >> of an atomic type when used with C11's _Atomic qualifier. There are a couple >> of ports which have stricter alignment requirements for an atomic operation >> than the natural alignment of the integral type. Today they are just >> broken with no real facility to repair it. >> >> If this hook is not utilized by a port, the code is transparent and should >> therefore be harmless in the code base. It will enable the ports that care >> to experiment with changing alignment and see if their current problems can >> be resolved for C11.... and then we can look to push that into C++11 atomic >> templates somehow. It will also allow them to flush out any remaining >> problems that show up with the fundamental base code which enables it that >> went in as part of C11. >> >> Bootstraps on x86-64 and currently running regression tests. Assuming >> everything passes, OK for mainline? >> >> I wont actually check it in until HP reports back that it actually is useful >> to him, I just want to submit it before stage 1 ends :-). > > Looks good to me, but > > ! #define SET_ATOMIC_TYPE_NODE(TYPE, MODE, DEFAULT) \ > ! (TYPE) = build_atomic_base (DEFAULT, targetm.atomic_align_for_mode (MODE)); > ! > ! SET_ATOMIC_TYPE_NODE (atomicQI_type_node, QImode, > unsigned_intQI_type_node); > ! SET_ATOMIC_TYPE_NODE (atomicHI_type_node, HImode, > unsigned_intHI_type_node); > ! SET_ATOMIC_TYPE_NODE (atomicSI_type_node, SImode, > unsigned_intSI_type_node); > ! SET_ATOMIC_TYPE_NODE (atomicDI_type_node, DImode, > unsigned_intDI_type_node); > ! SET_ATOMIC_TYPE_NODE (atomicTI_type_node, TImode, > unsigned_intTI_type_node); > > if you have to use a macro please #undef it after the last use. > Also if you need to use a macro then make it > > atomicQI_type_node = BUILD_ATOMIC_TYPE (QI); > > or even > > SET_ATOMIC_TYPE_NODE (QI)
Btw, I wonder what happens if you declare an array of such over-aligned atomics ... ah, you get an error. typedef int aint __attribute__((aligned(8))); aint a[10]; ./cc1 -quiet t.c t.c:3:1: error: alignment of array elements is greater than element size aint a[10]; ^ good. That won't make arrays of atomics very portable though. Richard. > Thanks, > Richard. > >> Andrew