Subject: Re: gcc optimizer bug in netbsd-1-6 on alpha (gcc 2.95.3 20010315 (release) (NetBSD nb3))
To: der Mouse <mouse@Rodents.Montreal.QC.CA>
From: Ian Lance Taylor <ian@airs.com>
List: tech-toolchain
Date: 08/15/2003 22:01:19
der Mouse <mouse@Rodents.Montreal.QC.CA> writes:
> > At the risk of sounding condescending, I'll point out that it is, of
> > course, possible to write the earlier example in a standard
> > conforming fashion.
>
> How? I can't see any way short of allocating a struct in_addr and
> copying.
I'm not going to pretend that it is pretty, but this should work for
all C compilers:
union { int32 i; struct in_addr a; } inet = { 0 };
printf("parse_address(): inet addr given: [%s]\n",
inet_ntoa(inet.a));
If you can restrict yourself to gcc, this works too:
union int_in_addr { int32 i; struct in_addr a; };
printf("parse_address(): inet addr given: [%s]\n",
inet_ntoa(((union int_in_addr) { 0 }).i));
which is horribly ugly but can be hidden by a macro. That 0 doesn't
have to be a constant, it just has to be assignment compatible with
int32.
Jonathan Stone <jonathan@DSG.Stanford.EDU> writes:
> Still, maybe it gives Ian some idea what the griping's about.
I do understand that it should be possible to write code which changes
types without copying through a temporary variable--that is, it should
be possible to type pun portably and safely. In fully standard
conformant C, this now requires using a union type.
I don't claim to know the best solution for the larger issue. For
kernel builds it's easy enough to use -fno-strict-aliasing. For other
uses, when the new version of gcc is imported into the userland, I
dunno. I think different groups will want different defaults.
Ian