Browse Source

s390x: manually inline __tls_get_addr in __tls_get_offset

Calling __tls_get_addr with brasl is not valid since it's a global symbol; doing
so results in an R_390_PC32DBL relocation error from lld. We could fix this by
marking __tls_get_addr hidden since it is not part of the s390x ABI, or by using
a different instruction. However, given its simplicity, it makes more sense to
just manually inline it into __tls_get_offset for performance.

The patch has been tested by applying to Zig's bundled musl copy and running the
full Zig test suite under qemu-s390x.
master
Alex Rønne Petersen 2 years ago
committed by Rich Felker
parent
commit
6af4f25b89
  1. 20
      src/thread/s390x/__tls_get_offset.s

20
src/thread/s390x/__tls_get_offset.s

@ -1,17 +1,17 @@
.global __tls_get_offset .global __tls_get_offset
.type __tls_get_offset,%function .type __tls_get_offset,%function
__tls_get_offset: __tls_get_offset:
stmg %r14, %r15, 112(%r15) ear %r0, %a0
aghi %r15, -160 sllg %r0, %r0, 32
ear %r0, %a1
la %r2, 0(%r2, %r12) la %r1, 0(%r2, %r12)
brasl %r14, __tls_get_addr
ear %r1, %a0 lg %r3, 0(%r1)
sllg %r1, %r1, 32 sllg %r4, %r3, 3
ear %r1, %a1 lg %r5, 8(%r0)
lg %r2, 0(%r4, %r5)
ag %r2, 8(%r1)
sgr %r2, %r0
sgr %r2, %r1
lmg %r14, %r15, 272(%r15)
br %r14 br %r14

Loading…
Cancel
Save