old-cross-binutils/ld/testsuite/ld-mips-elf/mips-elf.exp
Richard Sandiford 738e53487d bfd/
* reloc.c (BFD_RELOC_MIPS16_GOT16, BFD_RELOC_MIPS16_CALL16): Declare.
	* libbfd.h, bfd-in2.h: Regenerate.
	* elf32-mips.c (elf_mips16_howto_table_rel): Fill in reserved
	R_MIPS16_GOT16 and R_MIPS16_CALL16 entries.
	(mips16_reloc_map): Add mappings.
	* elf64-mips.c (mips16_elf64_howto_table_rel): Fill in reserved
	R_MIPS16_GOT16 and R_MIPS16_CALL16 entries.
	(mips16_elf64_howto_table_rela): Likewise.
	(mips16_reloc_map): Add mappings.
	* elfn32-mips.c (elf_mips16_howto_table_rel): Fill in reserved
	R_MIPS16_GOT16 and R_MIPS16_CALL16 entries.
	(elf_mips16_howto_table_rela): Likewise.
	(mips16_reloc_map): Add mappings.
	* elfxx-mips.c (mips_elf_create_shadow_symbol): New function.
	(section_allows_mips16_refs_p): Likewise.
	(mips16_stub_symndx): Likewise.
	(mips_elf_check_mips16_stubs): Treat the data argument as a
	bfd_link_info.  Mark every dynamic symbol as needing MIPS16 stubs
	and create a "shadow" symbol for the original MIPS16 definition.
	(mips16_reloc_p, got16_reloc_p, call16_reloc_p, hi16_reloc_p)
	(lo16_reloc_p, mips16_call_reloc_p): New functions.
	(_bfd_mips16_elf_reloc_unshuffle): Use mips16_reloc_p to generalize
	relocation checks.
	(_bfd_mips16_elf_reloc_shuffle): Likewise.
	(_bfd_mips_elf_lo16_reloc): Handle R_MIPS16_GOT16.
	(mips_elf_got16_entry): Add comment.
	(mips_elf_calculate_relocation): Use hi16_reloc_p,
	lo16_reloc_p, mips16_call_reloc_p, call16_reloc_p and got16_reloc_p
	to generalize relocation checks.  Use section_allows_mips16_refs_p
	instead of mips16_stub_section_p.   Handle R_MIPS16_CALL16 and
	R_MIPS16_GOT16, allowing the former to refer directly to a
	MIPS16 function if its stub is not needed.
	(mips16_stub_section_p): Delete.
	(_bfd_mips_elf_symbol_processing): Convert odd-valued function
	symbols into even MIPS16 symbols.
	(mips_elf_add_lo16_rel_addend): Use mips16_reloc_p to generalize
	a relocation check.
	(_bfd_mips_elf_check_relocs): Calculate "bed" and "rel_end"
	earlier in the function.  Use mips16_stub_symndx to identify
	the target function.  Avoid out-of-bounds accesses when the
	stub has no relocations; report an error instead.  Use
	section_allows_mips16_refs_p instead of mips16_stub_section_p.
	Use mips16_call_reloc_p and got16_reloc_p to generalize relocation
	checks.  Handle R_MIPS16_CALL16 and R_MIPS16_GOT16.  Don't create
	dynamic relocations for absolute references to __gnu_local_gp.
	(_bfd_mips_elf_always_size_sections): Pass a bfd_link_info as
	the argument to mips_elf_check_mips16_stubs.  Generalize comment.
	(_bfd_mips_elf_relocate_section): Use hi16_reloc_p and got16_reloc_p
	to generalize relocation checks.
	(_bfd_mips_elf_finish_dynamic_symbol): If a dynamic MIPS16 function
	symbol has a non-MIPS16 stub, redirect the symbol to the stub.
	Fix an overly long line.  Don't give dynamic symbols type STO_MIPS16.
	(_bfd_mips_elf_gc_sweep_hook): Handle R_MIPS16_CALL16 and
	R_MIPS16_GOT16.

