On 10/08/16 19:36, John David Anglin wrote:
> On 2016-10-08, at 1:01 PM, Bernd Edlinger wrote:
>
>> I think your callback should also directly control the
>> alignment of max_align_t in stddef.h:
>>
>>
>> long long __max_align_ll __attribute__((__aligned__(__alignof__(long
>> long))));
>> long double __max_align_ld
>> __attribute__((__aligned__(__alignof__(long double))));
>> /* _Float128 is defined as a basic type, so max_align_t must be
>> sufficiently aligned for it. This code must work in C++, so we
>> use __float128 here; that is only available on some
>> architectures, but only on i386 is extra alignment needed for
>> __float128. */
>> #ifdef __i386__
>> __float128 __max_align_f128
>> __attribute__((__aligned__(__alignof(__float128))));
>> #endif
>> } max_align_t;
>>
>>
>> otherwise these will not match.
>
> Yes, i missed a hunk in the submission. On hpux, the alignment is determined
> by the long
> double field. With glibc, we need 16 byte alignment for max_align_t.
>
This looks still brittle to me.
I mean also the defines __hppa__ and __hpux__ come from
builtin_define calls in the backend, why not define
something with builtin_define_with_int_value,
which can be used as is in max_align_t.
For instance have:
typedef struct {
char __max_align[0] __attribute__((__aligned__(__MAX_ALIGN_T_ALIGN__)));
} max_align_t;
Provided we do:
builtin_define_with_value ("__MAX_ALIGN_T_ALIGN__",
targetm.max_align_t_align () / BITS_PER_UNIT);
Would'nt that guarantee, that __max_align_t and
max_align_t_align () will always be the same?
Bernd.