use hidden __tls_get_new for tls/tlsdesc lookup fallback cases
authorRich Felker <dalias@aerifal.cx>
Wed, 15 Apr 2015 03:45:08 +0000 (23:45 -0400)
committerRich Felker <dalias@aerifal.cx>
Wed, 15 Apr 2015 03:45:08 +0000 (23:45 -0400)
previously, the dynamic tlsdesc lookup functions and the i386
special-ABI ___tls_get_addr (3 underscores) function called
__tls_get_addr when the slot they wanted was not already setup;
__tls_get_addr would then in turn also see that it's not setup and
call __tls_get_new.

calling __tls_get_new directly is both more efficient and avoids the
issue of calling a non-hidden (public API/ABI) function from asm.

for the special i386 function, a weak reference to __tls_get_new is
used since this function is not defined when static linking (the code
path that needs it is unreachable in static-linked programs).

src/ldso/aarch64/tlsdesc.s
src/ldso/i386/tlsdesc.s
src/ldso/x86_64/tlsdesc.s
src/thread/i386/tls.s

index 32064bd7ffce61c11acde427704947c9aee7aad8..05ddbab4c776d557e73c8e56e5f6a75431bc9ba6 100644 (file)
@@ -8,6 +8,8 @@ __tlsdesc_static:
        ldr x0,[x0,#8]
        ret
 
+.hidden __tls_get_new
+
 // long __tlsdesc_dynamic(long *a)
 // {
 //     struct {size_t modidx,off;} *p = (void*)a[1];
@@ -37,7 +39,7 @@ __tlsdesc_dynamic:
        ldp x1,x2,[sp],#32
        ret
 
-       // save all registers __tls_get_addr may clobber
+       // save all registers __tls_get_new may clobber
        // ugly because addr offset must be in [-512,509]
 1:     stp x29,x30,[sp,#-160]!
        stp x5,x6,[sp,#16]
@@ -63,7 +65,7 @@ __tlsdesc_dynamic:
        stp q26,q27,[sp,#384]
        stp q28,q29,[sp,#416]
        stp q30,q31,[sp,#448]
-       bl __tls_get_addr
+       bl __tls_get_new
        mrs x1,tpidr_el0
        ldp q4,q5,[sp,#32]
        ldp q6,q7,[sp,#64]
index 3ac6129777c3da550e8c8bccd4b24b313c835e03..00a9fc09ac9776014c833082d9d5caae377c86c9 100644 (file)
@@ -5,6 +5,8 @@ __tlsdesc_static:
        mov 4(%eax),%eax
        ret
 
+.hidden __tls_get_new
+
 .global __tlsdesc_dynamic
 .type __tlsdesc_dynamic,@function
 __tlsdesc_dynamic:
@@ -22,6 +24,6 @@ __tlsdesc_dynamic:
        pop %edx
        ret
 1:     push %eax
-       call __tls_get_addr
+       call __tls_get_new
        pop %ecx
        jmp 2b
index 57b78e0be9213218c0c2c8efd88b8f79b4257f96..eb21b9dee77bcadfdd5834134f846a4f9cfb7d89 100644 (file)
@@ -5,6 +5,8 @@ __tlsdesc_static:
        mov 8(%rax),%rax
        ret
 
+.hidden __tls_get_new
+
 .global __tlsdesc_dynamic
 .type __tlsdesc_dynamic,@function
 __tlsdesc_dynamic:
@@ -29,7 +31,7 @@ __tlsdesc_dynamic:
        push %r10
        push %r11
        mov %rax,%rdi
-       call __tls_get_addr
+       call __tls_get_new
        pop %r11
        pop %r10
        pop %r9
index 6e01adf244a4c8da74decab12d8f433de9ebfbed..76d5d46253132b35705e27493ca0b1ad7fcbc66a 100644 (file)
@@ -10,6 +10,8 @@ ___tls_get_addr:
        add (%edx,%ecx,4),%eax
        ret
 1:     push %eax
-       call __tls_get_addr
+.weak __tls_get_new
+.hidden __tls_get_new
+       call __tls_get_new
        pop %edx
        ret