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

Reply via email to