Mike Stump wrote:
On Nov 10, 2006, at 9:48 AM, Howard Chu wrote:
Richard Guenther wrote:
If you compile with -O3 -combine *.c -o alias it will break.
Thanks for pointing that out. But that's not a realistic danger for
the actual application. The accessor function is always going to be
in a library compiled at a separate time. The call will always be
from a program built at a separate time, so -combine isn't a factor.
We are building a compiler to outsmart you. We presently working on
technology (google ("LTO")) to break your code. :-) Don't cry when
we turn it on by default and it does. I'd recommend understanding the
rules and following them.
Heh heh. Looking forward to using that. Google further back and you'll
see that I did link time optimization with gcc 1.4 for m68k/Atari,
almost 20 years ago. More power to you. (Why in my day, we had to carry
bitbuckets twenty miles uphill, BOTH DIRECTIONS!)
As for following the rules, I didn't define the SASL API. It strikes me
that (void **) is pretty unfriendly as an argument type. While it's easy
to make the warning go away with a union, that doesn't actually
guarantee that the memory being pointed to will be in a defined state.
With the previous example, if alias1.c was instead:
####
#include <stdio.h>
extern void getit( void **arg );
main() {
union {
int *foo;
void *bar;
} u;
getit( &u.bar );
printf("foo: %x\n", *u.foo);
}
####
gcc no longer complains, but according to the spec, the code is not any
more reliable.
On the other hand, I don't see any good reason for an optimizer to break
this code. The compiler knows absolutely that the two pointers have
identical values and therefore point to the same piece of memory. There
is no way it can legitimately squash out any loads or stores here - it's
not executing in a loop, where a prior load may have already fetched the
data.
--
-- Howard Chu
Chief Architect, Symas Corp. http://www.symas.com
Director, Highland Sun http://highlandsun.com/hyc
OpenLDAP Core Team http://www.openldap.org/project/