mirror of https://git.musl-libc.org/git/musl
Browse Source
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
committed by
Rich Felker
1 changed files with 10 additions and 10 deletions
@ -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…
Reference in new issue