aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/testsuite/ChangeLog30
-rw-r--r--ld/testsuite/ld-s390/s390.exp72
-rw-r--r--ld/testsuite/ld-s390/tlsbin.dd185
-rw-r--r--ld/testsuite/ld-s390/tlsbin.rd156
-rw-r--r--ld/testsuite/ld-s390/tlsbin.s73
-rw-r--r--ld/testsuite/ld-s390/tlsbin.sd13
-rw-r--r--ld/testsuite/ld-s390/tlsbin.td16
-rw-r--r--ld/testsuite/ld-s390/tlsbin_64.dd213
-rw-r--r--ld/testsuite/ld-s390/tlsbin_64.rd156
-rw-r--r--ld/testsuite/ld-s390/tlsbin_64.s75
-rw-r--r--ld/testsuite/ld-s390/tlsbin_64.sd18
-rw-r--r--ld/testsuite/ld-s390/tlsbin_64.td16
-rw-r--r--ld/testsuite/ld-s390/tlsbinpic.s168
-rw-r--r--ld/testsuite/ld-s390/tlsbinpic_64.s184
-rw-r--r--ld/testsuite/ld-s390/tlslib.s17
-rw-r--r--ld/testsuite/ld-s390/tlslib_64.s17
-rw-r--r--ld/testsuite/ld-s390/tlspic.dd161
-rw-r--r--ld/testsuite/ld-s390/tlspic.rd165
-rw-r--r--ld/testsuite/ld-s390/tlspic.sd16
-rw-r--r--ld/testsuite/ld-s390/tlspic.td16
-rw-r--r--ld/testsuite/ld-s390/tlspic1.s206
-rw-r--r--ld/testsuite/ld-s390/tlspic1_64.s222
-rw-r--r--ld/testsuite/ld-s390/tlspic2.s11
-rw-r--r--ld/testsuite/ld-s390/tlspic2_64.s11
-rw-r--r--ld/testsuite/ld-s390/tlspic_64.dd194
-rw-r--r--ld/testsuite/ld-s390/tlspic_64.rd165
-rw-r--r--ld/testsuite/ld-s390/tlspic_64.sd21
-rw-r--r--ld/testsuite/ld-s390/tlspic_64.td16
28 files changed, 2613 insertions, 0 deletions
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index b76242e..f6b156a 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,33 @@
+2003-01-24 Martin Schwidefsky <schwidefsky@de.ibm.com>
+
+ * ld-s390/s390.exp: New file.
+ * ld-s390/tlsbin_64.dd: New file.
+ * ld-s390/tlsbin_64.rd: New file.
+ * ld-s390/tlsbin_64.s: New file.
+ * ld-s390/tlsbin_64.sd: New file.
+ * ld-s390/tlsbin_64.td: New file.
+ * ld-s390/tlsbin.dd: New file.
+ * ld-s390/tlsbinpic_64.s: New file.
+ * ld-s390/tlsbinpic.s: New file.
+ * ld-s390/tlsbin.rd: New file.
+ * ld-s390/tlsbin.s: New file.
+ * ld-s390/tlsbin.sd: New file.
+ * ld-s390/tlsbin.td: New file.
+ * ld-s390/tlslib_64.s: New file.
+ * ld-s390/tlslib.s: New file.
+ * ld-s390/tlspic1_64.s: New file.
+ * ld-s390/tlspic1.s: New file.
+ * ld-s390/tlspic2_64.s: New file.
+ * ld-s390/tlspic2.s: New file.
+ * ld-s390/tlspic_64.dd: New file.
+ * ld-s390/tlspic_64.rd: New file.
+ * ld-s390/tlspic_64.sd: New file.
+ * ld-s390/tlspic_64.td: New file.
+ * ld-s390/tlspic.dd: New file.
+ * ld-s390/tlspic.rd: New file.
+ * ld-s390/tlspic.sd: New file.
+ * ld-s390/tlspic.td: New file.
+
2003-01-24 Alan Modra <amodra@bigpond.net.au>
* ld-alpha/tlsbin.sd: Cope with truncated address in data dumps.
diff --git a/ld/testsuite/ld-s390/s390.exp b/ld/testsuite/ld-s390/s390.exp
new file mode 100644
index 0000000..83582f1
--- /dev/null
+++ b/ld/testsuite/ld-s390/s390.exp
@@ -0,0 +1,72 @@
+# Expect script for ld-s390 tests
+# Copyright (C) 2003 Free Software Foundation
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+
+# Test s390 linking; all types of relocs. This tests the assembler and
+# tools like objdump as well as the linker.
+
+if { !([istarget "s390-*-*"] || [istarget "s390x-*-*"]) } {
+ return
+}
+
+# List contains test-items with 3 items followed by 2 lists:
+# 0:name 1:ld options 2:assembler options
+# 3:filenames of assembler files 4: action and options. 5: name of output file
+
+# Actions:
+# objdump: Apply objdump options on result. Compare with regex (last arg).
+# nm: Apply nm options on result. Compare with regex (last arg).
+# readelf: Apply readelf options on result. Compare with regex (last arg).
+
+set s390tests {
+ {"TLS -fpic -shared transitions" "-shared -melf_s390"
+ "-m31" {tlspic1.s tlspic2.s}
+ {{readelf -Ssrl tlspic.rd} {objdump -dzrj.text tlspic.dd}
+ {objdump -sj.got tlspic.sd} {objdump -sj.tdata tlspic.td}}
+ "libtlspic.so"}
+ {"Helper shared library" "-shared -melf_s390"
+ "-m31" {tlslib.s} {} "libtlslib.so"}
+ {"TLS -fpic and -fno-pic exec transitions"
+ "-melf_s390 tmpdir/libtlslib.so" "-m31" {tlsbinpic.s tlsbin.s}
+ {{readelf -Ssrl tlsbin.rd} {objdump -dzrj.text tlsbin.dd}
+ {objdump -sj.got tlsbin.sd} {objdump -sj.tdata tlsbin.td}}
+ "tlsbin"}
+}
+
+set s390xtests {
+ {"TLS -fpic -shared transitions" "-shared -melf64_s390"
+ "-m64 -Aesame" {tlspic1_64.s tlspic2_64.s}
+ {{readelf -WSsrl tlspic_64.rd} {objdump -dzrj.text tlspic_64.dd}
+ {objdump -sj.got tlspic_64.sd} {objdump -sj.tdata tlspic_64.td}}
+ "libtlspic_64.so"}
+ {"Helper shared library" "-shared -melf64_s390"
+ "-m64 -Aesame" {tlslib_64.s} {} "libtlslib_64.so"}
+ {"TLS -fpic and -fno-pic exec transitions"
+ "-melf64_s390 tmpdir/libtlslib_64.so" "-m64 -Aesame"
+ {tlsbinpic_64.s tlsbin_64.s}
+ {{readelf -WSsrl tlsbin_64.rd} {objdump -dzrj.text tlsbin_64.dd}
+ {objdump -sj.got tlsbin_64.sd} {objdump -sj.tdata tlsbin_64.td}}
+ "tlsbin_64"}
+}
+
+if [istarget "s390-*-*"] {
+ run_ld_link_tests $s390tests
+}
+
+if [istarget "s390x-*-*"] {
+ run_ld_link_tests $s390xtests
+}
diff --git a/ld/testsuite/ld-s390/tlsbin.dd b/ld/testsuite/ld-s390/tlsbin.dd
new file mode 100644
index 0000000..215a98d
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlsbin.dd
@@ -0,0 +1,185 @@
+#source: tlsbinpic.s
+#source: tlsbin.s
+#as: -m31
+#ld: -shared -melf_s390
+#objdump: -dzrj.text
+#target: s390-*-*
+
+# PT_TLS layout is:
+# Offset from Offset from Name
+# TCB base TCB end
+# 0x00 -0xa0 sg1..sg2
+# 0x20 -0x80 sl1..sl2
+# 0x40 -0x60 sh1..sh2
+# 0x60 -0x40 bg1..bg2
+# 0x80 -0x20 bl1..bl2
+
+.*: +file format elf32-s390
+
+Disassembly of section .text:
+
+0+4002e4 <fn2>:
+# function prolog
+ +4002e4: 90 6e f0 18 stm %r6,%r14,24\(%r15\)
+ +4002e8: a7 d5 00 24 bras %r13,400330 <fn2\+0x4c>
+# _GLOBAL_OFFSET_TABLE_
+ +4002ec: 00 00 12 90 .long 0x00001290
+# __tls_get_addr@plt-.LT1
+ +4002f0: ff ff ff d8 .long 0xffffffd8
+# sG1@tlsgd
+ +4002f4: 00 00 00 28 .long 0x00000028
+# sG2@tlsgd
+ +4002f8: 00 00 00 20 .long 0x00000020
+# sg1@tlsgd
+ +4002fc: ff ff ff 60 .long 0xffffff60
+# sl1@tlsgd
+ +400300: ff ff ff 80 .long 0xffffff80
+# sh1@tlsgd
+ +400304: ff ff ff a0 .long 0xffffffa0
+# sl1@tlsldm
+ +400308: 00 00 00 00 .long 0x00000000
+# sl1@dtpoff
+ +40030c: ff ff ff 80 .long 0xffffff80
+# sl2@dtpoff
+ +400310: ff ff ff 84 .long 0xffffff84
+# sh1@tlsldm
+ +400314: 00 00 00 00 .long 0x00000000
+# sh1@dtpoff
+ +400318: ff ff ff a0 .long 0xffffffa0
+# sh2@dtpoff
+ +40031c: ff ff ff a4 .long 0xffffffa4
+# sG2@gotntpoff
+ +400320: 00 00 00 20 .long 0x00000020
+# sg1@gotntpoff
+ +400324: ff ff ff 60 .long 0xffffff60
+# sl1@gotntpoff
+ +400328: ff ff ff 80 .long 0xffffff80
+# sh1@gotntpoff
+ +40032c: ff ff ff a0 .long 0xffffffa0
+# function prolog
+ +400330: 18 ef lr %r14,%r15
+ +400332: 58 c0 d0 00 l %r12,0\(%r13\)
+ +400336: a7 fa ff a0 ahi %r15,-96
+ +40033a: 41 cc d0 00 la %r12,0\(%r12,%r13\)
+ +40033e: 50 e0 e0 00 st %r14,0\(%r14\)
+# Extract TCB and load branch offset
+ +400342: b2 4f 00 90 ear %r9,%a0
+ +400346: 58 70 d0 04 l %r7,4\(%r13\)
+# GD -> IE because variable is not defined in executable
+ +40034a: 58 20 d0 08 l %r2,8\(%r13\)
+ +40034e: 58 22 c0 00 l %r2,0\(%r2,%r12\)
+ +400352: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD -> IE because variable is not defined in executable where
+# the variable is referenced through IE too
+ +400356: 58 20 d0 0c l %r2,12\(%r13\)
+ +40035a: 58 22 c0 00 l %r2,0\(%r2,%r12\)
+ +40035e: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD -> LE with global variable defined in executable
+ +400362: 58 20 d0 10 l %r2,16\(%r13\)
+ +400366: 47 00 00 00 bc 0,0
+ +40036a: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD -> LE with local variable defined in executable
+ +40036e: 58 20 d0 14 l %r2,20\(%r13\)
+ +400372: 47 00 00 00 bc 0,0
+ +400376: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD -> LE with hidden variable defined in executable
+ +40037a: 58 20 d0 18 l %r2,24\(%r13\)
+ +40037e: 47 00 00 00 bc 0,0
+ +400382: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# LD -> LE
+ +400386: 58 20 d0 1c l %r2,28\(%r13\)
+ +40038a: 47 00 00 00 bc 0,0
+ +40038e: 41 32 90 00 la %r3,0\(%r2,%r9\)
+ +400392: 58 40 d0 20 l %r4,32\(%r13\)
+ +400396: 41 54 30 00 la %r5,0\(%r4,%r3\)
+ +40039a: 58 40 d0 24 l %r4,36\(%r13\)
+ +40039e: 41 54 30 00 la %r5,0\(%r4,%r3\)
+# LD -> LE against hidden variables
+ +4003a2: 58 20 d0 28 l %r2,40\(%r13\)
+ +4003a6: 47 00 00 00 bc 0,0
+ +4003aa: 41 32 90 00 la %r3,0\(%r2,%r9\)
+ +4003ae: 58 40 d0 2c l %r4,44\(%r13\)
+ +4003b2: 41 54 30 00 la %r5,0\(%r4,%r3\)
+ +4003b6: 58 40 d0 30 l %r4,48\(%r13\)
+ +4003ba: 41 54 30 00 la %r5,0\(%r4,%r3\)
+# IE against global var
+ +4003be: 58 30 d0 34 l %r3,52\(%r13\)
+ +4003c2: 58 33 c0 00 l %r3,0\(%r3,%r12\)
+ +4003c6: 58 33 90 00 l %r3,0\(%r3,%r9\)
+# IE -> LE against global var defined in exec
+ +4003ca: 58 30 d0 38 l %r3,56\(%r13\)
+ +4003ce: 18 43 lr %r4,%r3
+ +4003d0: 07 00 bcr 0,%r0
+ +4003d2: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE -> LE against local var
+ +4003d6: 58 30 d0 3c l %r3,60\(%r13\)
+ +4003da: 18 43 lr %r4,%r3
+ +4003dc: 07 00 bcr 0,%r0
+ +4003de: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE -> LE against hidden var
+ +4003e2: 58 30 d0 40 l %r3,64\(%r13\)
+ +4003e6: 18 43 lr %r4,%r3
+ +4003e8: 07 00 bcr 0,%r0
+ +4003ea: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE against global var with small got access (no optimization)
+ +4003ee: 58 30 c0 14 l %r3,20\(%r12\)
+ +4003f2: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# IE against global var defined in exec with small got access
+# (no optimization)
+ +4003f6: 58 30 c0 18 l %r3,24\(%r12\)
+ +4003fa: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# IE against local var with small got access (no optimization)
+ +4003fe: 58 30 c0 10 l %r3,16\(%r12\)
+ +400402: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# IE against hidden var with small got access (no optimization)
+ +400406: 58 30 c0 1c l %r3,28\(%r12\)
+ +40040a: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# function epilog
+ +40040e: 98 6e f0 78 lm %r6,%r14,120\(%r15\)
+ +400412: 07 fe br %r14
+
+0+400414 <_start>:
+# function prolog
+ +400414: 90 6e f0 18 stm %r6,%r14,24\(%r15\)
+ +400418: a7 d5 00 0c bras %r13,400430 <_start\+0x1c>
+# sG6@indntpoff
+ +40041c: 00 40 15 a0 .long 0x004015a0
+# bg6@indntpoff
+ +400420: ff ff ff d4 .long 0xffffffd4
+# bl6@indntpoff
+ +400424: ff ff ff f4 .long 0xfffffff4
+# sh6@indntpoff
+ +400428: ff ff ff b4 .long 0xffffffb4
+# sg3@indntpoff
+ +40042c: ff ff ff 68 .long 0xffffff68
+# function prolog
+ +400430: 18 ef lr %r14,%r15
+ +400432: a7 fa ff a0 ahi %r15,-96
+ +400436: 50 e0 e0 00 st %r14,0\(%r14\)
+# Extract TCB
+ +40043a: b2 4f 00 90 ear %r9,%a0
+# IE against global var
+ +40043e: 58 30 d0 00 l %r3,0\(%r13\)
+ +400442: 58 33 c0 00 l %r3,0\(%r3,%r12\)
+ +400446: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# IE -> LE against global var defined in exec
+ +40044a: 58 30 d0 04 l %r3,4\(%r13\)
+ +40044e: 18 43 lr %r4,%r3
+ +400450: 07 00 bcr 0,%r0
+ +400452: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE -> LE against local var
+ +400456: 58 30 d0 08 l %r3,8\(%r13\)
+ +40045a: 18 43 lr %r4,%r3
+ +40045c: 07 00 bcr 0,%r0
+ +40045e: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE -> LE against hidden but not local var
+ +400462: 58 30 d0 0c l %r3,12\(%r13\)
+ +400466: 18 43 lr %r4,%r3
+ +400468: 07 00 bcr 0,%r0
+ +40046a: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# LE, global var defined in exec
+ +40046e: 58 40 d0 10 l %r4,16\(%r13\)
+ +400472: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# function epilog
+ +400476: 98 6e f0 78 lm %r6,%r14,120\(%r15\)
+ +40047a: 07 fe br %r14
diff --git a/ld/testsuite/ld-s390/tlsbin.rd b/ld/testsuite/ld-s390/tlsbin.rd
new file mode 100644
index 0000000..e643b6e
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlsbin.rd
@@ -0,0 +1,156 @@
+#source: tlsbinpic.s
+#source: tlsbin.s
+#as: -m31
+#ld: -shared -melf_s390
+#readelf: -Ssrl
+#target: s390-*-*
+
+There are 19 section headers, starting at offset 0x[0-9a-f]+:
+
+Section Headers:
+ \[Nr\] Name +Type +Addr +Off +Size +ES Flg Lk Inf Al
+ \[ 0\] +NULL +0+ 0+ 0+ 00 +0 +0 +0
+ \[ 1\] .interp +.*
+ \[ 2\] .hash +.*
+ \[ 3\] .dynsym +.*
+ \[ 4\] .dynstr +.*
+ \[ 5\] .rela.dyn +.*
+ \[ 6\] .rela.plt +.*
+ \[ 7\] .plt +.*
+ \[ 8\] .text +PROGBITS +0+4002e4 0+2e4 0+198 00 +AX +0 +0 +4
+ \[ 9\] .data +.*
+ \[10\] .tdata +PROGBITS +0+40147c 0+47c 0+60 00 WAT +0 +0 +1
+ \[11\] .tbss +NOBITS +0+4014dc 0+4dc 0+40 00 WAT +0 +0 +1
+ \[12\] .dynamic +DYNAMIC +0+4014dc 0+4dc 0+a0 08 +WA +4 +0 +4
+ \[13\] .got +PROGBITS +0+40157c 0+57c 0+2c 04 +WA +0 +0 +4
+ \[14\] .sbss +.*
+ \[15\] .bss +.*
+ \[16\] .shstrtab +.*
+ \[17\] .symtab +.*
+ \[18\] .strtab +.*
+Key to Flags:
+.*
+.*
+.*
+
+Elf file type is EXEC \(Executable file\)
+Entry point 0x400414
+There are 6 program headers, starting at offset [0-9]+
+
+Program Headers:
+ Type +Offset +VirtAddr +PhysAddr +FileSiz +MemSiz +Flg Align
+ PHDR +0x0+34 0x0+400034 0x0+400034 0x0+c0 0x0+c0 R E 0x4
+ INTERP +0x0+f4 0x0+4000f4 0x0+4000f4 0x0+11 0x0+11 R +0x1
+.*Requesting program interpreter.*
+ LOAD +0x0+ 0x0+400000 0x0+400000 0x0+47c 0x0+47c R E 0x1000
+ LOAD +0x0+47c 0x0+40147c 0x0+40147c 0x0+12c 0x0+12c RW 0x1000
+ DYNAMIC +0x0+4dc 0x0+4014dc 0x0+4014dc 0x0+a0 0x0+a0 RW 0x4
+ TLS +0x0+47c 0x0+40147c 0x0+40147c 0x0+60 0x0+a0 R +0x1
+
+ Section to Segment mapping:
+ Segment Sections...
+ 00 *
+ 01 +.interp *
+ 02 +.interp .hash .dynsym .dynstr .rela.dyn .rela.plt .plt .text *
+ 03 +.tdata .tbss .dynamic .got *
+ 04 +.tbss .dynamic *
+ 05 +.tdata .tbss *
+
+Relocation section '.rela.dyn' at offset 0x268 contains 4 entries:
+ Offset +Info +Type +Sym.Value Sym. Name \+ Addend
+[0-9a-f]+ 0+138 R_390_TLS_TPOFF +0+ +sG3 \+ 0
+[0-9a-f]+ 0+338 R_390_TLS_TPOFF +0+ +sG2 \+ 0
+[0-9a-f]+ 0+638 R_390_TLS_TPOFF +0+ +sG6 \+ 0
+[0-9a-f]+ 0+738 R_390_TLS_TPOFF +0+ +sG1 \+ 0
+
+Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
+ Offset +Info +Type +Sym.Value Sym. Name \+ Addend
+[0-9a-f]+ 0+40b R_390_JMP_SLOT +0+40+2c4 +__tls_get_offset \+ 0
+
+Symbol table '.dynsym' contains 11 entries:
+ +Num: +Value Size Type +Bind +Vis +Ndx Name
+ +0: 0+ +0 NOTYPE LOCAL DEFAULT UND
+ +1: 0+ +0 TLS +GLOBAL DEFAULT UND sG3
+ +2: [0-9a-f]+ +0 OBJECT GLOBAL DEFAULT ABS _DYNAMIC
+ +3: 0+ +0 TLS +GLOBAL DEFAULT UND sG2
+ +4: [0-9a-f]+ +0 FUNC +GLOBAL DEFAULT UND __tls_get_offset
+ +5: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS __bss_start
+ +6: 0+ +0 TLS +GLOBAL DEFAULT UND sG6
+ +7: 0+ +0 TLS +GLOBAL DEFAULT UND sG1
+ +8: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS _edata
+ +9: [0-9a-f]+ +0 OBJECT GLOBAL DEFAULT ABS _GLOBAL_OFFSET_TABLE_
+ +10: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS _end
+
+Symbol table '.symtab' contains 71 entries:
+ +Num: +Value Size Type +Bind +Vis +Ndx Name
+ +0: 0+ +0 NOTYPE LOCAL DEFAULT UND
+ +1: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +1
+ +2: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +2
+ +3: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +3
+ +4: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +4
+ +5: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +5
+ +6: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +6
+ +7: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +7
+ +8: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +8
+ +9: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +9
+ +10: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +10
+ +11: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +11
+ +12: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +12
+ +13: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +13
+ +14: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +14
+ +15: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +15
+ +16: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +16
+ +17: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +17
+ +18: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +18
+ +19: 0+20 +0 TLS +LOCAL DEFAULT +10 sl1
+ +20: 0+24 +0 TLS +LOCAL DEFAULT +10 sl2
+ +21: 0+28 +0 TLS +LOCAL DEFAULT +10 sl3
+ +22: 0+2c +0 TLS +LOCAL DEFAULT +10 sl4
+ +23: 0+30 +0 TLS +LOCAL DEFAULT +10 sl5
+ +24: 0+34 +0 TLS +LOCAL DEFAULT +10 sl6
+ +25: 0+38 +0 TLS +LOCAL DEFAULT +10 sl7
+ +26: 0+3c +0 TLS +LOCAL DEFAULT +10 sl8
+ +27: 0+80 +0 TLS +LOCAL DEFAULT +11 bl1
+ +28: 0+84 +0 TLS +LOCAL DEFAULT +11 bl2
+ +29: 0+88 +0 TLS +LOCAL DEFAULT +11 bl3
+ +30: 0+8c +0 TLS +LOCAL DEFAULT +11 bl4
+ +31: 0+90 +0 TLS +LOCAL DEFAULT +11 bl5
+ +32: 0+94 +0 TLS +LOCAL DEFAULT +11 bl6
+ +33: 0+98 +0 TLS +LOCAL DEFAULT +11 bl7
+ +34: 0+9c +0 TLS +LOCAL DEFAULT +11 bl8
+ +35: 0+ +0 TLS +GLOBAL DEFAULT UND sG3
+ +36: 0+1c +0 TLS +GLOBAL DEFAULT +10 sg8
+ +37: 0+7c +0 TLS +GLOBAL DEFAULT +11 bg8
+ +38: 0+74 +0 TLS +GLOBAL DEFAULT +11 bg6
+ +39: 0+68 +0 TLS +GLOBAL DEFAULT +11 bg3
+ +40: [0-9a-f]+ +0 OBJECT GLOBAL DEFAULT ABS _DYNAMIC
+ +41: 0+8 +0 TLS +GLOBAL DEFAULT +10 sg3
+ +42: 0+48 +0 TLS +GLOBAL HIDDEN +10 sh3
+ +43: 0+ +0 TLS +GLOBAL DEFAULT UND sG2
+ +44: 0+c +0 TLS +GLOBAL DEFAULT +10 sg4
+ +45: 0+10 +0 TLS +GLOBAL DEFAULT +10 sg5
+ +46: 0+70 +0 TLS +GLOBAL DEFAULT +11 bg5
+ +47: 0+58 +0 TLS +GLOBAL HIDDEN +10 sh7
+ +48: 0+5c +0 TLS +GLOBAL HIDDEN +10 sh8
+ +49: [0-9a-f]+ +0 FUNC +GLOBAL DEFAULT UND __tls_get_offset
+ +50: 0+ +0 TLS +GLOBAL DEFAULT +10 sg1
+ +51: [0-9a-f]+ +0 FUNC +GLOBAL DEFAULT +8 _start
+ +52: 0+4c +0 TLS +GLOBAL HIDDEN +10 sh4
+ +53: 0+78 +0 TLS +GLOBAL DEFAULT +11 bg7
+ +54: 0+50 +0 TLS +GLOBAL HIDDEN +10 sh5
+ +55: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS __bss_start
+ +56: 0+ +0 TLS +GLOBAL DEFAULT UND sG6
+ +57: [0-9a-f]+ +0 FUNC +GLOBAL DEFAULT +8 fn2
+ +58: 0+4 +0 TLS +GLOBAL DEFAULT +10 sg2
+ +59: 0+ +0 TLS +GLOBAL DEFAULT UND sG1
+ +60: 0+40 +0 TLS +GLOBAL HIDDEN +10 sh1
+ +61: 0+14 +0 TLS +GLOBAL DEFAULT +10 sg6
+ +62: 0+18 +0 TLS +GLOBAL DEFAULT +10 sg7
+ +63: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS _edata
+ +64: [0-9a-f]+ +0 OBJECT GLOBAL DEFAULT ABS _GLOBAL_OFFSET_TABLE_
+ +65: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS _end
+ +66: 0+44 +0 TLS +GLOBAL HIDDEN +10 sh2
+ +67: 0+54 +0 TLS +GLOBAL HIDDEN +10 sh6
+ +68: 0+64 +0 TLS +GLOBAL DEFAULT +11 bg2
+ +69: 0+60 +0 TLS +GLOBAL DEFAULT +11 bg1
+ +70: 0+6c +0 TLS +GLOBAL DEFAULT +11 bg4
diff --git a/ld/testsuite/ld-s390/tlsbin.s b/ld/testsuite/ld-s390/tlsbin.s
new file mode 100644
index 0000000..4da50e7
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlsbin.s
@@ -0,0 +1,73 @@
+ .section ".tbss", "awT", @nobits
+ .globl bg1, bg2, bg3, bg4, bg5, bg6, bg7, bg8
+bg1: .space 4
+bg2: .space 4
+bg3: .space 4
+bg4: .space 4
+bg5: .space 4
+bg6: .space 4
+bg7: .space 4
+bg8: .space 4
+bl1: .space 4
+bl2: .space 4
+bl3: .space 4
+bl4: .space 4
+bl5: .space 4
+bl6: .space 4
+bl7: .space 4
+bl8: .space 4
+ .text
+ .globl _start
+ .type _start,@function
+_start:
+ /* Function prolog */
+ stm %r6,%r14,24(%r15)
+ bras %r13,.LTN1
+ /* Literal pool */
+.LT1:
+.LC0:
+ .long sG6@indntpoff
+.LC1:
+ .long bg6@indntpoff
+.LC2:
+ .long bl6@indntpoff
+.LC3:
+ .long sh6@indntpoff
+.LC4:
+ .long sg3@indntpoff
+.LTN1:
+ /* Function prolog */
+ lr %r14,%r15
+ ahi %r15,-96
+ st %r14,0(%r14)
+
+ /* Extract TCB */
+ ear %r9,%a0
+
+ /* IE against global var */
+ l %r3,.LC0-.LT1(%r13)
+ l %r3,0(%r3,%r12):tls_load:sG6
+ la %r3,0(%r3,%r9)
+
+ /* IE -> LE against global var defined in exec */
+ l %r3,.LC1-.LT1(%r13)
+ l %r4,0(%r3,%r12):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
+ 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
+ la %r5,0(%r4,%r9)
+
+ /* LE, global var defined in exec */
+ l %r4,.LC4-.LT1(%r13)
+ la %r5,0(%r4,%r9)
+
+ /* Function epilog */
+ lm %r6,%r14,120(%r15)
+ br %r14
diff --git a/ld/testsuite/ld-s390/tlsbin.sd b/ld/testsuite/ld-s390/tlsbin.sd
new file mode 100644
index 0000000..fd48420
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlsbin.sd
@@ -0,0 +1,13 @@
+#source: tlsbinpic.s
+#source: tlsbin.s
+#as: -m31
+#ld: -shared -melf_s390
+#objdump: -sj.got
+#target: s390-*-*
+
+.*: file format elf32-s390
+
+Contents of section .got:
+ 40157c [0-9a-f]+ 00000000 00000000 [0-9a-f]+ .@...........@..
+ 40158c ffffff88 00000000 ffffff68 ffffffa8 ...........h....
+ 40159c 00000000 00000000 00000000 ............
diff --git a/ld/testsuite/ld-s390/tlsbin.td b/ld/testsuite/ld-s390/tlsbin.td
new file mode 100644
index 0000000..6ecd9c7
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlsbin.td
@@ -0,0 +1,16 @@
+#source: tlsbinpic.s
+#source: tlsbin.s
+#as: -m31
+#ld: -shared -melf_s390
+#objdump: -sj.tdata
+#target: s390-*-*
+
+.*: file format elf32-s390
+
+Contents of section .tdata:
+ 40147c 00000011 00000012 00000013 00000014 .*
+ 40148c 00000015 00000016 00000017 00000018 .*
+ 40149c 00000041 00000042 00000043 00000044 .*
+ 4014ac 00000045 00000046 00000047 00000048 .*
+ 4014bc 00000101 00000102 00000103 00000104 .*
+ 4014cc 00000105 00000106 00000107 00000108 .*
diff --git a/ld/testsuite/ld-s390/tlsbin_64.dd b/ld/testsuite/ld-s390/tlsbin_64.dd
new file mode 100644
index 0000000..ca13d73
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlsbin_64.dd
@@ -0,0 +1,213 @@
+#source: tlsbinpic_64.s
+#source: tlsbin_64.s
+#as: -m64 -Aesame
+#ld: -shared -melf64_s390
+#objdump: -dzrj.text
+#target: s390x-*-*
+
+# PT_TLS layout is:
+# Offset from Offset from Name
+# TCB base TCB end
+# 0x00 -0xa0 sg1..sg2
+# 0x20 -0x80 sl1..sl2
+# 0x40 -0x60 sh1..sh2
+# 0x60 -0x40 bg1..bg2
+# 0x80 -0x20 bl1..bl2
+
+.*: +file format elf64-s390
+
+Disassembly of section .text:
+
+0+80000458 <fn2>:
+# function prolog
+ +80000458: eb 6e f0 30 00 24 stmg %r6,%r14,48\(%r15\)
+ +8000045e: a7 d5 00 3e bras %r13,800004da <fn2\+0x82>
+# sG1@tlsgd
+ +80000462: 00 00 00 00 .long 0x00000000
+ +80000466: 00 00 00 60 .long 0x00000060
+# sG2@tlsgd
+ +8000046a: 00 00 00 00 .long 0x00000000
+ +8000046e: 00 00 00 48 .long 0x00000048
+# sg1@tlsgd
+ +80000472: ff ff ff ff .long 0xffffffff
+ +80000476: ff ff ff 60 .long 0xffffff60
+# sl1@tlsgd
+ +8000047a: ff ff ff ff .long 0xffffffff
+ +8000047e: ff ff ff 80 .long 0xffffff80
+# sh1@tlsgd
+ +80000482: ff ff ff ff .long 0xffffffff
+ +80000486: ff ff ff a0 .long 0xffffffa0
+# sl1@tlsldm
+ +8000048a: 00 00 00 00 .long 0x00000000
+ +8000048e: 00 00 00 00 .long 0x00000000
+# sl1@dtpoff
+ +80000492: ff ff ff ff .long 0xffffffff
+ +80000496: ff ff ff 80 .long 0xffffff80
+# sl2@dtpoff
+ +8000049a: ff ff ff ff .long 0xffffffff
+ +8000049e: ff ff ff 84 .long 0xffffff84
+# sh1@tlsldm
+ +800004a2: 00 00 00 00 .long 0x00000000
+ +800004a6: 00 00 00 00 .long 0x00000000
+# sh1@dtpoff
+ +800004aa: ff ff ff ff .long 0xffffffff
+ +800004ae: ff ff ff a0 .long 0xffffffa0
+# sh2@dtpoff
+ +800004b2: ff ff ff ff .long 0xffffffff
+ +800004b6: ff ff ff a4 .long 0xffffffa4
+# sG2@gotntpoff
+ +800004ba: 00 00 00 00 .long 0x00000000
+ +800004be: 00 00 00 48 .long 0x00000048
+# sg1@gotntpoff
+ +800004c2: ff ff ff ff .long 0xffffffff
+ +800004c6: ff ff ff 60 .long 0xffffff60
+# sl1@gotntpoff
+ +800004ca: ff ff ff ff .long 0xffffffff
+ +800004ce: ff ff ff 80 .long 0xffffff80
+# sh1@gotntpoff
+ +800004d2: ff ff ff ff .long 0xffffffff
+ +800004d6: ff ff ff a0 .long 0xffffffa0
+# function prolog
+ +800004da: b9 04 00 ef lgr %r14,%r15
+ +800004de: a7 fb ff 60 aghi %r15,-160
+ +800004e2: c0 c0 00 00 09 d3 larl %r12,80001888 <_GLOBAL_OFFSET_TABLE_>
+ +800004e8: e3 e0 e0 00 00 24 stg %r14,0\(%r14\)
+# extract TCB
+ +800004ee: b2 4f 00 90 ear %r9,%a0
+ +800004f2: eb 94 00 20 00 0d sllg %r9,%r4,32
+ +800004f8: b2 4f 00 91 ear %r9,%a1
+# GD -> IE because variable is not defined in executable
+ +800004fc: e3 c0 d0 00 00 04 lg %r12,0\(%r13\)
+ +80000502: e3 22 c0 00 00 04 lg %r2,0\(%r2,%r12\)
+ +80000508: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD -> IE because variable is not defined in executable where
+# the variable is referenced through IE too
+ +8000050c: e3 20 d0 08 00 04 lg %r2,8\(%r13\)
+ +80000512: e3 22 c0 00 00 04 lg %r2,0\(%r2,%r12\)
+ +80000518: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD -> LE with global variable defined in executable
+ +8000051c: e3 20 d0 10 00 04 lg %r2,16\(%r13\)
+ +80000522: c0 04 00 00 00 00 brcl 0,80000522 <fn2\+0xca>
+ +80000528: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD -> LE with local variable defined in executable
+ +8000052c: e3 20 d0 18 00 04 lg %r2,24\(%r13\)
+ +80000532: c0 04 00 00 00 00 brcl 0,80000532 <fn2\+0xda>
+ +80000538: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD -> LE with hidden variable defined in executable
+ +8000053c: e3 20 d0 20 00 04 lg %r2,32\(%r13\)
+ +80000542: c0 04 00 00 00 00 brcl 0,80000542 <fn2\+0xea>
+ +80000548: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# LD -> LE
+ +8000054c: e3 20 d0 28 00 04 lg %r2,40\(%r13\)
+ +80000552: c0 04 00 00 00 00 brcl 0,80000552 <fn2\+0xfa>
+ +80000558: 41 32 90 00 la %r3,0\(%r2,%r9\)
+ +8000055c: e3 40 d0 30 00 04 lg %r4,48\(%r13\)
+ +80000562: 41 54 30 00 la %r5,0\(%r4,%r3\)
+ +80000566: e3 40 d0 38 00 04 lg %r4,56\(%r13\)
+ +8000056c: 41 54 30 00 la %r5,0\(%r4,%r3\)
+ +80000570: e3 20 d0 40 00 04 lg %r2,64\(%r13\)
+ +80000576: c0 04 00 00 00 00 brcl 0,80000576 <fn2\+0x11e>
+ +8000057c: 41 32 90 00 la %r3,0\(%r2,%r9\)
+ +80000580: e3 40 d0 48 00 04 lg %r4,72\(%r13\)
+ +80000586: 41 54 30 00 la %r5,0\(%r4,%r3\)
+ +8000058a: e3 40 d0 50 00 04 lg %r4,80\(%r13\)
+ +80000590: 41 54 30 00 la %r5,0\(%r4,%r3\)
+# IE against global var
+ +80000594: e3 30 d0 58 00 04 lg %r3,88\(%r13\)
+ +8000059a: e3 33 c0 00 00 04 lg %r3,0\(%r3,%r12\)
+ +800005a0: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# IE -> LE against global var defined in exec
+ +800005a4: e3 30 d0 60 00 04 lg %r3,96\(%r13\)
+ +800005aa: eb 43 00 00 00 0d sllg %r4,%r3,0
+ +800005b0: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE -> LE against local var
+ +800005b4: e3 30 d0 68 00 04 lg %r3,104\(%r13\)
+ +800005ba: eb 43 00 00 00 0d sllg %r4,%r3,0
+ +800005c0: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE -> LE against hidden var
+ +800005c4: e3 30 d0 70 00 04 lg %r3,112\(%r13\)
+ +800005ca: eb 43 00 00 00 0d sllg %r4,%r3,0
+ +800005d0: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE against global var with larl got access
+ +800005d4: c0 30 00 00 09 6e larl %r3,800018b0 <\_GLOBAL\_OFFSET\_TABLE\_\+0x28>
+ +800005da: e3 33 c0 00 00 04 lg %r3,0\(%r3,%r12\)
+ +800005e0: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# IE against global var defined in exec with larl got access
+ +800005e4: c0 30 00 00 09 6e larl %r3,800018c0 <\_GLOBAL\_OFFSET\_TABLE\_\+0x38>
+ +800005ea: eb 43 00 00 00 0d sllg %r4,%r3,0
+ +800005f0: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE against local var with larl got access
+ +800005f4: c0 30 00 00 09 5a larl %r3,800018a8 <\_GLOBAL\_OFFSET\_TABLE\_\+0x20>
+ +800005fa: eb 43 00 00 00 0d sllg %r4,%r3,0
+ +80000600: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE against hidden var with larl got access
+ +80000604: c0 30 00 00 09 62 larl %r3,800018c8 <\_GLOBAL\_OFFSET\_TABLE\_\+0x40>
+ +8000060a: eb 43 00 00 00 0d sllg %r4,%r3,0
+ +80000610: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE against global var with small got access (no optimization)
+ +80000614: e3 30 c0 28 00 04 lg %r3,40\(%r12\)
+ +8000061a: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# IE against global var defined in exec with small got access
+# (no optimization)
+ +8000061e: e3 30 c0 38 00 04 lg %r3,56\(%r12\)
+ +80000624: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# IE against local var with small got access (no optimization)
+ +80000628: e3 30 c0 20 00 04 lg %r3,32\(%r12\)
+ +8000062e: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# IE against hidden var with small got access (no optimization)
+ +80000632: e3 30 c0 40 00 04 lg %r3,64\(%r12\)
+ +80000638: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# function epilog
+ +8000063c: eb 6e f0 d0 00 04 lmg %r6,%r14,208\(%r15\)
+ +80000642: 07 fe br %r14
+
+0+80000644 <_start>:
+# function prolog
+ +80000644: 90 6e f0 18 stm %r6,%r14,24\(%r15\)
+ +80000648: a7 d5 00 16 bras %r13,80000674 <_start\+0x30>
+# sG6@indntpoff
+ +8000064c: 00 00 00 00 .long 0x00000000
+ +80000650: 80 00 18 e0 ssm 2272\(%r1\)
+# bg6@indntpoff
+ +80000654: ff ff ff ff .long 0xffffffff
+ +80000658: ff ff ff d4 .long 0xffffffd4
+# bl6@indntpoff
+ +8000065c: ff ff ff ff .long 0xffffffff
+ +80000660: ff ff ff f4 .long 0xfffffff4
+# sh6@indntpoff
+ +80000664: ff ff ff ff .long 0xffffffff
+ +80000668: ff ff ff b4 .long 0xffffffb4
+# sg3@indntpoff
+ +8000066c: ff ff ff ff .long 0xffffffff
+ +80000670: ff ff ff 68 .long 0xffffff68
+# function prolog
+ +80000674: b9 04 00 ef lgr %r14,%r15
+ +80000678: a7 fb ff 60 aghi %r15,-160
+ +8000067c: e3 e0 e0 00 00 24 stg %r14,0\(%r14\)
+# extract TCB
+ +80000682: b2 4f 00 90 ear %r9,%a0
+ +80000686: eb 94 00 20 00 0d sllg %r9,%r4,32
+ +8000068c: b2 4f 00 91 ear %r9,%a1
+# IE against global var
+ +80000690: e3 30 d0 00 00 04 lg %r3,0\(%r13\)
+ +80000696: e3 33 c0 00 00 04 lg %r3,0\(%r3,%r12\)
+ +8000069c: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# IE -> LE against global var defined in exec
+ +800006a0: e3 30 d0 08 00 04 lg %r3,8\(%r13\)
+ +800006a6: eb 43 00 00 00 0d sllg %r4,%r3,0
+ +800006ac: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE -> LE against local var
+ +800006b0: e3 30 d0 10 00 04 lg %r3,16\(%r13\)
+ +800006b6: eb 43 00 00 00 0d sllg %r4,%r3,0
+ +800006bc: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE -> LE against hidden but not local var
+ +800006c0: e3 30 d0 18 00 04 lg %r3,24\(%r13\)
+ +800006c6: eb 43 00 00 00 0d sllg %r4,%r3,0
+ +800006cc: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# LE, global var defined in exec
+ +800006d0: e3 40 d0 20 00 04 lg %r4,32\(%r13\)
+ +800006d6: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# function epilog
+ +800006da: eb 6e f0 d0 00 04 lmg %r6,%r14,208\(%r15\)
+ +800006e0: 07 fe br %r14
+ +800006e2: 07 07 bcr 0,%r7
diff --git a/ld/testsuite/ld-s390/tlsbin_64.rd b/ld/testsuite/ld-s390/tlsbin_64.rd
new file mode 100644
index 0000000..b9ded2b
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlsbin_64.rd
@@ -0,0 +1,156 @@
+#source: tlsbinpic.s
+#source: tlsbin.s
+#as: -m64 -Aesame
+#ld: -shared -melf64_s390
+#readelf: -Ssrl
+#target: s390x-*-*
+
+There are 19 section headers, starting at offset 0x[0-9a-f]+:
+
+Section Headers:
+ \[Nr\] Name +Type +Address +Off +Size +ES Flg Lk Inf Al
+ \[ 0\] +NULL +0+ 0+ 0+ 00 +0 +0 +0
+ \[ 1\] .interp +.*
+ \[ 2\] .hash +.*
+ \[ 3\] .dynsym +.*
+ \[ 4\] .dynstr +.*
+ \[ 5\] .rela.dyn +.*
+ \[ 6\] .rela.plt +.*
+ \[ 7\] .plt +.*
+ \[ 8\] .text +PROGBITS +0+80000458 0+458 0+28c 00 +AX +0 +0 +4
+ \[ 9\] .data +.*
+ \[10\] .tdata +PROGBITS +0+800016e8 0+6e8 0+60 00 WAT +0 +0 +1
+ \[11\] .tbss +NOBITS +0+80001748 0+748 0+40 00 WAT +0 +0 +1
+ \[12\] .dynamic +DYNAMIC +0+80001748 0+748 0+140 10 +WA +4 +0 +8
+ \[13\] .got +PROGBITS +0+80001888 0+888 0+78 08 +WA +0 +0 +8
+ \[14\] .sbss +.*
+ \[15\] .bss +.*
+ \[16\] .shstrtab +.*
+ \[17\] .symtab +.*
+ \[18\] .strtab +.*
+Key to Flags:
+.*
+.*
+.*
+
+Elf file type is EXEC \(Executable file\)
+Entry point 0x80000644
+There are 6 program headers, starting at offset [0-9]+
+
+Program Headers:
+ Type +Offset +VirtAddr +PhysAddr +FileSiz +MemSiz +Flg Align
+ PHDR +0x0+40 0x0+80000040 0x0+80000040 0x0+150 0x0+150 R E 0x8
+ INTERP +0x0+190 0x0+80000190 0x0+80000190 0x0+11 0x0+11 R +0x1
+.*Requesting program interpreter.*
+ LOAD +0x0+ 0x0+80000000 0x0+80000000 0x0+6e4 0x0+6e4 R E 0x1000
+ LOAD +0x0+6e8 0x0+800016e8 0x0+800016e8 0x0+218 0x0+218 RW 0x1000
+ DYNAMIC +0x0+748 0x0+80001748 0x0+80001748 0x0+140 0x0+140 RW 0x8
+ TLS +0x0+6e8 0x0+800016e8 0x0+800016e8 0x0+60 0x0+a0 R +0x1
+
+ Section to Segment mapping:
+ Segment Sections...
+ 00 *
+ 01 +.interp *
+ 02 +.interp .hash .dynsym .dynstr .rela.dyn .rela.plt .plt .text *
+ 03 +.tdata .tbss .dynamic .got *
+ 04 +.tbss .dynamic *
+ 05 +.tdata .tbss *
+
+Relocation section '.rela.dyn' at offset 0x[0-9a-z]+ contains 4 entries:
+ +Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend
+[0-9a-z]+ +0+10+38 R_390_TLS_TPOFF +0+ sG3 \+ 0
+[0-9a-z]+ +0+30+38 R_390_TLS_TPOFF +0+ sG2 \+ 0
+[0-9a-z]+ +0+60+38 R_390_TLS_TPOFF +0+ sG6 \+ 0
+[0-9a-z]+ +0+70+38 R_390_TLS_TPOFF +0+ sG1 \+ 0
+
+Relocation section '.rela.plt' at offset 0x40+ contains 1 entries:
+ +Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend
+[0-9a-z]+ +0+40+b R_390_JMP_SLOT +0+80+438 __tls_get_offset \+ 0
+
+Symbol table '.dynsym' contains 11 entries:
+ +Num: +Value +Size Type +Bind +Vis +Ndx Name
+ +0: 0+ +0 NOTYPE +LOCAL +DEFAULT +UND
+ +1: 0+ +0 TLS +GLOBAL DEFAULT +UND sG3
+ +2: [0-9a-z]+ +0 OBJECT +GLOBAL DEFAULT +ABS _DYNAMIC
+ +3: 0+ +0 TLS +GLOBAL DEFAULT +UND sG2
+ +4: [0-9a-z]+ +0 FUNC +GLOBAL DEFAULT +UND __tls_get_offset
+ +5: [0-9a-z]+ +0 NOTYPE +GLOBAL DEFAULT +ABS __bss_start
+ +6: 0+ +0 TLS +GLOBAL DEFAULT +UND sG6
+ +7: 0+ +0 TLS +GLOBAL DEFAULT +UND sG1
+ +8: [0-9a-z]+ +0 NOTYPE +GLOBAL DEFAULT +ABS _edata
+ +9: [0-9a-z]+ +0 OBJECT +GLOBAL DEFAULT +ABS _GLOBAL_OFFSET_TABLE_
+ +10: [0-9a-z]+ +0 NOTYPE +GLOBAL DEFAULT +ABS _end
+
+Symbol table '.symtab' contains 71 entries:
+ +Num: +Value +Size Type +Bind +Vis +Ndx Name
+ +0: 0+ +0 NOTYPE +LOCAL +DEFAULT +UND
+ +1: [0-9a-z]+ +0 SECTION LOCAL +DEFAULT +1
+ +2: [0-9a-z]+ +0 SECTION LOCAL +DEFAULT +2
+ +3: [0-9a-z]+ +0 SECTION LOCAL +DEFAULT +3
+ +4: [0-9a-z]+ +0 SECTION LOCAL +DEFAULT +4
+ +5: [0-9a-z]+ +0 SECTION LOCAL +DEFAULT +5
+ +6: [0-9a-z]+ +0 SECTION LOCAL +DEFAULT +6
+ +7: [0-9a-z]+ +0 SECTION LOCAL +DEFAULT +7
+ +8: [0-9a-z]+ +0 SECTION LOCAL +DEFAULT +8
+ +9: [0-9a-z]+ +0 SECTION LOCAL +DEFAULT +9
+ +10: [0-9a-z]+ +0 SECTION LOCAL +DEFAULT +10
+ +11: [0-9a-z]+ +0 SECTION LOCAL +DEFAULT +11
+ +12: [0-9a-z]+ +0 SECTION LOCAL +DEFAULT +12
+ +13: [0-9a-z]+ +0 SECTION LOCAL +DEFAULT +13
+ +14: [0-9a-z]+ +0 SECTION LOCAL +DEFAULT +14
+ +15: [0-9a-z]+ +0 SECTION LOCAL +DEFAULT +15
+ +16: [0-9a-z]+ +0 SECTION LOCAL +DEFAULT +16
+ +17: [0-9a-z]+ +0 SECTION LOCAL +DEFAULT +17
+ +18: [0-9a-z]+ +0 SECTION LOCAL +DEFAULT +18
+ +19: 0+20 +0 TLS +LOCAL +DEFAULT +10 sl1
+ +20: 0+24 +0 TLS +LOCAL +DEFAULT +10 sl2
+ +21: 0+28 +0 TLS +LOCAL +DEFAULT +10 sl3
+ +22: 0+2c +0 TLS +LOCAL +DEFAULT +10 sl4
+ +23: 0+30 +0 TLS +LOCAL +DEFAULT +10 sl5
+ +24: 0+34 +0 TLS +LOCAL +DEFAULT +10 sl6
+ +25: 0+38 +0 TLS +LOCAL +DEFAULT +10 sl7
+ +26: 0+3c +0 TLS +LOCAL +DEFAULT +10 sl8
+ +27: 0+80 +0 TLS +LOCAL +DEFAULT +11 bl1
+ +28: 0+84 +0 TLS +LOCAL +DEFAULT +11 bl2
+ +29: 0+88 +0 TLS +LOCAL +DEFAULT +11 bl3
+ +30: 0+8c +0 TLS +LOCAL +DEFAULT +11 bl4
+ +31: 0+90 +0 TLS +LOCAL +DEFAULT +11 bl5
+ +32: 0+94 +0 TLS +LOCAL +DEFAULT +11 bl6
+ +33: 0+98 +0 TLS +LOCAL +DEFAULT +11 bl7
+ +34: 0+9c +0 TLS +LOCAL +DEFAULT +11 bl8
+ +35: 0+ +0 TLS +GLOBAL DEFAULT +UND sG3
+ +36: 0+1c +0 TLS +GLOBAL DEFAULT +10 sg8
+ +37: 0+7c +0 TLS +GLOBAL DEFAULT +11 bg8
+ +38: 0+74 +0 TLS +GLOBAL DEFAULT +11 bg6
+ +39: 0+68 +0 TLS +GLOBAL DEFAULT +11 bg3
+ +40: [0-9a-z]+ +0 OBJECT +GLOBAL DEFAULT +ABS _DYNAMIC
+ +41: 0+8 +0 TLS +GLOBAL DEFAULT +10 sg3
+ +42: 0+48 +0 TLS +GLOBAL HIDDEN +10 sh3
+ +43: 0+ +0 TLS +GLOBAL DEFAULT +UND sG2
+ +44: 0+c +0 TLS +GLOBAL DEFAULT +10 sg4
+ +45: 0+10 +0 TLS +GLOBAL DEFAULT +10 sg5
+ +46: 0+70 +0 TLS +GLOBAL DEFAULT +11 bg5
+ +47: 0+58 +0 TLS +GLOBAL HIDDEN +10 sh7
+ +48: 0+5c +0 TLS +GLOBAL HIDDEN +10 sh8
+ +49: [0-9a-z]+ +0 FUNC +GLOBAL DEFAULT +UND __tls_get_offset
+ +50: 0+ +0 TLS +GLOBAL DEFAULT +10 sg1
+ +51: [0-9a-z]+ +0 FUNC +GLOBAL DEFAULT +8 _start
+ +52: 0+4c +0 TLS +GLOBAL HIDDEN +10 sh4
+ +53: 0+78 +0 TLS +GLOBAL DEFAULT +11 bg7
+ +54: 0+50 +0 TLS +GLOBAL HIDDEN +10 sh5
+ +55: [0-9a-z]+ +0 NOTYPE +GLOBAL DEFAULT +ABS __bss_start
+ +56: 0+ +0 TLS +GLOBAL DEFAULT +UND sG6
+ +57: [0-9a-z]+ +0 FUNC +GLOBAL DEFAULT +8 fn2
+ +58: 0+4 +0 TLS +GLOBAL DEFAULT +10 sg2
+ +59: 0+ +0 TLS +GLOBAL DEFAULT +UND sG1
+ +60: 0+40 +0 TLS +GLOBAL HIDDEN +10 sh1
+ +61: 0+14 +0 TLS +GLOBAL DEFAULT +10 sg6
+ +62: 0+18 +0 TLS +GLOBAL DEFAULT +10 sg7
+ +63: [0-9a-z]+ +0 NOTYPE +GLOBAL DEFAULT +ABS _edata
+ +64: [0-9a-z]+ +0 OBJECT +GLOBAL DEFAULT +ABS _GLOBAL_OFFSET_TABLE_
+ +65: 0+80+190+ +0 NOTYPE +GLOBAL DEFAULT +ABS _end
+ +66: 0+44 +0 TLS +GLOBAL HIDDEN +10 sh2
+ +67: 0+54 +0 TLS +GLOBAL HIDDEN +10 sh6
+ +68: 0+64 +0 TLS +GLOBAL DEFAULT +11 bg2
+ +69: 0+60 +0 TLS +GLOBAL DEFAULT +11 bg1
+ +70: 0+6c +0 TLS +GLOBAL DEFAULT +11 bg4
diff --git a/ld/testsuite/ld-s390/tlsbin_64.s b/ld/testsuite/ld-s390/tlsbin_64.s
new file mode 100644
index 0000000..c40fcfc
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlsbin_64.s
@@ -0,0 +1,75 @@
+ .section ".tbss", "awT", @nobits
+ .globl bg1, bg2, bg3, bg4, bg5, bg6, bg7, bg8
+bg1: .space 4
+bg2: .space 4
+bg3: .space 4
+bg4: .space 4
+bg5: .space 4
+bg6: .space 4
+bg7: .space 4
+bg8: .space 4
+bl1: .space 4
+bl2: .space 4
+bl3: .space 4
+bl4: .space 4
+bl5: .space 4
+bl6: .space 4
+bl7: .space 4
+bl8: .space 4
+ .text
+ .globl _start
+ .type _start,@function
+_start:
+ /* Function prolog */
+ stm %r6,%r14,24(%r15)
+ bras %r13,.LTN1
+ /* Literal pool */
+.LT1:
+.LC0:
+ .quad sG6@indntpoff
+.LC1:
+ .quad bg6@indntpoff
+.LC2:
+ .quad bl6@indntpoff
+.LC3:
+ .quad sh6@indntpoff
+.LC4:
+ .quad sg3@indntpoff
+.LTN1:
+ /* Function prolog */
+ lgr %r14,%r15
+ aghi %r15,-160
+ stg %r14,0(%r14)
+
+ /* Extract TCB */
+ ear %r9,%a0
+ sllg %r9,%r4,32
+ ear %r9,%a1
+
+ /* IE against global var */
+ lg %r3,.LC0-.LT1(%r13)
+ lg %r3,0(%r3,%r12):tls_load:sG6
+ la %r3,0(%r3,%r9)
+
+ /* IE -> LE against global var defined in exec */
+ lg %r3,.LC1-.LT1(%r13)
+ lg %r4,0(%r3,%r12):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
+ 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
+ la %r5,0(%r4,%r9)
+
+ /* LE, global var defined in exec */
+ lg %r4,.LC4-.LT1(%r13)
+ la %r5,0(%r4,%r9)
+
+ /* Function epilog */
+ lmg %r6,%r14,208(%r15)
+ br %r14
diff --git a/ld/testsuite/ld-s390/tlsbin_64.sd b/ld/testsuite/ld-s390/tlsbin_64.sd
new file mode 100644
index 0000000..873c4f9
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlsbin_64.sd
@@ -0,0 +1,18 @@
+#source: tlsbinpic_64.s
+#source: tlsbin_64.s
+#as: -m64 -Aesame
+#ld: -shared -melf64_s390
+#objdump: -sj.got
+#target: s390x-*-*
+
+.*: file format elf64-s390
+
+Contents of section .got:
+ 80001888 [0-9a-f]+ [0-9a-f]+ 00000000 00000000 .*
+ 80001898 00000000 00000000 [0-9a-f]+ [0-9a-f]+ .*
+ 800018a8 ffffffff ffffff88 00000000 00000000 .*
+ 800018b8 00000000 00000000 ffffffff ffffff68 .*
+ 800018c8 ffffffff ffffffa8 00000000 00000000 .*
+ 800018d8 00000000 00000000 00000000 00000000 .*
+ 800018e8 00000000 00000000 00000000 00000000 .*
+ 800018f8 00000000 00000000 .*
diff --git a/ld/testsuite/ld-s390/tlsbin_64.td b/ld/testsuite/ld-s390/tlsbin_64.td
new file mode 100644
index 0000000..0101b6f
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlsbin_64.td
@@ -0,0 +1,16 @@
+#source: tlsbinpic_64.s
+#source: tlsbin_64.s
+#as: -m64 -Aesame
+#ld: -shared -melf64_s390
+#objdump: -sj.tdata
+#target: s390x-*-*
+
+.*: file format elf64-s390
+
+Contents of section .tdata:
+ 800016e8 00000011 00000012 00000013 00000014 .*
+ 800016f8 00000015 00000016 00000017 00000018 .*
+ 80001708 00000041 00000042 00000043 00000044 .*
+ 80001718 00000045 00000046 00000047 00000048 .*
+ 80001728 00000101 00000102 00000103 00000104 .*
+ 80001738 00000105 00000106 00000107 00000108 .*
diff --git a/ld/testsuite/ld-s390/tlsbinpic.s b/ld/testsuite/ld-s390/tlsbinpic.s
new file mode 100644
index 0000000..9779c05
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlsbinpic.s
@@ -0,0 +1,168 @@
+ .section ".tdata", "awT", @progbits
+ .globl sg1, sg2, sg3, sg4, sg5, sg6, sg7, sg8
+ .globl sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
+ .hidden sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
+ .hidden sh1, sh2
+sg1: .long 17
+sg2: .long 18
+sg3: .long 19
+sg4: .long 20
+sg5: .long 21
+sg6: .long 22
+sg7: .long 23
+sg8: .long 24
+sl1: .long 65
+sl2: .long 66
+sl3: .long 67
+sl4: .long 68
+sl5: .long 69
+sl6: .long 70
+sl7: .long 71
+sl8: .long 72
+sh1: .long 257
+sh2: .long 258
+sh3: .long 259
+sh4: .long 260
+sh5: .long 261
+sh6: .long 262
+sh7: .long 263
+sh8: .long 264
+ .text
+ .globl fn2
+ .type fn2,@function
+fn2:
+ /* Function prolog */
+ stm %r6,%r14,24(%r15)
+ bras %r13,.LTN1
+ /* Literal pool */
+.LT1:
+.LC0:
+ .long _GLOBAL_OFFSET_TABLE_-.LT1
+.LC1:
+ .long __tls_get_offset@plt-.LT1
+.LC2:
+ .long sG1@tlsgd
+.LC3:
+ .long sG2@tlsgd
+.LC4:
+ .long sg1@tlsgd
+.LC5:
+ .long sl1@tlsgd
+.LC6:
+ .long sh1@tlsgd
+.LC7:
+ .long sl1@tlsldm
+.LC8:
+ .long sl1@dtpoff
+.LC9:
+ .long sl2@dtpoff
+.LC10:
+ .long sh1@tlsldm
+.LC11:
+ .long sh1@dtpoff
+.LC12:
+ .long sh2@dtpoff
+.LC13:
+ .long sG2@gotntpoff
+.LC14:
+ .long sg1@gotntpoff
+.LC15:
+ .long sl1@gotntpoff
+.LC16:
+ .long sh1@gotntpoff
+.LTN1:
+ /* Function prolog */
+ lr %r14,%r15
+ l %r12,.LC0-.LT1(%r13)
+ ahi %r15,-96
+ la %r12,0(%r12,%r13)
+ st %r14,0(%r14)
+
+ /* Extract TCB and load branch offset */
+ ear %r9,%a0
+ l %r7,.LC1-.LT1(%r13)
+
+ /* GD -> IE because variable is not defined in executable */
+ l %r2,.LC2-.LT1(%r13)
+ bas %r14,0(%r7,%r13):tls_gdcall:sG1
+ la %r2,0(%r2,%r9)
+
+ /* GD -> IE because variable is not defined in executable where
+ the variable is referenced through IE too */
+ l %r2,.LC3-.LT1(%r13)
+ bas %r14,0(%r7,%r13):tls_gdcall:sG2
+ la %r2,0(%r2,%r9)
+
+ /* GD -> LE with global variable defined in executable */
+ l %r2,.LC4-.LT1(%r13)
+ bas %r14,0(%r7,%r13):tls_gdcall:sg1
+ la %r2,0(%r2,%r9)
+
+ /* GD -> LE with local variable defined in executable */
+ l %r2,.LC5-.LT1(%r13)
+ bas %r14,0(%r7,%r13):tls_gdcall:sl1
+ la %r2,0(%r2,%r9)
+
+ /* GD -> LE with hidden variable defined in executable */
+ l %r2,.LC6-.LT1(%r13)
+ bas %r14,0(%r7,%r13):tls_gdcall:sh1
+ la %r2,0(%r2,%r9)
+
+ /* LD -> LE */
+ l %r2,.LC7-.LT1(%r13)
+ bas %r14,0(%r7,%r13):tls_ldcall:sl1
+ la %r3,0(%r2,%r9)
+ l %r4,.LC8-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+ l %r4,.LC9-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+
+ /* LD -> LE against hidden variables */
+ l %r2,.LC10-.LT1(%r13)
+ bas %r14,0(%r7,%r13):tls_ldcall:sh1
+ la %r3,0(%r2,%r9)
+ l %r4,.LC11-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+ l %r4,.LC12-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+
+ /* IE against global var */
+ l %r3,.LC13-.LT1(%r13)
+ l %r3,0(%r3,%r12):tls_load:sG2
+ l %r3,0(%r3,%r9)
+
+ /* IE -> LE against global var defined in exec */
+ l %r3,.LC14-.LT1(%r13)
+ l %r4,0(%r3,%r12):tls_load:sg1
+ la %r5,0(%r4,%r9)
+
+ /* IE -> LE against local var */
+ l %r3,.LC15-.LT1(%r13)
+ l %r4,0(%r3,%r12):tls_load:sl1
+ la %r5,0(%r4,%r9)
+
+ /* IE -> LE against hidden var */
+ l %r3,.LC16-.LT1(%r13)
+ l %r4,0(%r3,%r12):tls_load:sh1
+ la %r5,0(%r4,%r9)
+
+ /* IE against global var with small got access (no optimization) */
+ l %r3,sG3@gotntpoff(%r12)
+ la %r3,0(%r3,%r9)
+
+ /* IE against global var defined in exec with small got access
+ (no optimization) */
+ l %r3,sg3@gotntpoff(%r12)
+ la %r3,0(%r3,%r9)
+
+ /* IE against local var with small got access (no optimization) */
+ l %r3,sl3@gotntpoff(%r12)
+ la %r3,0(%r3,%r9)
+
+ /* IE against hidden var with small got access (no optimization) */
+ l %r3,sh3@gotntpoff(%r12)
+ la %r3,0(%r3,%r9)
+
+ /* Function epilog */
+ lm %r6,%r14,120(%r15)
+ br %r14
diff --git a/ld/testsuite/ld-s390/tlsbinpic_64.s b/ld/testsuite/ld-s390/tlsbinpic_64.s
new file mode 100644
index 0000000..eaeff73
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlsbinpic_64.s
@@ -0,0 +1,184 @@
+ .section ".tdata", "awT", @progbits
+ .globl sg1, sg2, sg3, sg4, sg5, sg6, sg7, sg8
+ .globl sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
+ .hidden sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
+ .hidden sh1, sh2
+sg1: .long 17
+sg2: .long 18
+sg3: .long 19
+sg4: .long 20
+sg5: .long 21
+sg6: .long 22
+sg7: .long 23
+sg8: .long 24
+sl1: .long 65
+sl2: .long 66
+sl3: .long 67
+sl4: .long 68
+sl5: .long 69
+sl6: .long 70
+sl7: .long 71
+sl8: .long 72
+sh1: .long 257
+sh2: .long 258
+sh3: .long 259
+sh4: .long 260
+sh5: .long 261
+sh6: .long 262
+sh7: .long 263
+sh8: .long 264
+ .text
+ .globl fn2
+ .type fn2,@function
+fn2:
+ /* Function prolog */
+ stmg %r6,%r14,48(%r15)
+ bras %r13,.LTN1
+ /* Literal pool */
+.LT1:
+.LC2:
+ .quad sG1@tlsgd
+.LC3:
+ .quad sG2@tlsgd
+.LC4:
+ .quad sg1@tlsgd
+.LC5:
+ .quad sl1@tlsgd
+.LC6:
+ .quad sh1@tlsgd
+.LC7:
+ .quad sl1@tlsldm
+.LC8:
+ .quad sl1@dtpoff
+.LC9:
+ .quad sl2@dtpoff
+.LC10:
+ .quad sh1@tlsldm
+.LC11:
+ .quad sh1@dtpoff
+.LC12:
+ .quad sh2@dtpoff
+.LC13:
+ .quad sG2@gotntpoff
+.LC14:
+ .quad sg1@gotntpoff
+.LC15:
+ .quad sl1@gotntpoff
+.LC16:
+ .quad sh1@gotntpoff
+.LTN1:
+ /* Function prolog */
+ lgr %r14,%r15
+ aghi %r15,-160
+ larl %r12,_GLOBAL_OFFSET_TABLE_
+ stg %r14,0(%r14)
+
+ /* Extract TCB */
+ ear %r9,%a0
+ sllg %r9,%r4,32
+ ear %r9,%a1
+
+ /* GD -> IE because variable is not defined in executable */
+ lg %r12,.LC2-.LT1(%r13)
+ brasl %r14,__tls_get_offset@plt:tls_gdcall:sG1
+ la %r2,0(%r2,%r9)
+
+ /* GD -> IE because variable is not defined in executable where
+ the variable is referenced through IE too */
+ lg %r2,.LC3-.LT1(%r13)
+ brasl %r14,__tls_get_offset@plt:tls_gdcall:sG2
+ la %r2,0(%r2,%r9)
+
+ /* GD -> LE with global variable defined in executable */
+ lg %r2,.LC4-.LT1(%r13)
+ brasl %r14,__tls_get_offset@plt:tls_gdcall:sg1
+ la %r2,0(%r2,%r9)
+
+ /* GD -> LE with local variable defined in executable */
+ lg %r2,.LC5-.LT1(%r13)
+ brasl %r14,__tls_get_offset@plt:tls_gdcall:sl1
+ la %r2,0(%r2,%r9)
+
+ /* GD -> LE with hidden variable defined in executable */
+ lg %r2,.LC6-.LT1(%r13)
+ brasl %r14,__tls_get_offset@plt:tls_gdcall:sh1
+ la %r2,0(%r2,%r9)
+
+ /* LD -> LE */
+ lg %r2,.LC7-.LT1(%r13)
+ brasl %r14,__tls_get_offset@plt:tls_ldcall:sl1
+ la %r3,0(%r2,%r9)
+ lg %r4,.LC8-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+ lg %r4,.LC9-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+
+ /* LD -> LE against hidden variables */
+ lg %r2,.LC10-.LT1(%r13)
+ brasl %r14,__tls_get_offset@plt:tls_ldcall:sh1
+ la %r3,0(%r2,%r9)
+ lg %r4,.LC11-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+ lg %r4,.LC12-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+
+ /* IE against global var */
+ lg %r3,.LC13-.LT1(%r13)
+ lg %r3,0(%r3,%r12):tls_load:sG2
+ la %r3,0(%r3,%r9)
+
+ /* IE -> LE against global var defined in exec */
+ lg %r3,.LC14-.LT1(%r13)
+ lg %r4,0(%r3,%r12):tls_load:sg1
+ la %r5,0(%r4,%r9)
+
+ /* IE -> LE against local var */
+ lg %r3,.LC15-.LT1(%r13)
+ lg %r4,0(%r3,%r12):tls_load:sl2
+ la %r5,0(%r4,%r9)
+
+ /* IE -> LE against hidden var */
+ lg %r3,.LC16-.LT1(%r13)
+ lg %r4,0(%r3,%r12):tls_load:sh1
+ la %r5,0(%r4,%r9)
+
+ /* IE against global var with larl got access */
+ larl %r3,sG3@indntpoff
+ lg %r3,0(%r3,%r12):tls_load:sG3
+ la %r3,0(%r3,%r9)
+
+ /* IE against global var defined in exec with larl got access */
+ larl %r3,sg3@indntpoff
+ lg %r4,0(%r3,%r12):tls_load:sg3
+ 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
+ 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
+ la %r5,0(%r4,%r9)
+
+ /* IE against global var with small got access (no optimization) */
+ lg %r3,sG3@gotntpoff(%r12)
+ la %r3,0(%r3,%r9)
+
+ /* IE against global var defined in exec with small got access
+ (no optimization) */
+ lg %r3,sg3@gotntpoff(%r12)
+ la %r3,0(%r3,%r9)
+
+ /* IE against local var with small got access (no optimization) */
+ lg %r3,sl3@gotntpoff(%r12)
+ la %r3,0(%r3,%r9)
+
+ /* IE against hidden var with small got access (no optimization) */
+ lg %r3,sh3@gotntpoff(%r12)
+ la %r3,0(%r3,%r9)
+
+ /* Function epilog */
+ lmg %r6,%r14,208(%r15)
+ br %r14
diff --git a/ld/testsuite/ld-s390/tlslib.s b/ld/testsuite/ld-s390/tlslib.s
new file mode 100644
index 0000000..3ec87c2
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlslib.s
@@ -0,0 +1,17 @@
+ .section ".tdata", "awT", @progbits
+ .globl sG1, sG2, sG3, sG4, sG5, sG6, sG7, sG8,
+sG1: .long 513
+sG2: .long 514
+sG3: .long 515
+sG4: .long 516
+sG5: .long 517
+sG6: .long 518
+sG7: .long 519
+sG8: .long 520
+
+ .text
+ /* Dummy. */
+ .globl __tls_get_offset
+ .type __tls_get_offset,@function
+__tls_get_offset:
+ br %r14
diff --git a/ld/testsuite/ld-s390/tlslib_64.s b/ld/testsuite/ld-s390/tlslib_64.s
new file mode 100644
index 0000000..3ec87c2
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlslib_64.s
@@ -0,0 +1,17 @@
+ .section ".tdata", "awT", @progbits
+ .globl sG1, sG2, sG3, sG4, sG5, sG6, sG7, sG8,
+sG1: .long 513
+sG2: .long 514
+sG3: .long 515
+sG4: .long 516
+sG5: .long 517
+sG6: .long 518
+sG7: .long 519
+sG8: .long 520
+
+ .text
+ /* Dummy. */
+ .globl __tls_get_offset
+ .type __tls_get_offset,@function
+__tls_get_offset:
+ br %r14
diff --git a/ld/testsuite/ld-s390/tlspic.dd b/ld/testsuite/ld-s390/tlspic.dd
new file mode 100644
index 0000000..71add02
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlspic.dd
@@ -0,0 +1,161 @@
+#source: tlspic1.s
+#source: tlspic2.s
+#as: -m31
+#ld: -shared -melf_s390
+#objdump: -dzrj.text
+#target: s390-*-*
+
+.*: +file format elf32-s390
+
+Disassembly of section .text:
+
+0+4bc <fn1>:
+# function prolog
+ +4bc: 90 6e f0 18 stm %r6,%r14,24\(%r15\)
+ +4c0: a7 d5 00 30 bras %r13,520 <fn1\+0x64>
+# _GLOBAL_OFFSET_TABLE_-.LT1
+ +4c4: 00 00 12 78 .long 0x00001278
+# __tls_get_addr@plt-.LT1
+ +4c8: ff ff ff d8 .long 0xffffffd8
+# sg1@tlsgd
+ +4cc: 00 00 00 38 .long 0x00000038
+# sg2@tlsgd
+ +4d0: 00 00 00 48 .long 0x00000048
+# sl1@tlsgd
+ +4d4: 00 00 00 10 .long 0x00000010
+# sl2@tlsgd
+ +4d8: 00 00 00 18 .long 0x00000018
+# sh1@tlsgd
+ +4dc: 00 00 00 4c .long 0x0000004c
+# sh2@tlsgd
+ +4e0: 00 00 00 54 .long 0x00000054
+# sH1@tlsgd
+ +4e4: 00 00 00 28 .long 0x00000028
+# sH2@tlsgd
+ +4e8: 00 00 00 30 .long 0x00000030
+# sl1@tlsldm
+ +4ec: 00 00 00 20 .long 0x00000020
+# sl1@dtpoff
+ +4f0: 00 00 00 20 .long 0x00000020
+# sl2@dtpoff
+ +4f4: 00 00 00 24 .long 0x00000024
+# sh1@tlsldm
+ +4f8: 00 00 00 20 .long 0x00000020
+# sh1@dtpoff
+ +4fc: 00 00 00 40 .long 0x00000040
+# sh2@dtpoff
+ +500: 00 00 00 44 .long 0x00000044
+# sH1@tlsldm
+ +504: 00 00 00 20 .long 0x00000020
+# sH1@dtpoff
+ +508: 00 00 00 60 .long 0x00000060
+# sH2@dtpoff
+ +50c: 00 00 00 64 .long 0x00000064
+# sg2@gotntpoff
+ +510: 00 00 00 48 .long 0x00000048
+# sl2@gotntpoff
+ +514: 00 00 00 18 .long 0x00000018
+# sh2@gotntpoff
+ +518: 00 00 00 54 .long 0x00000054
+# sH2@gotntpoff
+ +51c: 00 00 00 30 .long 0x00000030
+# function prolog
+ +520: 18 ef lr %r14,%r15
+ +522: 58 c0 d0 00 l %r12,0\(%r13\)
+ +526: a7 fa ff a0 ahi %r15,-96
+ +52a: 41 cc d0 00 la %r12,0\(%r12,%r13\)
+ +52e: 50 e0 e0 00 st %r14,0\(%r14\)
+# Extract TCB and load branch offset
+ +532: b2 4f 00 90 ear %r9,%a0
+ +536: 58 70 d0 04 l %r7,4\(%r13\)
+# GD
+ +53a: 58 20 d0 08 l %r2,8\(%r13\)
+ +53e: 4d e7 d0 00 bas %r14,0\(%r7,%r13\)
+ +542: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD -> IE because variable is referenced through IE too
+ +546: 58 20 d0 0c l %r2,12\(%r13\)
+ +54a: 58 22 c0 00 l %r2,0\(%r2,%r12\)
+ +54e: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD against local variable
+ +552: 58 20 d0 10 l %r2,16\(%r13\)
+ +556: 4d e7 d0 00 bas %r14,0\(%r7,%r13\)
+ +55a: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD -> IE against local variable referenced through IE too
+ +55e: 58 20 d0 14 l %r2,20\(%r13\)
+ +562: 58 22 c0 00 l %r2,0\(%r2,%r12\)
+ +566: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD against hidden and local variable
+ +56a: 58 20 d0 18 l %r2,24\(%r13\)
+ +56e: 4d e7 d0 00 bas %r14,0\(%r7,%r13\)
+ +572: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD -> IE against hidden and local variable referenced through
+# IE too
+ +576: 58 20 d0 1c l %r2,28\(%r13\)
+ +57a: 58 22 c0 00 l %r2,0\(%r2,%r12\)
+ +57e: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD against hidden but not local variable
+ +582: 58 20 d0 20 l %r2,32\(%r13\)
+ +586: 4d e7 d0 00 bas %r14,0\(%r7,%r13\)
+ +58a: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD -> IE against hidden but not local variable referenced through
+# IE too
+ +58e: 58 20 d0 24 l %r2,36\(%r13\)
+ +592: 58 22 c0 00 l %r2,0\(%r2,%r12\)
+ +596: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# LD
+ +59a: 58 20 d0 28 l %r2,40\(%r13\)
+ +59e: 4d e7 d0 00 bas %r14,0\(%r7,%r13\)
+ +5a2: 41 32 90 00 la %r3,0\(%r2,%r9\)
+ +5a6: 58 40 d0 2c l %r4,44\(%r13\)
+ +5aa: 41 54 30 00 la %r5,0\(%r4,%r3\)
+ +5ae: 58 40 d0 30 l %r4,48\(%r13\)
+ +5b2: 41 54 30 00 la %r5,0\(%r4,%r3\)
+# LD against hidden and local variables
+ +5b6: 58 20 d0 34 l %r2,52\(%r13\)
+ +5ba: 4d e7 d0 00 bas %r14,0\(%r7,%r13\)
+ +5be: 41 32 90 00 la %r3,0\(%r2,%r9\)
+ +5c2: 58 40 d0 38 l %r4,56\(%r13\)
+ +5c6: 41 54 30 00 la %r5,0\(%r4,%r3\)
+ +5ca: 58 40 d0 34 l %r4,52\(%r13\)
+ +5ce: 41 55 30 00 la %r5,0\(%r5,%r3\)
+# LD against hidden but not local variables
+ +5d2: 58 20 d0 40 l %r2,64\(%r13\)
+ +5d6: 4d e7 d0 00 bas %r14,0\(%r7,%r13\)
+ +5da: 41 32 90 00 la %r3,0\(%r2,%r9\)
+ +5de: 58 30 d0 44 l %r3,68\(%r13\)
+ +5e2: 41 54 30 00 la %r5,0\(%r4,%r3\)
+ +5e6: 58 40 d0 48 l %r4,72\(%r13\)
+ +5ea: 41 54 30 00 la %r5,0\(%r4,%r3\)
+# IE against global var
+ +5ee: 58 30 d0 4c l %r3,76\(%r13\)
+ +5f2: 58 33 c0 00 l %r3,0\(%r3,%r12\)
+ +5f6: 41 33 30 00 la %r3,0\(%r3,%r3\)
+# IE against local var
+ +5fa: 58 30 d0 50 l %r3,80\(%r13\)
+ +5fe: 58 43 c0 00 l %r4,0\(%r3,%r12\)
+ +602: 41 54 30 00 la %r5,0\(%r4,%r3\)
+# IE against hidden and local var
+ +606: 58 30 d0 54 l %r3,84\(%r13\)
+ +60a: 58 43 c0 00 l %r4,0\(%r3,%r12\)
+ +60e: 41 54 30 00 la %r5,0\(%r4,%r3\)
+# IE against hidden but not local var
+ +612: 58 30 d0 58 l %r3,88\(%r13\)
+ +616: 58 43 c0 00 l %r4,0\(%r3,%r12\)
+ +61a: 41 54 30 00 la %r5,0\(%r4,%r3\)
+# IE against global var with small got access (no optimization)
+ +61e: 58 30 c0 34 l %r3,52\(%r12\)
+ +622: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# IE against local var with small got access (no optimization)
+ +626: 58 30 c0 1c l %r3,28\(%r12\)
+ +62a: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# IE against hidden and local var with small got access
+# (no optimization)
+ +62e: 58 30 c0 40 l %r3,64\(%r12\)
+ +632: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# IE against hidden but not local var with small got access
+# (no optimization)
+ +636: 58 30 c0 44 l %r3,68\(%r12\)
+ +63a: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# function prolog
+ +63e: 98 6e f0 78 lm %r6,%r14,120\(%r15\)
+ +642: 07 fe br %r14
diff --git a/ld/testsuite/ld-s390/tlspic.rd b/ld/testsuite/ld-s390/tlspic.rd
new file mode 100644
index 0000000..6c7468b
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlspic.rd
@@ -0,0 +1,165 @@
+#source: tlspic1.s
+#source: tlspic2.s
+#as: -m31
+#ld: -shared -melf_s390
+#readelf: -Ssrl
+#target: s390-*-*
+
+There are 18 section headers, starting at offset 0x[0-9a-f]+:
+
+Section Headers:
+ \[Nr\] Name +Type +Addr +Off +Size +ES Flg Lk Inf Al
+ \[ 0\] +NULL +0+ 0+ 0+ 00 +0 +0 0
+ \[ 1\] .hash +.*
+ \[ 2\] .dynsym +.*
+ \[ 3\] .dynstr +.*
+ \[ 4\] .rela.dyn +.*
+ \[ 5\] .rela.plt +.*
+ \[ 6\] .plt +.*
+ \[ 7\] .text +PROGBITS +0+4bc 0+4bc 0+188 00 AX 0 +0 4
+ \[ 8\] .data +.*
+ \[ 9\] .tdata +PROGBITS +0+1644 0+644 0+60 00 WAT 0 +0 1
+ \[10\] .tbss +NOBITS +0+16a4 0+6a4 0+20 00 WAT 0 +0 1
+ \[11\] .dynamic +DYNAMIC +0+16a4 0+6a4 0+98 08 WA 3 +0 4
+ \[12\] .got +PROGBITS +0+173c 0+73c 0+58 04 WA 0 +0 4
+ \[13\] .sbss +.*
+ \[14\] .bss +.*
+ \[15\] .shstrtab +.*
+ \[16\] .symtab +.*
+ \[17\] .strtab +.*
+Key to Flags:
+.*
+.*
+.*
+
+Elf file type is DYN \(Shared object file\)
+Entry point 0x4bc
+There are 4 program headers, starting at offset [0-9]+
+
+Program Headers:
+ Type +Offset +VirtAddr +PhysAddr +FileSiz MemSiz Flg Align
+ LOAD +0x0+ 0x0+ 0x0+ 0x[0-9a-f]+ 0x[0-9a-f]+ R E 0x1000
+ LOAD +0x0+644 0x0+1644 0x0+1644 0x00150 0x00150 RW 0x1000
+ DYNAMIC +0x0+6a4 0x0+16a4 0x0+16a4 0x0+98 0x0+98 RW 0x4
+ TLS +0x0+644 0x0+1644 0x0+1644 0x0+60 0x0+80 R +0x1
+
+ Section to Segment mapping:
+ Segment Sections...
+ +00 +.hash .dynsym .dynstr .rela.dyn .rela.plt .plt .text
+ +01 +.tdata .tbss .dynamic .got
+ +02 +.tbss .dynamic
+ +03 +.tdata .tbss
+
+Relocation section '.rela.dyn' at offset 0x3c8 contains 14 entries:
+ Offset +Info +Type +Sym.Value Sym. Name \+ Addend
+[0-9a-f]+ 0+36 R_390_TLS_DTPMOD +0+
+[0-9a-f]+ 0+38 R_390_TLS_TPOFF +0+24
+[0-9a-f]+ 0+38 R_390_TLS_TPOFF +0+30
+[0-9a-f]+ 0+36 R_390_TLS_DTPMOD +0+
+[0-9a-f]+ 0+36 R_390_TLS_DTPMOD +0+
+[0-9a-f]+ 0+38 R_390_TLS_TPOFF +0+64
+[0-9a-f]+ 0+38 R_390_TLS_TPOFF +0+50
+[0-9a-f]+ 0+38 R_390_TLS_TPOFF +0+70
+[0-9a-f]+ 0+36 R_390_TLS_DTPMOD +0+
+[0-9a-f]+ 0+38 R_390_TLS_TPOFF +0+44
+[0-9a-f]+ 0+1338 R_390_TLS_TPOFF +0+10 +sg5 \+ 0
+[0-9a-f]+ 0+1536 R_390_TLS_DTPMOD 0+ +sg1 \+ 0
+[0-9a-f]+ 0+1537 R_390_TLS_DTPOFF 0+ +sg1 \+ 0
+[0-9a-f]+ 0+1838 R_390_TLS_TPOFF +0+4 +sg2 \+ 0
+
+Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
+ Offset +Info +Type +Sym.Value Sym. Name \+ Addend
+[0-9a-f]+ 0+140b R_390_JMP_SLOT +0+ +__tls_get_offset \+ 0
+
+Symbol table '.dynsym' contains 30 entries:
+ +Num: +Value Size Type +Bind +Vis +Ndx Name
+ +0: 0+ +0 NOTYPE LOCAL DEFAULT UND
+ +1: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +1
+ +2: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +2
+ +3: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +3
+ +4: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +4
+ +5: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +5
+ +6: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +6
+ +7: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +7
+ +8: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +8
+ +9: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +9
+ +10: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +10
+ +11: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +11
+ +12: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +12
+ +13: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +13
+ +14: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +14
+ +15: 0+1c +0 TLS +GLOBAL DEFAULT +9 sg8
+ +16: [0-9a-f]+ +0 OBJECT GLOBAL DEFAULT ABS _DYNAMIC
+ +17: 0+8 +0 TLS +GLOBAL DEFAULT +9 sg3
+ +18: 0+c +0 TLS +GLOBAL DEFAULT +9 sg4
+ +19: 0+10 +0 TLS +GLOBAL DEFAULT +9 sg5
+ +20: 0+ +0 NOTYPE GLOBAL DEFAULT UND __tls_get_offset
+ +21: 0+ +0 TLS +GLOBAL DEFAULT +9 sg1
+ +22: [0-9a-f]+ +0 FUNC +GLOBAL DEFAULT +7 fn1
+ +23: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS __bss_start
+ +24: 0+4 +0 TLS +GLOBAL DEFAULT +9 sg2
+ +25: 0+14 +0 TLS +GLOBAL DEFAULT +9 sg6
+ +26: 0+18 +0 TLS +GLOBAL DEFAULT +9 sg7
+ +27: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS _edata
+ +28: [0-9a-f]+ +0 OBJECT GLOBAL DEFAULT ABS _GLOBAL_OFFSET_TABLE_
+ +29: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS _end
+
+Symbol table '.symtab' contains 57 entries:
+ +Num: +Value Size Type +Bind +Vis +Ndx Name
+ +0: 0+ +0 NOTYPE LOCAL DEFAULT UND
+ +1: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +1
+ +2: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +2
+ +3: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +3
+ +4: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +4
+ +5: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +5
+ +6: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +6
+ +7: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +7
+ +8: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +8
+ +9: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +9
+ +10: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +10
+ +11: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +11
+ +12: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +12
+ +13: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +13
+ +14: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +14
+ +15: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +15
+ +16: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +16
+ +17: [0-9a-f]+ +0 SECTION LOCAL DEFAULT +17
+ +18: 0+20 +0 TLS +LOCAL DEFAULT +9 sl1
+ +19: 0+24 +0 TLS +LOCAL DEFAULT +9 sl2
+ +20: 0+28 +0 TLS +LOCAL DEFAULT +9 sl3
+ +21: 0+2c +0 TLS +LOCAL DEFAULT +9 sl4
+ +22: 0+30 +0 TLS +LOCAL DEFAULT +9 sl5
+ +23: 0+34 +0 TLS +LOCAL DEFAULT +9 sl6
+ +24: 0+38 +0 TLS +LOCAL DEFAULT +9 sl7
+ +25: 0+3c +0 TLS +LOCAL DEFAULT +9 sl8
+ +26: 0+60 +0 TLS +LOCAL HIDDEN +10 sH1
+ +27: 0+48 +0 TLS +LOCAL HIDDEN +9 sh3
+ +28: 0+64 +0 TLS +LOCAL HIDDEN +10 sH2
+ +29: 0+78 +0 TLS +LOCAL HIDDEN +10 sH7
+ +30: 0+58 +0 TLS +LOCAL HIDDEN +9 sh7
+ +31: 0+5c +0 TLS +LOCAL HIDDEN +9 sh8
+ +32: 0+6c +0 TLS +LOCAL HIDDEN +10 sH4
+ +33: 0+4c +0 TLS +LOCAL HIDDEN +9 sh4
+ +34: 0+68 +0 TLS +LOCAL HIDDEN +10 sH3
+ +35: 0+50 +0 TLS +LOCAL HIDDEN +9 sh5
+ +36: 0+70 +0 TLS +LOCAL HIDDEN +10 sH5
+ +37: 0+74 +0 TLS +LOCAL HIDDEN +10 sH6
+ +38: 0+7c +0 TLS +LOCAL HIDDEN +10 sH8
+ +39: 0+40 +0 TLS +LOCAL HIDDEN +9 sh1
+ +40: 0+44 +0 TLS +LOCAL HIDDEN +9 sh2
+ +41: 0+54 +0 TLS +LOCAL HIDDEN +9 sh6
+ +42: 0+1c +0 TLS +GLOBAL DEFAULT +9 sg8
+ +43: [0-9a-f]+ +0 OBJECT GLOBAL DEFAULT ABS _DYNAMIC
+ +44: 0+8 +0 TLS +GLOBAL DEFAULT +9 sg3
+ +45: 0+c +0 TLS +GLOBAL DEFAULT +9 sg4
+ +46: 0+10 +0 TLS +GLOBAL DEFAULT +9 sg5
+ +47: 0+ +0 NOTYPE GLOBAL DEFAULT UND __tls_get_offset
+ +48: 0+ +0 TLS +GLOBAL DEFAULT +9 sg1
+ +49: [0-9a-f]+ +0 FUNC +GLOBAL DEFAULT +7 fn1
+ +50: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS __bss_start
+ +51: 0+4 +0 TLS +GLOBAL DEFAULT +9 sg2
+ +52: 0+14 +0 TLS +GLOBAL DEFAULT +9 sg6
+ +53: 0+18 +0 TLS +GLOBAL DEFAULT +9 sg7
+ +54: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS _edata
+ +55: [0-9a-f]+ +0 OBJECT GLOBAL DEFAULT ABS _GLOBAL_OFFSET_TABLE_
+ +56: [0-9a-f]+ +0 NOTYPE GLOBAL DEFAULT ABS _end
diff --git a/ld/testsuite/ld-s390/tlspic.sd b/ld/testsuite/ld-s390/tlspic.sd
new file mode 100644
index 0000000..04763dc
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlspic.sd
@@ -0,0 +1,16 @@
+#source: tlspic1.s
+#source: tlspic2.s
+#as: -m31
+#ld: -shared -melf_s390
+#objdump: -sj.got
+#target: s390-*-*
+
+.*: +file format elf32-s390
+
+Contents of section .got:
+ 173c [0-9a-f]+ 00000000 00000000 [0-9a-f]+ .*
+ 174c 00000000 00000020 00000000 00000000 .*
+ 175c 00000000 00000000 00000000 00000060 .*
+ 176c 00000000 00000000 00000000 00000000 .*
+ 177c 00000000 00000000 00000000 00000000 .*
+ 178c 00000040 00000000 +.*
diff --git a/ld/testsuite/ld-s390/tlspic.td b/ld/testsuite/ld-s390/tlspic.td
new file mode 100644
index 0000000..161de76
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlspic.td
@@ -0,0 +1,16 @@
+#source: tlspic1.s
+#source: tlspic2.s
+#as: -m31
+#ld: -shared -melf_s390
+#objdump: -sj.tdata
+#target: s390-*-*
+
+.*: +file format elf32-s390
+
+Contents of section .tdata:
+ 1644 00000011 00000012 00000013 00000014 .*
+ 1654 00000015 00000016 00000017 00000018 .*
+ 1664 00000041 00000042 00000043 00000044 .*
+ 1674 00000045 00000046 00000047 00000048 .*
+ 1684 00000101 00000102 00000103 00000104 .*
+ 1694 00000105 00000106 00000107 00000108 .*
diff --git a/ld/testsuite/ld-s390/tlspic1.s b/ld/testsuite/ld-s390/tlspic1.s
new file mode 100644
index 0000000..e24d129
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlspic1.s
@@ -0,0 +1,206 @@
+ .section ".tdata", "awT", @progbits
+ .globl sg1, sg2, sg3, sg4, sg5, sg6, sg7, sg8
+ .globl sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
+ .hidden sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
+sg1: .long 17
+sg2: .long 18
+sg3: .long 19
+sg4: .long 20
+sg5: .long 21
+sg6: .long 22
+sg7: .long 23
+sg8: .long 24
+sl1: .long 65
+sl2: .long 66
+sl3: .long 67
+sl4: .long 68
+sl5: .long 69
+sl6: .long 70
+sl7: .long 71
+sl8: .long 72
+sh1: .long 257
+sh2: .long 258
+sh3: .long 259
+sh4: .long 260
+sh5: .long 261
+sh6: .long 262
+sh7: .long 263
+sh8: .long 264
+ .text
+ .globl fn1
+ .type fn1,@function
+fn1:
+ /* Funtion prolog */
+ stm %r6,%r14,24(%r15)
+ bras %r13,.LTN1
+ /* Literal pool */
+.LT1:
+.LC0:
+ .long _GLOBAL_OFFSET_TABLE_-.LT1
+.LC1:
+ .long __tls_get_offset@plt-.LT1
+.LC2:
+ .long sg1@tlsgd
+.LC3:
+ .long sg2@tlsgd
+.LC4:
+ .long sl1@tlsgd
+.LC5:
+ .long sl2@tlsgd
+.LC6:
+ .long sh1@tlsgd
+.LC7:
+ .long sh2@tlsgd
+.LC8:
+ .long sH1@tlsgd
+.LC9:
+ .long sH2@tlsgd
+.LC10:
+ .long sl1@tlsldm
+.LC11:
+ .long sl1@dtpoff
+.LC12:
+ .long sl2@dtpoff
+.LC13:
+ .long sh1@tlsldm
+.LC14:
+ .long sh1@dtpoff
+.LC15:
+ .long sh2@dtpoff
+.LC16:
+ .long sH1@tlsldm
+.LC17:
+ .long sH1@dtpoff
+.LC18:
+ .long sH2@dtpoff
+.LC19:
+ .long sg2@gotntpoff
+.LC20:
+ .long sl2@gotntpoff
+.LC21:
+ .long sh2@gotntpoff
+.LC22:
+ .long sH2@gotntpoff
+.LTN1:
+ /* Funtion prolog */
+ lr %r14,%r15
+ l %r12,.LC0-.LT1(%r13)
+ ahi %r15,-96
+ la %r12,0(%r12,%r13)
+ st %r14,0(%r14)
+
+ /* Extract TCB and load branch offset */
+ ear %r9,%a0
+ l %r7,.LC1-.LT1(%r13)
+
+ /* GD */
+ l %r2,.LC2-.LT1(%r13)
+ bas %r14,0(%r7,%r13):tls_gdcall:sg1
+ la %r2,0(%r2,%r9)
+
+ /* GD -> IE because variable is referenced through IE too */
+ l %r2,.LC3-.LT1(%r13)
+ bas %r14,0(%r7,%r13):tls_gdcall:sg2
+ la %r2,0(%r2,%r9)
+
+ /* GD against local variable */
+ l %r2,.LC4-.LT1(%r13)
+ bas %r14,0(%r7,%r13):tls_gdcall:sl1
+ la %r2,0(%r2,%r9)
+
+ /* GD -> IE against local variable referenced through IE too */
+ l %r2,.LC5-.LT1(%r13)
+ bas %r14,0(%r7,%r13):tls_gdcall:sl2
+ la %r2,0(%r2,%r9)
+
+ /* GD against hidden and local variable */
+ l %r2,.LC6-.LT1(%r13)
+ bas %r14,0(%r7,%r13):tls_gdcall:sh1
+ la %r2,0(%r2,%r9)
+
+ /* GD -> IE against hidden and local variable referenced through
+ IE too */
+ l %r2,.LC7-.LT1(%r13)
+ bas %r14,0(%r7,%r13):tls_gdcall:sh2
+ la %r2,0(%r2,%r9)
+
+ /* GD against hidden but not local variable */
+ l %r2,.LC8-.LT1(%r13)
+ bas %r14,0(%r7,%r13):tls_gdcall:sH1
+ la %r2,0(%r2,%r9)
+
+ /* GD -> IE against hidden but not local variable referenced through
+ IE too */
+ l %r2,.LC9-.LT1(%r13)
+ bas %r14,0(%r7,%r13):tls_gdcall:sH2
+ la %r2,0(%r2,%r9)
+
+ /* LD */
+ l %r2,.LC10-.LT1(%r13)
+ bas %r14,0(%r7,%r13):tls_ldcall:sl1
+ la %r3,0(%r2,%r9)
+ l %r4,.LC11-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+ l %r4,.LC12-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+
+ /* LD against hidden and local variables */
+ l %r2,.LC13-.LT1(%r13)
+ bas %r14,0(%r7,%r13):tls_ldcall:sh1
+ la %r3,0(%r2,%r9)
+ l %r4,.LC14-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+ l %r4,.LC13-.LT1(%r13)
+ la %r5,0(%r5,%r3)
+
+ /* LD against hidden but not local variables */
+ l %r2,.LC16-.LT1(%r13)
+ bas %r14,0(%r7,%r13):tls_ldcall:sH1
+ la %r3,0(%r2,%r9)
+ l %r3,.LC17-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+ l %r4,.LC18-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+
+ /* IE against global var */
+ l %r3,.LC19-.LT1(%r13)
+ l %r3,0(%r3,%r12):tls_load:sg2
+ la %r3,0(%r3,%r3)
+
+ /* IE against local var */
+ l %r3,.LC20-.LT1(%r13)
+ l %r4,0(%r3,%r12):tls_load:sl2
+ la %r5,0(%r4,%r3)
+
+ /* IE against hidden and local var */
+ l %r3,.LC21-.LT1(%r13)
+ l %r4,0(%r3,%r12):tls_load:sh2
+ la %r5,0(%r4,%r3)
+
+ /* IE against hidden but not local var */
+ l %r3,.LC22-.LT1(%r13)
+ l %r4,0(%r3,%r12):tls_load:sH2
+ la %r5,0(%r4,%r3)
+
+ /* IE against global var with small got access (no optimization) */
+ l %r3,sg5@gotntpoff(%r12)
+ la %r3,0(%r3,%r9)
+
+ /* IE against local var with small got access (no optimization) */
+ l %r3,sl5@gotntpoff(%r12)
+ la %r3,0(%r3,%r9)
+
+ /* IE against hidden and local var with small got access
+ (no optimization) */
+ l %r3,sh5@gotntpoff(%r12)
+ la %r3,0(%r3,%r9)
+
+ /* IE against hidden but not local var with small got access
+ (no optimization) */
+ l %r3,sH5@gotntpoff(%r12)
+ la %r3,0(%r3,%r9)
+
+ /* Function epilog */
+ lm %r6,%r14,120(%r15)
+ br %r14
+
diff --git a/ld/testsuite/ld-s390/tlspic1_64.s b/ld/testsuite/ld-s390/tlspic1_64.s
new file mode 100644
index 0000000..350b51d
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlspic1_64.s
@@ -0,0 +1,222 @@
+ .section ".tdata", "awT", @progbits
+ .globl sg1, sg2, sg3, sg4, sg5, sg6, sg7, sg8
+ .globl sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
+ .hidden sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
+sg1: .long 17
+sg2: .long 18
+sg3: .long 19
+sg4: .long 20
+sg5: .long 21
+sg6: .long 22
+sg7: .long 23
+sg8: .long 24
+sl1: .long 65
+sl2: .long 66
+sl3: .long 67
+sl4: .long 68
+sl5: .long 69
+sl6: .long 70
+sl7: .long 71
+sl8: .long 72
+sh1: .long 257
+sh2: .long 258
+sh3: .long 259
+sh4: .long 260
+sh5: .long 261
+sh6: .long 262
+sh7: .long 263
+sh8: .long 264
+ .text
+ .globl fn1
+ .type fn1,@function
+fn1:
+ /* Funtion prolog */
+ stmg %r6,%r14,48(%r15)
+ bras %r13,.LTN1
+ /* Literal pool */
+.LT1:
+.LC2:
+ .quad sg1@tlsgd
+.LC3:
+ .quad sg2@tlsgd
+.LC4:
+ .quad sl1@tlsgd
+.LC5:
+ .quad sl2@tlsgd
+.LC6:
+ .quad sh1@tlsgd
+.LC7:
+ .quad sh2@tlsgd
+.LC8:
+ .quad sH1@tlsgd
+.LC9:
+ .quad sH2@tlsgd
+.LC10:
+ .quad sl1@tlsldm
+.LC11:
+ .quad sl1@dtpoff
+.LC12:
+ .quad sl2@dtpoff
+.LC13:
+ .quad sh1@tlsldm
+.LC14:
+ .quad sh1@dtpoff
+.LC15:
+ .quad sh2@dtpoff
+.LC16:
+ .quad sH1@tlsldm
+.LC17:
+ .quad sH1@dtpoff
+.LC18:
+ .quad sH2@dtpoff
+.LC19:
+ .quad sg2@gotntpoff
+.LC20:
+ .quad sl2@gotntpoff
+.LC21:
+ .quad sh2@gotntpoff
+.LC22:
+ .quad sH2@gotntpoff
+.LTN1:
+ /* Funtion prolog */
+ lgr %r14,%r15
+ larl %r12,_GLOBAL_OFFSET_TABLE_
+ aghi %r15,-160
+ stg %r14,0(%r14)
+
+ /* Extract TCB */
+ ear %r9,%a0
+ sllg %r9,%r4,32
+ ear %r9,%a1
+
+ /* GD */
+ lg %r2,.LC2-.LT1(%r13)
+ brasl %r14,__tls_get_offset@plt:tls_gdcall:sg1
+ la %r2,0(%r2,%r9)
+
+ /* GD -> IE because variable is referenced through IE too */
+ lg %r2,.LC3-.LT1(%r13)
+ brasl %r14,__tls_get_offset@plt:tls_gdcall:sg2
+ la %r2,0(%r2,%r9)
+
+ /* GD against local variable */
+ lg %r2,.LC4-.LT1(%r13)
+ brasl %r14,__tls_get_offset@plt:tls_gdcall:sl1
+ la %r2,0(%r2,%r9)
+
+ /* GD -> IE against local variable referenced through IE too */
+ lg %r2,.LC5-.LT1(%r13)
+ brasl %r14,__tls_get_offset@plt:tls_gdcall:sl2
+ la %r2,0(%r2,%r9)
+
+ /* GD against hidden and local variable */
+ lg %r2,.LC6-.LT1(%r13)
+ brasl %r14,__tls_get_offset@plt:tls_gdcall:sh1
+ la %r2,0(%r2,%r9)
+
+ /* GD -> IE against hidden and local variable referenced through
+ IE too */
+ lg %r2,.LC7-.LT1(%r13)
+ brasl %r14,__tls_get_offset@plt:tls_gdcall:sh2
+ la %r2,0(%r2,%r9)
+
+ /* GD against hidden but not local variable */
+ lg %r2,.LC8-.LT1(%r13)
+ brasl %r14,__tls_get_offset@plt:tls_gdcall:sH1
+ la %r2,0(%r2,%r9)
+
+ /* GD -> IE against hidden but not local variable referenced through
+ IE too */
+ lg %r2,.LC9-.LT1(%r13)
+ brasl %r14,__tls_get_offset@plt:tls_gdcall:sH2
+ la %r2,0(%r2,%r9)
+
+ /* LD */
+ lg %r2,.LC10-.LT1(%r13)
+ brasl %r14,__tls_get_offset@plt:tls_ldcall:sl1
+ la %r3,0(%r2,%r9)
+ lg %r4,.LC11-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+ lg %r4,.LC12-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+
+ /* LD against hidden and local variables */
+ lg %r2,.LC13-.LT1(%r13)
+ brasl %r14,__tls_get_offset@plt:tls_ldcall:sh1
+ la %r3,0(%r2,%r9)
+ lg %r4,.LC14-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+ lg %r4,.LC15-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+
+ /* LD against hidden but not local variables */
+ lg %r2,.LC16-.LT1(%r13)
+ brasl %r14,__tls_get_offset@plt:tls_ldcall:sH1
+ la %r3,0(%r2,%r9)
+ lg %r4,.LC17-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+ lg %r4,.LC18-.LT1(%r13)
+ la %r5,0(%r4,%r3)
+
+ /* IE against global var */
+ lg %r3,.LC19-.LT1(%r13)
+ lg %r3,0(%r3,%r12):tls_load:sg2
+ la %r3,0(%r3,%r9)
+
+ /* IE against local var */
+ lg %r3,.LC20-.LT1(%r13)
+ lg %r4,0(%r3,%r12):tls_load:sl2
+ la %r5,0(%r4,%r9)
+
+ /* IE against hidden and local var */
+ lg %r3,.LC21-.LT1(%r13)
+ lg %r4,0(%r3,%r12):tls_load:sh2
+ la %r5,0(%r4,%r9)
+
+ /* IE against hidden but not local var */
+ lg %r3,.LC22-.LT1(%r13)
+ lg %r4,0(%r3,%r12):tls_load:sH2
+ la %r5,0(%r4,%r9)
+
+ /* IE against global var with larl got access */
+ larl %r3,sg5@indntpoff
+ lg %r3,0(%r3,%r12):tls_load:sg2
+ la %r3,0(%r3,%r9)
+
+ /* IE against local var with larl got access */
+ larl %r3,sl5@indntpoff
+ lg %r4,0(%r3,%r12):tls_load:sl2
+ la %r5,0(%r4,%r9)
+
+ /* IE against hidden and local var with larl got access */
+ larl %r3,sh5@indntpoff
+ lg %r4,0(%r3,%r12):tls_load:sh2
+ la %r5,0(%r4,%r9)
+
+ /* IE against hidden but not local var with larl got access */
+ larl %r3,sH5@indntpoff
+ lg %r4,0(%r3,%r12):tls_load:sH2
+ la %r5,0(%r4,%r9)
+
+ /* IE against global var with small got access (no optimization) */
+ lg %r3,sg5@gotntpoff(%r12)
+ la %r3,0(%r3,%r9)
+
+ /* IE against local var with small got access (no optimization) */
+ lg %r3,sl5@gotntpoff(%r12)
+ la %r3,0(%r3,%r9)
+
+ /* IE against hidden and local var with small got access
+ (no optimization) */
+ lg %r3,sh5@gotntpoff(%r12)
+ la %r3,0(%r3,%r9)
+
+ /* IE against hidden but not local var with small got access
+ (no optimization) */
+ lg %r3,sH5@gotntpoff(%r12)
+ la %r3,0(%r3,%r9)
+
+ /* Function epilog */
+ lmg %r6,%r14,208(%r15)
+ br %r14
+
diff --git a/ld/testsuite/ld-s390/tlspic2.s b/ld/testsuite/ld-s390/tlspic2.s
new file mode 100644
index 0000000..5513f9b
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlspic2.s
@@ -0,0 +1,11 @@
+ .section ".tbss", "awT", @nobits
+ .globl sH1, sH2, sH3, sH4, sH5, sH6, sH7, sH8
+ .hidden sH1, sH2, sH3, sH4, sH5, sH6, sH7, sH8
+sH1: .space 4
+sH2: .space 4
+sH3: .space 4
+sH4: .space 4
+sH5: .space 4
+sH6: .space 4
+sH7: .space 4
+sH8: .space 4
diff --git a/ld/testsuite/ld-s390/tlspic2_64.s b/ld/testsuite/ld-s390/tlspic2_64.s
new file mode 100644
index 0000000..5513f9b
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlspic2_64.s
@@ -0,0 +1,11 @@
+ .section ".tbss", "awT", @nobits
+ .globl sH1, sH2, sH3, sH4, sH5, sH6, sH7, sH8
+ .hidden sH1, sH2, sH3, sH4, sH5, sH6, sH7, sH8
+sH1: .space 4
+sH2: .space 4
+sH3: .space 4
+sH4: .space 4
+sH5: .space 4
+sH6: .space 4
+sH7: .space 4
+sH8: .space 4
diff --git a/ld/testsuite/ld-s390/tlspic_64.dd b/ld/testsuite/ld-s390/tlspic_64.dd
new file mode 100644
index 0000000..423cdf9
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlspic_64.dd
@@ -0,0 +1,194 @@
+#source: tlspic1.s
+#source: tlspic2.s
+#as: -m64 -Aesame
+#ld: -shared -melf64_s390
+#objdump: -dzrj.text
+#target: s390x-*-*
+
+.*: +file format elf64-s390
+
+Disassembly of section .text:
+
+0+790 <fn1>:
+# function prolog
+ +790: eb 6e f0 30 00 24 stmg %r6,%r14,48\(%r15\)
+ +796: a7 d5 00 56 bras %r13,842 <fn1\+0xb2>
+# sg1@tlsgd
+ +79a: 00 00 00 00 .long 0x00000000
+ +79e: 00 00 00 70 .long 0x00000070
+# sg2@tlsgd
+ +7a2: 00 00 00 00 .long 0x00000000
+ +7a6: 00 00 00 90 .long 0x00000090
+# sl1@tlsgd
+ +7aa: 00 00 00 00 .long 0x00000000
+ +7ae: 00 00 00 20 .long 0x00000020
+# sl2@tlsgd
+ +7b2: 00 00 00 00 .long 0x00000000
+ +7b6: 00 00 00 30 .long 0x00000030
+# sh1@tlsgd
+ +7ba: 00 00 00 00 .long 0x00000000
+ +7be: 00 00 00 98 .long 0x00000098
+# sh2@tlsgd
+ +7c2: 00 00 00 00 .long 0x00000000
+ +7c6: 00 00 00 a8 .long 0x000000a8
+# sH1@tlsgd
+ +7ca: 00 00 00 00 .long 0x00000000
+ +7ce: 00 00 00 50 .long 0x00000050
+# sH2@tlsgd
+ +7d2: 00 00 00 00 .long 0x00000000
+ +7d6: 00 00 00 60 .long 0x00000060
+# sl1@tlsldm
+ +7da: 00 00 00 00 .long 0x00000000
+ +7de: 00 00 00 40 .long 0x00000040
+# sl1@dtpoff
+ +7e2: 00 00 00 00 .long 0x00000000
+ +7e6: 00 00 00 20 .long 0x00000020
+# sl2@dtpoff
+ +7ea: 00 00 00 00 .long 0x00000000
+ +7ee: 00 00 00 24 .long 0x00000024
+# sh1@tlsldm
+ +7f2: 00 00 00 00 .long 0x00000000
+ +7f6: 00 00 00 40 .long 0x00000040
+# sh1@dtpoff
+ +7fa: 00 00 00 00 .long 0x00000000
+ +7fe: 00 00 00 40 .long 0x00000040
+# sh2@dtpoff
+ +802: 00 00 00 00 .long 0x00000000
+ +806: 00 00 00 44 .long 0x00000044
+# sH1@tlsldm
+ +80a: 00 00 00 00 .long 0x00000000
+ +80e: 00 00 00 40 .long 0x00000040
+# sH1@dtpoff
+ +812: 00 00 00 00 .long 0x00000000
+ +816: 00 00 00 60 .long 0x00000060
+# sH2@dtpoff
+ +81a: 00 00 00 00 .long 0x00000000
+ +81e: 00 00 00 64 .long 0x00000064
+# sg2@gotntpoff
+ +822: 00 00 00 00 .long 0x00000000
+ +826: 00 00 00 90 .long 0x00000090
+# sl2@gotntpoff
+ +82a: 00 00 00 00 .long 0x00000000
+ +82e: 00 00 00 30 .long 0x00000030
+# sh2@gotntpoff
+ +832: 00 00 00 00 .long 0x00000000
+ +836: 00 00 00 a8 .long 0x000000a8
+# sH2@gotntpoff
+ +83a: 00 00 00 00 .long 0x00000000
+ +83e: 00 00 00 60 .long 0x00000060
+# function prolog
+ +842: b9 04 00 ef lgr %r14,%r15
+ +846: c0 c0 00 00 09 a5 larl %r12,1b90 <_GLOBAL_OFFSET_TABLE_>
+ +84c: a7 fb ff 60 aghi %r15,-160
+ +850: e3 e0 e0 00 00 24 stg %r14,0\(%r14\)
+# extract TCB
+ +856: b2 4f 00 90 ear %r9,%a0
+ +85a: eb 94 00 20 00 0d sllg %r9,%r4,32
+ +860: b2 4f 00 91 ear %r9,%a1
+# GD
+ +864: e3 20 d0 00 00 04 lg %r2,0\(%r13\)
+ +86a: c0 e5 ff ff ff 83 brasl %r14,770 <sH8\+0x6f4>
+ +870: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD -> IE because variable is referenced through IE too
+ +874: e3 20 d0 08 00 04 lg %r2,8\(%r13\)
+ +87a: e3 22 c0 00 00 04 lg %r2,0\(%r2,%r12\)
+ +880: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD against local variable
+ +884: e3 20 d0 10 00 04 lg %r2,16\(%r13\)
+ +88a: c0 e5 ff ff ff 73 brasl %r14,770 <sH8\+0x6f4>
+ +890: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD -> IE against local variable referenced through IE too
+ +894: e3 20 d0 18 00 04 lg %r2,24\(%r13\)
+ +89a: e3 22 c0 00 00 04 lg %r2,0\(%r2,%r12\)
+ +8a0: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD against hidden and local variable
+ +8a4: e3 20 d0 20 00 04 lg %r2,32\(%r13\)
+ +8aa: c0 e5 ff ff ff 63 brasl %r14,770 <sH8\+0x6f4>
+ +8b0: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD -> IE against hidden and local variable referenced through
+# IE too
+ +8b4: e3 20 d0 28 00 04 lg %r2,40\(%r13\)
+ +8ba: e3 22 c0 00 00 04 lg %r2,0\(%r2,%r12\)
+ +8c0: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD against hidden but not local variable
+ +8c4: e3 20 d0 30 00 04 lg %r2,48\(%r13\)
+ +8ca: c0 e5 ff ff ff 53 brasl %r14,770 <sH8\+0x6f4>
+ +8d0: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# GD -> IE against hidden but not local variable referenced through
+# IE too
+ +8d4: e3 20 d0 38 00 04 lg %r2,56\(%r13\)
+ +8da: e3 22 c0 00 00 04 lg %r2,0\(%r2,%r12\)
+ +8e0: 41 22 90 00 la %r2,0\(%r2,%r9\)
+# LD
+ +8e4: e3 20 d0 40 00 04 lg %r2,64\(%r13\)
+ +8ea: c0 e5 ff ff ff 43 brasl %r14,770 <sH8\+0x6f4>
+ +8f0: 41 32 90 00 la %r3,0\(%r2,%r9\)
+ +8f4: e3 40 d0 48 00 04 lg %r4,72\(%r13\)
+ +8fa: 41 54 30 00 la %r5,0\(%r4,%r3\)
+ +8fe: e3 40 d0 50 00 04 lg %r4,80\(%r13\)
+ +904: 41 54 30 00 la %r5,0\(%r4,%r3\)
+# LD against hidden and local variables
+ +908: e3 20 d0 58 00 04 lg %r2,88\(%r13\)
+ +90e: c0 e5 ff ff ff 31 brasl %r14,770 <sH8\+0x6f4>
+ +914: 41 32 90 00 la %r3,0\(%r2,%r9\)
+ +918: e3 40 d0 60 00 04 lg %r4,96\(%r13\)
+ +91e: 41 54 30 00 la %r5,0\(%r4,%r3\)
+ +922: e3 40 d0 68 00 04 lg %r4,104\(%r13\)
+ +928: 41 54 30 00 la %r5,0\(%r4,%r3\)
+# LD against hidden but not local variables
+ +92c: e3 20 d0 70 00 04 lg %r2,112\(%r13\)
+ +932: c0 e5 ff ff ff 1f brasl %r14,770 <sH8\+0x6f4>
+ +938: 41 32 90 00 la %r3,0\(%r2,%r9\)
+ +93c: e3 40 d0 78 00 04 lg %r4,120\(%r13\)
+ +942: 41 54 30 00 la %r5,0\(%r4,%r3\)
+ +946: e3 40 d0 80 00 04 lg %r4,128\(%r13\)
+ +94c: 41 54 30 00 la %r5,0\(%r4,%r3\)
+# IE against global var
+ +950: e3 30 d0 88 00 04 lg %r3,136\(%r13\)
+ +956: e3 33 c0 00 00 04 lg %r3,0\(%r3,%r12\)
+ +95c: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# IE against local var
+ +960: e3 30 d0 90 00 04 lg %r3,144\(%r13\)
+ +966: e3 43 c0 00 00 04 lg %r4,0\(%r3,%r12\)
+ +96c: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE against hidden and local var
+ +970: e3 30 d0 98 00 04 lg %r3,152\(%r13\)
+ +976: e3 43 c0 00 00 04 lg %r4,0\(%r3,%r12\)
+ +97c: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE against hidden but not local var
+ +980: e3 30 d0 a0 00 04 lg %r3,160\(%r13\)
+ +986: e3 43 c0 00 00 04 lg %r4,0\(%r3,%r12\)
+ +98c: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE against global var with larl got access
+ +990: c0 30 00 00 09 34 larl %r3,1bf8 <\_GLOBAL\_OFFSET\_TABLE\_\+0x68>
+ +996: e3 33 c0 00 00 04 lg %r3,0\(%r3,%r12\)
+ +99c: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# IE against local var with larl got access
+ +9a0: c0 30 00 00 09 14 larl %r3,1bc8 <\_GLOBAL\_OFFSET\_TABLE\_\+0x38>
+ +9a6: e3 43 c0 00 00 04 lg %r4,0\(%r3,%r12\)
+ +9ac: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE against hidden and local var with larl got access
+ +9b0: c0 30 00 00 09 30 larl %r3,1c10 <\_GLOBAL\_OFFSET\_TABLE\_\+0x80>
+ +9b6: e3 43 c0 00 00 04 lg %r4,0\(%r3,%r12\)
+ +9bc: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE against hidden but not local var with larl got access
+ +9c0: c0 30 00 00 09 2c larl %r3,1c18 <\_GLOBAL\_OFFSET\_TABLE\_\+0x88>
+ +9c6: e3 43 c0 00 00 04 lg %r4,0\(%r3,%r12\)
+ +9cc: 41 54 90 00 la %r5,0\(%r4,%r9\)
+# IE against global var with small got access (no optimization)
+ +9d0: e3 30 c0 68 00 04 lg %r3,104\(%r12\)
+ +9d6: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# IE against local var with small got access (no optimization)
+ +9da: e3 30 c0 38 00 04 lg %r3,56\(%r12\)
+ +9e0: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# IE against hidden and local var with small got access
+# (no optimization)
+ +9e4: e3 30 c0 80 00 04 lg %r3,128\(%r12\)
+ +9ea: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# IE against hidden but not local var with small got access
+# (no optimization)
+ +9ee: e3 30 c0 88 00 04 lg %r3,136\(%r12\)
+ +9f4: 41 33 90 00 la %r3,0\(%r3,%r9\)
+# function epilog
+ +9f8: eb 6e f0 d0 00 04 lmg %r6,%r14,208\(%r15\)
+ +9fe: 07 fe br %r14
diff --git a/ld/testsuite/ld-s390/tlspic_64.rd b/ld/testsuite/ld-s390/tlspic_64.rd
new file mode 100644
index 0000000..e37a62a
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlspic_64.rd
@@ -0,0 +1,165 @@
+#source: tlspic1.s
+#source: tlspic2.s
+#as: -m64 -Aesame
+#ld: -shared -melf64_s390
+#readelf: -WSsrl
+#target: s390x-*-*
+
+There are 18 section headers, starting at offset 0x[0-9a-f]+:
+
+Section Headers:
+ \[Nr\] Name +Type +Address +Off +Size +ES Flg Lk Inf Al
+ \[ 0\] +NULL +0+ 0+ 0+ 0+ +0 +0 +0
+ \[ 1\] .hash +.*
+ \[ 2\] .dynsym +.*
+ \[ 3\] .dynstr +.*
+ \[ 4\] .rela.dyn +.*
+ \[ 5\] .rela.plt +.*
+ \[ 6\] .plt +.*
+ \[ 7\] .text +PROGBITS +0+790 0+790 0+270 00 +AX +0 +0 +4
+ \[ 8\] .data +.*
+ \[ 9\] .tdata +PROGBITS +0+1a00 0+a00 0+60 00 WAT +0 +0 +1
+ \[10\] .tbss +NOBITS +0+1a60 0+a60 0+20 00 WAT +0 +0 +1
+ \[11\] .dynamic +DYNAMIC +0+1a60 0+a60 0+130 10 +WA +3 +0 +8
+ \[12\] .got +PROGBITS +0+1b90 0+b90 0+b0 08 +WA +0 +0 +8
+ \[13\] .sbss +.*
+ \[14\] .bss +.*
+ \[15\] .shstrtab +.*
+ \[16\] .symtab +.*
+ \[17\] .strtab +.*
+Key to Flags:
+.*
+.*
+.*
+
+Elf file type is DYN \(Shared object file\)
+Entry point 0x790
+There are 4 program headers, starting at offset [0-9]+
+
+Program Headers:
+ Type +Offset +VirtAddr +PhysAddr +FileSiz +MemSiz +Flg Align
+ LOAD +0x0+ 0x0+ 0x0+ 0x[0-9a-f]+ 0x[0-9a-f]+ R E 0x1000
+ LOAD +0x0+a00 0x0+1a00 0x0+1a00 0x0+240 0x0+240 RW +0x1000
+ DYNAMIC +0x0+a60 0x0+1a60 0x0+1a60 0x0+130 0x0+130 RW +0x8
+ TLS +0x0+a00 0x0+1a00 0x0+1a00 0x0+60 0x0+80 R +0x1
+
+ Section to Segment mapping:
+ Segment Sections...
+ 00 +.hash .dynsym .dynstr .rela.dyn .rela.plt .plt .text *
+ 01 +.tdata .tbss .dynamic .got *
+ 02 +.tbss .dynamic *
+ 03 +.tdata .tbss *
+
+Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 14 entries:
+ +Offset +Info +Type +Symbol's Value Symbol's Name \+ Addend
+[0-9a-z]+ 0+36 R_390_TLS_DTPMOD +0+
+[0-9a-z]+ 0+38 R_390_TLS_TPOFF +0+24
+[0-9a-z]+ 0+38 R_390_TLS_TPOFF +0+30
+[0-9a-z]+ 0+36 R_390_TLS_DTPMOD +0+
+[0-9a-z]+ 0+36 R_390_TLS_DTPMOD +0+
+[0-9a-z]+ 0+38 R_390_TLS_TPOFF +0+64
+[0-9a-z]+ 0+38 R_390_TLS_TPOFF +0+50
+[0-9a-z]+ 0+38 R_390_TLS_TPOFF +0+70
+[0-9a-z]+ 0+36 R_390_TLS_DTPMOD +0+
+[0-9a-z]+ 0+38 R_390_TLS_TPOFF +0+44
+[0-9a-z]+ 0+130+38 R_390_TLS_TPOFF +0+10 sg5 \+ 0
+[0-9a-z]+ 0+150+36 R_390_TLS_DTPMOD +0+ sg1 \+ 0
+[0-9a-z]+ 0+150+37 R_390_TLS_DTPOFF +0+ sg1 \+ 0
+[0-9a-z]+ 0+180+38 R_390_TLS_TPOFF +0+4 sg2 \+ 0
+
+Relocation section '.rela.plt' at offset 0x738 contains 1 entries:
+ +Offset +Info +Type +Symbol's Value Symbol's Name \+ Addend
+0+1ba8 0+140+b R_390_JMP_SLOT +0+ __tls_get_offset \+ 0
+
+Symbol table '.dynsym' contains 30 entries:
+ +Num: +Value +Size Type +Bind +Vis +Ndx Name
+ +0: 0+ +0 NOTYPE LOCAL DEFAULT UND
+ +1: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +1
+ +2: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +2
+ +3: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +3
+ +4: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +4
+ +5: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +5
+ +6: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +6
+ +7: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +7
+ +8: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +8
+ +9: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +9
+ +10: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +10
+ +11: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +11
+ +12: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +12
+ +13: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +13
+ +14: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +14
+ +15: 0+1c +0 TLS +GLOBAL DEFAULT +9 sg8
+ +16: [0-9a-z]+ +0 OBJECT GLOBAL DEFAULT ABS _DYNAMIC
+ +17: 0+8 +0 TLS +GLOBAL DEFAULT +9 sg3
+ +18: 0+c +0 TLS +GLOBAL DEFAULT +9 sg4
+ +19: 0+10 +0 TLS +GLOBAL DEFAULT +9 sg5
+ +20: 0+ +0 NOTYPE GLOBAL DEFAULT UND __tls_get_offset
+ +21: 0+ +0 TLS +GLOBAL DEFAULT +9 sg1
+ +22: [0-9a-z]+ +0 FUNC +GLOBAL DEFAULT +7 fn1
+ +23: [0-9a-z]+ +0 NOTYPE GLOBAL DEFAULT ABS __bss_start
+ +24: 0+4 +0 TLS +GLOBAL DEFAULT +9 sg2
+ +25: 0+14 +0 TLS +GLOBAL DEFAULT +9 sg6
+ +26: 0+18 +0 TLS +GLOBAL DEFAULT +9 sg7
+ +27: [0-9a-z]+ +0 NOTYPE GLOBAL DEFAULT ABS _edata
+ +28: [0-9a-z]+ +0 OBJECT GLOBAL DEFAULT ABS _GLOBAL_OFFSET_TABLE_
+ +29: 0+1c40 +0 NOTYPE GLOBAL DEFAULT ABS _end
+
+Symbol table '.symtab' contains 57 entries:
+ +Num: +Value +Size Type +Bind +Vis +Ndx Name
+ +0: 0+ +0 NOTYPE LOCAL DEFAULT UND
+ +1: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +1
+ +2: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +2
+ +3: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +3
+ +4: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +4
+ +5: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +5
+ +6: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +6
+ +7: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +7
+ +8: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +8
+ +9: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +9
+ +10: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +10
+ +11: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +11
+ +12: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +12
+ +13: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +13
+ +14: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +14
+ +15: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +15
+ +16: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +16
+ +17: [0-9a-z]+ +0 SECTION LOCAL DEFAULT +17
+ +18: 0+20 +0 TLS +LOCAL DEFAULT +9 sl1
+ +19: 0+24 +0 TLS +LOCAL DEFAULT +9 sl2
+ +20: 0+28 +0 TLS +LOCAL DEFAULT +9 sl3
+ +21: 0+2c +0 TLS +LOCAL DEFAULT +9 sl4
+ +22: 0+30 +0 TLS +LOCAL DEFAULT +9 sl5
+ +23: 0+34 +0 TLS +LOCAL DEFAULT +9 sl6
+ +24: 0+38 +0 TLS +LOCAL DEFAULT +9 sl7
+ +25: 0+3c +0 TLS +LOCAL DEFAULT +9 sl8
+ +26: 0+60 +0 TLS +LOCAL HIDDEN +10 sH1
+ +27: 0+48 +0 TLS +LOCAL HIDDEN +9 sh3
+ +28: 0+64 +0 TLS +LOCAL HIDDEN +10 sH2
+ +29: 0+78 +0 TLS +LOCAL HIDDEN +10 sH7
+ +30: 0+58 +0 TLS +LOCAL HIDDEN +9 sh7
+ +31: 0+5c +0 TLS +LOCAL HIDDEN +9 sh8
+ +32: 0+6c +0 TLS +LOCAL HIDDEN +10 sH4
+ +33: 0+4c +0 TLS +LOCAL HIDDEN +9 sh4
+ +34: 0+68 +0 TLS +LOCAL HIDDEN +10 sH3
+ +35: 0+50 +0 TLS +LOCAL HIDDEN +9 sh5
+ +36: 0+70 +0 TLS +LOCAL HIDDEN +10 sH5
+ +37: 0+74 +0 TLS +LOCAL HIDDEN +10 sH6
+ +38: 0+7c +0 TLS +LOCAL HIDDEN +10 sH8
+ +39: 0+40 +0 TLS +LOCAL HIDDEN +9 sh1
+ +40: 0+44 +0 TLS +LOCAL HIDDEN +9 sh2
+ +41: 0+54 +0 TLS +LOCAL HIDDEN +9 sh6
+ +42: 0+1c +0 TLS +GLOBAL DEFAULT +9 sg8
+ +43: [0-9a-z]+ +0 OBJECT GLOBAL DEFAULT ABS _DYNAMIC
+ +44: 0+8 +0 TLS +GLOBAL DEFAULT +9 sg3
+ +45: 0+c +0 TLS +GLOBAL DEFAULT +9 sg4
+ +46: 0+10 +0 TLS +GLOBAL DEFAULT +9 sg5
+ +47: 0+ +0 NOTYPE GLOBAL DEFAULT UND __tls_get_offset
+ +48: 0+ +0 TLS +GLOBAL DEFAULT +9 sg1
+ +49: [0-9a-z]+ +0 FUNC +GLOBAL DEFAULT +7 fn1
+ +50: [0-9a-z]+ +0 NOTYPE GLOBAL DEFAULT ABS __bss_start
+ +51: 0+4 +0 TLS +GLOBAL DEFAULT +9 sg2
+ +52: 0+14 +0 TLS +GLOBAL DEFAULT +9 sg6
+ +53: 0+18 +0 TLS +GLOBAL DEFAULT +9 sg7
+ +54: [0-9a-z]+ +0 NOTYPE GLOBAL DEFAULT ABS _edata
+ +55: [0-9a-z]+ +0 OBJECT GLOBAL DEFAULT ABS _GLOBAL_OFFSET_TABLE_
+ +56: [0-9a-z]+ +0 NOTYPE GLOBAL DEFAULT ABS _end
diff --git a/ld/testsuite/ld-s390/tlspic_64.sd b/ld/testsuite/ld-s390/tlspic_64.sd
new file mode 100644
index 0000000..4e1672d
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlspic_64.sd
@@ -0,0 +1,21 @@
+#source: tlspic1.s
+#source: tlspic2.s
+#as: -m64 -Aesame
+#ld: -shared -melf64_s390
+#objdump: -sj.got
+#target: s390x-*-*
+
+.*: +file format elf64-s390
+
+Contents of section .got:
+ 1b90 [0-9a-f]+ [0-9a-f]+ 00000000 00000000 .*
+ 1ba0 00000000 00000000 [0-9a-f]+ [0-9a-f]+ .*
+ 1bb0 00000000 00000000 00000000 00000020 .*
+ 1bc0 00000000 00000000 00000000 00000000 .*
+ 1bd0 00000000 00000000 00000000 00000000 .*
+ 1be0 00000000 00000000 00000000 00000060 .*
+ 1bf0 00000000 00000000 00000000 00000000 .*
+ 1c00 00000000 00000000 00000000 00000000 .*
+ 1c10 00000000 00000000 00000000 00000000 .*
+ 1c20 00000000 00000000 00000000 00000000 .*
+ 1c30 00000000 00000040 00000000 00000000 .*
diff --git a/ld/testsuite/ld-s390/tlspic_64.td b/ld/testsuite/ld-s390/tlspic_64.td
new file mode 100644
index 0000000..ba2b934
--- /dev/null
+++ b/ld/testsuite/ld-s390/tlspic_64.td
@@ -0,0 +1,16 @@
+#source: tlspic1.s
+#source: tlspic2.s
+#as: -m64 -Aesame
+#ld: -shared -melf64_s390
+#objdump: -sj.tdata
+#target: s390x-*-*
+
+.*: +file format elf64-s390
+
+Contents of section .tdata:
+ 1a00 00000011 00000012 00000013 00000014 .*
+ 1a10 00000015 00000016 00000017 00000018 .*
+ 1a20 00000041 00000042 00000043 00000044 .*
+ 1a30 00000045 00000046 00000047 00000048 .*
+ 1a40 00000101 00000102 00000103 00000104 .*
+ 1a50 00000105 00000106 00000107 00000108 .*