summaryrefslogtreecommitdiffstats
path: root/binutils-2.21/ld/testsuite/ld-xtensa
diff options
context:
space:
mode:
Diffstat (limited to 'binutils-2.21/ld/testsuite/ld-xtensa')
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/coalesce.exp100
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/coalesce.t6
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/coalesce1.s15
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/coalesce2.s10
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/lcall.exp114
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/lcall.t6
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/lcall1.s10
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/lcall2.s6
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.dd65
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.rd118
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.s98
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.sd14
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.td14
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/tlslib.s18
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/tlspic.dd81
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/tlspic.rd142
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/tlspic.sd17
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/tlspic.td16
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/tlspic1.s120
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/tlspic2.s12
-rw-r--r--binutils-2.21/ld/testsuite/ld-xtensa/xtensa.exp54
21 files changed, 1036 insertions, 0 deletions
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/coalesce.exp b/binutils-2.21/ld/testsuite/ld-xtensa/coalesce.exp
new file mode 100644
index 0000000..c122263
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/coalesce.exp
@@ -0,0 +1,100 @@
+# Test literal coaslescing for Xtensa targets.
+# By David Heine, Tensilica, Inc.
+# Copyright 2002, 2003, 2005, 2007, 2008
+# Free Software Foundation, Inc.
+#
+# This file is part of the GNU Binutils.
+#
+# This program 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 3 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., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+if ![istarget "xtensa*-*-*"] {
+ return
+}
+
+set testname "COALESCE"
+
+set OBJDUMPFLAGS "-dr"
+
+#
+# default_ld_objdump
+# run objdump on a file
+#
+proc default_ld_objdump { objdump object outputfile } {
+ global OBJDUMPFLAGS
+ global objdump_output
+ global host_triplet
+
+ if {[which $objdump] == 0} then {
+ perror "$objdump does not exist"
+ return 0
+ }
+
+ if ![info exists OBJDUMPFLAGS] { set OBJDUMPFLAGS "" }
+
+ verbose -log "$objdump $OBJDUMPFLAGS $object >$outputfile"
+
+ catch "exec $objdump $OBJDUMPFLAGS $object >$outputfile" exec_output
+ set exec_output [prune_warnings $exec_output]
+ if [string match "" $exec_output] then {
+ return 1
+ } else {
+ verbose -log "$exec_output"
+ perror "$object: objdump failed"
+ return 0
+ }
+}
+
+
+if ![ld_assemble $as $srcdir/$subdir/coalesce1.s tmpdir/coalesce1.o] {
+ unresolved $testname
+ return
+}
+if ![ld_assemble $as $srcdir/$subdir/coalesce2.s tmpdir/coalesce2.o] {
+ unresolved $testname
+ return
+}
+
+set object "tmpdir/coalesce"
+set outputfile "$object.txt"
+
+if ![ld_simple_link $ld $object "-T $srcdir/$subdir/coalesce.t tmpdir/coalesce1.o tmpdir/coalesce2.o"] {
+ verbose -log "failure in ld"
+ fail $testname
+ return
+}
+
+if ![default_ld_objdump $objdump $object $outputfile ] {
+ verbose -log "failure in objdump"
+ fail $testname
+ return
+}
+
+set file [open $outputfile r]
+set found 0
+
+while { [gets $file line] != -1 } {
+ # verbose "$line" 2
+ if [regexp "^0000000c <main>:" $line] {
+ set found 1
+ }
+}
+close $file
+if $found {
+ pass $testname
+} else {
+ fail $testname
+}
+
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/coalesce.t b/binutils-2.21/ld/testsuite/ld-xtensa/coalesce.t
new file mode 100644
index 0000000..7bff69f
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/coalesce.t
@@ -0,0 +1,6 @@
+SECTIONS
+{
+ .text 0x00000000 : {
+ *(.literal .text)
+ }
+}
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/coalesce1.s b/binutils-2.21/ld/testsuite/ld-xtensa/coalesce1.s
new file mode 100644
index 0000000..4374463
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/coalesce1.s
@@ -0,0 +1,15 @@
+ .global foo
+ .data
+ .global g_name
+ .align 4
+g_name:
+ .word 0xffffffff
+ .text
+ .global main
+ .align 4
+main:
+ entry a5,16
+ movi a5,20000
+ movi a6,g_name
+ call8 foo
+ ret
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/coalesce2.s b/binutils-2.21/ld/testsuite/ld-xtensa/coalesce2.s
new file mode 100644
index 0000000..7c9a83d
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/coalesce2.s
@@ -0,0 +1,10 @@
+ .text
+ .global foo
+ .global g_name
+ .align 4
+foo:
+ entry a5,16
+ movi a5,20000
+ movi a6,g_name
+ movi a7,50000
+ ret
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/lcall.exp b/binutils-2.21/ld/testsuite/ld-xtensa/lcall.exp
new file mode 100644
index 0000000..599c69c
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/lcall.exp
@@ -0,0 +1,114 @@
+# Test Xtensa longcall optimization.
+# By David Heine, Tensilica, Inc.
+# Copyright 2002, 2003, 2005, 2007, 2008
+# Free Software Foundation, Inc.
+#
+# This file is part of the GNU Binutils.
+#
+# This program 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 3 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., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+if ![istarget "xtensa*-*-*"] {
+ return
+}
+
+set testname "LCALL"
+
+set OBJDUMPFLAGS "-dr"
+
+#
+# default_ld_objdump
+# run objdump on a file
+#
+proc default_ld_objdump { objdump object outputfile } {
+ global OBJDUMPFLAGS
+ global objdump_output
+ global host_triplet
+
+ if {[which $objdump] == 0} then {
+ perror "$objdump does not exist"
+ return 0
+ }
+
+ if ![info exists OBJDUMPFLAGS] { set OBJDUMPFLAGS "" }
+
+ verbose -log "$objdump $OBJDUMPFLAGS $object >$outputfile"
+
+ catch "exec $objdump $OBJDUMPFLAGS $object >$outputfile" exec_output
+ set exec_output [prune_warnings $exec_output]
+ if [string match "" $exec_output] then {
+ return 1
+ } else {
+ verbose -log "$exec_output"
+ perror "$object: objdump failed"
+ return 0
+ }
+}
+
+
+if ![ld_assemble $as $srcdir/$subdir/lcall1.s tmpdir/lcall1.o] {
+ unresolved $testname
+ return
+}
+if ![ld_assemble $as $srcdir/$subdir/lcall2.s tmpdir/lcall2.o] {
+ unresolved $testname
+ return
+}
+
+set object "tmpdir/lcall"
+set outputfile "$object.txt"
+
+if ![ld_simple_link $ld $object "-T $srcdir/$subdir/lcall.t tmpdir/lcall1.o tmpdir/lcall2.o"] {
+ verbose -log "failure in ld"
+ fail $testname
+ return
+}
+
+if ![default_ld_objdump $objdump $object $outputfile ] {
+ verbose -log "failure in objdump"
+ fail $testname
+ return
+}
+
+set file [open $outputfile r]
+while { [gets $file line] != -1 } {
+ # verbose "$line" 2
+ if [regexp "l32r" $line] {
+ verbose -log "Found an l32r in the linked object"
+ verbose -log "$line"
+ fail $testname
+ }
+}
+close $file
+pass $testname
+
+
+set testname "LCALL2"
+set file [open $outputfile r]
+set found 0
+
+while { [gets $file line] != -1 } {
+ # verbose "$line" 2
+ if [regexp "^00000004 <label1>:" $line] {
+ set found 1
+ }
+}
+close $file
+if $found {
+ pass $testname
+} else {
+ fail $testname
+}
+
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/lcall.t b/binutils-2.21/ld/testsuite/ld-xtensa/lcall.t
new file mode 100644
index 0000000..7bff69f
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/lcall.t
@@ -0,0 +1,6 @@
+SECTIONS
+{
+ .text 0x00000000 : {
+ *(.literal .text)
+ }
+}
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/lcall1.s b/binutils-2.21/ld/testsuite/ld-xtensa/lcall1.s
new file mode 100644
index 0000000..3439319
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/lcall1.s
@@ -0,0 +1,10 @@
+.global foo
+.text
+ .align 4
+label1:
+ .literal .Lunused, 0xffffffff
+ entry a5,16
+.begin longcalls
+ call4 foo
+.end longcalls
+ nop
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/lcall2.s b/binutils-2.21/ld/testsuite/ld-xtensa/lcall2.s
new file mode 100644
index 0000000..d697096
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/lcall2.s
@@ -0,0 +1,6 @@
+ .global foo
+ .align 4
+foo:
+ entry a5,16
+ nop
+ ret
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.dd b/binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.dd
new file mode 100644
index 0000000..c3fad8b
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.dd
@@ -0,0 +1,65 @@
+#source: tlsbin.s
+#as:
+#ld: -melf32xtensa
+#objdump: -drj.text --start-address=0x400238
+#target: xtensa*-*-linux*
+
+.*: +file format elf32-xtensa-.e
+
+Disassembly of section \.text:
+
+0+400238 <_start>:
+ [0-9a-f]+: [0-9a-f]+[ ]+entry a1, 32
+# GD -> IE because variable is not defined in executable
+ [0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 4001ec <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a10, a10, a8
+# GD -> IE because variable is not defined in executable where
+# the variable is referenced through IE too
+ [0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 4001f4 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a10, a10, a8
+# GD -> LE with global variable defined in executable
+ [0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 4001fc <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a10, a10, a8
+# GD -> LE with local variable defined in executable
+ [0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 400204 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a10, a10, a8
+# GD -> LE with hidden variable defined in executable
+ [0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 40020c <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a10, a10, a8
+# LD -> LE
+ [0-9a-f]+: [0-9a-f]+[ ]+nop.*
+ [0-9a-f]+: [0-9a-f]+[ ]+nop.*
+ [0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a10
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a12, 400218 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a12, a12, a10
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a13, 40021c <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a13, a13, a10
+# LD -> LE against hidden variables
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a12, 400220 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a12, a12, a10
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a13, 400224 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a13, a13, a10
+#
+# IE against global var
+ [0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a2
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a3, 400228 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a3, a3, a2
+# IE -> LE against global var defined in exec
+ [0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a4
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a5, 40022c <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a5, a5, a4
+# IE -> LE against local var
+ [0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a6
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a7, 400230 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a7, a7, a6
+# IE -> LE against hidden var
+ [0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a9, 400234 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a9, a9, a8
+#
+ [0-9a-f]+: [0-9a-f]+[ ]+retw.*
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.rd b/binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.rd
new file mode 100644
index 0000000..dcb9fab
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.rd
@@ -0,0 +1,118 @@
+#source: tlsbin.s
+#as:
+#ld: -melf32xtensa
+#readelf: -WSsrl
+#target: xtensa*-*-linux*
+
+There are [0-9]+ section headers, starting at offset 0x[0-9a-f]+:
+
+Section Headers:
+ +\[Nr\] Name +Type +Addr +Off +Size +ES Flg Lk Inf Al
+ +\[[ 0-9]+\] +NULL +0+ 0+ 0+ 00 +0 +0 +0
+ +\[[ 0-9]+\] .interp +.*
+ +\[[ 0-9]+\] .hash +.*
+ +\[[ 0-9]+\] .dynsym +.*
+ +\[[ 0-9]+\] .dynstr +.*
+ +\[[ 0-9]+\] .rela.dyn +.*
+ +\[[ 0-9]+\] .text +PROGBITS +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +AX +0 +0 +4
+ +\[[ 0-9]+\] .got.loc +PROGBITS +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +A +0 +0 +4
+ +\[[ 0-9]+\] .tdata +PROGBITS +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +WAT +0 +0 +4
+ +\[[ 0-9]+\] .dynamic +DYNAMIC +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 08 +WA +4 +0 +4
+ +\[[ 0-9]+\] .got +PROGBITS +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +WA +0 +0 +4
+ +\[[ 0-9]+\] .xt.lit +PROGBITS +0+ .*
+ +\[[ 0-9]+\] .xt.prop +PROGBITS +0+ .*
+ +\[[ 0-9]+\] .xtensa.info +NOTE +0+ .*
+ +\[[ 0-9]+\] .shstrtab +.*
+ +\[[ 0-9]+\] .symtab +.*
+ +\[[ 0-9]+\] .strtab +.*
+Key to Flags:
+.*
+.*
+.*
+
+Elf file type is EXEC \(Executable file\)
+Entry point 0x[0-9a-f]+
+There are [0-9]+ program headers, starting at offset [0-9]+
+
+Program Headers:
+ +Type +Offset +VirtAddr +PhysAddr +FileSiz +MemSiz +Flg Align
+ +PHDR.*
+ +INTERP.*
+.*Requesting program interpreter.*
+ +LOAD +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ R E 0x1000
+ +LOAD +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ RW +0x1000
+ +DYNAMIC +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ RW +0x4
+ +TLS +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ R +0x4
+
+ Section to Segment mapping:
+ +Segment Sections...
+ +00 *
+ +01 +.interp *
+ +02 +.interp .hash .dynsym .dynstr .rela.dyn .text .got.loc *
+ +03 +.tdata .dynamic .got *
+ +04 +.dynamic *
+ +05 +.tdata *
+
+Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 3 entries:
+ +Offset +Info +Type +Sym\. Value +Symbol's Name \+ Addend
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLS_TPOFF +0+ +sG1 \+ 0
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLS_TPOFF +0+ +sG2 \+ 0
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLS_TPOFF +0+ +sG2 \+ 0
+
+Symbol table '\.dynsym' contains [0-9]+ entries:
+ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
+ +[0-9]+: 0+ +0 +NOTYPE +LOCAL +DEFAULT +UND *
+ +[0-9]+: 0+ +0 +TLS +GLOBAL +DEFAULT +UND sG2
+ +[0-9]+: 0+[0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +ABS __bss_start
+ +[0-9]+: 0+ +0 +TLS +GLOBAL +DEFAULT +UND sG1
+ +[0-9]+: 0+[0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +ABS _edata
+ +[0-9]+: 0+[0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +ABS _end
+
+Symbol table '\.symtab' contains [0-9]+ entries:
+ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
+ +[0-9]+: 0+ +0 +NOTYPE +LOCAL +DEFAULT +UND *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +1 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +2 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +3 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +4 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +5 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +6 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +7 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +8 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +9 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +10 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +11 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +12 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +13 *
+ +[0-9]+: [0-9a-f]+ +0 +TLS +LOCAL +DEFAULT +8 sl1
+ +[0-9]+: [0-9a-f]+ +0 +TLS +LOCAL +DEFAULT +8 sl2
+ +[0-9]+: [0-9a-f]+ +0 +TLS +LOCAL +DEFAULT +8 sl3
+ +[0-9]+: [0-9a-f]+ +0 +TLS +LOCAL +DEFAULT +8 sl4
+ +[0-9]+: [0-9a-f]+ +0 +TLS +LOCAL +DEFAULT +8 sl5
+ +[0-9]+: [0-9a-f]+ +0 +TLS +LOCAL +DEFAULT +8 sl6
+ +[0-9]+: [0-9a-f]+ +0 +TLS +LOCAL +DEFAULT +8 sl7
+ +[0-9]+: [0-9a-f]+ +0 +TLS +LOCAL +DEFAULT +8 sl8
+ +[0-9]+: 0+ +0 +TLS +LOCAL +DEFAULT +8 _TLS_MODULE_BASE_
+ +[0-9]+: [0-9a-f]+ +0 +OBJECT +LOCAL +DEFAULT +9 _DYNAMIC
+ +[0-9]+: [0-9a-f]+ +0 +TLS +GLOBAL +DEFAULT +8 sg8
+ +[0-9]+: [0-9a-f]+ +0 +TLS +GLOBAL +DEFAULT +8 sg3
+ +[0-9]+: [0-9a-f]+ +0 +TLS +GLOBAL +HIDDEN +8 sh3
+ +[0-9]+: 0+ +0 +TLS +GLOBAL +DEFAULT +UND sG2
+ +[0-9]+: [0-9a-f]+ +0 +TLS +GLOBAL +DEFAULT +8 sg4
+ +[0-9]+: [0-9a-f]+ +0 +TLS +GLOBAL +DEFAULT +8 sg5
+ +[0-9]+: [0-9a-f]+ +0 +TLS +GLOBAL +HIDDEN +8 sh7
+ +[0-9]+: [0-9a-f]+ +0 +TLS +GLOBAL +HIDDEN +8 sh8
+ +[0-9]+: [0-9a-f]+ +0 +TLS +GLOBAL +DEFAULT +8 sg1
+ +[0-9]+: [0-9a-f]+ +0 +FUNC +GLOBAL +DEFAULT +6 _start
+ +[0-9]+: [0-9a-f]+ +0 +TLS +GLOBAL +HIDDEN +8 sh4
+ +[0-9]+: [0-9a-f]+ +0 +TLS +GLOBAL +HIDDEN +8 sh5
+ +[0-9]+: [0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +ABS __bss_start
+ +[0-9]+: [0-9a-f]+ +0 +TLS +GLOBAL +DEFAULT +8 sg2
+ +[0-9]+: 0+ +0 +TLS +GLOBAL +DEFAULT +UND sG1
+ +[0-9]+: [0-9a-f]+ +0 +TLS +GLOBAL +HIDDEN +8 sh1
+ +[0-9]+: [0-9a-f]+ +0 +TLS +GLOBAL +DEFAULT +8 sg6
+ +[0-9]+: [0-9a-f]+ +0 +TLS +GLOBAL +DEFAULT +8 sg7
+ +[0-9]+: [0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +ABS _edata
+ +[0-9]+: [0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +ABS _end
+ +[0-9]+: [0-9a-f]+ +0 +TLS +GLOBAL +HIDDEN +8 sh2
+ +[0-9]+: [0-9a-f]+ +0 +TLS +GLOBAL +HIDDEN +8 sh6
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.s b/binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.s
new file mode 100644
index 0000000..2220cfc
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.s
@@ -0,0 +1,98 @@
+ .section ".tdata", "awT", @progbits
+ .global sg1, sg2, sg3, sg4, sg5, sg6, sg7, sg8
+ .global sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
+ .hidden sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
+ .align 4
+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 157
+sh2: .long 158
+sh3: .long 159
+sh4: .long 160
+sh5: .long 161
+sh6: .long 162
+sh7: .long 163
+sh8: .long 164
+
+ .text
+ .global _start
+ .type _start, @function
+_start:
+ entry sp, 32
+
+ /* GD -> IE because variable is not defined in executable */
+ movi a8, sG1@tlsfunc
+ movi a10, sG1@tlsarg
+ callx8.tls a8, sG1@tlscall
+
+ /* GD -> IE because variable is not defined in executable where
+ the variable is referenced through IE too */
+ movi a8, sG2@tlsfunc
+ movi a10, sG2@tlsarg
+ callx8.tls a8, sG2@tlscall
+
+ /* GD -> LE with global variable defined in executable */
+ movi a8, sg1@tlsfunc
+ movi a10, sg1@tlsarg
+ callx8.tls a8, sg1@tlscall
+
+ /* GD -> LE with local variable defined in executable */
+ movi a8, sl1@tlsfunc
+ movi a10, sl1@tlsarg
+ callx8.tls a8, sl1@tlscall
+
+ /* GD -> LE with hidden variable defined in executable */
+ movi a8, sh1@tlsfunc
+ movi a10, sh1@tlsarg
+ callx8.tls a8, sh1@tlscall
+
+ /* LD -> LE */
+ movi a8, _TLS_MODULE_BASE_@tlsfunc
+ movi a10, _TLS_MODULE_BASE_@tlsarg
+ callx8.tls a8, _TLS_MODULE_BASE_@tlscall
+ movi a12, 1+sl1@dtpoff
+ add a12, a12, a10
+ movi a13, sl2@dtpoff+2
+ add a13, a13, a10
+
+ /* LD -> LE against hidden variables */
+ movi a12, sh1@dtpoff
+ add a12, a12, a10
+ movi a13, 3+sh2@dtpoff
+ add a13, a13, a10
+
+ /* IE against global var */
+ rur a2, THREADPTR
+ movi a3, sG2@tpoff
+ add a3, a3, a2
+
+ /* IE -> LE against global var defined in exec */
+ rur a4, THREADPTR
+ movi a5, sg1@tpoff
+ add a5, a5, a4
+
+ /* IE -> LE against local var */
+ rur a6, THREADPTR
+ movi a7, sl1@tpoff
+ add a7, a7, a6
+
+ /* IE -> LE against hidden var */
+ rur a8, THREADPTR
+ movi a9, sh1@tpoff
+ add a9, a9, a8
+
+ retw
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.sd b/binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.sd
new file mode 100644
index 0000000..484db07
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.sd
@@ -0,0 +1,14 @@
+#source: tlsbin.s
+#as:
+#ld: -melf32xtensa
+#objdump: -sj.text --stop-address=0x400238
+#target: xtensa*-*-linux*
+
+.*: +file format elf32-xtensa-.e
+
+Contents of section .text:
+ *[0-9a-f]+ 0+ 0+ 0+ 0+ .*
+ *[0-9a-f]+ 0+ 0*080* 0+ 0*280* .*
+ *[0-9a-f]+ 0+ 0*480* 0+ 0*080* .*
+ *[0-9a-f]+ 0*290* 0*2e0* 0*480* 0*4f0* .*
+ *[0-9a-f]+ 0+ 0*080* 0*280* 0*480* .*
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.td b/binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.td
new file mode 100644
index 0000000..efef45c
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/tlsbin.td
@@ -0,0 +1,14 @@
+#source: tlsbin.s
+#ld: -melf32xtensa
+#objdump: -sj.tdata
+#target: xtensa*-*-linux*
+
+.*: +file format elf32-xtensa-.e
+
+Contents of section .tdata:
+ *[0-9a-f]+ 0*110* 0*120* 0*130* 0*140* .*
+ *[0-9a-f]+ 0*150* 0*160* 0*170* 0*180* .*
+ *[0-9a-f]+ 0*410* 0*420* 0*430* 0*440* .*
+ *[0-9a-f]+ 0*450* 0*460* 0*470* 0*480* .*
+ *[0-9a-f]+ 0*9d0* 0*9e0* 0*9f0* 0*a00* .*
+ *[0-9a-f]+ 0*a10* 0*a20* 0*a30* 0*a40* .*
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/tlslib.s b/binutils-2.21/ld/testsuite/ld-xtensa/tlslib.s
new file mode 100644
index 0000000..a2c430b
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/tlslib.s
@@ -0,0 +1,18 @@
+ .section ".tdata", "awT", @progbits
+ .global 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. */
+ .global __tls_get_addr
+ .type __tls_get_addr, @function
+__tls_get_addr:
+ entry sp, 16
+ retw
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/tlspic.dd b/binutils-2.21/ld/testsuite/ld-xtensa/tlspic.dd
new file mode 100644
index 0000000..9f6e20a
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/tlspic.dd
@@ -0,0 +1,81 @@
+#source: tlspic1.s
+#source: tlspic2.s
+#as:
+#ld: -shared -melf32xtensa
+#objdump: -drj.text --start-address=0x350
+#target: xtensa*-*-linux*
+
+.*: +file format elf32-xtensa-.e
+
+Disassembly of section \.text:
+
+0+350 <_start>:
+ [0-9a-f]+: [0-9a-f]+[ ]+entry a1, 32
+# GD
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a8, 2e0 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 2e4 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+callx8 a8
+# GD -> IE because variable is referenced through IE too
+ [0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 2ec <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a10, a10, a8
+# GD against local variable
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a8, 2f0 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 2f4 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+callx8 a8
+# GD -> IE against local variable referenced through IE too
+ [0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 2fc <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a10, a10, a8
+# GD against hidden and local variable
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a8, 300 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 304 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+callx8 a8
+# GD -> IE against hidden and local variable referenced through IE too
+ [0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 30c <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a10, a10, a8
+# GD against hidden but not local variable
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a8, 310 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 314 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+callx8 a8
+# GD -> IE against hidden but not local variable referenced through IE too
+ [0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 31c <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a10, a10, a8
+# LD
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a8, 320 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a10, 324 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+callx8 a8
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a12, 328 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a12, a12, a10
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a13, 32c <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a13, a13, a10
+# LD against hidden and local variables
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a12, 330 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a12, a12, a10
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a13, 334 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a13, a13, a10
+# LD against hidden but not local variables
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a12, 338 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a12, a12, a10
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a13, 33c <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a13, a13, a10
+# IE against global var
+ [0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a2
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a3, 340 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a3, a3, a2
+# IE against local var
+ [0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a4
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a5, 344 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a5, a5, a4
+# IE against hidden and local var
+ [0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a6
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a7, 348 <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a7, a7, a6
+# IE against hidden but not local var
+ [0-9a-f]+: [0-9a-f]+[ ]+rur.threadptr a8
+ [0-9a-f]+: [0-9a-f]+[ ]+l32r a9, 34c <.*>
+ [0-9a-f]+: [0-9a-f]+[ ]+add.* a9, a9, a8
+#
+ [0-9a-f]+: [0-9a-f]+[ ]+retw.*
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/tlspic.rd b/binutils-2.21/ld/testsuite/ld-xtensa/tlspic.rd
new file mode 100644
index 0000000..92d704e
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/tlspic.rd
@@ -0,0 +1,142 @@
+#source: tlspic1.s
+#source: tlspic2.s
+#as:
+#ld: -shared -melf32xtensa
+#readelf: -WSsrl
+#target: xtensa*-*-linux*
+
+There are [0-9]+ section headers, starting at offset 0x[0-9a-f]+:
+
+Section Headers:
+ +\[Nr\] Name +Type +Addr +Off +Size +ES Flg Lk Inf Al
+ +\[[ 0-9]+\] +NULL +0+ 0+ 0+ 00 +0 +0 +0
+ +\[[ 0-9]+\] .hash +.*
+ +\[[ 0-9]+\] .dynsym +.*
+ +\[[ 0-9]+\] .dynstr +.*
+ +\[[ 0-9]+\] .rela.dyn +.*
+ +\[[ 0-9]+\] .text +PROGBITS +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +AX +0 +0 +4
+ +\[[ 0-9]+\] .got.loc +PROGBITS +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +A +0 +0 +4
+ +\[[ 0-9]+\] .tdata +PROGBITS +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +WAT +0 +0 +4
+ +\[[ 0-9]+\] .tbss +NOBITS +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +WAT +0 +0 +4
+ +\[[ 0-9]+\] .dynamic +DYNAMIC +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 08 +WA +3 +0 +4
+ +\[[ 0-9]+\] .got +PROGBITS +[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +WA +0 +0 +4
+ +\[[ 0-9]+\] .xt.lit +PROGBITS +0+ .*
+ +\[[ 0-9]+\] .xt.prop +PROGBITS +0+ .*
+ +\[[ 0-9]+\] .xtensa.info +NOTE +0+ .*
+ +\[[ 0-9]+\] .shstrtab +.*
+ +\[[ 0-9]+\] .symtab +.*
+ +\[[ 0-9]+\] .strtab +.*
+Key to Flags:
+.*
+.*
+.*
+
+Elf file type is DYN \(Shared object file\)
+Entry point 0x[0-9a-f]+
+There are [0-9]+ program headers, starting at offset [0-9]+
+
+Program Headers:
+ +Type +Offset +VirtAddr +PhysAddr +FileSiz +MemSiz +Flg Align
+ +LOAD +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ R E 0x1000
+ +LOAD +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ RW +0x1000
+ +DYNAMIC +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ RW +0x4
+ +TLS +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ R +0x4
+
+ Section to Segment mapping:
+ +Segment Sections...
+ +00 +.hash .dynsym .dynstr .rela.dyn .text .got.loc *
+ +01 +.tdata .dynamic .got *
+ +02 +.dynamic *
+ +03 +.tdata .tbss *
+
+Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 18 entries:
+ +Offset +Info +Type +Sym\. Value +Symbol's Name \+ Addend
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLSDESC_FN +0+ +sg1 \+ 0
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLSDESC_ARG +0+ +sg1 \+ 0
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLS_TPOFF +0+4 +sg2 \+ 0
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLS_TPOFF +0+4 +sg2 \+ 0
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLSDESC_FN +0+20
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLSDESC_ARG +0+20
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLS_TPOFF +0+24
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLSDESC_FN +0+40
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLSDESC_ARG +0+40
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLS_TPOFF +0+44
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLSDESC_FN +0+60
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLSDESC_ARG +0+60
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLS_TPOFF +0+64
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLSDESC_FN +0+
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLSDESC_ARG +0+
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLS_TPOFF +0+24
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLS_TPOFF +0+44
+[0-9a-f]+ +[0-9a-f]+ R_XTENSA_TLS_TPOFF +0+64
+
+Symbol table '\.dynsym' contains [0-9]+ entries:
+ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
+ +[0-9]+: 0+ +0 +NOTYPE +LOCAL +DEFAULT +UND *
+ +[0-9]+: 0+1c +0 +TLS +GLOBAL +DEFAULT +7 sg8
+ +[0-9]+: 0+8 +0 +TLS +GLOBAL +DEFAULT +7 sg3
+ +[0-9]+: 0+c +0 +TLS +GLOBAL +DEFAULT +7 sg4
+ +[0-9]+: 0+10 +0 +TLS +GLOBAL +DEFAULT +7 sg5
+ +[0-9]+: 0+ +0 +TLS +GLOBAL +DEFAULT +7 sg1
+ +[0-9]+: 0+350 +0 +FUNC +GLOBAL +DEFAULT +5 _start
+ +[0-9]+: [0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +ABS __bss_start
+ +[0-9]+: 0+4 +0 +TLS +GLOBAL +DEFAULT +7 sg2
+ +[0-9]+: 0+14 +0 +TLS +GLOBAL +DEFAULT +7 sg6
+ +[0-9]+: 0+18 +0 +TLS +GLOBAL +DEFAULT +7 sg7
+ +[0-9]+: [0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +ABS _edata
+ +[0-9]+: [0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +ABS _end
+
+Symbol table '\.symtab' contains [0-9]+ entries:
+ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
+ +[0-9]+: 0+ +0 +NOTYPE +LOCAL +DEFAULT +UND *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +1 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +2 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +3 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +4 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +5 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +6 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +7 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +8 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +9 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +10 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +11 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +12 *
+ +[0-9]+: [0-9a-f]+ +0 +SECTION +LOCAL +DEFAULT +13 *
+ +[0-9]+: 0+20 +0 +TLS +LOCAL +DEFAULT +7 sl1
+ +[0-9]+: 0+24 +0 +TLS +LOCAL +DEFAULT +7 sl2
+ +[0-9]+: 0+28 +0 +TLS +LOCAL +DEFAULT +7 sl3
+ +[0-9]+: 0+2c +0 +TLS +LOCAL +DEFAULT +7 sl4
+ +[0-9]+: 0+30 +0 +TLS +LOCAL +DEFAULT +7 sl5
+ +[0-9]+: 0+34 +0 +TLS +LOCAL +DEFAULT +7 sl6
+ +[0-9]+: 0+38 +0 +TLS +LOCAL +DEFAULT +7 sl7
+ +[0-9]+: 0+3c +0 +TLS +LOCAL +DEFAULT +7 sl8
+ +[0-9]+: 0+60 +0 +TLS +LOCAL +DEFAULT +8 sH1
+ +[0-9]+: 0+ +0 +TLS +LOCAL +DEFAULT +7 _TLS_MODULE_BASE_
+ +[0-9]+: 0+144c +0 +OBJECT +LOCAL +DEFAULT +ABS _DYNAMIC
+ +[0-9]+: 0+48 +0 +TLS +LOCAL +DEFAULT +7 sh3
+ +[0-9]+: 0+64 +0 +TLS +LOCAL +DEFAULT +8 sH2
+ +[0-9]+: 0+78 +0 +TLS +LOCAL +DEFAULT +8 sH7
+ +[0-9]+: 0+58 +0 +TLS +LOCAL +DEFAULT +7 sh7
+ +[0-9]+: 0+5c +0 +TLS +LOCAL +DEFAULT +7 sh8
+ +[0-9]+: 0+6c +0 +TLS +LOCAL +DEFAULT +8 sH4
+ +[0-9]+: 0+4c +0 +TLS +LOCAL +DEFAULT +7 sh4
+ +[0-9]+: 0+68 +0 +TLS +LOCAL +DEFAULT +8 sH3
+ +[0-9]+: 0+50 +0 +TLS +LOCAL +DEFAULT +7 sh5
+ +[0-9]+: 0+70 +0 +TLS +LOCAL +DEFAULT +8 sH5
+ +[0-9]+: 0+74 +0 +TLS +LOCAL +DEFAULT +8 sH6
+ +[0-9]+: 0+7c +0 +TLS +LOCAL +DEFAULT +8 sH8
+ +[0-9]+: 0+40 +0 +TLS +LOCAL +DEFAULT +7 sh1
+ +[0-9]+: 0+44 +0 +TLS +LOCAL +DEFAULT +7 sh2
+ +[0-9]+: 0+54 +0 +TLS +LOCAL +DEFAULT +7 sh6
+ +[0-9]+: 0+1c +0 +TLS +GLOBAL +DEFAULT +7 sg8
+ +[0-9]+: 0+8 +0 +TLS +GLOBAL +DEFAULT +7 sg3
+ +[0-9]+: 0+c +0 +TLS +GLOBAL +DEFAULT +7 sg4
+ +[0-9]+: 0+10 +0 +TLS +GLOBAL +DEFAULT +7 sg5
+ +[0-9]+: 0+ +0 +TLS +GLOBAL +DEFAULT +7 sg1
+ +[0-9]+: 0+350 +0 +FUNC +GLOBAL +DEFAULT +5 _start
+ +[0-9]+: [0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +ABS __bss_start
+ +[0-9]+: 0+4 +0 +TLS +GLOBAL +DEFAULT +7 sg2
+ +[0-9]+: 0+14 +0 +TLS +GLOBAL +DEFAULT +7 sg6
+ +[0-9]+: 0+18 +0 +TLS +GLOBAL +DEFAULT +7 sg7
+ +[0-9]+: [0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +ABS _edata
+ +[0-9]+: [0-9a-f]+ +0 +NOTYPE +GLOBAL +DEFAULT +ABS _end
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/tlspic.sd b/binutils-2.21/ld/testsuite/ld-xtensa/tlspic.sd
new file mode 100644
index 0000000..57dafc0
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/tlspic.sd
@@ -0,0 +1,17 @@
+#source: tlspic1.s
+#source: tlspic2.s
+#as:
+#ld: -shared -melf32xtensa
+#objdump: -sj.text --stop-address=0x350
+#target: xtensa*-*-linux*
+
+.*: +file format elf32-xtensa-.e
+
+Contents of section .text:
+ 0+2e0 0+ 0+ 0+ 0+ .*
+ 0+2f0 0+ 0+ 0+ 0+ .*
+ 0+300 0+ 0+ 0+ 0+ .*
+ 0+310 0+ 0+ 0+ 0+ .*
+ 0+320 0+ 0+ 0*200* 0*260* .*
+ 0+330 0*400* 0*470* 0*600* 0*650* .*
+ 0+340 0+ 0+ 0+ 0+ .*
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/tlspic.td b/binutils-2.21/ld/testsuite/ld-xtensa/tlspic.td
new file mode 100644
index 0000000..d3e11d3
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/tlspic.td
@@ -0,0 +1,16 @@
+#source: tlspic1.s
+#source: tlspic2.s
+#as:
+#ld: -shared -melf32xtensa
+#objdump: -sj.tdata
+#target: xtensa*-*-linux*
+
+.*: +file format elf32-xtensa-.e
+
+Contents of section .tdata:
+ *[0-9a-f]+ 0*110* 0*120* 0*130* 0*140* .*
+ *[0-9a-f]+ 0*150* 0*160* 0*170* 0*180* .*
+ *[0-9a-f]+ 0*410* 0*420* 0*430* 0*440* .*
+ *[0-9a-f]+ 0*450* 0*460* 0*470* 0*480* .*
+ *[0-9a-f]+ 0*9d0* 0*9e0* 0*9f0* 0*a00* .*
+ *[0-9a-f]+ 0*a10* 0*a20* 0*a30* 0*a40* .*
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/tlspic1.s b/binutils-2.21/ld/testsuite/ld-xtensa/tlspic1.s
new file mode 100644
index 0000000..9ecde66
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/tlspic1.s
@@ -0,0 +1,120 @@
+ .section ".tdata", "awT", @progbits
+ .global sg1, sg2, sg3, sg4, sg5, sg6, sg7, sg8
+ .global sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
+ .hidden sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
+ .align 4
+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 157
+sh2: .long 158
+sh3: .long 159
+sh4: .long 160
+sh5: .long 161
+sh6: .long 162
+sh7: .long 163
+sh8: .long 164
+
+ .text
+ .global _start
+ .type _start, @function
+_start:
+ entry sp, 32
+
+ /* GD */
+ movi a8, sg1@tlsfunc
+ movi a10, sg1@tlsarg
+ callx8.tls a8, sg1@tlscall
+
+ /* GD -> IE because variable is referenced through IE too */
+ movi a8, sg2@tlsfunc
+ movi a10, sg2@tlsarg
+ callx8.tls a8, sg2@tlscall
+
+ /* GD against local variable */
+ movi a8, sl1@tlsfunc
+ movi a10, sl1@tlsarg
+ callx8.tls a8, sl1@tlscall
+
+ /* GD -> IE against local variable referenced through IE too */
+ movi a8, sl2@tlsfunc
+ movi a10, sl2@tlsarg
+ callx8.tls a8, sl2@tlscall
+
+ /* GD against hidden and local variable */
+ movi a8, sh1@tlsfunc
+ movi a10, sh1@tlsarg
+ callx8.tls a8, sh1@tlscall
+
+ /* GD -> IE against hidden and local variable referenced through
+ IE too */
+ movi a8, sh2@tlsfunc
+ movi a10, sh2@tlsarg
+ callx8.tls a8, sh2@tlscall
+
+ /* GD against hidden but not local variable */
+ movi a8, sH1@tlsfunc
+ movi a10, sH1@tlsarg
+ callx8.tls a8, sH1@tlscall
+
+ /* GD -> IE against hidden but not local variable referenced through
+ IE too */
+ movi a8, sH2@tlsfunc
+ movi a10, sH2@tlsarg
+ callx8.tls a8, sH2@tlscall
+
+ /* LD */
+ movi a8, _TLS_MODULE_BASE_@tlsfunc
+ movi a10, _TLS_MODULE_BASE_@tlsarg
+ callx8.tls a8, _TLS_MODULE_BASE_@tlscall
+ movi a12, sl1@dtpoff
+ add a12, a12, a10
+ movi a13, 2+sl2@dtpoff
+ add a13, a13, a10
+
+ /* LD against hidden and local variables */
+ movi a12, sh1@dtpoff
+ add a12, a12, a10
+ movi a13, sh2@dtpoff+3
+ add a13, a13, a10
+
+ /* LD against hidden but not local variables */
+ movi a12, sH1@dtpoff
+ add a12, a12, a10
+ movi a13, sH2@dtpoff+1
+ add a13, a13, a10
+
+ /* IE against global var */
+ rur a2, THREADPTR
+ movi a3, sg2@tpoff
+ add a3, a3, a2
+
+ /* IE against local var */
+ rur a4, THREADPTR
+ movi a5, sl2@tpoff
+ add a5, a5, a4
+
+ /* IE against hidden and local var */
+ rur a6, THREADPTR
+ movi a7, sh2@tpoff
+ add a7, a7, a6
+
+ /* IE against hidden but not local var */
+ rur a8, THREADPTR
+ movi a9, sH2@tpoff
+ add a9, a9, a8
+
+ retw
diff --git a/binutils-2.21/ld/testsuite/ld-xtensa/tlspic2.s b/binutils-2.21/ld/testsuite/ld-xtensa/tlspic2.s
new file mode 100644
index 0000000..9f337e7
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/tlspic2.s
@@ -0,0 +1,12 @@
+ .section ".tbss", "awT", @nobits
+ .global sH1, sH2, sH3, sH4, sH5, sH6, sH7, sH8
+ .hidden sH1, sH2, sH3, sH4, sH5, sH6, sH7, sH8
+ .align 4
+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/binutils-2.21/ld/testsuite/ld-xtensa/xtensa.exp b/binutils-2.21/ld/testsuite/ld-xtensa/xtensa.exp
new file mode 100644
index 0000000..e6dc827
--- /dev/null
+++ b/binutils-2.21/ld/testsuite/ld-xtensa/xtensa.exp
@@ -0,0 +1,54 @@
+# Expect script for ld-xtensa tests
+# Copyright (C) 2008 Free Software Foundation
+#
+# This file is part of the GNU Binutils.
+#
+# This program 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 3 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., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+#
+
+if { !([istarget "xtensa*-*-linux*"]) } {
+ 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 xtensatests {
+ {"TLS -shared transitions"
+ "-shared -melf32xtensa" "" {tlspic1.s tlspic2.s}
+ {{readelf -WSsrl tlspic.rd}
+ {objdump "-drj.text --start-address=0x350" tlspic.dd}
+ {objdump "-sj.text --stop-address=0x350" tlspic.sd}
+ {objdump -sj.tdata tlspic.td}}
+ "libtlspic.so"}
+ {"Helper shared library" "-shared -melf32xtensa"
+ "" {tlslib.s} {} "libtlslib.so"}
+ {"TLS exec transitions"
+ "-melf32xtensa tmpdir/libtlslib.so" "" {tlsbin.s}
+ {{readelf -WSsrl tlsbin.rd}
+ {objdump "-drj.text --start-address=0x400238" tlsbin.dd}
+ {objdump "-sj.text --stop-address=0x400238" tlsbin.sd}
+ {objdump -sj.tdata tlsbin.td}}
+ "tlsbin"}
+}
+
+run_ld_link_tests $xtensatests