egcs and bitfields

David A. Greene greened@eecs.umich.edu
Fri Mar 12 07:16:00 GMT 1999


Martin v. Loewis wrote:
> 
> > I sent this question to the list a few days ago but got
> > no response.  Can someone please help me out?
> 
> I think the problem with your previous report was that it was hard to
> understand. I tried to come up with a program that demonstrates your
> problem, and I got
> 
> struct baz { unsigned int a:2, b:4, c:32;} y;
> 
> void foo()
> {
>   y.c = 0x56789;
> }
> 
> int main()
> {
>   unsigned int  *b;
>   bzero(&y,sizeof(y));
>   foo();
>   b=&y;
>   printf("%x %x\n",b[0],b[1]);
> }
> 
> Is this the case you are talking about? Now, you claim that the SysV
> ABI requires y.c to be at offset 4, right? (this is a claim I can't
> verify since I don't have that specification)
> 
> Anyway, when I run the program on i586-pc-linux-gnu, with
> egcs-2.93.11, I get as output
> 
> 0 56789
> 
> >From your explanation, I understand that this result is
> ABI-compliant. So where is the problem?

>From this example, things look right.  Let me check my example
again.  Maybe I goofed!

Oh boy...It appears as though "gcc" on our machines has magically become
gcc-2.7.2.3 rather than egcs-1.1.1 as it used to be.  egcs in fact
functions correctly.  gcc-2.7.2.3 does not.

Our sysadmins will be hearing about this...  >:-[

Sorry to bother everyone with this "problem."

However, the signedness problem still seems to be there:

#include <stdio.h>

struct foo { int c:3; } x = { 7 };

int main(void)
{
  printf("%d\n", x.c);

  return(0);
}

>>-drakh-> egcc fieldinit.c
>>-drakh-> ./a.out
-1

I think the output should be 7, since an "int"
 bitfield is supposed
to be unsigned according to the i386 SysV ABI.

>>-drakh-> egcc -v
Reading specs from /usr/lib/gcc-lib/i486-linux/egcs-2.91.60/specs
gcc version egcs-2.91.60 Debian 2.1 (egcs-1.1.1 release)


                                            -Dave


More information about the Gcc mailing list