This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] powerpc: fix ifunc-sel.h with GCC 6
- From: "Tulio Magno Quites Machado Filho" <tuliom at linux dot vnet dot ibm dot com>
- To: Aurelien Jarno <aurelien at aurel32 dot net>, libc-alpha at sourceware dot org, Alan Modra <amodra at gmail dot com>
- Cc:
- Date: Thu, 21 Jul 2016 14:48:09 -0300
- Subject: Re: [PATCH] powerpc: fix ifunc-sel.h with GCC 6
- Authentication-results: sourceware.org; auth=none
- References: <1469093774-25485-1-git-send-email-aurelien@aurel32.net>
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