gas/
	* config/tc-mips.c (mips16_reloc_p, got16_reloc_p, hi16_reloc_p)
	(lo16_reloc_p): New functions.
	(reloc_needs_lo_p): Use hi16_reloc_p and got16_reloc_p to
	generalize relocation checks.
	(matching_lo_reloc): New function.
	(fixup_has_matching_lo_p): Use it.
	(mips16_mark_labels): Don't clobber a symbol's visibility.
	(append_insn): Use hi16_reloc_p and lo16_reloc_p.
	(mips16_ip): Handle BFD_RELOC_MIPS16_GOT16 and BFD_RELOC_MIPS16_CALL16.
	(md_apply_fix): Likewise.
	(mips16_percent_op): Add %got and %call16.
	(mips_frob_file): Use got16_reloc_p to generalize relocation checks.
	Use matching_lo_reloc.
	(mips_force_relocation): Use hi16_reloc_p and lo16_reloc_p to
	generalize relocation checks.
	(mips_fix_adjustable): Use lo16_reloc_p to generalize relocation
	checks.

gas/testsuite/
	* gas/mips/elf-rel8-mips16.d, gas/mips/elf-rel8-mips16.s,
	* gas/mips/elf-rel9-mips16.d, gas/mips/elf-rel9-mips16.s,
	* gas/mips/elf-rel13-mips16.d, gas/mips/elf-rel13-mips16.s: New tests.
	* gas/mips/mips.exp: Run them.

ld/testsuite/
	* ld-mips-elf/mips16-local-stubs-1.d: Remove stub_for_h3,
	which was only referenced by the .pdr section, and was not
	actually needed by code.
	* ld-mips-elf/mips16-intermix.d: Remove unused static function stubs.
	* ld-mips-elf/mips16-pic-1a.s,
	ld-mips-elf/mips16-pic-1b.s,
	ld-mips-elf/mips16-pic-1-dummy.s,
	ld-mips-elf/mips16-pic-1.dd,
	ld-mips-elf/mips16-pic-1.gd,
	ld-mips-elf/mips16-pic-1.inc,
	ld-mips-elf/mips16-pic-1.ld,
	ld-mips-elf/mips16-pic-2a.s,
	ld-mips-elf/mips16-pic-2b.s,
	ld-mips-elf/mips16-pic-2.ad,
	ld-mips-elf/mips16-pic-2.dd,
	ld-mips-elf/mips16-pic-2.gd,
	ld-mips-elf/mips16-pic-2.nd,
	ld-mips-elf/mips16-pic-2.rd: New tests.
	* ld-mips-elf/mips-elf.exp: Run them.
2008-08-06 19:44:47 +00:00

364 lines
12 KiB
Text

