[Fontconfig] fontconfig 2.10 and alignof(double) on AIX

Albert Chin fontconfig at mlists.thewrittenword.com
Wed Aug 21 10:41:58 PDT 2013


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

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
  $ xlc -q64 -qalign=natural e.c && ./a.out
sizeof (s1): 16
sizeof (s2): 16

-- 
albert chin (china at thewrittenword.com)


More information about the Fontconfig mailing list