This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] powerpc: fix ifunc-sel.h with GCC 6


Aurelien Jarno <aurelien@aurel32.net> writes:

> On 32-bit PowerPC GCC 6 always saves the PIC register on the stack in
> the prologue and adjust the stack in the epilogue. It is therefore not
> possible anymore to just exit the function in the inline asm code,
> otherwise it corrupts the stack pointer. This causes the following tests
> to fail when using GCC 6:
>
> FAIL: elf/ifuncmain1
> FAIL: elf/ifuncmain1pic
> FAIL: elf/ifuncmain1picstatic
> FAIL: elf/ifuncmain1pie
> FAIL: elf/ifuncmain1staticpic
> FAIL: elf/ifuncmain1staticpie
> FAIL: elf/ifuncmain1vis
> FAIL: elf/ifuncmain1vispic
> FAIL: elf/ifuncmain1vispie
> FAIL: elf/ifuncmain2pic
> FAIL: elf/ifuncmain2picstatic
> FAIL: elf/ifuncmain3
> FAIL: elf/ifuncmain4picstatic
> FAIL: elf/ifuncmain5
> FAIL: elf/ifuncmain5picstatic
> FAIL: elf/ifuncmain5staticpic
>
> The solution is to replace the beqlr instructions by a beq to the end
> of the inline asm code. This fixes all the above failures.
>
> ChangeLog:
> 	* sysdeps/powerpc/ifunc-sel.h (ifunc_sel): Replace beqlr instructions
> 	by beq instructions jumping to the end of the function.

I'd prefer to remove this file.

Alan, do we still need this file?

> ---
>  ChangeLog                   | 5 +++++
>  sysdeps/powerpc/ifunc-sel.h | 7 ++++---
>  2 files changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/ChangeLog b/ChangeLog
> index 97c46a1..b18a8cd 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,8 @@
> +2016-07-21  Aurelien Jarno  <aurelien@aurel32.net>
> +
> +	* sysdeps/powerpc/ifunc-sel.h (ifunc_sel): Replace beqlr instructions
> +	by beq instructions jumping to the end of the function.
> +
>  2016-07-21  Szabolcs Nagy  <szabolcs.nagy@arm.com>
>
>  	* sysdeps/aarch64/libm-test-ulps: Updated.
> diff --git a/sysdeps/powerpc/ifunc-sel.h b/sysdeps/powerpc/ifunc-sel.h
> index 526d8ed..79d110f 100644
> --- a/sysdeps/powerpc/ifunc-sel.h
> +++ b/sysdeps/powerpc/ifunc-sel.h
> @@ -17,13 +17,14 @@ ifunc_sel (int (*f1) (void), int (*f2) (void), int (*f3) (void))
>  	   "addis %0,11,%2-1b@ha\n\t"
>  	   "addi %0,%0,%2-1b@l\n\t"
>  	   "cmpwi 12,1\n\t"
> -	   "beqlr\n\t"
> +	   "beq 2f\n\t"
>  	   "addis %0,11,%3-1b@ha\n\t"
>  	   "addi %0,%0,%3-1b@l\n\t"
>  	   "cmpwi 12,-1\n\t"
> -	   "beqlr\n\t"
> +	   "beq 2f\n\t"
>  	   "addis %0,11,%4-1b@ha\n\t"
> -	   "addi %0,%0,%4-1b@l"
> +	   "addi %0,%0,%4-1b@l\n\t"
> +	   "2:"
>  	   : "=r" (ret)
>  	   : "X" (&global), "X" (f1), "X" (f2), "X" (f3));
>    return ret;
> -- 
> 2.8.1
>

-- 
Tulio Magno


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]