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



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).


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