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/ _______________________________________________ Fontconfig mailing list Fontconfig@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/fontconfig