diff options
| author | Alex Rønne Petersen <alex@alexrp.com> | 2025-01-24 06:12:13 +0100 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2025-02-09 09:46:53 -0500 | 
| commit | 6af4f25b899e89e4b91f8c197ae5a6ce04bcce7b (patch) | |
| tree | 7165ccd14c4b3259870a43e6a00e5e704a131461 /src | |
| parent | 5ccf05d86dacba0e6542ae1a6b6508a41cfe326e (diff) | |
| download | musl-6af4f25b899e89e4b91f8c197ae5a6ce04bcce7b.tar.gz | |
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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/thread/s390x/__tls_get_offset.s | 20 | 
1 files changed, 10 insertions, 10 deletions
diff --git a/src/thread/s390x/__tls_get_offset.s b/src/thread/s390x/__tls_get_offset.s index 8ee92de8..405f118b 100644 --- a/src/thread/s390x/__tls_get_offset.s +++ b/src/thread/s390x/__tls_get_offset.s @@ -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  | 
