http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49084

--- Comment #16 from Cesar Strauss <cestrauss at gmail dot com> 2011-12-10 
23:03:13 UTC ---
As can be seen in the assembler code above, the Ada compiler thinks the Node
structure is 32 bytes in size, while the C compiler thinks its size is 36
bytes. 

The culprit is the struct Flag_Word (gcc/ada/atree.h:116), included in Node,
which increased from 4 bytes to 6 bytes:

struct Flag_Word
{
  Boolean      flag73        :  1;
  Boolean      flag74        :  1;
  Boolean      flag75        :  1;
  Boolean      flag76        :  1;
  Boolean      flag77        :  1;
  Boolean      flag78        :  1;
  Boolean      flag79        :  1;
  Boolean      flag80        :  1;
  Boolean      flag81        :  1;
  Boolean      flag82        :  1;
  Boolean      flag83        :  1;
  Boolean      flag84        :  1;
  Boolean      flag85        :  1;
  Boolean      flag86        :  1;
  Boolean      flag87        :  1;
  Boolean      flag88        :  1;
  Boolean      flag89        :  1;
  Boolean      flag90        :  1;
  Boolean      flag91        :  1;
  Boolean      flag92        :  1;
  Boolean      flag93        :  1;
  Boolean      flag94        :  1;
  Boolean      flag95        :  1;
  Boolean      flag96        :  1;
  Short        convention   :  8;
};

On MinGW, the bitfield packing convention has changed in GCC 4.7: it now
follows the Microsoft compiler (-mms-bitfields). Since the size of the
"convention" field (16 bit short) is different from the previous one (8 bit
unsigned char), padding is added until it starts on a new 16 bit boundary.

Indeed, rebuilding GCC with make 'BOOT_CFLAGS=-g -O2 -mno-ms-bitfields' allows
the build to proceed to completion. Changing Short to Byte in Flag_Word also
works.

Reply via email to