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