mirror of
git://git.musl-libc.org/musl
synced 2025-03-06 20:48:29 +01:00
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.
This commit is contained in:
parent
5ccf05d86d
commit
6af4f25b89
1 changed files with 10 additions and 10 deletions
|
@ -1,17 +1,17 @@
|
|||
.global __tls_get_offset
|
||||
.type __tls_get_offset,%function
|
||||
__tls_get_offset:
|
||||
stmg %r14, %r15, 112(%r15)
|
||||
aghi %r15, -160
|
||||
ear %r0, %a0
|
||||
sllg %r0, %r0, 32
|
||||
ear %r0, %a1
|
||||
|
||||
la %r2, 0(%r2, %r12)
|
||||
brasl %r14, __tls_get_addr
|
||||
la %r1, 0(%r2, %r12)
|
||||
|
||||
ear %r1, %a0
|
||||
sllg %r1, %r1, 32
|
||||
ear %r1, %a1
|
||||
lg %r3, 0(%r1)
|
||||
sllg %r4, %r3, 3
|
||||
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
|
||||
|
|
Loading…
Add table
Reference in a new issue