tinycc-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Tinycc-devel] question about bit-fields


From: Didier Barvaux
Subject: Re: [Tinycc-devel] question about bit-fields
Date: Sat, 20 Oct 2012 22:28:51 +0200

Grischka,

> > Please find attached, a patch that modify TCC so that it can pack
> > bit fields the way GCC does. The mechanism is optional and off by
> > default. It can be enabled with the -fgcc-packing option.
> 
> ... the way GCC does?
> 
> > I added this mechanism because I want to use TCC to compile some
> > code that manages IPv4 headers [1]. The code uses the 'struct
> > iphdr' of the GNU libc, and relies on its size doing exactly 20
> > bytes. TCC does not compute the structure length the same way GCC
> > does, and the program fails.
> 
> ... the same way GCC does?
> 
> > Someone told me that I can add code to mimic the behaviour of GCC.
> > The attached patch is an attempt to do so. It is probably not very
> > good as I didn't known TCC's codebase before, but it seems to work.
> > I'm open for comments on it. I tested my modifications with the
> > attached test program.
> 
> ... to mimic the behavior of GCC?
> 
> Just curious:  What now is this way/behavior of GCC, actually?
> 
> Because as you say, maybe the patch is not very good (e.g. suspicious
> "copy & paste" portion) but you didn't know TCC before.
> 
> Then again maybe some people here know TCC but still can't really
> comment your patch or suggest improvements because they don't know
> the details about GCC's bit packing right now.

Sorry, it was discussed in previous emails, but I forgot to repeat it.
Here are some more details.

On a structure such as:
  struct mystruct1
  {
     unsigned int mystruct1_foo:4;
     unsigned int mystruct1_bar:4;
     uint8_t mystruct1_other;
     uint16_t mystruct1_other2;
  };

The 2 first fields uses 1 byte with GCC/Clang while they use
sizeof(unsigned int) bytes with TCC. GCC/Clang pack the bit fields on
the smaller type available. So, sizeof(struct mystruct1) = 4 with
GCC/Clang and sizeof(struct mystruct1) = 8 with TCC.

My program (and probably many others, as the struct iphdr for IPv4
header defined by the GNU libc is defined that way) relies on this
behaviour. That's why I created the patch. It packs bit fields "the way
GCC does". If you got a better description, I'll be happy to change
it :)

Regards,
Didier

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]