This is observed on gcc-3.4.6. It may be a known issue, and/or it may be
fixed in later compilers.
For bringup purposes, I wrote an inline assembly hack to get the cross
compiler to tell me whether the target is little/big endian. The code
fragment is:
const unsigned long ul = 0x04030201llu;
if ( *((char *) &ul) == 0x1 )
ASMDEF(LITTLE_ENDIAN);
else
ASMDEF(BIG_ENDIAN);
The expectation is that when run with -O2, the compiler should
constant-fold all of this stuff away, resulting in exactly one ASMDEF.
On i386 and m68k, the constant folding occurs as expected. For ARM it
does not(!).
I am not surprised that there is different behavior for different
targets, but I am very surprised that *this* behavior is different. This
optimization ought to be happening in the mid-end, and it ought to be
entirely machine independent.
Can somebody explain what is going on here?
shap