powerpc __tls_get_addr call optimization
Alan Modra
amodra@gmail.com
Sat Mar 21 07:33:00 GMT 2015
On Sat, Mar 21, 2015 at 12:36:30AM -0400, Rich Felker wrote:
> On Sat, Mar 21, 2015 at 01:37:02PM +1030, Alan Modra wrote:
> > On Fri, Mar 20, 2015 at 11:27:12AM -0400, Rich Felker wrote:
> > > I also don't see how your approach is a "direct call". The function
> > > being called is in a different DSO so it has to go through a pointer
> > > in the GOT or similar, in which case it's just as "indirect" as the
> > > TLSDESC call would be.
> >
> > It is a direct call to the linker provided stub, which will return
> > after a few instructions in the optimized case when static TLS is
> > available.
>
> That linker-provided stub address is loaded from a "GOT slot" of some
> sort,
No, it really is a direct call. The linker provided stub is local.
This ppc64 elfv2 GD sequence in a relocatable object file
addi r3,r2,x@got@tlsgd
bl __tls_get_addr(x@tlsgd)
nop
results in shared library code of
addi r3,r2,x@got@tlsgd # r3 -> tls_index entry in GOT
bl __tls_get_addr_opt_stub # direct call
nop
.
.
__tls_get_addr_opt_stub:
ld r11,0(r3) # tls_index->ti_module
ld r12 8(r3) # tls_index->ti_offset
mr r0,r3
cmpdi r11,0
add r3,r12,r13 # r13 == thread pointer
beqlr # return if static TLS allocated
mr r3,r0
mflr r11
std r11, 8(r1)
std r2 24(r1)
addis r12,r2,__tls_get_addr_opt@plt@ha
ld r12, __tls_get_addr_opt@plt@l(r12)
mtctr r12
bctrl # call __tls_get_addr_opt
ld r2,24(r1)
ld r11,8(r1)
mtlr r11
blr
--
Alan Modra
Australia Development Lab, IBM
More information about the Libc-alpha
mailing list