[Bug target/89222] [7.x regression] ARM thumb-2 misoptimisation of func ptr call with -O2 or -Os
wilco at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Feb 8 16:05:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89222
Wilco <wilco at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |wilco at gcc dot gnu.org
--- Comment #5 from Wilco <wilco at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #4)
> I think the bug is in the assembler or the linker:
> .L22:
> .word myhandler2-1
>
>
>
> Basically what is happening is:
> (__handler != ((__sighandler_t) 2)) && (__handler != ((__sighandler_t)
> SIG_DFL))
>
> is converted to:
>
> (((size_t)__handler)-1) <= 1
>
> And then GCC emits myhandler2-1 in the constant pool which is correct but
> the assembler/linker decides to put 0x200003a7 in that location (See the
> .L22 above) and then GCC adds +1 to it to try to make it myhandler2 (again).
>
> This is why using SIG_DFL of 5 works, it is just by accident because GCC
> decides not to do the transformation or put myhandler2-1 in the constant
> pool.
>
> Again I think this is an assembler/linker issue of putting the wrong value
> for
>
> .L22:
> .word myhandler2-1
The +1 is added by the assembler since it is a Thumb function. Then the
compiler adds another +1, making it +2. Basically one shouldn't do arithmetic
with function symbols since bit 0 encodes the Arm/Thumb state.
More information about the Gcc-bugs
mailing list