This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: PowerPC: gettimeofday optimization by using IFUNC
Ping.
On 03/05/2013 12:49 PM, Adhemerval Zanella wrote:
> On 03/05/2013 12:06 PM, Richard Henderson wrote:
>> On 03/05/2013 04:22 AM, Adhemerval Zanella wrote:
>>> +/* Macro to return vdso_xxx value on IFUNC implementations.
>>> + On PPC64 the returned value is actually an OPD entry. */
>>> +#if defined(__PPC64__) || defined(__powerpc64__)
>>> +#define PTR_IFUNC_RET(value) &value
>>> +#else
>>> +#define PTR_IFUNC_RET(value) value
>>> +#endif
>>> +
>> We are talking about function symbols in C right? These two expressions are
>> identical due to function pointer decomposition.
>>
>>
>> r~
>>
> Not in this case: without the '&' on PPC64 the vDSO function address will be
> returned instead of ODP entry and then elf_ifunc_invoke will fail to correct
> resolve the symbol. On PPC32 this is not need, the vDSO address is returned
> instead.
>
> Here is the disassemble of the IFUNC resolver with my latest patch:
>
> Dump of assembler code for function __gettimeofday:
> => 0x00000fffb7ed7700 <+0>: nop
> 0x00000fffb7ed7704 <+4>: ld r9,-14952(r2)
> 0x00000fffb7ed7708 <+8>: addi r3,r2,-14952
> 0x00000fffb7ed770c <+12>: cmpdi cr7,r9,0
> 0x00000fffb7ed7710 <+16>: bnelr cr7
> 0x00000fffb7ed7714 <+20>: addis r3,r2,-1
> 0x00000fffb7ed7718 <+24>: addi r3,r3,-5200
> 0x00000fffb7ed771c <+28>: blr
>
> And here it is the resolver with '#define PTR_IFUNC_RET(value) value':
>
> => 0x00000fffb7ed7700 <+0>: nop
> 0x00000fffb7ed7704 <+4>: ld r3,-14952(r2)
> 0x00000fffb7ed7708 <+8>: cmpdi cr7,r3,0
> 0x00000fffb7ed770c <+12>: bnelr cr7
> 0x00000fffb7ed7710 <+16>: addis r3,r2,-1
> 0x00000fffb7ed7714 <+20>: addi r3,r3,-5200
> 0x00000fffb7ed7718 <+24>: blr
>
> The addi instruction will correctly point to ODP entry instead of the vDSO entry.
>
>
>