[Fontconfig] fontconfig 2.10 and alignof(double) on AIX
Behdad Esfahbod
behdad at behdad.org
Wed Aug 21 11:33:08 PDT 2013
On 13-08-21 01:41 PM, Albert Chin wrote:
> On Wed, Aug 21, 2013 at 01:45:12AM -0400, Behdad Esfahbod wrote:
>> On 13-08-21 12:44 AM, Albert Chin wrote:
>>> On AIX 32-bit and 64-bit, alignof(double) == 4. This isn't a
>>> problem for 32-bit builds of fontconfig but for 64-bit builds, the
>>> following assert in src/fcarch.c fails:
>>> FC_ASSERT_STATIC (0x08 + 1*FC_MAX(4,ALIGNOF_DOUBLE) == sizeof (FcValue));
>>
>> So, what *is* sizeof(FcValue)? If alignof(double) is 4, double
>> itself is 8, and enum is 4, then sizeof(FcValue) should be 12 which
>> is exactly what the assertion is trying to ensure.
>
> This is the offending line above compiled with -E:
> typedef int _static_assert_on_line_59_failed[(((0x08 + 1*((4) > (4) ? (4) : (4)) == sizeof (FcValue))))?1:-1];
>
> sizeof (FcValue) == 16.
>
> typedef struct _FcValue { // sizeof(type)
> FcType type; 4
> union {
> const FcChar8 *s; 8
> int i; 4
> FcBool b; 4
> double d; 8
> const FcMatrix *m; 8
> const FcCharSet *c; 8
> void *f; 8
> const FcLangSet *l; 8
> } u;
> } FcValue; 16
I see. I wasn't expecting any 64bit system to have a 32bit double alignment.
Pushed out a fix. Please test.
> AIX has some oddity when it comes to the alignment of aggregates
> involving doubles:
> http://pic.dhe.ibm.com/infocenter/comphelp/v111v131/topic/com.ibm.xlcpp111.aix.doc/proguide/aggregate_align.html
> http://peeterjoot.wordpress.com/2009/11/11/c-structure-alignment-padding/
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=10645
>
> From one of the comments in
> http://peeterjoot.wordpress.com/2009/11/11/c-structure-alignment-padding/:
> We don’t see the effects of this much anymore since 64-bit AIX
> defaults to -qalign=natural, and we stopped shipping a 32-bit server
> on AIX (32-bit client only).
>
> However, we're using the v11 version of the compiler and it doesn't
> seem to default to -qalign=natural:
> $ cat >e.c <<_EOT_
> #include <stdio.h>
>
> struct {
> char c1;
> double d1;
> } s1;
> struct {
> double d1;
> char c1;
> } s2;
>
> int
> main (void) {
> printf ("sizeof (s1): %ld\n", sizeof (s1));
> printf ("sizeof (s2): %ld\n", sizeof (s2));
> }
> _EOT_
> $ xlc -q64 e.c && ./a.out
> sizeof (s1): 12
> sizeof (s2): 16
That is weird. Hopefully we don't hit that.
> $ xlc -q64 -qalign=natural e.c && ./a.out
> sizeof (s1): 16
> sizeof (s2): 16
>
--
behdad
http://behdad.org/
More information about the Fontconfig
mailing list