Date: Mon, 30 Nov 2009 02:16:43 +0100 From: Luigi Rizzo <rizzo@iet.unipi.it> To: current@freebsd.org Subject: poor struct definition in ipfw (bitfield with enum base type) ? Message-ID: <20091130011643.GA29020@onelab2.iet.unipi.it>
next in thread | raw e-mail | index | archive | help
While trying to compile ipfw (userland) with tcc, i hit an issue on the following struct in ip_fw.h (I think I wrote it): typedef struct _ipfw_insn { /* template for instructions */ enum ipfw_opcodes opcode:8; u_int8_t len; /* number of 32-bit words */ u_int16_t arg1; } ipfw_insn; gcc correctly packs the structure in 4 bytes, however tcc fails to realize that the enum fits in 8 bits, and uses the base type (int, which is 32 bit) which results in the structure using 8 bytes. You can imagine the results. I wonder if the difference is a bug in 'tcc' or it is one of those things that are 'implementation-defined' by the C99 standard (googling around seems to suggest the latter). grepping through the entire /usr/src shows only one instance of the above construct (a bitfield using an enum as base type). To be safe, I'd be inclined to change 'opcode' to uint8_t, which is non ambiguous and generates the same code on gcc and tcc cheers luigi
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20091130011643.GA29020>