[Bug 721531] Re: [armel] gcc computes wrong address for main() at build time
Bug Watch Updater
721531 at bugs.launchpad.net
Thu May 26 07:22:36 UTC 2011
Launchpad has imported 1 comments from the remote bug at
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49169.
If you reply to an imported comment from within Launchpad, your comment
will be sent to the remote bug automatically. Read more about
Launchpad's inter-bugtracker facilities at
https://help.launchpad.net/InterBugTracking.
------------------------------------------------------------------------
On 2011-05-26T02:13:27+00:00 Michael Hope wrote:
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:
https://bugs.launchpad.net/ubuntu/+source/gcc-4.5/+bug/721531
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.
Reply at: https://bugs.launchpad.net/gcc/+bug/721531/comments/18
** Changed in: gcc
Status: Unknown => New
** Changed in: gcc
Importance: Unknown => Medium
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to gcc-4.5 in Ubuntu.
https://bugs.launchpad.net/bugs/721531
Title:
[armel] gcc computes wrong address for main() at build time
Status in The GNU Compiler Collection:
New
Status in Linaro GCC:
Triaged
Status in “gcc-4.5” package in Ubuntu:
Triaged
Status in “gcc-4.5” source package in Natty:
Won't Fix
Status in “gcc-4.5” source package in Oneiric:
Triaged
Bug description:
Binary package hint: gcc-4.5
During the debugging of mono, we found a confirmed tool chain
regression and isolated it down to a testcase:
Test code:
void main() {
void *p = main;
if ((int)p & 1) printf ("HIT!\n");
}
Output:
mcasadevall at risingsun:~/tmp$ gcc -g test.c
test.c: In function 'main':
test.c:3:18: warning: incompatible implicit declaration of built-in function 'printf'
mcasadevall at risingsun:~/tmp$ ./a.out
HIT!
mcasadevall at risingsun:~/tmp$ gcc -g -O2 test.c
test.c: In function 'main':
test.c:3:18: warning: incompatible implicit declaration of built-in function 'printf'
mcasadevall at risingsun:~/tmp$ ./a.out
mcasadevall at risingsun:~/tmp$
Doesn't occur with gcc-4.4.
Additional comments from #monodev:
16:26:58 < vargaz> NCommander: it seems to think function addresses on arm
have their lowest bit set to 0, which is not true for
thumb.
More information about the foundations-bugs
mailing list