ARM devices encode the instruction set mode in the LSB of the function address. Functions are word aligned on ARM. If you try to test the LSB of a function pointer then GCC assumes that the two least significant bits are zero and optimises away the test.
ARM devices encode the instruction set mode in the LSB of the function address. Functions are word aligned on ARM. If you try to test the LSB of a function pointer then GCC assumes that the two least significant bits are zero and optimises away the test.
This problem is seen in Mono and was originally reported at: /bugs.launchpad .net/ubuntu/ +source/ gcc-4.5/ +bug/721531
https:/
A reduced test case is:
void main() {
void *p = main;
if ((int)p & 1) printf ("HIT!\n");
}
When compiled with -march=armv7-a -mthumb -O0 then the word 'HIT!' will show. When compiled with -O2, the branch is not taken.
The problem does not occur in 4.4.5. It does occur in 4.5.2, 4.6.0, and trunk r174044.