* ld-s390/s390.exp: New file.
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 24 Jan 2003 17:20:25 +0000 (17:20 +0000)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 24 Jan 2003 17:20:25 +0000 (17:20 +0000)
* 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.

28 files changed:
ld/testsuite/ChangeLog
ld/testsuite/ld-s390/s390.exp [new file with mode: 0644]
ld/testsuite/ld-s390/tlsbin.dd [new file with mode: 0644]
ld/testsuite/ld-s390/tlsbin.rd [new file with mode: 0644]
ld/testsuite/ld-s390/tlsbin.s [new file with mode: 0644]
ld/testsuite/ld-s390/tlsbin.sd [new file with mode: 0644]
ld/testsuite/ld-s390/tlsbin.td [new file with mode: 0644]
ld/testsuite/ld-s390/tlsbin_64.dd [new file with mode: 0644]
ld/testsuite/ld-s390/tlsbin_64.rd [new file with mode: 0644]
ld/testsuite/ld-s390/tlsbin_64.s [new file with mode: 0644]
ld/testsuite/ld-s390/tlsbin_64.sd [new file with mode: 0644]
ld/testsuite/ld-s390/tlsbin_64.td [new file with mode: 0644]
ld/testsuite/ld-s390/tlsbinpic.s [new file with mode: 0644]
ld/testsuite/ld-s390/tlsbinpic_64.s [new file with mode: 0644]
ld/testsuite/ld-s390/tlslib.s [new file with mode: 0644]
ld/testsuite/ld-s390/tlslib_64.s [new file with mode: 0644]
ld/testsuite/ld-s390/tlspic.dd [new file with mode: 0644]
ld/testsuite/ld-s390/tlspic.rd [new file with mode: 0644]
ld/testsuite/ld-s390/tlspic.sd [new file with mode: 0644]
ld/testsuite/ld-s390/tlspic.td [new file with mode: 0644]
ld/testsuite/ld-s390/tlspic1.s [new file with mode: 0644]
ld/testsuite/ld-s390/tlspic1_64.s [new file with mode: 0644]
ld/testsuite/ld-s390/tlspic2.s [new file with mode: 0644]
ld/testsuite/ld-s390/tlspic2_64.s [new file with mode: 0644]
ld/testsuite/ld-s390/tlspic_64.dd [new file with mode: 0644]
ld/testsuite/ld-s390/tlspic_64.rd [new file with mode: 0644]
ld/testsuite/ld-s390/tlspic_64.sd [new file with mode: 0644]
ld/testsuite/ld-s390/tlspic_64.td [new file with mode: 0644]

index b76242e..f6b156a 100644 (file)
@@ -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 (file)
index 0000000..83582f1
--- /dev/null
@@ -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 (file)
index 0000000..215a98d
--- /dev/null
@@ -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 (file)
index 0000000..e643b6e
--- /dev/null
@@ -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 (file)
index 0000000..4da50e7
--- /dev/null
@@ -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 (file)
index 0000000..fd48420
--- /dev/null
@@ -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 (file)
index 0000000..6ecd9c7
--- /dev/null
@@ -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 (file)
index 0000000..ca13d73
--- /dev/null
@@ -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 (file)
index 0000000..b9ded2b
--- /dev/null
@@ -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 (file)
index 0000000..c40fcfc
--- /dev/null
@@ -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 (file)
index 0000000..873c4f9
--- /dev/null
@@ -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 (file)
index 0000000..0101b6f
--- /dev/null
@@ -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 (file)
index 0000000..9779c05
--- /dev/null
@@ -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 (file)
index 0000000..eaeff73
--- /dev/null
@@ -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 (file)
index 0000000..3ec87c2
--- /dev/null
@@ -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 (file)
index 0000000..3ec87c2
--- /dev/null
@@ -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 (file)
index 0000000..71add02
--- /dev/null
@@ -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 (file)
index 0000000..6c7468b
--- /dev/null
@@ -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 (file)
index 0000000..04763dc
--- /dev/null
@@ -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 (file)
index 0000000..161de76
--- /dev/null
@@ -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 (file)
index 0000000..e24d129
--- /dev/null
@@ -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 (file)
index 0000000..350b51d
--- /dev/null
@@ -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 (file)
index 0000000..5513f9b
--- /dev/null
@@ -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 (file)
index 0000000..5513f9b
--- /dev/null
@@ -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 (file)
index 0000000..423cdf9
--- /dev/null
@@ -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 (file)
index 0000000..e37a62a
--- /dev/null
@@ -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 (file)
index 0000000..4e1672d
--- /dev/null
@@ -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 (file)
index 0000000..ba2b934
--- /dev/null
@@ -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  .*