Fix Thumb-2 Linux nested functions with -O0 libgcc
Richard Earnshaw
rearnsha@arm.com
Thu May 28 16:07:00 GMT 2009
On Wed, 2009-05-20 at 14:55 +0000, Joseph S. Myers wrote:
> This patch fixes a problem calling nested functions on ARM EABI
> GNU/Linux if libgcc is built for Thumb-2 with -O0.
>
> The libgcc function __clear_cache, used when stack trampolines are in
> use, is defined using an asm that puts the inputs in register
> variables, an ARM-specific syscall number in a register variable for
> r7, and calls the syscall.
>
> r7 is also used as the frame pointer for Thumb. If GCC eliminates the
> frame pointer the asm works OK, but if not (in particular if building
> with -O0) then the generated code ends up trying to use the syscall
> number stored in r7 as the frame pointer for restoring values from the
> stack. To avoid this problem arising, it seems simplest to implement
> this simple function directly in assembly, which this patch does.
> Tested with no regressions with cross to arm-none-linux-gnueabi. OK
> to commit?
>
> 2009-05-20 Joseph Myers <joseph@codesourcery.com>
>
> * config/arm/lib1funcs.asm (__clear_cache): Define if
> L_clear_cache.
> * config/arm/linux-eabi.h (CLEAR_INSN_CACHE): Define to give an
> error if used.
> * config/arm/t-linux-eabi (LIB1ASMFUNCS): Add _clear_cache.
>
This is OK, however...
> +#ifdef L_clear_cache
> +@ EABI GNU/Linux call to cacheflush syscall.
> +#if !defined __ARM_EABI__ || !defined __linux__
> +#error "This is only for ARM EABI GNU/Linux"
> +#endif
This would be more easily extensible if written as a guard around the
implementation with a #else at the end to cache unsupported targets.
ie.
#if supported_target_1
...
#elif supported_target_2
...
#else
#error unsupported target
#endif
R.
More information about the Gcc-patches
mailing list