[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