From b9734f35729dfe8bba288ff1b6ab2c45fbacc03d Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 24 Jan 2003 23:44:45 +0000 Subject: 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. --- ld/testsuite/ChangeLog | 41 +++++ ld/testsuite/ld-sparc/sparc.exp | 88 +++++++++++ ld/testsuite/ld-sparc/tlsg32.s | 12 ++ ld/testsuite/ld-sparc/tlsg32.sd | 10 ++ ld/testsuite/ld-sparc/tlsg64.s | 12 ++ ld/testsuite/ld-sparc/tlsg64.sd | 11 ++ ld/testsuite/ld-sparc/tlslib.s | 20 +++ ld/testsuite/ld-sparc/tlsnopic.s | 8 + ld/testsuite/ld-sparc/tlspic.s | 12 ++ ld/testsuite/ld-sparc/tlssunbin32.dd | 273 +++++++++++++++++++++++++++++++++ ld/testsuite/ld-sparc/tlssunbin32.rd | 137 +++++++++++++++++ ld/testsuite/ld-sparc/tlssunbin32.s | 114 ++++++++++++++ ld/testsuite/ld-sparc/tlssunbin32.sd | 11 ++ ld/testsuite/ld-sparc/tlssunbin32.td | 19 +++ ld/testsuite/ld-sparc/tlssunbin64.dd | 11 ++ ld/testsuite/ld-sparc/tlssunbin64.rd | 8 + ld/testsuite/ld-sparc/tlssunbin64.s | 118 ++++++++++++++ ld/testsuite/ld-sparc/tlssunbin64.sd | 11 ++ ld/testsuite/ld-sparc/tlssunbin64.td | 11 ++ ld/testsuite/ld-sparc/tlssunbinpic32.s | 183 ++++++++++++++++++++++ ld/testsuite/ld-sparc/tlssunbinpic64.s | 182 ++++++++++++++++++++++ ld/testsuite/ld-sparc/tlssunnopic32.dd | 84 ++++++++++ ld/testsuite/ld-sparc/tlssunnopic32.rd | 112 ++++++++++++++ ld/testsuite/ld-sparc/tlssunnopic32.s | 77 ++++++++++ ld/testsuite/ld-sparc/tlssunnopic32.sd | 12 ++ ld/testsuite/ld-sparc/tlssunnopic64.dd | 12 ++ ld/testsuite/ld-sparc/tlssunnopic64.rd | 9 ++ ld/testsuite/ld-sparc/tlssunnopic64.s | 81 ++++++++++ ld/testsuite/ld-sparc/tlssunnopic64.sd | 12 ++ ld/testsuite/ld-sparc/tlssunpic32.dd | 220 ++++++++++++++++++++++++++ ld/testsuite/ld-sparc/tlssunpic32.rd | 155 +++++++++++++++++++ ld/testsuite/ld-sparc/tlssunpic32.s | 228 +++++++++++++++++++++++++++ ld/testsuite/ld-sparc/tlssunpic32.sd | 15 ++ ld/testsuite/ld-sparc/tlssunpic32.td | 16 ++ ld/testsuite/ld-sparc/tlssunpic64.dd | 12 ++ ld/testsuite/ld-sparc/tlssunpic64.rd | 9 ++ ld/testsuite/ld-sparc/tlssunpic64.s | 228 +++++++++++++++++++++++++++ ld/testsuite/ld-sparc/tlssunpic64.sd | 12 ++ ld/testsuite/ld-sparc/tlssunpic64.td | 12 ++ 39 files changed, 2598 insertions(+) create mode 100644 ld/testsuite/ld-sparc/sparc.exp create mode 100644 ld/testsuite/ld-sparc/tlsg32.s create mode 100644 ld/testsuite/ld-sparc/tlsg32.sd create mode 100644 ld/testsuite/ld-sparc/tlsg64.s create mode 100644 ld/testsuite/ld-sparc/tlsg64.sd create mode 100644 ld/testsuite/ld-sparc/tlslib.s create mode 100644 ld/testsuite/ld-sparc/tlsnopic.s create mode 100644 ld/testsuite/ld-sparc/tlspic.s create mode 100644 ld/testsuite/ld-sparc/tlssunbin32.dd create mode 100644 ld/testsuite/ld-sparc/tlssunbin32.rd create mode 100644 ld/testsuite/ld-sparc/tlssunbin32.s create mode 100644 ld/testsuite/ld-sparc/tlssunbin32.sd create mode 100644 ld/testsuite/ld-sparc/tlssunbin32.td create mode 100644 ld/testsuite/ld-sparc/tlssunbin64.dd create mode 100644 ld/testsuite/ld-sparc/tlssunbin64.rd create mode 100644 ld/testsuite/ld-sparc/tlssunbin64.s create mode 100644 ld/testsuite/ld-sparc/tlssunbin64.sd create mode 100644 ld/testsuite/ld-sparc/tlssunbin64.td create mode 100644 ld/testsuite/ld-sparc/tlssunbinpic32.s create mode 100644 ld/testsuite/ld-sparc/tlssunbinpic64.s create mode 100644 ld/testsuite/ld-sparc/tlssunnopic32.dd create mode 100644 ld/testsuite/ld-sparc/tlssunnopic32.rd create mode 100644 ld/testsuite/ld-sparc/tlssunnopic32.s create mode 100644 ld/testsuite/ld-sparc/tlssunnopic32.sd create mode 100644 ld/testsuite/ld-sparc/tlssunnopic64.dd create mode 100644 ld/testsuite/ld-sparc/tlssunnopic64.rd create mode 100644 ld/testsuite/ld-sparc/tlssunnopic64.s create mode 100644 ld/testsuite/ld-sparc/tlssunnopic64.sd create mode 100644 ld/testsuite/ld-sparc/tlssunpic32.dd create mode 100644 ld/testsuite/ld-sparc/tlssunpic32.rd create mode 100644 ld/testsuite/ld-sparc/tlssunpic32.s create mode 100644 ld/testsuite/ld-sparc/tlssunpic32.sd create mode 100644 ld/testsuite/ld-sparc/tlssunpic32.td create mode 100644 ld/testsuite/ld-sparc/tlssunpic64.dd create mode 100644 ld/testsuite/ld-sparc/tlssunpic64.rd create mode 100644 ld/testsuite/ld-sparc/tlssunpic64.s create mode 100644 ld/testsuite/ld-sparc/tlssunpic64.sd create mode 100644 ld/testsuite/ld-sparc/tlssunpic64.td (limited to 'ld') diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index f6b156a..aaffd33 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,44 @@ +2003-01-25 Jakub Jelinek + + * 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. + 2003-01-24 Martin Schwidefsky * ld-s390/s390.exp: New file. 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 : + +11000: 81 c3 e0 08 retl * + +11004: ae 03 c0 17 add %o7, %l7, %l7 + +0+11008 : + +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 : + +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 : + +1000: 81 c3 e0 08 retl * + +1004: ae 03 c0 17 add %o7, %l7, %l7 + +00001008 : + +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 -- cgit v1.1