[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