[PATCH 07/11] s390: Fix linker TLS IE without GOT pointer tests

Jens Remus jremus@linux.ibm.com
Thu Nov 13 13:21:40 GMT 2025


In TLS Initial Exec (IE) model tests without GOT pointer do not
erroneously add the GOT pointer (in register r12) to the GOT entry
address (sym@indntpoff).  Note that there is no related change in
the expected test results as the load (lg) is rewritten to a load
register (sllg) due to IE -> LE transition.

Additionally in IE without GOT pointer using larl @indntpoff to load
the GOT entry address do not use the :tls_load marker on the subsequent
load from GOT as the sym@indtpoff cannot be optimized to sym@ntpoff.
Otherwise the linker erroneously rewrites the load (lg) to a load
register (sllg) due to IE -> LE transition.

ld/testsuite/
	* ld-s390/tlsbin.s: Do not add GOT pointer to GOT entry
	addresses in IE tests without GOT pointer.
	* ld-s390/tlsbin_64.s: Likewise.
	* ld-s390/tlsbinpic_64.s: Likewise.  Do not use :tls_load marker
	on load from GOT in IE tests without GOT pointer using
	larl @indntpoff.
	* ld-s390/tlsbin.dd: Adapt expected test output patterns to
	test changes.
	* ld-s390/tlsbin_64.dd: Likewise.

Signed-off-by: Jens Remus <jremus@linux.ibm.com>
---
 ld/testsuite/ld-s390/tlsbin.dd      |  2 +-
 ld/testsuite/ld-s390/tlsbin.s       |  8 ++++----
 ld/testsuite/ld-s390/tlsbin_64.dd   | 10 +++++-----
 ld/testsuite/ld-s390/tlsbin_64.s    |  8 ++++----
 ld/testsuite/ld-s390/tlsbinpic_64.s |  8 ++++----
 5 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/ld/testsuite/ld-s390/tlsbin.dd b/ld/testsuite/ld-s390/tlsbin.dd
index 6121ed470fec..21dc2970614b 100644
--- a/ld/testsuite/ld-s390/tlsbin.dd
+++ b/ld/testsuite/ld-s390/tlsbin.dd
@@ -170,7 +170,7 @@ Disassembly of section .text:
   +[0-9a-f]+:	b2 4f 00 90       	ear	%r9,%a0
 # IE against global var
   +[0-9a-f]+:	58 30 d0 00       	l	%r3,0\(%r13\)
-  +[0-9a-f]+:	58 43 c0 00       	l	%r4,0\(%r3,%r12\)
+  +[0-9a-f]+:	58 40 30 00       	l	%r4,0\(%r3\)
   +[0-9a-f]+:	41 54 90 00       	la	%r5,0\(%r4,%r9\)
 # IE -> LE against global var defined in exec
   +[0-9a-f]+:	58 30 d0 04       	l	%r3,4\(%r13\)
diff --git a/ld/testsuite/ld-s390/tlsbin.s b/ld/testsuite/ld-s390/tlsbin.s
index 43f9c4569e2b..43c17b214c05 100644
--- a/ld/testsuite/ld-s390/tlsbin.s
+++ b/ld/testsuite/ld-s390/tlsbin.s
@@ -49,22 +49,22 @@ _start:
 
 	/* IE against global var  */
 	l	%r3,.LC0-.LT1(%r13)
-	l	%r4,0(%r3,%r12):tls_load:sG6
+	l	%r4,0(%r3):tls_load:sG6
 	la	%r5,0(%r4,%r9)
 
 	/* IE -> LE against global var defined in exec  */
 	l	%r3,.LC1-.LT1(%r13)
-	l	%r4,0(%r3,%r12):tls_load:bg6
+	l	%r4,0(%r3):tls_load:bg6
 	la	%r5,0(%r4,%r9)
 
 	/* IE -> LE against local var  */
 	l	%r3,.LC2-.LT1(%r13)
-	l	%r4,0(%r3,%r12):tls_load:bl6
+	l	%r4,0(%r3):tls_load:bl6
 	la	%r5,0(%r4,%r9)
 
 	/* IE -> LE against hidden but not local var  */
 	l	%r3,.LC3-.LT1(%r13)
-	l	%r4,0(%r3,%r12):tls_load:sh6
+	l	%r4,0(%r3):tls_load:sh6
 	la	%r5,0(%r4,%r9)
 
 	/* LE, global var defined in exec  */
diff --git a/ld/testsuite/ld-s390/tlsbin_64.dd b/ld/testsuite/ld-s390/tlsbin_64.dd
index f5391575a245..f42d3a2c122a 100644
--- a/ld/testsuite/ld-s390/tlsbin_64.dd
+++ b/ld/testsuite/ld-s390/tlsbin_64.dd
@@ -131,19 +131,19 @@ Disassembly of section .text:
  +[0-9a-f]+:	41 54 90 00       	la	%r5,0\(%r4,%r9\)
 # IE against global var with larl got access
  +[0-9a-f]+:	c0 30 [0-9a-f ]+ 	larl	%r3,[0-9a-f]+ <.*>
- +[0-9a-f]+:	e3 43 c0 00 00 04 	lg	%r4,0\(%r3,%r12\)
+ +[0-9a-f]+:	e3 40 30 00 00 04 	lg	%r4,0\(%r3\)
  +[0-9a-f]+:	41 54 90 00       	la	%r5,0\(%r4,%r9\)
 # IE against global var defined in exec with larl got access
  +[0-9a-f]+:	c0 30 [0-9a-f ]+ 	larl	%r3,[0-9a-f]+ <_GLOBAL_OFFSET_TABLE_\+0x30>
