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
On 21/07/2016 14:48, Tulio Magno Quites Machado Filho wrote:
> 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
>>
>
I think the idea of these function are to solely test ifunc implementation
and I think we should keep them.
Also, if we are fixing it here it would be a good idea to also fix the
same implementation on gold/binutils (gold/testsuite/ifunc-sel.h).