# Expect script for MIPS ELF linker tests
# Copyright 2002, 2003, 2004, 2005, 2007 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 "mips*-*-vxworks"]} {
set mipsvxtests {
{"VxWorks shared library test 1" "-shared -Tvxworks1.ld"
"-mips2" {vxworks1-lib.s}
{{readelf --relocs vxworks1-lib.rd} {objdump -dr vxworks1-lib.dd}
{readelf --symbols vxworks1-lib.nd} {readelf -d vxworks1-lib.td}}
"libvxworks1.so"}
{"VxWorks executable test 1 (dynamic)" \
"tmpdir/libvxworks1.so -Tvxworks1.ld -q --force-dynamic"
"-mips2" {vxworks1.s}
{{readelf --relocs vxworks1.rd} {objdump -dr vxworks1.dd}}
"vxworks1"}
{"VxWorks executable test 2 (dynamic)" \
"-Tvxworks1.ld -q --force-dynamic"
"-mips2" {vxworks2.s}
{{readelf --segments vxworks2.sd}}
"vxworks2"}
{"VxWorks executable test 2 (static)"
"-Tvxworks1.ld"
"-mips2" {vxworks2.s}
{{readelf --segments vxworks2-static.sd}}
"vxworks2"}
}
run_ld_link_tests $mipsvxtests
run_dump_test "vxworks1-static"
run_dump_test "vxworks-forced-local-1"
return
}
if {![istarget mips*-*-*] || ![is_elf_format]} {
return
}
set has_newabi [expr [istarget *-*-irix6*] || [istarget mips64*-*-linux*]]
set linux_gnu [expr [istarget mips*-*-linux*]]
set embedded_elf [expr [istarget mips*-*-elf]]
if { $linux_gnu } {
run_ld_link_tests [list \
[list "Dummy shared library for MIPS16 PIC test 1" \
"-shared -melf32btsmip" \
"-EB -32" { mips16-pic-1-dummy.s } \
{} \
"mips16-pic-1-dummy.so"] \
[list "MIPS16 PIC test 1" \
"-melf32btsmip -T mips16-pic-1.ld tmpdir/mips16-pic-1-dummy.so" \
"-EB -32 -I $srcdir/$subdir" { mips16-pic-1a.s mips16-pic-1b.s } \
{ { objdump { -dr -j.text } mips16-pic-1.dd }
{ readelf -A mips16-pic-1.gd } } \
"mips16-pic-1"] \
[list "MIPS16 PIC test 2" \
"-melf32btsmip -T mips16-pic-1.ld -shared" \
"-EB -32 -I $srcdir/$subdir" { mips16-pic-2a.s mips16-pic-2b.s } \
{ { objdump { -dr -j.text } mips16-pic-2.dd } \
{ readelf -A mips16-pic-2.gd } \
{ readelf --symbols mips16-pic-2.nd } \
{ readelf --relocs mips16-pic-2.rd } \
{ readelf -d mips16-pic-2.ad } } \
"mips16-pic-2"]]
}
if { [istarget mips64*-linux-gnu] } {
set o32_as_flags "-32 -EB"
set o32_ld_flags "-melf32btsmip"
} else {
set o32_as_flags ""
set o32_ld_flags ""
}
# Check MIPS16 markings being passed through link.
run_dump_test "mips16-1"
# MIPS branch offset final link checking.
run_dump_test "branch-misc-1"
# Test multi-got link. We only do this on GNU/Linux because it requires
# the "traditional" emulations.
if { $linux_gnu } {
run_dump_test "multi-got-1"
run_dump_test "multi-got-no-shared"
run_dump_test "multi-got-hidden-1"
run_dump_test "multi-got-hidden-2"
}
# Test __gnu_local_gp accesses
if { $linux_gnu } {
run_dump_test "no-shared-1-o32"
if { $has_newabi } {
run_dump_test "no-shared-1-n32"
run_dump_test "no-shared-1-n64"
}
}
if $has_newabi {
run_dump_test "elf-rel-got-n32"
run_dump_test "elf-rel-xgot-n32"
if { $linux_gnu } {
run_dump_test "elf-rel-got-n64-linux"
run_dump_test "elf-rel-xgot-n64-linux"
} else {
run_dump_test "elf-rel-got-n64"
run_dump_test "elf-rel-xgot-n64"
}
run_dump_test "relax-jalr-n32"
run_dump_test "relax-jalr-n32-shared"
run_dump_test "relax-jalr-n64"
run_dump_test "relax-jalr-n64-shared"
}
if { $linux_gnu } {
run_dump_test "rel32-o32"
run_dump_test "rel32-n32"
run_dump_test "rel64"
}
if { $embedded_elf } {
run_dump_test "region1"
}
if $embedded_elf {
# This could work on other targets too, but would need the appropriate
# ld -m switch.
run_dump_test "reloc-1-rel"
}
if $has_newabi {
run_dump_test "reloc-1-n32"
if $linux_gnu {
# Uses a linux-specific ld -m switch
run_dump_test "reloc-1-n64"
}
}
run_dump_test "reloc-2"
run_dump_test "reloc-merge-lo16"
run_dump_test "reloc-3"
if {$has_newabi} {
run_dump_test "reloc-3-n32"
}
run_dump_test "reloc-4"
run_dump_test "reloc-5"
if {$has_newabi && $linux_gnu} {
run_dump_test "eh-frame1-n32"
run_dump_test "eh-frame1-n64"
run_dump_test "eh-frame2-n32"
run_dump_test "eh-frame2-n64"
}
if {$embedded_elf} {
run_dump_test "eh-frame3"
run_dump_test "eh-frame4"
}
run_dump_test "jaloverflow"
run_dump_test "jaloverflow-2"
if {$has_newabi} {
run_dump_test "jalbal"
}
run_dump_test "mips16-hilo"
if {$has_newabi} {
run_dump_test "mips16-hilo-n32"
}
if { $linux_gnu } {
run_dump_test "textrel-1"
run_dump_test "got-page-1"
if $has_newabi {
run_dump_test "got-page-2"
run_dump_test "dyn-sec64"
}
run_dump_test "got-page-3"
run_dump_test "got-dump-1"
if $has_newabi {
run_dump_test "got-dump-2"
}
}
if $has_newabi {
run_dump_test "emit-relocs-1"
}
run_dump_test "hash1a"
run_dump_test "hash1b"
run_dump_test "hash1c"
if {[istarget mips*-*-linux*]} {
# The number of symbols that are always included in the symbol table
# for these tests. The 4 are:
#
# the null symbol entry
# the .MIPS.stubs section symbol
# _gp
# _GLOBAL_OFFSET_TABLE_
set base_syms 4
foreach dynsym { 7fff 8000 fff0 10000 2fe80 } {
run_ld_link_tests \
[list [list \
"Stub for dynsym 0x$dynsym" \
"-shared -melf32btsmip -T stub-dynsym-1.ld" \
[concat \
"-EB -march=mips1 -32 -KPIC" \
"--defsym base_syms=$base_syms" \
"--defsym dynsym=0x$dynsym"] \
[list "stub-dynsym-1.s"] \
[list [list \
"objdump" "-dz" \
"stub-dynsym-1-$dynsym.d"]] \
"stub-dynsym-1-$dynsym"]]
}
}
# For tests which may involve multiple files, use run_ld_link_tests.
# 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 mips_tls_tests {
{"Static executable with TLS" "-static -melf32btsmip -T mips-dyn.ld"
"-EB -march=mips1 -32 -KPIC" {tlsbin-o32.s}
{{objdump {-dr -m mips:isa32r2} tlsbin-o32.d} {objdump -srj.got tlsbin-o32.got}}
"tls-static-o32"}
{"Shared library with TLS" "-shared -melf32btsmip -T mips-lib.ld"
"-EB -march=mips1 -32 -KPIC" {tlslib-o32.s}
{{objdump {-dr -m mips:isa32r2} tlslib-o32.d} {objdump -Rsj.got tlslib-o32.got}}
"tlslib-o32.so"}
{"Dynamic executable with TLS"
"-melf32btsmip -T mips-dyn.ld tmpdir/tlslib-o32.so"
"-EB -march=mips1 -32 -KPIC" {tlsdyn-o32.s}
{{objdump {-dr -m mips:isa32r2} tlsdyn-o32.d} {objdump -Rsj.got tlsdyn-o32.got}}
"tls-dynamic-o32"}
{"Shared library with multiple GOTs and TLS"
"-shared -melf32btsmip -T mips-lib.ld"
"-EB -march=mips1 -32 -KPIC" {tls-multi-got-1-1.s tls-multi-got-1-2.s}
{{readelf {-d -r} tls-multi-got-1.r}
{objdump {-dr -m mips:isa32r2} tls-multi-got-1.d}
{objdump -Rsj.got tls-multi-got-1.got}}
"tlslib-multi.so"}
{"Shared library with TLS and versioning"
"-shared -melf32btsmip -T mips-lib.ld --version-script tlslib.ver"
"-EB -march=mips1 -32 -KPIC" {tlslib-o32.s}
{{objdump {-dr -m mips:isa32r2} tlslib-o32.d} {objdump -Rsj.got tlslib-o32-ver.got}}
"tlslib-o32-ver.so"}
{"Dynamic executable with TLS and versioning"
"-melf32btsmip -T mips-dyn.ld tmpdir/tlslib-o32-ver.so"
"-EB -march=mips1 -32 -KPIC" {tlsdyn-o32.s tlsdyn-o32-2.s}
{{objdump {-dr -m mips:isa32r2} tlsdyn-o32-1.d} {objdump -Rsj.got tlsdyn-o32-1.got}}
"tls-dynamic-o32-ver"}
{"Dynamic executable with TLS and versioning (order 2)"
"-melf32btsmip -T mips-dyn.ld tmpdir/tlsdyn-o32.o tmpdir/tlslib-o32-ver.so tmpdir/tlsdyn-o32-2.o"
"-EB -march=mips1 -32 -KPIC" {}
{{objdump {-dr -m mips:isa32r2} tlsdyn-o32-2.d} {objdump -Rsj.got tlsdyn-o32-2.got}}
"tls-dynamic-o32-ver-2"}
{"Dynamic executable with TLS and versioning (order 3)"
"-melf32btsmip -T mips-dyn.ld tmpdir/tlsdyn-o32-2.o tmpdir/tlslib-o32-ver.so tmpdir/tlsdyn-o32.o"
"-EB -march=mips1 -32 -KPIC" {}
{{objdump {-dr -m mips:isa32r2} tlsdyn-o32-3.d} {objdump -Rsj.got tlsdyn-o32-3.got}}
"tls-dynamic-o32-ver-3"}
{"Shared library with TLS and hidden symbols"
"-shared -melf32btsmip -T mips-lib.ld --version-script tlslib-hidden.ver"
"-EB -march=mips1 -32 -KPIC" {tlslib-o32.s}
{{objdump {-dr -m mips:isa32r2} tlslib-o32.d} {objdump -Rsj.got tlslib-o32-hidden.got}}
"tlslib-o32-hidden.so"}
{"Shared library with TLS and hidden symbols (2)"
"-shared -melf32btsmip -T mips-lib.ld"
"-EB -march=mips1 -32 -KPIC" {tls-hidden2a.s tls-hidden2b.s}
{{objdump -drj.text tls-hidden2.d} {objdump -sj.got tls-hidden2-got.d}}
"tls-hidden2.so"}
{"Shared library with TLS and hidden symbols (3)"
"-shared -melf32btsmip -T tls-hidden3.ld"
"-EB -march=mips2 -32 -KPIC" {tls-hidden3a.s tls-hidden3b.s}
{{objdump -dj.text tls-hidden3.d} {objdump -sj.got tls-hidden3.got}
{readelf --relocs tls-hidden3.r}}
"tls-hidden3.so"}
{"Shared library with TLS and hidden symbols (4)"
"-shared -melf32btsmip -T tls-hidden3.ld"
"-EB -march=mips2 -32 -KPIC" {tls-hidden4a.s tls-hidden4b.s}
{{objdump -sj.got tls-hidden4.got} {readelf --relocs tls-hidden4.r}}
"tls-hidden4.so"}
}
if {[istarget mips*-*-linux*]} {
run_ld_link_tests $mips_tls_tests
}
set mips16_call_global_test [list \
[list "Global calls from mips16" \
"$o32_ld_flags" \
"$o32_as_flags -mips32r2" \
{mips16-call-global-1.s mips16-call-global-2.s mips16-call-global-3.s} \
{{objdump -dr mips16-call-global.d}} \
"mips16-call-global"]]
run_ld_link_tests $mips16_call_global_test
set mips16_intermix_test [list \
[list "Intermixing mips32 and mips16 functions" \
"$o32_ld_flags" \
"$o32_as_flags -mips32r2" \
{mips16-intermix-1.s mips16-intermix-2.s} \
{{objdump -t mips16-intermix.d}} \
"mips16-intermix"]]
run_ld_link_tests $mips16_intermix_test
run_dump_test "mips16-local-stubs-1"
run_dump_test "attr-gnu-4-00"
run_dump_test "attr-gnu-4-01"
run_dump_test "attr-gnu-4-02"
run_dump_test "attr-gnu-4-03"
run_dump_test "attr-gnu-4-04"
run_dump_test "attr-gnu-4-05"
run_dump_test "attr-gnu-4-10"
run_dump_test "attr-gnu-4-11"
run_dump_test "attr-gnu-4-12"
run_dump_test "attr-gnu-4-13"
run_dump_test "attr-gnu-4-14"
run_dump_test "attr-gnu-4-15"
run_dump_test "attr-gnu-4-20"
run_dump_test "attr-gnu-4-21"
run_dump_test "attr-gnu-4-22"
run_dump_test "attr-gnu-4-23"
run_dump_test "attr-gnu-4-24"
run_dump_test "attr-gnu-4-25"
run_dump_test "attr-gnu-4-30"
run_dump_test "attr-gnu-4-31"
run_dump_test "attr-gnu-4-32"
run_dump_test "attr-gnu-4-33"
run_dump_test "attr-gnu-4-34"
run_dump_test "attr-gnu-4-35"
run_dump_test "attr-gnu-4-40"
run_dump_test "attr-gnu-4-41"
run_dump_test "attr-gnu-4-42"
run_dump_test "attr-gnu-4-43"
run_dump_test "attr-gnu-4-44"
run_dump_test "attr-gnu-4-45"
run_dump_test "attr-gnu-4-51"