- +[0-9a-f]+:	eb 43 00 00 00 0d 	sllg	%r4,%r3,0
+ +[0-9a-f]+:	e3 40 30 00 00 04 	lg	%r4,0\(%r3\)
  +[0-9a-f]+:	41 54 90 00       	la	%r5,0\(%r4,%r9\)
 # IE against local var with larl got access
  +[0-9a-f]+:	c0 30 [0-9a-f ]+ 	larl	%r3,[0-9a-f]+ <_GLOBAL_OFFSET_TABLE_\+0x20>
- +[0-9a-f]+:	eb 43 00 00 00 0d 	sllg	%r4,%r3,0
+ +[0-9a-f]+:	e3 40 30 00 00 04 	lg	%r4,0\(%r3\)
  +[0-9a-f]+:	41 54 90 00       	la	%r5,0\(%r4,%r9\)
 # IE against hidden var with larl got access
  +[0-9a-f]+:	c0 30 [0-9a-f ]+ 	larl	%r3,[0-9a-f]+ <_GLOBAL_OFFSET_TABLE_\+0x38>
- +[0-9a-f]+:	eb 43 00 00 00 0d 	sllg	%r4,%r3,0
+ +[0-9a-f]+:	e3 40 30 00 00 04 	lg	%r4,0\(%r3\)
  +[0-9a-f]+:	41 54 90 00       	la	%r5,0\(%r4,%r9\)
 # IE against global var with small got access (no optimization)
  +[0-9a-f]+:	e3 30 c0 28 00 04 	lg	%r3,40\(%r12\)
@@ -203,7 +203,7 @@ Disassembly of section .text:
  +[0-9a-f]+:	b2 4f 00 91       	ear	%r9,%a1
 # IE against global var
  +[0-9a-f]+:	e3 30 d0 00 00 04 	lg	%r3,0\(%r13\)
- +[0-9a-f]+:	e3 43 c0 00 00 04 	lg	%r4,0\(%r3,%r12\)
+ +[0-9a-f]+:	e3 40 30 00 00 04 	lg	%r4,0\(%r3\)
  +[0-9a-f]+:	41 54 90 00       	la	%r5,0\(%r4,%r9\)
 # IE -> LE against global var defined in exec
  +[0-9a-f]+:	e3 30 d0 08 00 04 	lg	%r3,8\(%r13\)
diff --git a/ld/testsuite/ld-s390/tlsbin_64.s b/ld/testsuite/ld-s390/tlsbin_64.s
index 82fb4d5a00ff..15c3bc32e3bb 100644
--- a/ld/testsuite/ld-s390/tlsbin_64.s
+++ b/ld/testsuite/ld-s390/tlsbin_64.s
@@ -51,22 +51,22 @@ _start:
 
 	/* IE against global var  */
 	lg	%r3,.LC0-.LT1(%r13)
-	lg	%r4,0(%r3,%r12):tls_load:sG6
+	lg	%r4,0(%r3):tls_load:sG6
 	la	%r5,0(%r4,%r9)
 
 	/* IE -> LE against global var defined in exec  */
 	lg	%r3,.LC1-.LT1(%r13)
-	lg	%r4,0(%r3,%r12):tls_load:bg6
+	lg	%r4,0(%r3):tls_load:bg6
 	la	%r5,0(%r4,%r9)
 
 	/* IE -> LE against local var  */
 	lg	%r3,.LC2-.LT1(%r13)
-	lg	%r4,0(%r3,%r12):tls_load:bl6
+	lg	%r4,0(%r3):tls_load:bl6
 	la	%r5,0(%r4,%r9)
 
 	/* IE -> LE against hidden but not local var  */
 	lg	%r3,.LC3-.LT1(%r13)
-	lg	%r4,0(%r3,%r12):tls_load:sh6
+	lg	%r4,0(%r3):tls_load:sh6
 	la	%r5,0(%r4,%r9)
 
 	/* LE, global var defined in exec  */
diff --git a/ld/testsuite/ld-s390/tlsbinpic_64.s b/ld/testsuite/ld-s390/tlsbinpic_64.s
index b337a61b316f..b849156ed0fb 100644
--- a/ld/testsuite/ld-s390/tlsbinpic_64.s
+++ b/ld/testsuite/ld-s390/tlsbinpic_64.s
@@ -145,22 +145,22 @@ fn2:
 
 	/* IE against global var with larl got access */
 	larl	%r3,sG3@indntpoff
-	lg	%r4,0(%r3,%r12):tls_load:sG3
+	lg	%r4,0(%r3)
 	la	%r5,0(%r4,%r9)
 
 	/* IE against global var defined in exec with larl got access */
 	larl	%r3,sg3@indntpoff
-	lg	%r4,0(%r3,%r12):tls_load:sg3
+	lg	%r4,0(%r3)
 	la	%r5,0(%r4,%r9)
 
 	/* IE against local var with larl got access */
 	larl	%r3,sl3@indntpoff
-	lg	%r4,0(%r3,%r12):tls_load:sl3
+	lg	%r4,0(%r3)
 	la	%r5,0(%r4,%r9)
 
 	/* IE against hidden var with larl got access */
 	larl	%r3,sh3@indntpoff
-	lg	%r4,0(%r3,%r12):tls_load:sh3
+	lg	%r4,0(%r3)
 	la	%r5,0(%r4,%r9)
 
 	/* IE against global var with small got access (no optimization) */
-- 
2.48.1



More information about the Binutils mailing list