aboutsummaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-sparc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2003-01-24 23:44:45 +0000
committerJakub Jelinek <jakub@redhat.com>2003-01-24 23:44:45 +0000
commitb9734f35729dfe8bba288ff1b6ab2c45fbacc03d (patch)
tree8239278e95b0efb28bb27b3cd15df6de41c4f5cb /ld/testsuite/ld-sparc
parentc34ee0383a5eb2b49f172da630431191af4886eb (diff)
downloadgdb-b9734f35729dfe8bba288ff1b6ab2c45fbacc03d.zip
gdb-b9734f35729dfe8bba288ff1b6ab2c45fbacc03d.tar.gz
gdb-b9734f35729dfe8bba288ff1b6ab2c45fbacc03d.tar.bz2
bfd/
* elf32-sparc.c (_bfd_sparc_elf_howto_table): Add TLS relocs. (elf32_sparc_rev32_howto): New variable. (sparc_reloc_map): Add TLS relocs. (elf32_sparc_reloc_type_lookup, elf32_sparc_info_to_howto): Handle REV32. (sparc_elf_hix22_reloc, sparc_elf_lox10_reloc, elf32_sparc_mkobject): New functions. (struct elf32_sparc_dyn_relocs, struct elf32_sparc_link_hash_entry, struct elf32_sparc_link_hash_table): New structures. (elf32_sparc_tdata, elf32_sparc_local_got_tls_type, elf32_sparc_hash_table): Define. (link_hash_newfunc, elf32_sparc_link_hash_table_create, create_got_section, elf32_sparc_create_dynamic_sections, elf32_sparc_copy_indirect_symbol, elf32_sparc_tls_transition): New functions. (elf32_sparc_check_relocs): Handle TLS relocs. Add dynamic reloc reference counting. (elf32_sparc_gc_sweep_hook): Likewise. (elf32_sparc_adjust_dynamic_symbol): Likewise. (elf32_sparc_size_dynamic_sections): Likewise. (elf32_sparc_relocate_section): Likewise. (allocate_dynrelocs, readonly_dynrelocs, dtpoff_base, tpoff): New functions. (elf32_sparc_object_p): Allocate backend private object data. (bfd_elf32_bfd_link_hash_table_create, elf_backend_copy_indirect_symbol, bfd_elf32_mkobject, elf_backend_can_refcount): Define. (elf_backend_create_dynamic_sections): Define to elf32_sparc_create_dynamic_sections. * reloc.c: Add SPARC TLS relocs. * bfd-in2.h, libbfd.h: Rebuilt. * elf64-sparc.c (sparc64_elf_howto_table): Add TLS relocs. (sparc_reloc_map): Likewise. gas/ * config/tc-sparc.c (sparc_ip): Handle TLS % operators. (tc_gen_reloc): Handle TLS relocs. (sparc_cons, cons_fix_new_sparc): Handle %r_tls_dtpoff. * config/tc-sparc.h (tc_fix_adjustable): Don't adjust TLS relocs. * config/obj-elf.c (obj_elf_section_word): Handle tls. (obj_elf_type): Handle tls_object. include/ * elf/sparc.h: Add TLS relocs. Move R_SPARC_REV32 to 252. ld/testsuite/ * ld-sparc/sparc.exp: New. * ld-sparc/tlsg32.s: New test. * ld-sparc/tlsg32.sd: Likewise. * ld-sparc/tlsg64.s: Likewise. * ld-sparc/tlsg64.sd: Likewise. * ld-sparc/tlslib.s: Likewise. * ld-sparc/tlsnopic.s: Likewise. * ld-sparc/tlspic.s: Likewise. * ld-sparc/tlssunbin32.dd: Likewise. * ld-sparc/tlssunbin32.rd: Likewise. * ld-sparc/tlssunbin32.s: Likewise. * ld-sparc/tlssunbin32.sd: Likewise. * ld-sparc/tlssunbin32.td: Likewise. * ld-sparc/tlssunbin64.dd: Likewise. * ld-sparc/tlssunbin64.rd: Likewise. * ld-sparc/tlssunbin64.s: Likewise. * ld-sparc/tlssunbin64.sd: Likewise. * ld-sparc/tlssunbin64.td: Likewise. * ld-sparc/tlssunbinpic32.s: Likewise. * ld-sparc/tlssunbinpic64.s: Likewise. * ld-sparc/tlssunnopic32.dd: Likewise. * ld-sparc/tlssunnopic32.rd: Likewise. * ld-sparc/tlssunnopic32.s: Likewise. * ld-sparc/tlssunnopic32.sd: Likewise. * ld-sparc/tlssunnopic64.dd: Likewise. * ld-sparc/tlssunnopic64.rd: Likewise. * ld-sparc/tlssunnopic64.s: Likewise. * ld-sparc/tlssunnopic64.sd: Likewise. * ld-sparc/tlssunpic32.dd: Likewise. * ld-sparc/tlssunpic32.rd: Likewise. * ld-sparc/tlssunpic32.s: Likewise. * ld-sparc/tlssunpic32.sd: Likewise. * ld-sparc/tlssunpic32.td: Likewise. * ld-sparc/tlssunpic64.dd: Likewise. * ld-sparc/tlssunpic64.rd: Likewise. * ld-sparc/tlssunpic64.s: Likewise. * ld-sparc/tlssunpic64.sd: Likewise. * ld-sparc/tlssunpic64.td: Likewise.
Diffstat (limited to 'ld/testsuite/ld-sparc')
-rw-r--r--ld/testsuite/ld-sparc/sparc.exp88
-rw-r--r--ld/testsuite/ld-sparc/tlsg32.s12
-rw-r--r--ld/testsuite/ld-sparc/tlsg32.sd10
-rw-r--r--ld/testsuite/ld-sparc/tlsg64.s12
-rw-r--r--ld/testsuite/ld-sparc/tlsg64.sd11
-rw-r--r--ld/testsuite/ld-sparc/tlslib.s20
-rw-r--r--ld/testsuite/ld-sparc/tlsnopic.s8
-rw-r--r--ld/testsuite/ld-sparc/tlspic.s12
-rw-r--r--ld/testsuite/ld-sparc/tlssunbin32.dd273
-rw-r--r--ld/testsuite/ld-sparc/tlssunbin32.rd137
-rw-r--r--ld/testsuite/ld-sparc/tlssunbin32.s114
-rw-r--r--ld/testsuite/ld-sparc/tlssunbin32.sd11
-rw-r--r--ld/testsuite/ld-sparc/tlssunbin32.td19
-rw-r--r--ld/testsuite/ld-sparc/tlssunbin64.dd11
-rw-r--r--ld/testsuite/ld-sparc/tlssunbin64.rd8
-rw-r--r--ld/testsuite/ld-sparc/tlssunbin64.s118
-rw-r--r--ld/testsuite/ld-sparc/tlssunbin64.sd11
-rw-r--r--ld/testsuite/ld-sparc/tlssunbin64.td11
-rw-r--r--ld/testsuite/ld-sparc/tlssunbinpic32.s183
-rw-r--r--ld/testsuite/ld-sparc/tlssunbinpic64.s182
-rw-r--r--ld/testsuite/ld-sparc/tlssunnopic32.dd84
-rw-r--r--ld/testsuite/ld-sparc/tlssunnopic32.rd112
-rw-r--r--ld/testsuite/ld-sparc/tlssunnopic32.s77
-rw-r--r--ld/testsuite/ld-sparc/tlssunnopic32.sd12
-rw-r--r--ld/testsuite/ld-sparc/tlssunnopic64.dd12
-rw-r--r--ld/testsuite/ld-sparc/tlssunnopic64.rd9
-rw-r--r--ld/testsuite/ld-sparc/tlssunnopic64.s81
-rw-r--r--ld/testsuite/ld-sparc/tlssunnopic64.sd12
-rw-r--r--ld/testsuite/ld-sparc/tlssunpic32.dd220
-rw-r--r--ld/testsuite/ld-sparc/tlssunpic32.rd155
-rw-r--r--ld/testsuite/ld-sparc/tlssunpic32.s228
-rw-r--r--ld/testsuite/ld-sparc/tlssunpic32.sd15
-rw-r--r--ld/testsuite/ld-sparc/tlssunpic32.td16
-rw-r--r--ld/testsuite/ld-sparc/tlssunpic64.dd12
-rw-r--r--ld/testsuite/ld-sparc/tlssunpic64.rd9
-rw-r--r--ld/testsuite/ld-sparc/tlssunpic64.s228
-rw-r--r--ld/testsuite/ld-sparc/tlssunpic64.sd12
-rw-r--r--ld/testsuite/ld-sparc/tlssunpic64.td12
38 files changed, 2557 insertions, 0 deletions
diff --git a/ld/testsuite/ld-sparc/sparc.exp b/ld/testsuite/ld-sparc/sparc.exp
new file mode 100644
index 0000000..9376783
--- /dev/null
+++ b/ld/testsuite/ld-sparc/sparc.exp
@@ -0,0 +1,88 @@
+# Expect script for ld-sparc tests
+# Copyright (C) 2002, 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 i386 linking; all types of relocs. This tests the assembler and
+# tools like objdump as well as the linker.
+
+if { !([istarget "sparc*-*-elf*"]
+ || ([istarget "sparc*-*-linux*"]
+ && ![istarget "*-*-*aout*"]
+ && ![istarget "*-*-*oldld*"])) } {
+ 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 sparctests {
+ {"TLS -fpic -shared transitions" "-shared -melf32_sparc"
+ "--32 -K PIC" {tlssunpic32.s tlspic.s}
+ {{readelf -WSsrl tlssunpic32.rd} {objdump -drj.text tlssunpic32.dd}
+ {objdump -sj.got tlssunpic32.sd} {objdump -sj.tdata tlssunpic32.td}}
+ "libtlssunpic32.so"}
+ {"Helper shared library" "-shared -melf32_sparc"
+ "--32 -K PIC" {tlslib.s} {} "libtlslib32.so"}
+ {"Another helper shared library" "-shared -melf32_sparc"
+ "--32 -K PIC" {tlssunbinpic32.s} {} "libtlssunbinpic32.so"}
+ {"TLS -fpic and -fno-pic exec transitions"
+ "-melf32_sparc tmpdir/libtlslib32.so tmpdir/tlssunbinpic32.o"
+ "--32" {tlssunbin32.s}
+ {{readelf -WSsrl tlssunbin32.rd} {objdump -drj.text tlssunbin32.dd}
+ {objdump -sj.got tlssunbin32.sd} {objdump -sj.tdata tlssunbin32.td}}
+ "tlssunbin32"}
+ {"TLS -fno-pic -shared" "-shared -melf32_sparc"
+ "--32" {tlssunnopic32.s tlsnopic.s}
+ {{readelf -WSsrl tlssunnopic32.rd} {objdump -drj.text tlssunnopic32.dd}
+ {objdump -sj.got tlssunnopic32.sd}} "libtlssunnopic32.so"}
+ {"TLS in debug sections" "-melf32_sparc"
+ "--32" {tlsg32.s}
+ {{objdump -sj.debug_foobar tlsg32.sd}} "tlsg32"}
+}
+set sparc64tests {
+ {"TLS -fpic -shared transitions" "-shared -melf64_sparc"
+ "--64 -Av9 -K PIC" {tlssunpic64.s tlspic.s}
+ {{readelf -WSsrl tlssunpic64.rd} {objdump -drj.text tlssunpic64.dd}
+ {objdump -sj.got tlssunpic64.sd} {objdump -sj.tdata tlssunpic64.td}}
+ "libtlssunpic64.so"}
+ {"Helper shared library" "-shared -melf64_sparc"
+ "--64 -Av9 -K PIC" {tlslib.s} {} "libtlslib64.so"}
+ {"Another helper shared library" "-shared -melf64_sparc"
+ "--64 -Av9 -K PIC" {tlssunbinpic64.s} {} "libtlssunbinpic64.so"}
+ {"TLS -fpic and -fno-pic exec transitions"
+ "-melf64_sparc tmpdir/libtlslib64.so tmpdir/tlssunbinpic64.o"
+ "--64 -Av9" {tlssunbin64.s}
+ {{readelf -WSsrl tlssunbin64.rd} {objdump -drj.text tlssunbin64.dd}
+ {objdump -sj.got tlssunbin64.sd} {objdump -sj.tdata tlssunbin64.td}}
+ "tlssunbin64"}
+ {"TLS -fno-pic -shared" "-shared -melf64_sparc"
+ "--64 -Av9" {tlssunnopic64.s tlsnopic.s}
+ {{readelf -WSsrl tlssunnopic64.rd} {objdump -drj.text tlssunnopic64.dd}
+ {objdump -sj.got tlssunnopic64.sd}} "libtlssunnopic64.so"}
+ {"TLS in debug sections" "-melf64_sparc"
+ "--64 -Av9" {tlsg64.s}
+ {{objdump -sj.debug_foobar tlsg64.sd}} "tlsg64"}
+}
+
+run_ld_link_tests $sparctests
+# run_ld_link_tests $sparc64tests
diff --git a/ld/testsuite/ld-sparc/tlsg32.s b/ld/testsuite/ld-sparc/tlsg32.s
new file mode 100644
index 0000000..0339f50c
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlsg32.s
@@ -0,0 +1,12 @@
+ .section .tbss
+ .align 4
+ .word 0, 0, 0, 0, 0, 0
+ .type a,#tls_object
+ .size a,4
+a:
+ .word 0
+ .text
+ .globl _start
+_start:
+ .section .debug_foobar
+ .word %r_tls_dtpoff32(a)
diff --git a/ld/testsuite/ld-sparc/tlsg32.sd b/ld/testsuite/ld-sparc/tlsg32.sd
new file mode 100644
index 0000000..861ac2e
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlsg32.sd
@@ -0,0 +1,10 @@
+#source: tlsg.s
+#as: --32
+#ld: -melf32_sparc
+#objdump: -sj.debug_foobar
+#target: sparc*-*-*
+
+.*: +file format elf32-sparc
+
+Contents of section .debug_foobar:
+ 0+ 0+18 .*
diff --git a/ld/testsuite/ld-sparc/tlsg64.s b/ld/testsuite/ld-sparc/tlsg64.s
new file mode 100644
index 0000000..4419974
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlsg64.s
@@ -0,0 +1,12 @@
+ .section .tbss
+ .align 4
+ .word 0, 0, 0, 0, 0, 0
+ .type a,#tls_object
+ .size a,4
+a:
+ .word 0
+ .text
+ .globl _start
+_start:
+ .section .debug_foobar
+ .xword %r_tls_dtpoff64(a)
diff --git a/ld/testsuite/ld-sparc/tlsg64.sd b/ld/testsuite/ld-sparc/tlsg64.sd
new file mode 100644
index 0000000..6768fa1
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlsg64.sd
@@ -0,0 +1,11 @@
+#source: tlsg.s
+#as: --64 -Av9
+#ld: -melf64_sparc
+#objdump: -sj.debug_foobar
+#target: sparc*-*-*
+
+.*: +file format elf64-sparc
+
+Contents of section .debug_foobar:
+# FIXME
+#pass
diff --git a/ld/testsuite/ld-sparc/tlslib.s b/ld/testsuite/ld-sparc/tlslib.s
new file mode 100644
index 0000000..6b62e09
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlslib.s
@@ -0,0 +1,20 @@
+ .section ".tdata", #alloc, #write, #tls
+ .align 4
+ .globl sG1, sG2, sG3, sG4, sG5, sG6, sG7, sG8
+sG1: .word 513
+sG2: .word 514
+sG3: .word 515
+sG4: .word 516
+sG5: .word 517
+sG6: .word 518
+sG7: .word 519
+sG8: .word 520
+
+ .text
+ /* Dummy. */
+ .globl __tls_get_addr
+ .type __tls_get_addr,#function
+ .proc 04
+__tls_get_addr:
+ ret
+ restore
diff --git a/ld/testsuite/ld-sparc/tlsnopic.s b/ld/testsuite/ld-sparc/tlsnopic.s
new file mode 100644
index 0000000..648660a
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlsnopic.s
@@ -0,0 +1,8 @@
+ .section ".tbss"
+ .align 4
+ .globl sh1, sh2, sh3, sh4
+ .hidden sh1, sh2, sh3, sh4
+sh1: .word 0
+sh2: .word 0
+sh3: .word 0
+sh4: .word 0
diff --git a/ld/testsuite/ld-sparc/tlspic.s b/ld/testsuite/ld-sparc/tlspic.s
new file mode 100644
index 0000000..7c806d0
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlspic.s
@@ -0,0 +1,12 @@
+ .section ".tbss"
+ .align 4
+ .globl sH1, sH2, sH3, sH4, sH5, sH6, sH7, sH8
+ .hidden sH1, sH2, sH3, sH4, sH5, sH6, sH7, sH8
+sH1: .word 0
+sH2: .word 0
+sH3: .word 0
+sH4: .word 0
+sH5: .word 0
+sH6: .word 0
+sH7: .word 0
+sH8: .word 0
diff --git a/ld/testsuite/ld-sparc/tlssunbin32.dd b/ld/testsuite/ld-sparc/tlssunbin32.dd
new file mode 100644
index 0000000..87aee12
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunbin32.dd
@@ -0,0 +1,273 @@
+#source: tlssunbin32.s
+#as: --32
+#ld: -shared -melf32_sparc tmpdir/libtlslib32.so tmpdir/tlssunbinpic32.o
+#objdump: -drj.text
+#target: sparc*-*-*
+
+.*: +file format elf32-sparc
+
+Disassembly of section .text:
+
+0+11000 <fn2-0x8>:
+ +11000: 81 c3 e0 08 retl *
+ +11004: ae 03 c0 17 add %o7, %l7, %l7
+
+0+11008 <fn2>:
+ +11008: 9d e3 bf 98 save %sp, -104, %sp
+ +1100c: 2f 00 00 50 sethi %hi\(0x14000\), %l7
+ +11010: 7f ff ff fc call 11000 <.*>
+ +11014: ae 05 e0 d0 add %l7, 0xd0, %l7 ! 140d0 <.*>
+ +11018: 01 00 00 00 nop *
+ +1101c: 01 00 00 00 nop *
+ +11020: 01 00 00 00 nop *
+ +11024: 01 00 00 00 nop *
+ +11028: 23 00 00 00 sethi %hi\(0\), %l1
+ +1102c: 01 00 00 00 nop *
+ +11030: a4 04 60 10 add %l1, 0x10, %l2
+ +11034: 01 00 00 00 nop *
+ +11038: d0 05 c0 12 ld \[ %l7 \+ %l2 \], %o0
+ +1103c: 01 00 00 00 nop *
+ +11040: 90 01 c0 08 add %g7, %o0, %o0
+ +11044: 01 00 00 00 nop *
+ +11048: 01 00 00 00 nop *
+ +1104c: 01 00 00 00 nop *
+ +11050: 01 00 00 00 nop *
+ +11054: 01 00 00 00 nop *
+ +11058: 11 00 00 00 sethi %hi\(0\), %o0
+ +1105c: 92 02 20 08 add %o0, 8, %o1 ! 8 <.*>
+ +11060: d0 05 c0 09 ld \[ %l7 \+ %o1 \], %o0
+ +11064: 90 01 c0 08 add %g7, %o0, %o0
+ +11068: 01 00 00 00 nop *
+ +1106c: 01 00 00 00 nop *
+ +11070: 01 00 00 00 nop *
+ +11074: 01 00 00 00 nop *
+ +11078: 01 00 00 00 nop *
+ +1107c: 21 00 00 04 sethi %hi\(0x1000\), %l0
+ +11080: aa 1c 3f 60 xor %l0, -160, %l5
+ +11084: 90 01 c0 15 add %g7, %l5, %o0
+ +11088: 01 00 00 00 nop *
+ +1108c: 01 00 00 00 nop *
+ +11090: 01 00 00 00 nop *
+ +11094: 01 00 00 00 nop *
+ +11098: 01 00 00 00 nop *
+ +1109c: 01 00 00 00 nop *
+ +110a0: 11 00 00 00 sethi %hi\(0\), %o0
+ +110a4: 92 1a 3f 80 xor %o0, -128, %o1
+ +110a8: 90 01 c0 09 add %g7, %o1, %o0
+ +110ac: 01 00 00 00 nop *
+ +110b0: 01 00 00 00 nop *
+ +110b4: 01 00 00 00 nop *
+ +110b8: 01 00 00 00 nop *
+ +110bc: 01 00 00 00 nop *
+ +110c0: 01 00 00 00 nop *
+ +110c4: 11 00 00 00 sethi %hi\(0\), %o0
+ +110c8: 92 1a 3f a0 xor %o0, -96, %o1
+ +110cc: 90 01 c0 09 add %g7, %o1, %o0
+ +110d0: 01 00 00 00 nop *
+ +110d4: 01 00 00 00 nop *
+ +110d8: 01 00 00 00 nop *
+ +110dc: 01 00 00 00 nop *
+ +110e0: 01 00 00 00 nop *
+ +110e4: 01 00 00 00 nop *
+ +110e8: 01 00 00 00 nop *
+ +110ec: 01 00 00 00 nop *
+ +110f0: 01 00 00 00 nop *
+ +110f4: 01 00 00 00 nop *
+ +110f8: 01 00 00 00 nop *
+ +110fc: 01 00 00 00 nop *
+ +11100: 90 10 00 00 mov %g0, %o0
+ +11104: 01 00 00 00 nop *
+ +11108: 27 00 00 00 sethi %hi\(0\), %l3
+ +1110c: 01 00 00 00 nop *
+ +11110: a8 1c ff 80 xor %l3, -128, %l4
+ +11114: 01 00 00 00 nop *
+ +11118: aa 01 c0 14 add %g7, %l4, %l5
+ +1111c: 01 00 00 00 nop *
+ +11120: 25 00 00 00 sethi %hi\(0\), %l2
+ +11124: 01 00 00 00 nop *
+ +11128: a6 1c bf 86 xor %l2, -122, %l3
+ +1112c: 01 00 00 00 nop *
+ +11130: ec 11 c0 13 lduh \[ %g7 \+ %l3 \], %l6
+ +11134: 01 00 00 00 nop *
+ +11138: 01 00 00 00 nop *
+ +1113c: 01 00 00 00 nop *
+ +11140: 01 00 00 00 nop *
+ +11144: 01 00 00 00 nop *
+ +11148: 27 00 00 00 sethi %hi\(0\), %l3
+ +1114c: 01 00 00 00 nop *
+ +11150: 25 00 00 00 sethi %hi\(0\), %l2
+ +11154: 01 00 00 00 nop *
+ +11158: a8 1c ff a0 xor %l3, -96, %l4
+ +1115c: 90 10 00 00 mov %g0, %o0
+ +11160: a6 1c bf a5 xor %l2, -91, %l3
+ +11164: aa 01 c0 14 add %g7, %l4, %l5
+ +11168: ec 09 c0 13 ldub \[ %g7 \+ %l3 \], %l6
+ +1116c: 01 00 00 00 nop *
+ +11170: 01 00 00 00 nop *
+ +11174: 01 00 00 00 nop *
+ +11178: 01 00 00 00 nop *
+ +1117c: 23 00 00 00 sethi %hi\(0\), %l1
+ +11180: 01 00 00 00 nop *
+ +11184: a4 04 60 08 add %l1, 8, %l2
+ +11188: 01 00 00 00 nop *
+ +1118c: e4 05 c0 12 ld \[ %l7 \+ %l2 \], %l2
+ +11190: 01 00 00 00 nop *
+ +11194: a4 01 c0 12 add %g7, %l2, %l2
+ +11198: 01 00 00 00 nop *
+ +1119c: 01 00 00 00 nop *
+ +111a0: 01 00 00 00 nop *
+ +111a4: 01 00 00 00 nop *
+ +111a8: 17 00 00 04 sethi %hi\(0x1000\), %o3
+ +111ac: 96 1a ff 60 xor %o3, -160, %o3
+ +111b0: 01 00 00 00 nop *
+ +111b4: 98 01 c0 0b add %g7, %o3, %o4
+ +111b8: 01 00 00 00 nop *
+ +111bc: 01 00 00 00 nop *
+ +111c0: 01 00 00 00 nop *
+ +111c4: 01 00 00 00 nop *
+ +111c8: 29 00 00 00 sethi %hi\(0\), %l4
+ +111cc: a2 1d 3f 80 xor %l4, -128, %l1
+ +111d0: a6 10 00 11 mov %l1, %l3
+ +111d4: a6 01 c0 13 add %g7, %l3, %l3
+ +111d8: 01 00 00 00 nop *
+ +111dc: 01 00 00 00 nop *
+ +111e0: 01 00 00 00 nop *
+ +111e4: 01 00 00 00 nop *
+ +111e8: 13 00 00 00 sethi %hi\(0\), %o1
+ +111ec: 96 1a 7f a0 xor %o1, -96, %o3
+ +111f0: 90 10 00 0b mov %o3, %o0
+ +111f4: 96 01 c0 08 add %g7, %o0, %o3
+ +111f8: 01 00 00 00 nop *
+ +111fc: 01 00 00 00 nop *
+ +11200: 01 00 00 00 nop *
+ +11204: 01 00 00 00 nop *
+ +11208: 17 00 00 00 sethi %hi\(0\), %o3
+ +1120c: 96 02 e0 04 add %o3, 4, %o3 ! 4 <.*>
+ +11210: d4 05 c0 0b ld \[ %l7 \+ %o3 \], %o2
+ +11214: d8 01 c0 0a ld \[ %g7 \+ %o2 \], %o4
+ +11218: 01 00 00 00 nop *
+ +1121c: 01 00 00 00 nop *
+ +11220: 01 00 00 00 nop *
+ +11224: 01 00 00 00 nop *
+ +11228: 17 00 00 00 sethi %hi\(0\), %o3
+ +1122c: 96 1a ff 90 xor %o3, -112, %o3
+ +11230: 94 10 00 0b mov %o3, %o2
+ +11234: d8 29 c0 0a stb %o4, \[ %g7 \+ %o2 \]
+ +11238: 01 00 00 00 nop *
+ +1123c: 01 00 00 00 nop *
+ +11240: 01 00 00 00 nop *
+ +11244: 01 00 00 00 nop *
+ +11248: 1b 00 00 00 sethi %hi\(0\), %o5
+ +1124c: 96 1b 7f b0 xor %o5, -80, %o3
+ +11250: 94 10 00 0b mov %o3, %o2
+ +11254: d8 49 c0 0a ldsb \[ %g7 \+ %o2 \], %o4
+ +11258: 01 00 00 00 nop *
+ +1125c: 01 00 00 00 nop *
+ +11260: 01 00 00 00 nop *
+ +11264: 01 00 00 00 nop *
+ +11268: 81 c7 e0 08 ret *
+ +1126c: 81 e8 00 00 restore *
+#...
+
+00012000 <_start>:
+ +12000: 9d e3 bf 98 save %sp, -104, %sp
+ +12004: 29 00 00 94 sethi %hi\(0x25000\), %l4
+ +12008: a8 15 20 e0 or %l4, 0xe0, %l4 ! 250e0 <.*>
+ +1200c: 01 00 00 00 nop *
+ +12010: 01 00 00 00 nop *
+ +12014: 01 00 00 00 nop *
+ +12018: 01 00 00 00 nop *
+ +1201c: 17 00 00 00 sethi %hi\(0\), %o3
+ +12020: 96 02 e0 0c add %o3, 0xc, %o3 ! c <.*>
+ +12024: d4 05 00 0b ld \[ %l4 \+ %o3 \], %o2
+ +12028: 98 01 c0 0a add %g7, %o2, %o4
+ +1202c: 01 00 00 00 nop *
+ +12030: 01 00 00 00 nop *
+ +12034: 01 00 00 00 nop *
+ +12038: 01 00 00 00 nop *
+ +1203c: 17 00 00 00 sethi %hi\(0\), %o3
+ +12040: 9a 1a ff d4 xor %o3, -44, %o5
+ +12044: 94 10 00 0d mov %o5, %o2
+ +12048: 98 01 c0 0a add %g7, %o2, %o4
+ +1204c: 01 00 00 00 nop *
+ +12050: 01 00 00 00 nop *
+ +12054: 01 00 00 00 nop *
+ +12058: 01 00 00 00 nop *
+ +1205c: 17 00 00 00 sethi %hi\(0\), %o3
+ +12060: 9a 1a ff f4 xor %o3, -12, %o5
+ +12064: a4 10 00 0d mov %o5, %l2
+ +12068: a4 01 c0 12 add %g7, %l2, %l2
+ +1206c: 01 00 00 00 nop *
+ +12070: 01 00 00 00 nop *
+ +12074: 01 00 00 00 nop *
+ +12078: 01 00 00 00 nop *
+ +1207c: 17 00 00 00 sethi %hi\(0\), %o3
+ +12080: 9a 1a ff fc xor %o3, -4, %o5
+ +12084: a4 10 00 0d mov %o5, %l2
+ +12088: e4 01 c0 12 ld \[ %g7 \+ %l2 \], %l2
+ +1208c: 01 00 00 00 nop *
+ +12090: 01 00 00 00 nop *
+ +12094: 01 00 00 00 nop *
+ +12098: 01 00 00 00 nop *
+ +1209c: 17 00 00 00 sethi %hi\(0\), %o3
+ +120a0: 9a 1a ff b4 xor %o3, -76, %o5
+ +120a4: a4 10 00 0d mov %o5, %l2
+ +120a8: a4 01 c0 12 add %g7, %l2, %l2
+ +120ac: 01 00 00 00 nop *
+ +120b0: 01 00 00 00 nop *
+ +120b4: 01 00 00 00 nop *
+ +120b8: 01 00 00 00 nop *
+ +120bc: 17 00 00 00 sethi %hi\(0\), %o3
+ +120c0: 9a 1a ff fc xor %o3, -4, %o5
+ +120c4: a4 10 00 0d mov %o5, %l2
+ +120c8: e2 29 c0 12 stb %l1, \[ %g7 \+ %l2 \]
+ +120cc: 01 00 00 00 nop *
+ +120d0: 01 00 00 00 nop *
+ +120d4: 01 00 00 00 nop *
+ +120d8: 01 00 00 00 nop *
+ +120dc: 23 00 00 00 sethi %hi\(0\), %l1
+ +120e0: 01 00 00 00 nop *
+ +120e4: a4 1c 7f 64 xor %l1, -156, %l2
+ +120e8: 01 00 00 00 nop *
+ +120ec: a6 01 c0 12 add %g7, %l2, %l3
+ +120f0: 01 00 00 00 nop *
+ +120f4: 01 00 00 00 nop *
+ +120f8: 01 00 00 00 nop *
+ +120fc: 01 00 00 00 nop *
+ +12100: 11 00 00 00 sethi %hi\(0\), %o0
+ +12104: 90 1a 3f e6 xor %o0, -26, %o0
+ +12108: 90 01 c0 08 add %g7, %o0, %o0
+ +1210c: 01 00 00 00 nop *
+ +12110: 01 00 00 00 nop *
+ +12114: 01 00 00 00 nop *
+ +12118: 01 00 00 00 nop *
+ +1211c: 23 00 00 00 sethi %hi\(0\), %l1
+ +12120: 9a 1c 7f a5 xor %l1, -91, %o5
+ +12124: 92 01 c0 0d add %g7, %o5, %o1
+ +12128: 01 00 00 00 nop *
+ +1212c: 01 00 00 00 nop *
+ +12130: 01 00 00 00 nop *
+ +12134: 01 00 00 00 nop *
+ +12138: 23 00 00 00 sethi %hi\(0\), %l1
+ +1213c: 9a 1c 7f 68 xor %l1, -152, %o5
+ +12140: d2 01 c0 0d ld \[ %g7 \+ %o5 \], %o1
+ +12144: 01 00 00 00 nop *
+ +12148: 01 00 00 00 nop *
+ +1214c: 01 00 00 00 nop *
+ +12150: 01 00 00 00 nop *
+ +12154: 11 00 00 00 sethi %hi\(0\), %o0
+ +12158: 90 1a 3f eb xor %o0, -21, %o0
+ +1215c: d2 29 c0 08 stb %o1, \[ %g7 \+ %o0 \]
+ +12160: 01 00 00 00 nop *
+ +12164: 01 00 00 00 nop *
+ +12168: 01 00 00 00 nop *
+ +1216c: 01 00 00 00 nop *
+ +12170: 15 00 00 00 sethi %hi\(0\), %o2
+ +12174: 98 1a bf ab xor %o2, -85, %o4
+ +12178: da 69 c0 0c ldstub \[ %g7 \+ %o4 \], %o5
+ +1217c: 01 00 00 00 nop *
+ +12180: 01 00 00 00 nop *
+ +12184: 01 00 00 00 nop *
+ +12188: 01 00 00 00 nop *
+ +1218c: 81 c7 e0 08 ret *
+ +12190: 81 e8 00 00 restore *
diff --git a/ld/testsuite/ld-sparc/tlssunbin32.rd b/ld/testsuite/ld-sparc/tlssunbin32.rd
new file mode 100644
index 0000000..0235237
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunbin32.rd
@@ -0,0 +1,137 @@
+#source: tlssunbin32.s
+#as: --32
+#ld: -shared -melf32_sparc tmpdir/libtlslib32.so tmpdir/tlssunbinpic32.o
+#readelf: -WSsrl
+#target: sparc*-*-*
+
+There are 17 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\] .text +PROGBITS +0+11000 0+1000 0+1194 00 +AX +0 +0 4096
+ +\[ 7\] .data +.*
+ +\[ 8\] .tdata +PROGBITS +0+24000 0+4000 0+1060 00 WAT +0 +0 +4
+ +\[ 9\] .tbss +NOBITS +0+25060 0+5060 0+40 00 WAT +0 +0 +4
+ +\[10\] .dynamic +DYNAMIC +0+25060 0+5060 0+80 08 +WA +4 +0 +4
+ +\[11\] .plt +.*
+ +\[12\] .got +PROGBITS +0+250e0 0+50e0 0+14 04 +WA +0 +0 +4
+ +\[13\] .bss +.*
+ +\[14\] .shstrtab +.*
+ +\[15\] .symtab +.*
+ +\[16\] .strtab +.*
+#...
+
+Elf file type is EXEC \(Executable file\)
+Entry point 0x12000
+There are 6 program headers, starting at offset [0-9]+
+
+Program Headers:
+ +Type +Offset +VirtAddr +PhysAddr +FileSiz MemSiz +Flg Align
+ +PHDR +0x0+34 0x0+10034 0x0+10034 0x0+c0 0x0+c0 R E 0x4
+ +INTERP +0x0+f4 0x0+100f4 0x0+100f4 0x0+11 0x0+11 R +0x1
+.*Requesting program interpreter.*
+ +LOAD +0x0+ 0x0+10000 0x0+10000 0x0+2194 0x0+2194 R E 0x10000
+ +LOAD +0x0+4000 0x0+24000 0x0+24000 0x0+10f4 0x0+10f8 RWE 0x10000
+ +DYNAMIC +0x0+5060 0x0+25060 0x0+25060 0x0+80 0x0+80 RW +0x4
+ +TLS +0x0+4000 0x0+24000 0x0+24000 0x0+1060 0x0+10a0 R +0x4
+#...
+
+Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 4 entries:
+ Offset +Info +Type +Sym. Value +Symbol's Name \+ Addend
+000250e4 +0000014e R_SPARC_TLS_TPOFF32 +00000000 +sG5 \+ 0
+000250e8 +0000034e R_SPARC_TLS_TPOFF32 +00000000 +sG2 \+ 0
+000250ec +0000074e R_SPARC_TLS_TPOFF32 +00000000 +sG6 \+ 0
+000250f0 +0000084e R_SPARC_TLS_TPOFF32 +00000000 +sG1 \+ 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 sG5
+ +2: 0+25060 +0 OBJECT +GLOBAL DEFAULT +ABS _DYNAMIC
+ +3: 0+ +0 TLS +GLOBAL DEFAULT +UND sG2
+ +4: [0-9a-f]+ +0 OBJECT +GLOBAL DEFAULT +ABS _PROCEDURE_LINKAGE_TABLE_
+ +5: 0+ +0 FUNC +GLOBAL DEFAULT +UND __tls_get_addr
+ +6: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS __bss_start
+ +7: 0+ +0 TLS +GLOBAL DEFAULT +UND sG6
+ +8: 0+ +0 TLS +GLOBAL DEFAULT +UND sG1
+ +9: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS _edata
+ +10: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS _end
+
+Symbol table '.symtab' contains 70 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+1020 +0 TLS +LOCAL +DEFAULT +8 sl1
+ +18: 0+1024 +0 TLS +LOCAL +DEFAULT +8 sl2
+ +19: 0+1028 +0 TLS +LOCAL +DEFAULT +8 sl3
+ +20: 0+102c +0 TLS +LOCAL +DEFAULT +8 sl4
+ +21: 0+1030 +0 TLS +LOCAL +DEFAULT +8 sl5
+ +22: 0+1034 +0 TLS +LOCAL +DEFAULT +8 sl6
+ +23: 0+1038 +0 TLS +LOCAL +DEFAULT +8 sl7
+ +24: 0+103c +0 TLS +LOCAL +DEFAULT +8 sl8
+ +25: 0+1080 +0 TLS +LOCAL +DEFAULT +9 bl1
+ +26: 0+1084 +0 TLS +LOCAL +DEFAULT +9 bl2
+ +27: 0+1088 +0 TLS +LOCAL +DEFAULT +9 bl3
+ +28: 0+108c +0 TLS +LOCAL +DEFAULT +9 bl4
+ +29: 0+1090 +0 TLS +LOCAL +DEFAULT +9 bl5
+ +30: 0+1094 +0 TLS +LOCAL +DEFAULT +9 bl6
+ +31: 0+1098 +0 TLS +LOCAL +DEFAULT +9 bl7
+ +32: 0+109c +0 TLS +LOCAL +DEFAULT +9 bl8
+ +33: 0+250e0 +0 OBJECT +LOCAL +HIDDEN +12 _GLOBAL_OFFSET_TABLE_
+ +34: 0+101c +0 TLS +GLOBAL DEFAULT +8 sg8
+ +35: 0+107c +0 TLS +GLOBAL DEFAULT +9 bg8
+ +36: 0+1074 +0 TLS +GLOBAL DEFAULT +9 bg6
+ +37: 0+ +0 TLS +GLOBAL DEFAULT +UND sG5
+ +38: 0+1068 +0 TLS +GLOBAL DEFAULT +9 bg3
+ +39: 0+25060 +0 OBJECT +GLOBAL DEFAULT +ABS _DYNAMIC
+ +40: 0+1008 +0 TLS +GLOBAL DEFAULT +8 sg3
+ +41: 0+1048 +0 TLS +GLOBAL HIDDEN +8 sh3
+ +42: 0+ +0 TLS +GLOBAL DEFAULT +UND sG2
+ +43: 0+100c +0 TLS +GLOBAL DEFAULT +8 sg4
+ +44: 0+1010 +0 TLS +GLOBAL DEFAULT +8 sg5
+ +45: [0-9a-f]+ +0 OBJECT +GLOBAL DEFAULT +ABS _PROCEDURE_LINKAGE_TABLE_
+ +46: 0+1070 +0 TLS +GLOBAL DEFAULT +9 bg5
+ +47: 0+ +0 FUNC +GLOBAL DEFAULT +UND __tls_get_addr
+ +48: 0+1058 +0 TLS +GLOBAL HIDDEN +8 sh7
+ +49: 0+105c +0 TLS +GLOBAL HIDDEN +8 sh8
+ +50: 0+ +0 TLS +GLOBAL DEFAULT +8 sg1
+ +51: 0+12000 +0 FUNC +GLOBAL DEFAULT +6 _start
+ +52: 0+104c +0 TLS +GLOBAL HIDDEN +8 sh4
+ +53: 0+1078 +0 TLS +GLOBAL DEFAULT +9 bg7
+ +54: 0+1050 +0 TLS +GLOBAL HIDDEN +8 sh5
+ +55: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS __bss_start
+ +56: 0+ +0 TLS +GLOBAL DEFAULT +UND sG6
+ +57: 0+11008 +0 FUNC +GLOBAL DEFAULT +6 fn2
+ +58: 0+1004 +0 TLS +GLOBAL DEFAULT +8 sg2
+ +59: 0+ +0 TLS +GLOBAL DEFAULT +UND sG1
+ +60: 0+1040 +0 TLS +GLOBAL HIDDEN +8 sh1
+ +61: 0+1014 +0 TLS +GLOBAL DEFAULT +8 sg6
+ +62: 0+1018 +0 TLS +GLOBAL DEFAULT +8 sg7
+ +63: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS _edata
+ +64: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS _end
+ +65: 0+1044 +0 TLS +GLOBAL HIDDEN +8 sh2
+ +66: 0+1054 +0 TLS +GLOBAL HIDDEN +8 sh6
+ +67: 0+1064 +0 TLS +GLOBAL DEFAULT +9 bg2
+ +68: 0+1060 +0 TLS +GLOBAL DEFAULT +9 bg1
+ +69: 0+106c +0 TLS +GLOBAL DEFAULT +9 bg4
diff --git a/ld/testsuite/ld-sparc/tlssunbin32.s b/ld/testsuite/ld-sparc/tlssunbin32.s
new file mode 100644
index 0000000..21716f3
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunbin32.s
@@ -0,0 +1,114 @@
+ .section ".tbss"
+ .align 4
+ .globl bg1, bg2, bg3, bg4, bg5, bg6, bg7, bg8
+bg1: .word 0
+bg2: .word 0
+bg3: .word 0
+bg4: .word 0
+bg5: .word 0
+bg6: .word 0
+bg7: .word 0
+bg8: .word 0
+bl1: .word 0
+bl2: .word 0
+bl3: .word 0
+bl4: .word 0
+bl5: .word 0
+bl6: .word 0
+bl7: .word 0
+bl8: .word 0
+ .text
+ .globl _start
+ .type _start,#function
+ .proc 04
+_start:
+ save %sp, -104, %sp
+ .hidden _GLOBAL_OFFSET_TABLE_
+ sethi %hi(_GLOBAL_OFFSET_TABLE_), %l4
+ or %l4, %lo(_GLOBAL_OFFSET_TABLE_), %l4
+ nop;nop;nop;nop
+
+ /* IE against global var */
+ sethi %tie_hi22(sG6), %o3
+ add %o3, %tie_lo10(sG6), %o3
+ ld [%l4 + %o3], %o2, %tie_ld(sG6)
+ add %g7, %o2, %o4, %tie_add(sG6)
+ nop;nop;nop;nop
+
+ /* IE -> LE against global var defined in exec */
+ sethi %tie_hi22(bg6), %o3
+ add %o3, %tie_lo10(bg6), %o5
+ ld [%l4 + %o5], %o2, %tie_ld(bg6)
+ add %g7, %o2, %o4, %tie_add(bg6)
+ nop;nop;nop;nop
+
+ /* IE -> LE against local var */
+ sethi %tie_hi22(bl6), %o3
+ add %o3, %tie_lo10(bl6), %o5
+ ld [%l4 + %o5], %l2, %tie_ld(bl6)
+ add %g7, %l2, %l2, %tie_add(bl6)
+ nop;nop;nop;nop
+
+ /* direct %g7 access IE -> LE against local var */
+ sethi %tie_hi22(bl8), %o3
+ add %o3, %tie_lo10(bl8), %o5
+ ld [%l4 + %o5], %l2, %tie_ld(bl8)
+ ld [%g7 + %l2], %l2, %tie_add(bl8)
+ nop;nop;nop;nop
+
+ /* IE -> LE against hidden but not local var */
+ sethi %tie_hi22(sh6), %o3
+ add %o3, %tie_lo10(sh6), %o5
+ ld [%l4 + %o5], %l2, %tie_ld(sh6)
+ add %g7, %l2, %l2, %tie_add(sh6)
+ nop;nop;nop;nop
+
+ /* direct %g7 access IE -> LE against hidden but not local var */
+ sethi %tie_hi22(bl8), %o3
+ add %o3, %tie_lo10(bl8), %o5
+ ld [%l4 + %o5], %l2, %tie_ld(bl8)
+ stb %l1, [%g7 + %l2], %tie_add(bl8)
+ nop;nop;nop;nop
+
+ /* LE, global var defined in exec */
+ sethi %tle_hix22(sg2), %l1
+ nop
+ xor %l1, %tle_lox10(sg2), %l2
+ nop
+ add %g7, %l2, %l3
+ nop;nop;nop;nop
+
+ /* LE, local var */
+ sethi %tle_hix22(bl2+2), %o0
+ xor %o0, %tle_lox10(bl2+2), %o0
+ add %g7, %o0, %o0
+ nop;nop;nop;nop
+
+ /* LE, hidden var defined in exec */
+ sethi %tle_hix22(sh2+1), %l1
+ xor %l1, %tle_lox10(sh2+1), %o5
+ add %g7, %o5, %o1
+ nop;nop;nop;nop
+
+ /* Direct %g7 access */
+
+ /* LE, global var defined in exec */
+ sethi %tle_hix22(sg3), %l1
+ xor %l1, %tle_lox10(sg3), %o5
+ ld [%g7 + %o5], %o1
+ nop;nop;nop;nop
+
+ /* LE, local var */
+ sethi %tle_hix22(bl3 + 3), %o0
+ xor %o0, %tle_lox10(bl3 + 3), %o0
+ stb %o1, [%g7 + %o0]
+ nop;nop;nop;nop
+
+ /* LE, hidden var defined in exec */
+ sethi %tle_hix22(sh3 + 3), %o2
+ xor %o2, %tle_lox10(sh3 + 3), %o4
+ ldstub [%g7 + %o4], %o5
+ nop;nop;nop;nop
+
+ ret
+ restore
diff --git a/ld/testsuite/ld-sparc/tlssunbin32.sd b/ld/testsuite/ld-sparc/tlssunbin32.sd
new file mode 100644
index 0000000..9a81309
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunbin32.sd
@@ -0,0 +1,11 @@
+#source: tlssunbin32.s
+#as: --32
+#ld: -shared -melf32_sparc tmpdir/libtlslib32.so tmpdir/tlssunbinbin32.o
+#objdump: -sj.got
+#target: sparc*-*-*
+
+.*: +file format elf32-sparc
+
+Contents of section .got:
+ 250e0 00025060 0+ 0+ 0+ .*
+ 250f0 0+ .*
diff --git a/ld/testsuite/ld-sparc/tlssunbin32.td b/ld/testsuite/ld-sparc/tlssunbin32.td
new file mode 100644
index 0000000..526f494
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunbin32.td
@@ -0,0 +1,19 @@
+#source: tlssunbin32.s
+#as: --32
+#ld: -shared -melf32_sparc tmpdir/libtlslib32.so tmpdir/tlssunbinpic32.o
+#objdump: -sj.tdata
+#target: sparc*-*-*
+
+.*: +file format elf32-sparc
+
+Contents of section .tdata:
+ 24000 00000011 00000000 00000000 00000000 .*
+ 24010 00000000 00000000 00000000 00000000 .*
+#...
+ 24ff0 00000000 00000000 00000000 00000000 .*
+ 25000 00000000 00000012 00000013 00000014 .*
+ 25010 00000015 00000016 00000017 00000018 .*
+ 25020 00000041 00000042 00000043 00000044 .*
+ 25030 00000045 00000046 00000047 00000048 .*
+ 25040 00000101 00000102 00000103 00000104 .*
+ 25050 00000105 00000106 00000107 00000108 .*
diff --git a/ld/testsuite/ld-sparc/tlssunbin64.dd b/ld/testsuite/ld-sparc/tlssunbin64.dd
new file mode 100644
index 0000000..9a5dad9
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunbin64.dd
@@ -0,0 +1,11 @@
+#source: tlssunbin64.s
+#as: --64
+#ld: -shared -melf64_sparc tmpdir/libtlslib64.so tmpdir/tlssunbinpic64.o
+#objdump: -drj.text
+#target: sparc*-*-*
+
+.*: +file format elf64-sparc
+
+Disassembly of section .text:
+# FIXME
+#pass
diff --git a/ld/testsuite/ld-sparc/tlssunbin64.rd b/ld/testsuite/ld-sparc/tlssunbin64.rd
new file mode 100644
index 0000000..dee8c33
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunbin64.rd
@@ -0,0 +1,8 @@
+#source: tlssunbin64.s
+#as: --64
+#ld: -shared -melf64_sparc tmpdir/libtlslib64.so tmpdir/tlssunbinpic64.o
+#readelf: -WSsrl
+#target: sparc*-*-*
+
+# FIXME
+#pass
diff --git a/ld/testsuite/ld-sparc/tlssunbin64.s b/ld/testsuite/ld-sparc/tlssunbin64.s
new file mode 100644
index 0000000..bb62610
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunbin64.s
@@ -0,0 +1,118 @@
+ .section ".tbss"
+ .align 4
+ .globl bg1, bg2, bg3, bg4, bg5, bg6, bg7, bg8
+bg1: .word 0
+bg2: .word 0
+bg3: .word 0
+bg4: .word 0
+bg5: .word 0
+bg6: .word 0
+bg7: .word 0
+bg8: .word 0
+bl1: .word 0
+bl2: .word 0
+bl3: .word 0
+bl4: .word 0
+bl5: .word 0
+bl6: .word 0
+bl7: .word 0
+bl8: .word 0
+ .text
+ .globl _start
+ .type _start,#function
+ .proc 04
+_start:
+ save %sp, -160, %sp
+ .hidden _GLOBAL_OFFSET_TABLE_
+ sethi %hh(_GLOBAL_OFFSET_TABLE_), %l1
+ sethi %lm(_GLOBAL_OFFSET_TABLE_), %l2
+ or %l1, %hm(_GLOBAL_OFFSET_TABLE_), %l1
+ or %l2, %lo(_GLOBAL_OFFSET_TABLE_), %l2
+ sllx %l1, 32, %l1
+ add %l1, %l2, %l4
+ nop;nop;nop;nop
+
+ /* IE against global var */
+ sethi %tie_hi22(sG6), %o3
+ add %o3, %tie_lo10(sG6), %o3
+ ldx [%l4 + %o3], %o2, %tie_ldx(sG6)
+ add %g7, %o2, %o4, %tie_add(sG6)
+ nop;nop;nop;nop
+
+ /* IE -> LE against global var defined in exec */
+ sethi %tie_hi22(bg6), %o3
+ add %o3, %tie_lo10(bg6), %o5
+ ldx [%l4 + %o5], %o2, %tie_ldx(bg6)
+ add %g7, %o2, %o4, %tie_add(bg6)
+ nop;nop;nop;nop
+
+ /* IE -> LE against local var */
+ sethi %tie_hi22(bl6), %o3
+ add %o3, %tie_lo10(bl6), %o5
+ ldx [%l4 + %o5], %l2, %tie_ldx(bl6)
+ add %g7, %l2, %l2, %tie_add(bl6)
+ nop;nop;nop;nop
+
+ /* direct %g7 access IE -> LE against local var */
+ sethi %tie_hi22(bl8), %o3
+ add %o3, %tie_lo10(bl8), %o5
+ ldx [%l4 + %o5], %l2, %tie_ldx(bl8)
+ ldsw [%g7 + %l2], %l2, %tie_add(bl8)
+ nop;nop;nop;nop
+
+ /* IE -> LE against hidden but not local var */
+ sethi %tie_hi22(sh6), %o3
+ add %o3, %tie_lo10(sh6), %o5
+ ldx [%l4 + %o5], %l2, %tie_ldx(sh6)
+ add %g7, %l2, %l2, %tie_add(sh6)
+ nop;nop;nop;nop
+
+ /* direct %g7 access IE -> LE against hidden but not local var */
+ sethi %tie_hi22(bl8), %o3
+ add %o3, %tie_lo10(bl8), %o5
+ ldx [%l4 + %o5], %l2, %tie_ldx(bl8)
+ stb %l1, [%g7 + %l2], %tie_add(bl8)
+ nop;nop;nop;nop
+
+ /* LE, global var defined in exec */
+ sethi %tle_hix22(sg2), %l1
+ nop
+ xor %l1, %tle_lox10(sg2), %l2
+ nop
+ add %g7, %l2, %l3
+ nop;nop;nop;nop
+
+ /* LE, local var */
+ sethi %tle_hix22(bl2+2), %o0
+ xor %o0, %tle_lox10(bl2+2), %o0
+ add %g7, %o0, %o0
+ nop;nop;nop;nop
+
+ /* LE, hidden var defined in exec */
+ sethi %tle_hix22(sh2+1), %l1
+ xor %l1, %tle_lox10(sh2+1), %o5
+ add %g7, %o5, %o1
+ nop;nop;nop;nop
+
+ /* Direct %g7 access */
+
+ /* LE, global var defined in exec */
+ sethi %tle_hix22(sg3), %l1
+ xor %l1, %tle_lox10(sg3), %o5
+ ldx [%g7 + %o5], %o1
+ nop;nop;nop;nop
+
+ /* LE, local var */
+ sethi %tle_hix22(bl3 + 3), %o0
+ xor %o0, %tle_lox10(bl3 + 3), %o0
+ stb %o1, [%g7 + %o0]
+ nop;nop;nop;nop
+
+ /* LE, hidden var defined in exec */
+ sethi %tle_hix22(sh3 + 3), %o2
+ xor %o2, %tle_lox10(sh3 + 3), %o4
+ ldstub [%g7 + %o4], %o5
+ nop;nop;nop;nop
+
+ ret
+ restore
diff --git a/ld/testsuite/ld-sparc/tlssunbin64.sd b/ld/testsuite/ld-sparc/tlssunbin64.sd
new file mode 100644
index 0000000..c57fc10
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunbin64.sd
@@ -0,0 +1,11 @@
+#source: tlssunbin64.s
+#as: --64
+#ld: -shared -melf64_sparc tmpdir/libtlslib64.so tmpdir/tlssunbinpic64.o
+#objdump: -sj.got
+#target: sparc*-*-*
+
+.*: +file format elf64-sparc
+
+Contents of section .got:
+# FIXME
+#pass
diff --git a/ld/testsuite/ld-sparc/tlssunbin64.td b/ld/testsuite/ld-sparc/tlssunbin64.td
new file mode 100644
index 0000000..57b5afa
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunbin64.td
@@ -0,0 +1,11 @@
+#source: tlssunbin64.s
+#as: --64
+#ld: -shared -melf64_sparc tmpdir/libtlslib64.so tmpdir/tlssunbinpic64.o
+#objdump: -sj.tdata
+#target: sparc*-*-*
+
+.*: +file format elf64-sparc
+
+Contents of section .tdata:
+# FIXME
+#pass
diff --git a/ld/testsuite/ld-sparc/tlssunbinpic32.s b/ld/testsuite/ld-sparc/tlssunbinpic32.s
new file mode 100644
index 0000000..60fb585
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunbinpic32.s
@@ -0,0 +1,183 @@
+ .data
+ .align 4096
+ .section ".tdata", #alloc, #write, #tls
+ .align 4
+ .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: .word 17
+ .skip 4096
+sg2: .word 18
+sg3: .word 19
+sg4: .word 20
+sg5: .word 21
+sg6: .word 22
+sg7: .word 23
+sg8: .word 24
+sl1: .word 65
+sl2: .word 66
+sl3: .word 67
+sl4: .word 68
+sl5: .word 69
+sl6: .word 70
+sl7: .word 71
+sl8: .word 72
+sh1: .word 257
+sh2: .word 258
+sh3: .word 259
+sh4: .word 260
+sh5: .word 261
+sh6: .word 262
+sh7: .word 263
+sh8: .word 264
+ .text
+ .align 4096
+.LLGETPC0:
+ retl
+ add %o7, %l7, %l7
+
+ .globl fn2
+ .type fn2,#function
+ .proc 04
+fn2:
+ save %sp, -104, %sp
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %l7
+ call .LLGETPC0
+ add %l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7
+ nop;nop;nop;nop
+
+ /* GD -> IE because variable is not defined in executable */
+ sethi %tgd_hi22(sG1), %l1
+ nop
+ add %l1, %tgd_lo10(sG1), %l2
+ nop
+ add %l7, %l2, %o0, %tgd_add(sG1)
+ nop
+ call __tls_get_addr, %tgd_call(sG1)
+ nop
+ nop;nop;nop;nop
+
+ /* GD -> IE because variable is not defined in executable where
+ the variable is referenced through IE too */
+ sethi %tgd_hi22(sG2), %o0
+ add %o0, %tgd_lo10(sG2), %o1
+ add %l7, %o1, %o0, %tgd_add(sG2)
+ call __tls_get_addr, %tgd_call(sG2)
+ nop
+ nop;nop;nop;nop
+
+ /* GD -> LE with global variable defined in executable */
+ sethi %tgd_hi22(sg1), %l0
+ add %l0, %tgd_lo10(sg1), %l5
+ add %l7, %l5, %o0, %tgd_add(sg1)
+ call __tls_get_addr, %tgd_call(sg1)
+ nop
+ nop;nop;nop;nop
+
+ /* GD -> LE with local variable defined in executable */
+ sethi %tgd_hi22(sl1), %o0
+ add %o0, %tgd_lo10(sl1), %o1
+ add %l7, %o1, %o0, %tgd_add(sl1)
+ call __tls_get_addr, %tgd_call(sl1)
+ nop
+ nop;nop;nop;nop
+
+ /* GD -> LE with hidden variable defined in executable */
+ sethi %tgd_hi22(sh1), %o0
+ add %o0, %tgd_lo10(sh1), %o1
+ add %l7, %o1, %o0, %tgd_add(sh1)
+ call __tls_get_addr, %tgd_call(sh1)
+ nop
+ nop;nop;nop;nop
+
+ /* LD -> LE */
+ sethi %tldm_hi22(sl1), %l1
+ nop
+ add %l1, %tldm_lo10(sl1), %l2
+ nop
+ add %l7, %l2, %o0, %tldm_add(sl1)
+ nop
+ call __tls_get_addr, %tldm_call(sl1)
+ nop
+ sethi %tldo_hix22(sl1), %l3
+ nop
+ xor %l3, %tldo_lox10(sl1), %l4
+ nop
+ add %o0, %l4, %l5, %tldo_add(sl1)
+ nop
+ sethi %tldo_hix22(sl2 + 2), %l2
+ nop
+ xor %l2, %tldo_lox10(sl2 + 2), %l3
+ nop
+ lduh [%o0 + %l3], %l6, %tldo_add(sl2 + 2)
+ nop;nop;nop;nop
+
+ /* LD -> LE against hidden variables */
+ sethi %tldm_hi22(sh1), %o1
+ sethi %tldo_hix22(sh1), %l3
+ add %o1, %tldm_lo10(sh1), %o2
+ sethi %tldo_hix22(sh2 + 1), %l2
+ add %l7, %o2, %o0, %tldm_add(sh1)
+ xor %l3, %tldo_lox10(sh1), %l4
+ call __tls_get_addr, %tldm_call(sh1)
+ xor %l2, %tldo_lox10(sh2 + 1), %l3
+ add %o0, %l4, %l5, %tldo_add(sh1)
+ ldub [%o0 + %l3], %l6, %tldo_add(sh2 + 1)
+ nop;nop;nop;nop
+
+ /* IE against global var */
+ sethi %tie_hi22(sG2), %l1
+ nop
+ add %l1, %tie_lo10(sG2), %l2
+ nop
+ ld [%l7 + %l2], %l2, %tie_ld(sG2)
+ nop
+ add %g7, %l2, %l2, %tie_add(sG2)
+ nop;nop;nop;nop
+
+ /* IE -> LE against global var defined in exec */
+ sethi %tie_hi22(sg1), %o3
+ add %o3, %tie_lo10(sg1), %o3
+ ld [%l7 + %o3], %o3, %tie_ld(sg1)
+ add %g7, %o3, %o4, %tie_add(sg1)
+ nop;nop;nop;nop
+
+ /* IE -> LE against local var */
+ sethi %tie_hi22(sl1), %l4
+ add %l4, %tie_lo10(sl1), %l1
+ ld [%l7 + %l1], %l3, %tie_ld(sl1)
+ add %g7, %l3, %l3, %tie_add(sl1)
+ nop;nop;nop;nop
+
+ /* IE -> LE against hidden var */
+ sethi %tie_hi22(sh1), %o1
+ add %o1, %tie_lo10(sh1), %o3
+ ld [%l7 + %o3], %o0, %tie_ld(sh1)
+ add %g7, %o0, %o3, %tie_add(sh1)
+ nop;nop;nop;nop
+
+ /* Direct access through %g7 */
+
+ /* IE against global var */
+ sethi %tie_hi22(sG5), %o3
+ add %o3, %tie_lo10(sG5), %o3
+ ld [%l7 + %o3], %o2, %tie_ld(sG5)
+ ld [%g7 + %o2], %o4, %tie_add(sG5)
+ nop;nop;nop;nop
+
+ /* IE->LE against local var */
+ sethi %tie_hi22(sl5), %o3
+ add %o3, %tie_lo10(sl5), %o3
+ ld [%l7 + %o3], %o2, %tie_ld(sl5)
+ stb %o4, [%g7 + %o2], %tie_add(sl5)
+ nop;nop;nop;nop
+
+ /* IE->LE against hidden var */
+ sethi %tie_hi22(sh5), %o5
+ add %o5, %tie_lo10(sh5), %o3
+ ld [%l7 + %o3], %o2, %tie_ld(sh5)
+ ldsb [%g7 + %o2], %o4, %tie_add(sh5)
+ nop;nop;nop;nop
+
+ ret
+ restore
diff --git a/ld/testsuite/ld-sparc/tlssunbinpic64.s b/ld/testsuite/ld-sparc/tlssunbinpic64.s
new file mode 100644
index 0000000..a13d2d3
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunbinpic64.s
@@ -0,0 +1,182 @@
+ .data
+ .align 4096
+ .section ".tdata", #alloc, #write, #tls
+ .align 4
+ .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: .word 17
+sg2: .word 18
+sg3: .word 19
+sg4: .word 20
+sg5: .word 21
+sg6: .word 22
+sg7: .word 23
+sg8: .word 24
+sl1: .word 65
+sl2: .word 66
+sl3: .word 67
+sl4: .word 68
+sl5: .word 69
+sl6: .word 70
+sl7: .word 71
+sl8: .word 72
+sh1: .word 257
+sh2: .word 258
+sh3: .word 259
+sh4: .word 260
+sh5: .word 261
+sh6: .word 262
+sh7: .word 263
+sh8: .word 264
+ .text
+ .align 4096
+.LLGETPC0:
+ retl
+ add %o7, %l7, %l7
+
+ .globl fn2
+ .type fn2,#function
+ .proc 04
+fn2:
+ save %sp, -160, %sp
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %l7
+ call .LLGETPC0
+ add %l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7
+ nop;nop;nop;nop
+
+ /* GD -> IE because variable is not defined in executable */
+ sethi %tgd_hi22(sG1), %l1
+ nop
+ add %l1, %tgd_lo10(sG1), %l2
+ nop
+ add %l7, %l2, %o0, %tgd_add(sG1)
+ nop
+ call __tls_get_addr, %tgd_call(sG1)
+ nop
+ nop;nop;nop;nop
+
+ /* GD -> IE because variable is not defined in executable where
+ the variable is referenced through IE too */
+ sethi %tgd_hi22(sG2), %o0
+ add %o0, %tgd_lo10(sG2), %o1
+ add %l7, %o1, %o0, %tgd_add(sG2)
+ call __tls_get_addr, %tgd_call(sG2)
+ nop
+ nop;nop;nop;nop
+
+ /* GD -> LE with global variable defined in executable */
+ sethi %tgd_hi22(sg1), %l0
+ add %l0, %tgd_lo10(sg1), %l5
+ add %l7, %l5, %o0, %tgd_add(sg1)
+ call __tls_get_addr, %tgd_call(sg1)
+ nop
+ nop;nop;nop;nop
+
+ /* GD -> LE with local variable defined in executable */
+ sethi %tgd_hi22(sl1), %o0
+ add %o0, %tgd_lo10(sl1), %o1
+ add %l7, %o1, %o0, %tgd_add(sl1)
+ call __tls_get_addr, %tgd_call(sl1)
+ nop
+ nop;nop;nop;nop
+
+ /* GD -> LE with hidden variable defined in executable */
+ sethi %tgd_hi22(sh1), %o0
+ add %o0, %tgd_lo10(sh1), %o1
+ add %l7, %o1, %o0, %tgd_add(sh1)
+ call __tls_get_addr, %tgd_call(sh1)
+ nop
+ nop;nop;nop;nop
+
+ /* LD -> LE */
+ sethi %tldm_hi22(sl1), %l1
+ nop
+ add %l1, %tldm_lo10(sl1), %l2
+ nop
+ add %l7, %l2, %o0, %tldm_add(sl1)
+ nop
+ call __tls_get_addr, %tldm_call(sl1)
+ nop
+ sethi %tldo_hix22(sl1), %l3
+ nop
+ xor %l3, %tldo_lox10(sl1), %l4
+ nop
+ add %o0, %l4, %l5, %tldo_add(sl1)
+ nop
+ sethi %tldo_hix22(sl2 + 2), %l2
+ nop
+ xor %l2, %tldo_lox10(sl2 + 2), %l3
+ nop
+ lduh [%o0 + %l3], %l6, %tldo_add(sl2 + 2)
+ nop;nop;nop;nop
+
+ /* LD -> LE against hidden variables */
+ sethi %tldm_hi22(sh1), %o1
+ sethi %tldo_hix22(sh1), %l3
+ add %o1, %tldm_lo10(sh1), %o2
+ sethi %tldo_hix22(sh2 + 1), %l2
+ add %l7, %o2, %o0, %tldm_add(sh1)
+ xor %l3, %tldo_lox10(sh1), %l4
+ call __tls_get_addr, %tldm_call(sh1)
+ xor %l2, %tldo_lox10(sh2 + 1), %l3
+ add %o0, %l4, %l5, %tldo_add(sh1)
+ ldub [%o0 + %l3], %l6, %tldo_add(sh2 + 1)
+ nop;nop;nop;nop
+
+ /* IE against global var */
+ sethi %tie_hi22(sG2), %l1
+ nop
+ add %l1, %tie_lo10(sG2), %l2
+ nop
+ ldx [%l7 + %l2], %l2, %tie_ldx(sG2)
+ nop
+ add %g7, %l2, %l2, %tie_add(sG2)
+ nop;nop;nop;nop
+
+ /* IE -> LE against global var defined in exec */
+ sethi %tie_hi22(sg1), %o3
+ add %o3, %tie_lo10(sg1), %o3
+ ldx [%l7 + %o3], %o2, %tie_ldx(sg1)
+ add %g7, %o2, %o4, %tie_add(sg1)
+ nop;nop;nop;nop
+
+ /* IE -> LE against local var */
+ sethi %tie_hi22(sl1), %l4
+ add %l4, %tie_lo10(sl1), %l1
+ ldx [%l7 + %l1], %l3, %tie_ldx(sl1)
+ add %g7, %l3, %l3, %tie_add(sl1)
+ nop;nop;nop;nop
+
+ /* IE -> LE against hidden var */
+ sethi %tie_hi22(sh1), %o1
+ add %o1, %tie_lo10(sh1), %o3
+ ldx [%l7 + %o3], %o0, %tie_ldx(sh1)
+ add %g7, %o0, %o3, %tie_add(sh1)
+ nop;nop;nop;nop
+
+ /* Direct access through %g7 */
+
+ /* IE against global var */
+ sethi %tie_hi22(sG5), %o3
+ add %o3, %tie_lo10(sG5), %o3
+ ldx [%l7 + %o3], %o2, %tie_ldx(sG5)
+ ldx [%g7 + %o2], %o4, %tie_add(sG5)
+ nop;nop;nop;nop
+
+ /* IE->LE against local var */
+ sethi %tie_hi22(sl5), %o3
+ add %o3, %tie_lo10(sl5), %o3
+ ldx [%l7 + %o3], %o2, %tie_ldx(sl5)
+ stb %o4, [%g7 + %o2], %tie_add(sl5)
+ nop;nop;nop;nop
+
+ /* IE->LE against hidden var */
+ sethi %tie_hi22(sh5), %o5
+ add %o5, %tie_lo10(sh5), %o3
+ ldx [%l7 + %o3], %o2, %tie_ldx(sh5)
+ ldsb [%g7 + %o2], %o4, %tie_add(sh5)
+ nop;nop;nop;nop
+
+ return %i7 + 8
+ nop
diff --git a/ld/testsuite/ld-sparc/tlssunnopic32.dd b/ld/testsuite/ld-sparc/tlssunnopic32.dd
new file mode 100644
index 0000000..f3070fc
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunnopic32.dd
@@ -0,0 +1,84 @@
+#source: tlssunnopic32.s
+#source: tlsnopic.s
+#as: --32
+#ld: -shared -melf32_sparc
+#objdump: -drj.text
+#target: isparc-*-*
+
+.*: +file format elf32-sparc
+
+Disassembly of section .text:
+
+00001000 <fn3>:
+ +1000: 9d e3 bf 98 save %sp, -104, %sp
+ +1004: 23 00 00 00 sethi %hi\(0\), %l1
+ +1008: a2 14 60 00 mov %l1, %l1 ! 0 <.*>
+ +100c: 01 00 00 00 nop *
+ +1010: 01 00 00 00 nop *
+ +1014: 01 00 00 00 nop *
+ +1018: 01 00 00 00 nop *
+ +101c: 17 00 00 00 sethi %hi\(0\), %o3
+ +1020: 96 02 e0 0c add %o3, 0xc, %o3 ! c <.*>
+ +1024: d4 04 40 0b ld \[ %l1 \+ %o3 \], %o2
+ +1028: 98 01 c0 0a add %g7, %o2, %o4
+ +102c: 01 00 00 00 nop *
+ +1030: 01 00 00 00 nop *
+ +1034: 01 00 00 00 nop *
+ +1038: 01 00 00 00 nop *
+ +103c: 11 00 00 00 sethi %hi\(0\), %o0
+ +1040: 90 02 20 10 add %o0, 0x10, %o0 ! 10 <.*>
+ +1044: d0 04 40 08 ld \[ %l1 \+ %o0 \], %o0
+ +1048: d0 01 c0 08 ld \[ %g7 \+ %o0 \], %o0
+ +104c: 01 00 00 00 nop *
+ +1050: 01 00 00 00 nop *
+ +1054: 01 00 00 00 nop *
+ +1058: 01 00 00 00 nop *
+ +105c: 11 00 00 00 sethi %hi\(0\), %o0
+ +1060: 90 02 20 14 add %o0, 0x14, %o0 ! 14 <.*>
+ +1064: d0 04 40 08 ld \[ %l1 \+ %o0 \], %o0
+ +1068: 90 01 c0 08 add %g7, %o0, %o0
+ +106c: 01 00 00 00 nop *
+ +1070: 01 00 00 00 nop *
+ +1074: 01 00 00 00 nop *
+ +1078: 01 00 00 00 nop *
+ +107c: 1b 00 00 00 sethi %hi\(0\), %o5
+ +1080: 92 03 60 18 add %o5, 0x18, %o1 ! 18 <.*>
+ +1084: d4 04 40 09 ld \[ %l1 \+ %o1 \], %o2
+ +1088: d6 29 c0 0a stb %o3, \[ %g7 \+ %o2 \]
+ +108c: 01 00 00 00 nop *
+ +1090: 01 00 00 00 nop *
+ +1094: 01 00 00 00 nop *
+ +1098: 01 00 00 00 nop *
+ +109c: 11 00 00 00 sethi %hi\(0\), %o0
+ +10a0: 90 02 20 04 add %o0, 4, %o0 ! 4 <.*>
+ +10a4: d0 04 40 08 ld \[ %l1 \+ %o0 \], %o0
+ +10a8: 90 01 c0 08 add %g7, %o0, %o0
+ +10ac: 01 00 00 00 nop *
+ +10b0: 01 00 00 00 nop *
+ +10b4: 01 00 00 00 nop *
+ +10b8: 01 00 00 00 nop *
+ +10bc: 1b 00 00 00 sethi %hi\(0\), %o5
+ +10c0: 92 03 60 08 add %o5, 8, %o1 ! 8 <.*>
+ +10c4: d4 04 40 09 ld \[ %l1 \+ %o1 \], %o2
+ +10c8: d6 29 c0 0a stb %o3, \[ %g7 \+ %o2 \]
+ +10cc: 01 00 00 00 nop *
+ +10d0: 01 00 00 00 nop *
+ +10d4: 01 00 00 00 nop *
+ +10d8: 01 00 00 00 nop *
+ +10dc: 15 00 00 00 sethi %hi\(0\), %o2
+ +10e0: 98 1a a0 00 xor %o2, 0, %o4
+ +10e4: 90 01 c0 0c add %g7, %o4, %o0
+ +10e8: 01 00 00 00 nop *
+ +10ec: 01 00 00 00 nop *
+ +10f0: 01 00 00 00 nop *
+ +10f4: 01 00 00 00 nop *
+ +10f8: 15 00 00 00 sethi %hi\(0\), %o2
+ +10fc: 94 1a a0 00 xor %o2, 0, %o2
+ +1100: d4 01 c0 0a ld \[ %g7 \+ %o2 \], %o2
+ +1104: 01 00 00 00 nop *
+ +1108: 01 00 00 00 nop *
+ +110c: 01 00 00 00 nop *
+ +1110: 01 00 00 00 nop *
+ +1114: 81 c7 e0 08 ret *
+ +1118: 81 e8 00 00 restore *
+#pass
diff --git a/ld/testsuite/ld-sparc/tlssunnopic32.rd b/ld/testsuite/ld-sparc/tlssunnopic32.rd
new file mode 100644
index 0000000..318bb58
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunnopic32.rd
@@ -0,0 +1,112 @@
+#source: tlssunnopic32.s
+#source: tlsnopic.s
+#as: --32
+#ld: -shared -melf32_sparc
+#readelf: -WSsrl
+#target: sparc-*-*
+
+There are 15 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+ 0+ +0 +0 +0
+ +\[ 1\] .hash +.*
+ +\[ 2\] .dynsym +.*
+ +\[ 3\] .dynstr +.*
+ +\[ 4\] .rela.dyn +.*
+ +\[ 5\] .text +PROGBITS +0+1000 0+1000 0+1000 0+ +AX +0 +0 4096
+ +\[ 6\] .data +PROGBITS +0+12000 0+2000 0+ 0+ +WA +0 +0 4096
+ +\[ 7\] .tbss +NOBITS +0+12000 0+2000 0+24 0+ WAT +0 +0 +4
+ +\[ 8\] .dynamic +DYNAMIC +0+12000 0+2000 0+80 08 +WA +3 +0 +4
+ +\[ 9\] .plt +.*
+ +\[10\] .got +PROGBITS +0+12080 0+2080 0+1c 04 +WA +0 +0 +4
+ +\[11\] .bss +.*
+ +\[12\] .shstrtab +.*
+ +\[13\] .symtab +.*
+ +\[14\] .strtab +.*
+#...
+Elf file type is DYN \(Shared object file\)
+Entry point 0x1000
+There are 4 program headers, starting at offset [0-9a-f]+
+
+Program Headers:
+ +Type +Offset +VirtAddr +PhysAddr +FileSiz MemSiz +Flg Align
+ +LOAD +0x0+ 0x0+ 0x0+ 0x0+2000 0x0+2000 R E 0x10000
+ +LOAD +0x0+2000 0x0+12000 0x0+12000 0x0+9c 0x0+a0 RWE 0x10000
+ +DYNAMIC +0x0+2000 0x0+12000 0x0+12000 0x0+80 0x0+80 RW +0x4
+ +TLS +0x0+2000 0x0+12000 0x0+12000 0x0+ 0x0+24 R +0x4
+#...
+
+Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 12 entries:
+ Offset +Info +Type +Sym. Value +Symbol's Name \+ Addend
+0+1004 +0+a09 R_SPARC_HI22 +0+12080 +\.got \+ 12080
+0+1008 +0+a0c R_SPARC_LO10 +0+12080 +\.got \+ 12080
+0+10dc +0+48 R_SPARC_TLS_LE_HIX22 +0+9
+0+10e0 +0+49 R_SPARC_TLS_LE_LOX10 +0+9
+0+10f8 +0+48 R_SPARC_TLS_LE_HIX22 +0+1c
+0+10fc +0+49 R_SPARC_TLS_LE_LOX10 +0+1c
+0+12084 +0+4e R_SPARC_TLS_TPOFF32 +0+
+0+12088 +0+4e R_SPARC_TLS_TPOFF32 +0+4
+0+12094 +0+4e R_SPARC_TLS_TPOFF32 +0+14
+0+12098 +0+4e R_SPARC_TLS_TPOFF32 +0+18
+0+1208c +0+f4e R_SPARC_TLS_TPOFF32 +0+ +sg1 \+ 0
+0+12090 +0+114e R_SPARC_TLS_TPOFF32 +0+ +sg2 \+ 0
+
+Symbol table '.dynsym' contains 20 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+12000 +0 OBJECT +GLOBAL DEFAULT +ABS _DYNAMIC
+ +13: 0+1000 +0 FUNC +GLOBAL DEFAULT +5 fn3
+ +14: 0+12080 +0 OBJECT +GLOBAL DEFAULT +ABS _PROCEDURE_LINKAGE_TABLE_
+ +15: 0+ +0 NOTYPE +GLOBAL DEFAULT +UND sg1
+ +16: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS __bss_start
+ +17: 0+ +0 NOTYPE +GLOBAL DEFAULT +UND sg2
+ +18: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS _edata
+ +19: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS _end
+
+Symbol table '.symtab' contains 33 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+ +0 TLS +LOCAL +DEFAULT +7 bl1
+ +16: 0+4 +0 TLS +LOCAL +DEFAULT +7 bl2
+ +17: 0+8 +0 TLS +LOCAL +DEFAULT +7 bl3
+ +18: 0+c +0 TLS +LOCAL +DEFAULT +7 bl4
+ +19: 0+10 +0 TLS +LOCAL +DEFAULT +7 bl5
+ +20: 0+1c +0 TLS +LOCAL +HIDDEN +7 sh3
+ +21: 0+20 +0 TLS +LOCAL +HIDDEN +7 sh4
+ +22: 0+14 +0 TLS +LOCAL +HIDDEN +7 sh1
+ +23: 0+12080 +0 OBJECT +LOCAL +HIDDEN +ABS _GLOBAL_OFFSET_TABLE_
+ +24: 0+18 +0 TLS +LOCAL +HIDDEN +7 sh2
+ +25: 0+12000 +0 OBJECT +GLOBAL DEFAULT +ABS _DYNAMIC
+ +26: 0+1000 +0 FUNC +GLOBAL DEFAULT +5 fn3
+ +27: 0+12080 +0 OBJECT +GLOBAL DEFAULT +ABS _PROCEDURE_LINKAGE_TABLE_
+ +28: 0+ +0 NOTYPE +GLOBAL DEFAULT +UND sg1
+ +29: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS __bss_start
+ +30: 0+ +0 NOTYPE +GLOBAL DEFAULT +UND sg2
+ +31: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS _edata
+ +32: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS _end
diff --git a/ld/testsuite/ld-sparc/tlssunnopic32.s b/ld/testsuite/ld-sparc/tlssunnopic32.s
new file mode 100644
index 0000000..6c0ec33
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunnopic32.s
@@ -0,0 +1,77 @@
+ .data
+ .align 4096
+ .section ".tbss"
+ .align 4
+bl1: .word 0
+bl2: .word 0
+bl3: .word 0
+bl4: .word 0
+bl5: .word 0
+ .text
+ .align 4096
+ .globl fn3
+ .type fn3,#function
+ .proc 04
+fn3:
+ save %sp, -104, %sp
+ .hidden _GLOBAL_OFFSET_TABLE_
+ sethi %hi(_GLOBAL_OFFSET_TABLE_), %l1
+ or %l1, %lo(_GLOBAL_OFFSET_TABLE_), %l1
+ nop;nop;nop;nop
+
+ /* IE against global var */
+ sethi %tie_hi22(sg1), %o3
+ add %o3, %tie_lo10(sg1), %o3
+ ld [%l1 + %o3], %o2, %tie_ld(sg1)
+ add %g7, %o2, %o4, %tie_add(sg1)
+ nop;nop;nop;nop
+
+ /* direct %g7 access IE against global var */
+ sethi %tie_hi22(sg2), %o0
+ add %o0, %tie_lo10(sg2), %o0
+ ld [%l1 + %o0], %o0, %tie_ld(sg2)
+ ld [%g7 + %o0], %o0, %tie_add(sg2)
+ nop;nop;nop;nop
+
+ /* IE against hidden var */
+ sethi %tie_hi22(sh1), %o0
+ add %o0, %tie_lo10(sh1), %o0
+ ld [%l1 + %o0], %o0, %tie_ld(sh1)
+ add %g7, %o0, %o0, %tie_add(sh1)
+ nop;nop;nop;nop
+
+ /* direct %g7 access IE against hidden var */
+ sethi %tie_hi22(sh2), %o5
+ add %o5, %tie_lo10(sh2), %o1
+ ld [%l1 + %o1], %o2, %tie_ld(sh2)
+ stb %o3, [%g7 + %o2], %tie_add(sh2)
+ nop;nop;nop;nop
+
+ /* IE against local var */
+ sethi %tie_hi22(bl1), %o0
+ add %o0, %tie_lo10(bl1), %o0
+ ld [%l1 + %o0], %o0, %tie_ld(bl1)
+ add %g7, %o0, %o0, %tie_add(bl1)
+ nop;nop;nop;nop
+
+ /* direct %g7 access IE against local var */
+ sethi %tie_hi22(bl2), %o5
+ add %o5, %tie_lo10(bl2), %o1
+ ld [%l1 + %o1], %o2, %tie_ld(bl2)
+ stb %o3, [%g7 + %o2], %tie_add(bl2)
+ nop;nop;nop;nop
+
+ /* LE, local var */
+ sethi %tle_hix22(bl3+1), %o2
+ xor %o2, %tle_lox10(bl3+1), %o4
+ add %g7, %o4, %o0
+ nop;nop;nop;nop
+
+ /* LE, hidden var, direct %g7 access */
+ sethi %tle_hix22(sh3), %o2
+ xor %o2, %tle_lox10(sh3), %o2
+ ld [%g7 + %o2], %o2
+ nop;nop;nop;nop
+
+ ret
+ restore
diff --git a/ld/testsuite/ld-sparc/tlssunnopic32.sd b/ld/testsuite/ld-sparc/tlssunnopic32.sd
new file mode 100644
index 0000000..0322a0b
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunnopic32.sd
@@ -0,0 +1,12 @@
+#source: tlssunnopic32.s
+#source: tlsnopic.s
+#as: --32
+#ld: -shared -melf32_sparc
+#objdump: -sj.got
+#target: sparc-*-*
+
+.*: file format elf32-sparc
+
+Contents of section \.got:
+ 12080 0+12000 0+ 0+ 0+ .*
+ 12090 0+ 0+ 0+ .*
diff --git a/ld/testsuite/ld-sparc/tlssunnopic64.dd b/ld/testsuite/ld-sparc/tlssunnopic64.dd
new file mode 100644
index 0000000..742449e
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunnopic64.dd
@@ -0,0 +1,12 @@
+#source: tlssunnopic64.s
+#source: tlsnopic.s
+#as: --64 -Av9
+#ld: -shared -melf64_sparc
+#objdump: -drj.text
+#target: isparc-*-*
+
+.*: +file format elf64-sparc
+
+Disassembly of section .text:
+# FIXME
+#pass
diff --git a/ld/testsuite/ld-sparc/tlssunnopic64.rd b/ld/testsuite/ld-sparc/tlssunnopic64.rd
new file mode 100644
index 0000000..cbfd4aa
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunnopic64.rd
@@ -0,0 +1,9 @@
+#source: tlssunnopic64.s
+#source: tlsnopic.s
+#as: --64 -Av9
+#ld: -shared -melf64_sparc
+#readelf: -WSsrl
+#target: sparc-*-*
+
+# FIXME
+#pass
diff --git a/ld/testsuite/ld-sparc/tlssunnopic64.s b/ld/testsuite/ld-sparc/tlssunnopic64.s
new file mode 100644
index 0000000..3d0a4d3
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunnopic64.s
@@ -0,0 +1,81 @@
+ .data
+ .align 4096
+ .section ".tbss"
+ .align 4
+bl1: .word 0
+bl2: .word 0
+bl3: .word 0
+bl4: .word 0
+bl5: .word 0
+ .text
+ .align 4096
+ .globl fn3
+ .type fn3,#function
+ .proc 04
+fn3:
+ save %sp, -160, %sp
+ .hidden _GLOBAL_OFFSET_TABLE_
+ sethi %hh(_GLOBAL_OFFSET_TABLE_), %l1
+ sethi %lm(_GLOBAL_OFFSET_TABLE_), %l2
+ or %l1, %hm(_GLOBAL_OFFSET_TABLE_), %l1
+ or %l2, %lo(_GLOBAL_OFFSET_TABLE_), %l2
+ sllx %l1, 32, %l1
+ add %l1, %l2, %l1
+ nop;nop;nop;nop
+
+ /* IE against global var */
+ sethi %tie_hi22(sg1), %o3
+ add %o3, %tie_lo10(sg1), %o3
+ ldx [%l1 + %o3], %o2, %tie_ldx(sg1)
+ add %g7, %o2, %o4, %tie_add(sg1)
+ nop;nop;nop;nop
+
+ /* direct %g7 access IE against global var */
+ sethi %tie_hi22(sg2), %o0
+ add %o0, %tie_lo10(sg2), %o0
+ ldx [%l1 + %o0], %o0, %tie_ldx(sg2)
+ lduw [%g7 + %o0], %o0, %tie_add(sg2)
+ nop;nop;nop;nop
+
+ /* IE against hidden var */
+ sethi %tie_hi22(sh1), %o0
+ add %o0, %tie_lo10(sh1), %o0
+ ldx [%l1 + %o0], %o0, %tie_ldx(sh1)
+ add %g7, %o0, %o0, %tie_add(sh1)
+ nop;nop;nop;nop
+
+ /* direct %g7 access IE against hidden var */
+ sethi %tie_hi22(sh2), %o5
+ add %o5, %tie_lo10(sh2), %o1
+ ldx [%l1 + %o1], %o2, %tie_ldx(sh2)
+ stb %o3, [%g7 + %o2], %tie_add(sh2)
+ nop;nop;nop;nop
+
+ /* IE against local var */
+ sethi %tie_hi22(bl1), %o0
+ add %o0, %tie_lo10(bl1), %o0
+ ldx [%l1 + %o0], %o0, %tie_ldx(bl1)
+ add %g7, %o0, %o0, %tie_add(bl1)
+ nop;nop;nop;nop
+
+ /* direct %g7 access IE against local var */
+ sethi %tie_hi22(bl2), %o5
+ add %o5, %tie_lo10(bl2), %o1
+ ldx [%l1 + %o1], %o2, %tie_ldx(bl2)
+ stb %o3, [%g7 + %o2], %tie_add(bl2)
+ nop;nop;nop;nop
+
+ /* LE, local var */
+ sethi %tle_hix22(bl3+1), %o2
+ xor %o2, %tle_lox10(bl3+1), %o4
+ add %g7, %o4, %o0
+ nop;nop;nop;nop
+
+ /* LE, hidden var, direct %g7 access */
+ sethi %tle_hix22(sh3), %o2
+ xor %o2, %tle_lox10(sh3), %o2
+ ld [%g7 + %o2], %o2
+ nop;nop;nop;nop
+
+ return %i7 + 8
+ nop
diff --git a/ld/testsuite/ld-sparc/tlssunnopic64.sd b/ld/testsuite/ld-sparc/tlssunnopic64.sd
new file mode 100644
index 0000000..b288764
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunnopic64.sd
@@ -0,0 +1,12 @@
+#source: tlssunnopic64.s
+#source: tlsnopic.s
+#as: --64 -Av9
+#ld: -shared -melf64_sparc
+#objdump: -sj.got
+#target: sparc-*-*
+
+.*: file format elf64-sparc
+
+Contents of section \.got:
+# FIXME
+#pass
diff --git a/ld/testsuite/ld-sparc/tlssunpic32.dd b/ld/testsuite/ld-sparc/tlssunpic32.dd
new file mode 100644
index 0000000..ffc1823
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunpic32.dd
@@ -0,0 +1,220 @@
+#source: tlssunpic32.s
+#source: tlspic.s
+#as: --32 -K PIC
+#ld: -shared -melf32_sparc
+#objdump: -drj.text
+#target: sparc*-*-*
+
+.*: +file format elf32-sparc
+
+Disassembly of section .text:
+
+00001000 <fn1-0x8>:
+ +1000: 81 c3 e0 08 retl *
+ +1004: ae 03 c0 17 add %o7, %l7, %l7
+
+00001008 <fn1>:
+ +1008: 9d e3 bf 98 save %sp, -104, %sp
+ +100c: 2f 00 00 44 sethi %hi\(0x11000\), %l7
+ +1010: 7f ff ff fc call 1000 <.*>
+ +1014: ae 05 e1 28 add %l7, 0x128, %l7 ! 11128 <.*>
+ +1018: 01 00 00 00 nop *
+ +101c: 01 00 00 00 nop *
+ +1020: 01 00 00 00 nop *
+ +1024: 01 00 00 00 nop *
+ +1028: 23 00 00 00 sethi %hi\(0\), %l1
+ +102c: 01 00 00 00 nop *
+ +1030: a4 04 60 2c add %l1, 0x2c, %l2
+ +1034: 01 00 00 00 nop *
+ +1038: 90 05 c0 12 add %l7, %l2, %o0
+ +103c: 01 00 00 00 nop *
+ +1040: 40 00 44 3a call 12128 <.*>
+ +1044: 01 00 00 00 nop *
+ +1048: 01 00 00 00 nop *
+ +104c: 01 00 00 00 nop *
+ +1050: 01 00 00 00 nop *
+ +1054: 01 00 00 00 nop *
+ +1058: 11 00 00 00 sethi %hi\(0\), %o0
+ +105c: 92 02 20 3c add %o0, 0x3c, %o1 ! 3c <.*>
+ +1060: d0 05 c0 09 ld \[ %l7 \+ %o1 \], %o0
+ +1064: 90 01 c0 08 add %g7, %o0, %o0
+ +1068: 01 00 00 00 nop *
+ +106c: 01 00 00 00 nop *
+ +1070: 01 00 00 00 nop *
+ +1074: 01 00 00 00 nop *
+ +1078: 01 00 00 00 nop *
+ +107c: 19 00 00 00 sethi %hi\(0\), %o4
+ +1080: 98 03 20 04 add %o4, 4, %o4 ! 4 <.*>
+ +1084: 90 05 c0 0c add %l7, %o4, %o0
+ +1088: 40 00 44 28 call 12128 <.*>
+ +108c: 01 00 00 00 nop *
+ +1090: 01 00 00 00 nop *
+ +1094: 01 00 00 00 nop *
+ +1098: 01 00 00 00 nop *
+ +109c: 01 00 00 00 nop *
+ +10a0: 11 00 00 00 sethi %hi\(0\), %o0
+ +10a4: 90 02 20 0c add %o0, 0xc, %o0 ! c <.*>
+ +10a8: d0 05 c0 08 ld \[ %l7 \+ %o0 \], %o0
+ +10ac: 90 01 c0 08 add %g7, %o0, %o0
+ +10b0: 01 00 00 00 nop *
+ +10b4: 01 00 00 00 nop *
+ +10b8: 01 00 00 00 nop *
+ +10bc: 01 00 00 00 nop *
+ +10c0: 01 00 00 00 nop *
+ +10c4: 19 00 00 00 sethi %hi\(0\), %o4
+ +10c8: 98 03 20 40 add %o4, 0x40, %o4 ! 40 <.*>
+ +10cc: 90 05 c0 0c add %l7, %o4, %o0
+ +10d0: 40 00 44 16 call 12128 <.*>
+ +10d4: 01 00 00 00 nop *
+ +10d8: 01 00 00 00 nop *
+ +10dc: 01 00 00 00 nop *
+ +10e0: 01 00 00 00 nop *
+ +10e4: 01 00 00 00 nop *
+ +10e8: 11 00 00 00 sethi %hi\(0\), %o0
+ +10ec: 90 02 20 48 add %o0, 0x48, %o0 ! 48 <.*>
+ +10f0: d0 05 c0 08 ld \[ %l7 \+ %o0 \], %o0
+ +10f4: 90 01 c0 08 add %g7, %o0, %o0
+ +10f8: 01 00 00 00 nop *
+ +10fc: 01 00 00 00 nop *
+ +1100: 01 00 00 00 nop *
+ +1104: 01 00 00 00 nop *
+ +1108: 01 00 00 00 nop *
+ +110c: 19 00 00 00 sethi %hi\(0\), %o4
+ +1110: 98 03 20 1c add %o4, 0x1c, %o4 ! 1c <.*>
+ +1114: 90 05 c0 0c add %l7, %o4, %o0
+ +1118: 40 00 44 04 call 12128 <.*>
+ +111c: 01 00 00 00 nop *
+ +1120: 01 00 00 00 nop *
+ +1124: 01 00 00 00 nop *
+ +1128: 01 00 00 00 nop *
+ +112c: 01 00 00 00 nop *
+ +1130: 11 00 00 00 sethi %hi\(0\), %o0
+ +1134: 90 02 20 24 add %o0, 0x24, %o0 ! 24 <.*>
+ +1138: d0 05 c0 08 ld \[ %l7 \+ %o0 \], %o0
+ +113c: 90 01 c0 08 add %g7, %o0, %o0
+ +1140: 01 00 00 00 nop *
+ +1144: 01 00 00 00 nop *
+ +1148: 01 00 00 00 nop *
+ +114c: 01 00 00 00 nop *
+ +1150: 01 00 00 00 nop *
+ +1154: 23 00 00 00 sethi %hi\(0\), %l1
+ +1158: 01 00 00 00 nop *
+ +115c: a4 04 60 14 add %l1, 0x14, %l2
+ +1160: 01 00 00 00 nop *
+ +1164: 90 05 c0 12 add %l7, %l2, %o0
+ +1168: 01 00 00 00 nop *
+ +116c: 40 00 43 ef call 12128 <.*>
+ +1170: 01 00 00 00 nop *
+ +1174: 27 3f ff ff sethi %hi\(0xfffffc00\), %l3
+ +1178: 01 00 00 00 nop *
+ +117c: a8 1c fc 20 xor %l3, -992, %l4
+ +1180: 01 00 00 00 nop *
+ +1184: aa 02 00 14 add %o0, %l4, %l5
+ +1188: 01 00 00 00 nop *
+ +118c: 25 3f ff ff sethi %hi\(0xfffffc00\), %l2
+ +1190: 01 00 00 00 nop *
+ +1194: a6 1c bc 26 xor %l2, -986, %l3
+ +1198: 01 00 00 00 nop *
+ +119c: ec 12 00 13 lduh \[ %o0 \+ %l3 \], %l6
+ +11a0: 01 00 00 00 nop *
+ +11a4: 01 00 00 00 nop *
+ +11a8: 01 00 00 00 nop *
+ +11ac: 01 00 00 00 nop *
+ +11b0: 13 00 00 00 sethi %hi\(0\), %o1
+ +11b4: 27 3f ff ff sethi %hi\(0xfffffc00\), %l3
+ +11b8: 94 02 60 14 add %o1, 0x14, %o2
+ +11bc: 25 3f ff ff sethi %hi\(0xfffffc00\), %l2
+ +11c0: 90 05 c0 0a add %l7, %o2, %o0
+ +11c4: a8 1c fc 40 xor %l3, -960, %l4
+ +11c8: 40 00 43 d8 call 12128 <.*>
+ +11cc: a6 1c bc 45 xor %l2, -955, %l3
+ +11d0: aa 02 00 14 add %o0, %l4, %l5
+ +11d4: ec 0a 00 13 ldub \[ %o0 \+ %l3 \], %l6
+ +11d8: 01 00 00 00 nop *
+ +11dc: 01 00 00 00 nop *
+ +11e0: 01 00 00 00 nop *
+ +11e4: 01 00 00 00 nop *
+ +11e8: 13 00 00 00 sethi %hi\(0\), %o1
+ +11ec: 27 3f ff ff sethi %hi\(0xfffffc00\), %l3
+ +11f0: 94 02 60 14 add %o1, 0x14, %o2
+ +11f4: 25 3f ff ff sethi %hi\(0xfffffc00\), %l2
+ +11f8: 90 05 c0 0a add %l7, %o2, %o0
+ +11fc: a8 1c fc 63 xor %l3, -925, %l4
+ +1200: 40 00 43 ca call 12128 <.*>
+ +1204: a6 1c bc 64 xor %l2, -924, %l3
+ +1208: aa 02 00 14 add %o0, %l4, %l5
+ +120c: ec 02 00 13 ld \[ %o0 \+ %l3 \], %l6
+ +1210: 01 00 00 00 nop *
+ +1214: 01 00 00 00 nop *
+ +1218: 01 00 00 00 nop *
+ +121c: 01 00 00 00 nop *
+ +1220: 23 00 00 00 sethi %hi\(0\), %l1
+ +1224: 01 00 00 00 nop *
+ +1228: a4 04 60 3c add %l1, 0x3c, %l2
+ +122c: 01 00 00 00 nop *
+ +1230: e4 05 c0 12 ld \[ %l7 \+ %l2 \], %l2
+ +1234: 01 00 00 00 nop *
+ +1238: a4 01 c0 12 add %g7, %l2, %l2
+ +123c: 01 00 00 00 nop *
+ +1240: 01 00 00 00 nop *
+ +1244: 01 00 00 00 nop *
+ +1248: 01 00 00 00 nop *
+ +124c: 17 00 00 00 sethi %hi\(0\), %o3
+ +1250: 96 02 e0 0c add %o3, 0xc, %o3 ! c <.*>
+ +1254: d4 05 c0 0b ld \[ %l7 \+ %o3 \], %o2
+ +1258: 98 01 c0 0a add %g7, %o2, %o4
+ +125c: 01 00 00 00 nop *
+ +1260: 01 00 00 00 nop *
+ +1264: 01 00 00 00 nop *
+ +1268: 01 00 00 00 nop *
+ +126c: 23 00 00 00 sethi %hi\(0\), %l1
+ +1270: a4 04 60 48 add %l1, 0x48, %l2 ! 48 <.*>
+ +1274: e4 05 c0 12 ld \[ %l7 \+ %l2 \], %l2
+ +1278: a4 01 c0 12 add %g7, %l2, %l2
+ +127c: 01 00 00 00 nop *
+ +1280: 01 00 00 00 nop *
+ +1284: 01 00 00 00 nop *
+ +1288: 01 00 00 00 nop *
+ +128c: 23 00 00 00 sethi %hi\(0\), %l1
+ +1290: a4 04 60 24 add %l1, 0x24, %l2 ! 24 <.*>
+ +1294: e4 05 c0 12 ld \[ %l7 \+ %l2 \], %l2
+ +1298: a4 01 c0 12 add %g7, %l2, %l2
+ +129c: 01 00 00 00 nop *
+ +12a0: 01 00 00 00 nop *
+ +12a4: 01 00 00 00 nop *
+ +12a8: 01 00 00 00 nop *
+ +12ac: 23 00 00 00 sethi %hi\(0\), %l1
+ +12b0: a4 04 60 28 add %l1, 0x28, %l2 ! 28 <.*>
+ +12b4: e4 05 c0 12 ld \[ %l7 \+ %l2 \], %l2
+ +12b8: e4 01 c0 12 ld \[ %g7 \+ %l2 \], %l2
+ +12bc: 01 00 00 00 nop *
+ +12c0: 01 00 00 00 nop *
+ +12c4: 01 00 00 00 nop *
+ +12c8: 01 00 00 00 nop *
+ +12cc: 17 00 00 00 sethi %hi\(0\), %o3
+ +12d0: 98 02 e0 10 add %o3, 0x10, %o4 ! 10 <.*>
+ +12d4: da 05 c0 0c ld \[ %l7 \+ %o4 \], %o5
+ +12d8: e4 29 c0 0d stb %l2, \[ %g7 \+ %o5 \]
+ +12dc: 01 00 00 00 nop *
+ +12e0: 01 00 00 00 nop *
+ +12e4: 01 00 00 00 nop *
+ +12e8: 01 00 00 00 nop *
+ +12ec: 17 00 00 00 sethi %hi\(0\), %o3
+ +12f0: 98 02 e0 34 add %o3, 0x34, %o4 ! 34 <.*>
+ +12f4: da 05 c0 0c ld \[ %l7 \+ %o4 \], %o5
+ +12f8: e4 11 c0 0d lduh \[ %g7 \+ %o5 \], %l2
+ +12fc: 01 00 00 00 nop *
+ +1300: 01 00 00 00 nop *
+ +1304: 01 00 00 00 nop *
+ +1308: 01 00 00 00 nop *
+ +130c: 17 00 00 00 sethi %hi\(0\), %o3
+ +1310: 98 02 e0 38 add %o3, 0x38, %o4 ! 38 <.*>
+ +1314: da 05 c0 0c ld \[ %l7 \+ %o4 \], %o5
+ +1318: e4 21 c0 0d st %l2, \[ %g7 \+ %o5 \]
+ +131c: 01 00 00 00 nop *
+ +1320: 01 00 00 00 nop *
+ +1324: 01 00 00 00 nop *
+ +1328: 01 00 00 00 nop *
+ +132c: 81 c7 e0 08 ret *
+ +1330: 81 e8 00 00 restore *
+#pass
diff --git a/ld/testsuite/ld-sparc/tlssunpic32.rd b/ld/testsuite/ld-sparc/tlssunpic32.rd
new file mode 100644
index 0000000..7e73da6
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunpic32.rd
@@ -0,0 +1,155 @@
+#source: tlssunpic32.s
+#source: tlspic.s
+#as: --32 -K PIC
+#ld: -shared -melf32_sparc
+#readelf: -WSsrl
+#target: sparc*-*-*
+
+There are 17 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+ 0+ +0 +0 +0
+ +\[ 1\] .hash +.*
+ +\[ 2\] .dynsym +.*
+ +\[ 3\] .dynstr +.*
+ +\[ 4\] .rela.dyn +.*
+ +\[ 5\] .rela.plt +.*
+ +\[ 6\] .text +PROGBITS +0+1000 0+1000 0+1000 0+ +AX +0 +0 4096
+ +\[ 7\] .data +PROGBITS +0+12000 0+2000 0+ 0+ +WA +0 +0 4096
+ +\[ 8\] .tdata +PROGBITS +0+12000 0+2000 0+60 0+ WAT +0 +0 +4
+ +\[ 9\] .tbss +NOBITS +0+12060 0+2060 0+20 0+ WAT +0 +0 +4
+ +\[10\] .dynamic +DYNAMIC +0+12060 0+2060 0+98 08 +WA +3 +0 +4
+ +\[11\] .plt +.*
+ +\[12\] .got +PROGBITS +0+12138 0+2138 0+4c 04 +WA +0 +0 +4
+ +\[13\] .bss +.*
+ +\[14\] .shstrtab +.*
+ +\[15\] .symtab +.*
+ +\[16\] .strtab +.*
+#...
+
+Elf file type is DYN \(Shared object file\)
+Entry point 0x1000
+There are 4 program headers, starting at offset [0-9]+
+
+Program Headers:
+ +Type +Offset +VirtAddr +PhysAddr +FileSiz MemSiz +Flg Align
+ +LOAD +0x0+ 0x0+ 0x0+ 0x0+2000 0x0+2000 R E 0x10000
+ +LOAD +0x0+2000 0x0+12000 0x0+12000 0x0+184 0x0+188 RWE 0x10000
+ +DYNAMIC +0x0+2060 0x0+12060 0x0+12060 0x0+98 0x0+98 RW +0x4
+ +TLS +0x0+2000 0x0+12000 0x0+12000 0x0+60 0x0+80 R +0x4
+#...
+
+Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 14 entries:
+ Offset +Info +Type +Sym. Value +Symbol's Name \+ Addend
+0+1213c +0+4a R_SPARC_TLS_DTPMOD32 +0+
+0+12144 +0+4e R_SPARC_TLS_TPOFF32 +0+24
+0+12148 +0+4e R_SPARC_TLS_TPOFF32 +0+30
+0+1214c +0+4a R_SPARC_TLS_DTPMOD32 +0+
+0+12154 +0+4a R_SPARC_TLS_DTPMOD32 +0+
+0+1215c +0+4e R_SPARC_TLS_TPOFF32 +0+64
+0+1216c +0+4e R_SPARC_TLS_TPOFF32 +0+50
+0+12170 +0+4e R_SPARC_TLS_TPOFF32 +0+70
+0+12178 +0+4a R_SPARC_TLS_DTPMOD32 +0+
+0+12180 +0+4e R_SPARC_TLS_TPOFF32 +0+44
+0+12160 +0+124e R_SPARC_TLS_TPOFF32 +0+10 +sg5 \+ 0
+0+12164 +0+154a R_SPARC_TLS_DTPMOD32 +0+ +sg1 \+ 0
+0+12168 +0+154c R_SPARC_TLS_DTPOFF32 +0+ +sg1 \+ 0
+0+12174 +0+184e R_SPARC_TLS_TPOFF32 +0+4 +sg2 \+ 0
+
+Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
+ Offset +Info +Type +Sym. Value +Symbol's Name \+ Addend
+0+12128 +0+1415 R_SPARC_JMP_SLOT +0+ +__tls_get_addr \+ 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+1c +0 TLS +GLOBAL DEFAULT +8 sg8
+ +15: 0+12060 +0 OBJECT +GLOBAL DEFAULT +ABS _DYNAMIC
+ +16: 0+8 +0 TLS +GLOBAL DEFAULT +8 sg3
+ +17: 0+c +0 TLS +GLOBAL DEFAULT +8 sg4
+ +18: 0+10 +0 TLS +GLOBAL DEFAULT +8 sg5
+ +19: [0-9a-f]+ +0 OBJECT +GLOBAL DEFAULT +ABS _PROCEDURE_LINKAGE_TABLE_
+ +20: 0+ +0 NOTYPE +GLOBAL DEFAULT +UND __tls_get_addr
+ +21: 0+ +0 TLS +GLOBAL DEFAULT +8 sg1
+ +22: 0+1008 +0 FUNC +GLOBAL DEFAULT +6 fn1
+ +23: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS __bss_start
+ +24: 0+4 +0 TLS +GLOBAL DEFAULT +8 sg2
+ +25: 0+14 +0 TLS +GLOBAL DEFAULT +8 sg6
+ +26: 0+18 +0 TLS +GLOBAL DEFAULT +8 sg7
+ +27: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS _edata
+ +28: 0+12138 +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+20 +0 TLS +LOCAL +DEFAULT +8 sl1
+ +18: 0+24 +0 TLS +LOCAL +DEFAULT +8 sl2
+ +19: 0+28 +0 TLS +LOCAL +DEFAULT +8 sl3
+ +20: 0+2c +0 TLS +LOCAL +DEFAULT +8 sl4
+ +21: 0+30 +0 TLS +LOCAL +DEFAULT +8 sl5
+ +22: 0+34 +0 TLS +LOCAL +DEFAULT +8 sl6
+ +23: 0+38 +0 TLS +LOCAL +DEFAULT +8 sl7
+ +24: 0+3c +0 TLS +LOCAL +DEFAULT +8 sl8
+ +25: 0+60 +0 TLS +LOCAL +HIDDEN +9 sH1
+ +26: 0+48 +0 TLS +LOCAL +HIDDEN +8 sh3
+ +27: 0+64 +0 TLS +LOCAL +HIDDEN +9 sH2
+ +28: 0+78 +0 TLS +LOCAL +HIDDEN +9 sH7
+ +29: 0+58 +0 TLS +LOCAL +HIDDEN +8 sh7
+ +30: 0+5c +0 TLS +LOCAL +HIDDEN +8 sh8
+ +31: 0+6c +0 TLS +LOCAL +HIDDEN +9 sH4
+ +32: 0+4c +0 TLS +LOCAL +HIDDEN +8 sh4
+ +33: 0+68 +0 TLS +LOCAL +HIDDEN +9 sH3
+ +34: 0+50 +0 TLS +LOCAL +HIDDEN +8 sh5
+ +35: 0+70 +0 TLS +LOCAL +HIDDEN +9 sH5
+ +36: 0+74 +0 TLS +LOCAL +HIDDEN +9 sH6
+ +37: 0+7c +0 TLS +LOCAL +HIDDEN +9 sH8
+ +38: 0+40 +0 TLS +LOCAL +HIDDEN +8 sh1
+ +39: 0+44 +0 TLS +LOCAL +HIDDEN +8 sh2
+ +40: 0+54 +0 TLS +LOCAL +HIDDEN +8 sh6
+ +41: 0+1c +0 TLS +GLOBAL DEFAULT +8 sg8
+ +42: 0+12060 +0 OBJECT +GLOBAL DEFAULT +ABS _DYNAMIC
+ +43: 0+8 +0 TLS +GLOBAL DEFAULT +8 sg3
+ +44: 0+c +0 TLS +GLOBAL DEFAULT +8 sg4
+ +45: 0+10 +0 TLS +GLOBAL DEFAULT +8 sg5
+ +46: [0-9a-f]+ +0 OBJECT +GLOBAL DEFAULT +ABS _PROCEDURE_LINKAGE_TABLE_
+ +47: 0+ +0 NOTYPE +GLOBAL DEFAULT +UND __tls_get_addr
+ +48: 0+ +0 TLS +GLOBAL DEFAULT +8 sg1
+ +49: 0+1008 +0 FUNC +GLOBAL DEFAULT +6 fn1
+ +50: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS __bss_start
+ +51: 0+4 +0 TLS +GLOBAL DEFAULT +8 sg2
+ +52: 0+14 +0 TLS +GLOBAL DEFAULT +8 sg6
+ +53: 0+18 +0 TLS +GLOBAL DEFAULT +8 sg7
+ +54: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS _edata
+ +55: 0+12138 +0 OBJECT +GLOBAL DEFAULT +ABS _GLOBAL_OFFSET_TABLE_
+ +56: [0-9a-f]+ +0 NOTYPE +GLOBAL DEFAULT +ABS _end
diff --git a/ld/testsuite/ld-sparc/tlssunpic32.s b/ld/testsuite/ld-sparc/tlssunpic32.s
new file mode 100644
index 0000000..9e8a235
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunpic32.s
@@ -0,0 +1,228 @@
+ .data
+ .align 4096
+ .section ".tdata", #alloc, #write, #tls
+ .align 4
+ .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: .word 17
+sg2: .word 18
+sg3: .word 19
+sg4: .word 20
+sg5: .word 21
+sg6: .word 22
+sg7: .word 23
+sg8: .word 24
+sl1: .word 65
+sl2: .word 66
+sl3: .word 67
+sl4: .word 68
+sl5: .word 69
+sl6: .word 70
+sl7: .word 71
+sl8: .word 72
+sh1: .word 257
+sh2: .word 258
+sh3: .word 259
+sh4: .word 260
+sh5: .word 261
+sh6: .word 262
+sh7: .word 263
+sh8: .word 264
+
+ .text
+ .align 4096
+.LLGETPC0:
+ retl
+ add %o7, %l7, %l7
+
+ .globl fn1
+ .type fn1,#function
+ .proc 04
+fn1:
+ save %sp, -104, %sp
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %l7
+ call .LLGETPC0
+ add %l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7
+ nop;nop;nop;nop
+
+ /* GD */
+ sethi %tgd_hi22(sg1), %l1
+ nop
+ add %l1, %tgd_lo10(sg1), %l2
+ nop
+ add %l7, %l2, %o0, %tgd_add(sg1)
+ nop
+ call __tls_get_addr, %tgd_call(sg1)
+ nop
+ nop;nop;nop;nop
+
+ /* GD -> IE because variable is referenced through IE too */
+ sethi %tgd_hi22(sg2), %o0
+ add %o0, %tgd_lo10(sg2), %o1
+ add %l7, %o1, %o0, %tgd_add(sg2)
+ call __tls_get_addr, %tgd_call(sg2)
+ nop
+ nop;nop;nop;nop
+
+ /* GD against local variable */
+ sethi %tgd_hi22(sl1), %o4
+ add %o4, %tgd_lo10(sl1), %o4
+ add %l7, %o4, %o0, %tgd_add(sl1)
+ call __tls_get_addr, %tgd_call(sl1)
+ nop
+ nop;nop;nop;nop
+
+ /* GD -> IE against local variable referenced through IE too */
+ sethi %tgd_hi22(sl2), %o0
+ add %o0, %tgd_lo10(sl2), %o0
+ add %l7, %o0, %o0, %tgd_add(sl2)
+ call __tls_get_addr, %tgd_call(sl2)
+ nop
+ nop;nop;nop;nop
+
+ /* GD against hidden and local variable */
+ sethi %tgd_hi22(sh1), %o4
+ add %o4, %tgd_lo10(sh1), %o4
+ add %l7, %o4, %o0, %tgd_add(sh1)
+ call __tls_get_addr, %tgd_call(sh1)
+ nop
+ nop;nop;nop;nop
+
+ /* GD -> IE against hidden and local variable referenced through
+ IE too */
+ sethi %tgd_hi22(sh2), %o0
+ add %o0, %tgd_lo10(sh2), %o0
+ add %l7, %o0, %o0, %tgd_add(sh2)
+ call __tls_get_addr, %tgd_call(sh2)
+ nop
+ nop;nop;nop;nop
+
+ /* GD against hidden but not local variable */
+ sethi %tgd_hi22(sH1), %o4
+ add %o4, %tgd_lo10(sH1), %o4
+ add %l7, %o4, %o0, %tgd_add(sH1)
+ call __tls_get_addr, %tgd_call(sH1)
+ nop
+ nop;nop;nop;nop
+
+ /* GD -> IE against hidden but not local variable referenced through
+ IE too */
+ sethi %tgd_hi22(sH2), %o0
+ add %o0, %tgd_lo10(sH2), %o0
+ add %l7, %o0, %o0, %tgd_add(sH2)
+ call __tls_get_addr, %tgd_call(sH2)
+ nop
+ nop;nop;nop;nop
+
+ /* LD */
+ sethi %tldm_hi22(sl1), %l1
+ nop
+ add %l1, %tldm_lo10(sl1), %l2
+ nop
+ add %l7, %l2, %o0, %tldm_add(sl1)
+ nop
+ call __tls_get_addr, %tldm_call(sl1)
+ nop
+ sethi %tldo_hix22(sl1), %l3
+ nop
+ xor %l3, %tldo_lox10(sl1), %l4
+ nop
+ add %o0, %l4, %l5, %tldo_add(sl1)
+ nop
+ sethi %tldo_hix22(sl2 + 2), %l2
+ nop
+ xor %l2, %tldo_lox10(sl2 + 2), %l3
+ nop
+ lduh [%o0 + %l3], %l6, %tldo_add(sl2 + 2)
+ nop;nop;nop;nop
+
+ /* LD against hidden and local variables */
+ sethi %tldm_hi22(sh1), %o1
+ sethi %tldo_hix22(sh1), %l3
+ add %o1, %tldm_lo10(sh1), %o2
+ sethi %tldo_hix22(sh2 + 1), %l2
+ add %l7, %o2, %o0, %tldm_add(sh1)
+ xor %l3, %tldo_lox10(sh1), %l4
+ call __tls_get_addr, %tldm_call(sh1)
+ xor %l2, %tldo_lox10(sh2 + 1), %l3
+ add %o0, %l4, %l5, %tldo_add(sh1)
+ ldub [%o0 + %l3], %l6, %tldo_add(sh2 + 1)
+ nop;nop;nop;nop
+
+ /* LD against hidden but not local variables */
+ sethi %tldm_hi22(sH1), %o1
+ sethi %tldo_hix22(sH1 + 3), %l3
+ add %o1, %tldm_lo10(sH1), %o2
+ sethi %tldo_hix22(sH2), %l2
+ add %l7, %o2, %o0, %tldm_add(sH1)
+ xor %l3, %tldo_lox10(sH1 + 3), %l4
+ call __tls_get_addr, %tldm_call(sH1)
+ xor %l2, %tldo_lox10(sH2), %l3
+ add %o0, %l4, %l5, %tldo_add(sH1 + 3)
+ ld [%o0 + %l3], %l6, %tldo_add(sH2)
+ nop;nop;nop;nop
+
+ /* IE against global var */
+ sethi %tie_hi22(sg2), %l1
+ nop
+ add %l1, %tie_lo10(sg2), %l2
+ nop
+ ld [%l7 + %l2], %l2, %tie_ld(sg2)
+ nop
+ add %g7, %l2, %l2, %tie_add(sg2)
+ nop;nop;nop;nop
+
+ /* IE against local var */
+ sethi %tie_hi22(sl2), %o3
+ add %o3, %tie_lo10(sl2), %o3
+ ld [%l7 + %o3], %o2, %tie_ld(sl2)
+ add %g7, %o2, %o4, %tie_add(sl2)
+ nop;nop;nop;nop
+
+ /* IE against hidden and local var */
+ sethi %tie_hi22(sh2), %l1
+ add %l1, %tie_lo10(sh2), %l2
+ ld [%l7 + %l2], %l2, %tie_ld(sh2)
+ add %g7, %l2, %l2, %tie_add(sh2)
+ nop;nop;nop;nop
+
+ /* IE against hidden but not local var */
+ sethi %tie_hi22(sH2), %l1
+ add %l1, %tie_lo10(sH2), %l2
+ ld [%l7 + %l2], %l2, %tie_ld(sH2)
+ add %g7, %l2, %l2, %tie_add(sH2)
+ nop;nop;nop;nop
+
+ /* Direct access through %g7 */
+
+ /* IE against global var */
+ sethi %tie_hi22(sg5), %l1
+ add %l1, %tie_lo10(sg5), %l2
+ ld [%l7 + %l2], %l2, %tie_ld(sg5)
+ ld [%g7 + %l2], %l2, %tie_add(sg5)
+ nop;nop;nop;nop
+
+ /* IE against local var */
+ sethi %tie_hi22(sl5), %o3
+ add %o3, %tie_lo10(sl5), %o4
+ ld [%l7 + %o4], %o5, %tie_ld(sl5)
+ stb %l2, [%g7 + %o5], %tie_add(sl5)
+ nop;nop;nop;nop
+
+ /* IE against hidden and local var */
+ sethi %tie_hi22(sh5), %o3
+ add %o3, %tie_lo10(sh5), %o4
+ ld [%l7 + %o4], %o5, %tie_ld(sh5)
+ lduh [%g7 + %o5], %l2, %tie_add(sh5)
+ nop;nop;nop;nop
+
+ /* IE against hidden but not local var */
+ sethi %tie_hi22(sH5), %o3
+ add %o3, %tie_lo10(sH5), %o4
+ ld [%l7 + %o4], %o5, %tie_ld(sH5)
+ st %l2, [%g7 + %o5], %tie_add(sH5)
+ nop;nop;nop;nop
+
+ ret
+ restore
diff --git a/ld/testsuite/ld-sparc/tlssunpic32.sd b/ld/testsuite/ld-sparc/tlssunpic32.sd
new file mode 100644
index 0000000..80885f5
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunpic32.sd
@@ -0,0 +1,15 @@
+#source: tlssunpic32.s
+#source: tlspic.s
+#as: --32 -K PIC
+#ld: -shared -melf32_sparc
+#objdump: -sj.got
+#target: sparc*-*-*
+
+.*: +file format elf32-sparc
+
+Contents of section .got:
+ 12138 00012060 00000000 00000020 00000000 .*
+ 12148 00000000 00000000 00000000 00000000 .*
+ 12158 00000060 00000000 00000000 00000000 .*
+ 12168 00000000 00000000 00000000 00000000 .*
+ 12178 00000000 00000040 00000000 .*
diff --git a/ld/testsuite/ld-sparc/tlssunpic32.td b/ld/testsuite/ld-sparc/tlssunpic32.td
new file mode 100644
index 0000000..eb4e344
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunpic32.td
@@ -0,0 +1,16 @@
+#source: tlssunpic32.s
+#source: tlspic.s
+#as: --32 -K PIC
+#ld: -shared -melf32_sparc
+#objdump: -sj.tdata
+#target: sparc*-*-*
+
+.*: +file format elf32-sparc
+
+Contents of section .tdata:
+ 12000 00000011 00000012 00000013 00000014 .*
+ 12010 00000015 00000016 00000017 00000018 .*
+ 12020 00000041 00000042 00000043 00000044 .*
+ 12030 00000045 00000046 00000047 00000048 .*
+ 12040 00000101 00000102 00000103 00000104 .*
+ 12050 00000105 00000106 00000107 00000108 .*
diff --git a/ld/testsuite/ld-sparc/tlssunpic64.dd b/ld/testsuite/ld-sparc/tlssunpic64.dd
new file mode 100644
index 0000000..a1f97d9
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunpic64.dd
@@ -0,0 +1,12 @@
+#source: tlssunpic64.s
+#source: tlspic.s
+#as: --64 -Av9 -K PIC
+#ld: -shared -melf64_sparc
+#objdump: -drj.text
+#target: sparc*-*-*
+
+.*: +file format elf64-sparc
+
+Disassembly of section .text:
+# FIXME
+#pass
diff --git a/ld/testsuite/ld-sparc/tlssunpic64.rd b/ld/testsuite/ld-sparc/tlssunpic64.rd
new file mode 100644
index 0000000..9d56f70
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunpic64.rd
@@ -0,0 +1,9 @@
+#source: tlssunpic64.s
+#source: tlspic.s
+#as: --64 -Av9 -K PIC
+#ld: -shared -melf64_sparc
+#readelf: -WSsrl
+#target: sparc*-*-*
+
+# FIXME
+#pass
diff --git a/ld/testsuite/ld-sparc/tlssunpic64.s b/ld/testsuite/ld-sparc/tlssunpic64.s
new file mode 100644
index 0000000..14e110d
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunpic64.s
@@ -0,0 +1,228 @@
+ .data
+ .align 4096
+ .section ".tdata", #alloc, #write, #tls
+ .align 4
+ .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: .word 17
+sg2: .word 18
+sg3: .word 19
+sg4: .word 20
+sg5: .word 21
+sg6: .word 22
+sg7: .word 23
+sg8: .word 24
+sl1: .word 65
+sl2: .word 66
+sl3: .word 67
+sl4: .word 68
+sl5: .word 69
+sl6: .word 70
+sl7: .word 71
+sl8: .word 72
+sh1: .word 257
+sh2: .word 258
+sh3: .word 259
+sh4: .word 260
+sh5: .word 261
+sh6: .word 262
+sh7: .word 263
+sh8: .word 264
+
+ .text
+ .align 4096
+.LLGETPC0:
+ retl
+ add %o7, %l7, %l7
+
+ .globl fn1
+ .type fn1,#function
+ .proc 04
+fn1:
+ save %sp, -160, %sp
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %l7
+ call .LLGETPC0
+ add %l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7
+ nop;nop;nop;nop
+
+ /* GD */
+ sethi %tgd_hi22(sg1), %l1
+ nop
+ add %l1, %tgd_lo10(sg1), %l2
+ nop
+ add %l7, %l2, %o0, %tgd_add(sg1)
+ nop
+ call __tls_get_addr, %tgd_call(sg1)
+ nop
+ nop;nop;nop;nop
+
+ /* GD -> IE because variable is referenced through IE too */
+ sethi %tgd_hi22(sg2), %o0
+ add %o0, %tgd_lo10(sg2), %o1
+ add %l7, %o1, %o0, %tgd_add(sg2)
+ call __tls_get_addr, %tgd_call(sg2)
+ nop
+ nop;nop;nop;nop
+
+ /* GD against local variable */
+ sethi %tgd_hi22(sl1), %o4
+ add %o4, %tgd_lo10(sl1), %o4
+ add %l7, %o4, %o0, %tgd_add(sl1)
+ call __tls_get_addr, %tgd_call(sl1)
+ nop
+ nop;nop;nop;nop
+
+ /* GD -> IE against local variable referenced through IE too */
+ sethi %tgd_hi22(sl2), %o0
+ add %o0, %tgd_lo10(sl2), %o0
+ add %l7, %o0, %o0, %tgd_add(sl2)
+ call __tls_get_addr, %tgd_call(sl2)
+ nop
+ nop;nop;nop;nop
+
+ /* GD against hidden and local variable */
+ sethi %tgd_hi22(sh1), %o4
+ add %o4, %tgd_lo10(sh1), %o4
+ add %l7, %o4, %o0, %tgd_add(sh1)
+ call __tls_get_addr, %tgd_call(sh1)
+ nop
+ nop;nop;nop;nop
+
+ /* GD -> IE against hidden and local variable referenced through
+ IE too */
+ sethi %tgd_hi22(sh2), %o0
+ add %o0, %tgd_lo10(sh2), %o0
+ add %l7, %o0, %o0, %tgd_add(sh2)
+ call __tls_get_addr, %tgd_call(sh2)
+ nop
+ nop;nop;nop;nop
+
+ /* GD against hidden but not local variable */
+ sethi %tgd_hi22(sH1), %o4
+ add %o4, %tgd_lo10(sH1), %o4
+ add %l7, %o4, %o0, %tgd_add(sH1)
+ call __tls_get_addr, %tgd_call(sH1)
+ nop
+ nop;nop;nop;nop
+
+ /* GD -> IE against hidden but not local variable referenced through
+ IE too */
+ sethi %tgd_hi22(sH2), %o0
+ add %o0, %tgd_lo10(sH2), %o0
+ add %l7, %o0, %o0, %tgd_add(sH2)
+ call __tls_get_addr, %tgd_call(sH2)
+ nop
+ nop;nop;nop;nop
+
+ /* LD */
+ sethi %tldm_hi22(sl1), %l1
+ nop
+ add %l1, %tldm_lo10(sl1), %l2
+ nop
+ add %l7, %l2, %o0, %tldm_add(sl1)
+ nop
+ call __tls_get_addr, %tldm_call(sl1)
+ nop
+ sethi %tldo_hix22(sl1), %l3
+ nop
+ xor %l3, %tldo_lox10(sl1), %l4
+ nop
+ add %o0, %l4, %l5, %tldo_add(sl1)
+ nop
+ sethi %tldo_hix22(sl2 + 2), %l2
+ nop
+ xor %l2, %tldo_lox10(sl2 + 2), %l3
+ nop
+ lduh [%o0 + %l3], %l6, %tldo_add(sl2 + 2)
+ nop;nop;nop;nop
+
+ /* LD against hidden and local variables */
+ sethi %tldm_hi22(sh1), %o1
+ sethi %tldo_hix22(sh1), %l3
+ add %o1, %tldm_lo10(sh1), %o2
+ sethi %tldo_hix22(sh2 + 1), %l2
+ add %l7, %o2, %o0, %tldm_add(sh1)
+ xor %l3, %tldo_lox10(sh1), %l4
+ call __tls_get_addr, %tldm_call(sh1)
+ xor %l2, %tldo_lox10(sh2 + 1), %l3
+ ldx [%o0 + %l4], %l5, %tldo_add(sh1)
+ add %o0, %l3, %l6, %tldo_add(sh2 + 1)
+ nop;nop;nop;nop
+
+ /* LD against hidden but not local variables */
+ sethi %tldm_hi22(sH1), %o1
+ sethi %tldo_hix22(sH1 + 3), %l3
+ add %o1, %tldm_lo10(sH1), %o2
+ sethi %tldo_hix22(sH2), %l2
+ add %l7, %o2, %o0, %tldm_add(sH1)
+ xor %l3, %tldo_lox10(sH1 + 3), %l4
+ call __tls_get_addr, %tldm_call(sH1)
+ xor %l2, %tldo_lox10(sH2), %l3
+ add %o0, %l4, %l5, %tldo_add(sH1 + 3)
+ ld [%o0 + %l3], %l6, %tldo_add(sH2)
+ nop;nop;nop;nop
+
+ /* IE against global var */
+ sethi %tie_hi22(sg2), %l1
+ nop
+ add %l1, %tie_lo10(sg2), %l2
+ nop
+ ldx [%l7 + %l2], %l2, %tie_ldx(sg2)
+ nop
+ add %g7, %l2, %l2, %tie_add(sg2)
+ nop;nop;nop;nop
+
+ /* IE against local var */
+ sethi %tie_hi22(sl2), %o3
+ add %o3, %tie_lo10(sl2), %o3
+ ldx [%l7 + %o3], %o2, %tie_ldx(sl2)
+ add %g7, %o2, %o4, %tie_add(sl2)
+ nop;nop;nop;nop
+
+ /* IE against hidden and local var */
+ sethi %tie_hi22(sh2), %l1
+ add %l1, %tie_lo10(sh2), %l2
+ ldx [%l7 + %l2], %l2, %tie_ldx(sh2)
+ add %g7, %l2, %l2, %tie_add(sh2)
+ nop;nop;nop;nop
+
+ /* IE against hidden but not local var */
+ sethi %tie_hi22(sH2), %l1
+ add %l1, %tie_lo10(sH2), %l2
+ ldx [%l7 + %l2], %l2, %tie_ldx(sH2)
+ add %g7, %l2, %l2, %tie_add(sH2)
+ nop;nop;nop;nop
+
+ /* Direct access through %g7 */
+
+ /* IE against global var */
+ sethi %tie_hi22(sg5), %l1
+ add %l1, %tie_lo10(sg5), %l2
+ ldx [%l7 + %l2], %l2, %tie_ldx(sg5)
+ ldx [%g7 + %l2], %l2, %tie_add(sg5)
+ nop;nop;nop;nop
+
+ /* IE against local var */
+ sethi %tie_hi22(sl5), %o3
+ add %o3, %tie_lo10(sl5), %o4
+ ldx [%l7 + %o4], %o5, %tie_ldx(sl5)
+ stb %l2, [%g7 + %o5], %tie_add(sl5)
+ nop;nop;nop;nop
+
+ /* IE against hidden and local var */
+ sethi %tie_hi22(sh5), %o3
+ add %o3, %tie_lo10(sh5), %o4
+ ldx [%l7 + %o4], %o5, %tie_ldx(sh5)
+ stx %l2, [%g7 + %o5], %tie_add(sh5)
+ nop;nop;nop;nop
+
+ /* IE against hidden but not local var */
+ sethi %tie_hi22(sH5), %o3
+ add %o3, %tie_lo10(sH5), %o4
+ ldx [%l7 + %o4], %o5, %tie_ldx(sH5)
+ st %l2, [%g7 + %o5], %tie_add(sH5)
+ nop;nop;nop;nop
+
+ return %i7 + 8
+ nop
diff --git a/ld/testsuite/ld-sparc/tlssunpic64.sd b/ld/testsuite/ld-sparc/tlssunpic64.sd
new file mode 100644
index 0000000..83d4092
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunpic64.sd
@@ -0,0 +1,12 @@
+#source: tlssunpic64.s
+#source: tlspic.s
+#as: --64 -K PIC
+#ld: -shared -melf64_sparc
+#objdump: -sj.got
+#target: sparc*-*-*
+
+.*: +file format elf64-sparc
+
+Contents of section .got:
+# FIXME
+#pass
diff --git a/ld/testsuite/ld-sparc/tlssunpic64.td b/ld/testsuite/ld-sparc/tlssunpic64.td
new file mode 100644
index 0000000..77f6507
--- /dev/null
+++ b/ld/testsuite/ld-sparc/tlssunpic64.td
@@ -0,0 +1,12 @@
+#source: tlssunpic64.s
+#source: tlspic.s
+#as: --64 -K PIC
+#ld: -shared -melf64_sparc
+#objdump: -sj.tdata
+#target: sparc*-*-*
+
+.*: +file format elf64-sparc
+
+Contents of section .tdata:
+# FIXME
+#pass