summaryrefslogtreecommitdiff
path: root/gas/testsuite
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@nildram.co.uk>2008-08-06 19:44:47 +0000
committerRichard Sandiford <rsandifo@nildram.co.uk>2008-08-06 19:44:47 +0000
commit713e2aadd03574a40c338692366879c7f4cf06ad (patch)
tree0fd500b2c51158d90834aec8b931b73c3a67c526 /gas/testsuite
parent936a8a8bdfb2ceda749db6f3cfdab2805a92ae2e (diff)
downloadbinutils-redhat-713e2aadd03574a40c338692366879c7f4cf06ad.tar.gz
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.
Diffstat (limited to 'gas/testsuite')
-rw-r--r--gas/testsuite/ChangeLog7
-rw-r--r--gas/testsuite/gas/mips/elf-rel13-mips16.d17
-rw-r--r--gas/testsuite/gas/mips/elf-rel13-mips16.s24
-rw-r--r--gas/testsuite/gas/mips/elf-rel8-mips16.d38
-rw-r--r--gas/testsuite/gas/mips/elf-rel8-mips16.s39
-rw-r--r--gas/testsuite/gas/mips/elf-rel9-mips16.d70
-rw-r--r--gas/testsuite/gas/mips/elf-rel9-mips16.s59
-rw-r--r--gas/testsuite/gas/mips/mips.exp3
8 files changed, 257 insertions, 0 deletions
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 7516f50c32..e75b7cf50a 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2008-08-06 Richard Sandiford <rdsandiford@googlemail.com>
+
+ * 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.
+
2008-08-01 Peter Bergner <bergner@vnet.ibm.com>
* gas/ppc/power7.d: New.
diff --git a/gas/testsuite/gas/mips/elf-rel13-mips16.d b/gas/testsuite/gas/mips/elf-rel13-mips16.d
new file mode 100644
index 0000000000..aa404ab4c1
--- /dev/null
+++ b/gas/testsuite/gas/mips/elf-rel13-mips16.d
@@ -0,0 +1,17 @@
+#as: -march=mips2 -mabi=32 -KPIC
+#readelf: --relocs
+#name: MIPS ELF reloc 13 (MIPS16 version)
+
+Relocation section '\.rel\.text' at offset .* contains 9 entries:
+ *Offset * Info * Type * Sym\.Value * Sym\. Name
+0+0002 * 0+..66 * R_MIPS16_GOT16 * 0+0000 * \.data
+0+0016 * 0+..69 * R_MIPS16_LO16 * 0+0000 * \.data
+0+0012 * 0+..66 * R_MIPS16_GOT16 * 0+0000 * \.data
+0+001a * 0+..69 * R_MIPS16_LO16 * 0+0000 * \.data
+# The next two lines could be in either order.
+0+000e * 0+..66 * R_MIPS16_GOT16 * 0+0000 * \.rodata
+0+000a * 0+..66 * R_MIPS16_GOT16 * 0+0000 * \.rodata
+0+001e * 0+..69 * R_MIPS16_LO16 * 0+0000 * \.rodata
+0+0006 * 0+..66 * R_MIPS16_GOT16 * 0+0000 * \.bss
+0+0022 * 0+..69 * R_MIPS16_LO16 * 0+0000 * \.bss
+#pass
diff --git a/gas/testsuite/gas/mips/elf-rel13-mips16.s b/gas/testsuite/gas/mips/elf-rel13-mips16.s
new file mode 100644
index 0000000000..2983f0e2f0
--- /dev/null
+++ b/gas/testsuite/gas/mips/elf-rel13-mips16.s
@@ -0,0 +1,24 @@
+ .set mips16
+ .ent foo
+foo:
+ move $2,$28
+ lw $4,%got(l1)($2)
+ lw $4,%got(l2)($2)
+ lw $4,%got(l3)($2)
+ lw $4,%got(l3)($2)
+ lw $4,%got(l1+0x400)($2)
+ addiu $4,%lo(l1)
+ addiu $4,%lo(l1+0x400)
+ addiu $4,%lo(l3)
+ addiu $4,%lo(l2)
+ .align 5
+ .end foo
+
+ .data
+l1: .word 1
+
+ .lcomm l2, 4
+
+ .rdata
+ .word 1
+l3: .word 2
diff --git a/gas/testsuite/gas/mips/elf-rel8-mips16.d b/gas/testsuite/gas/mips/elf-rel8-mips16.d
new file mode 100644
index 0000000000..7c834fa5d2
--- /dev/null
+++ b/gas/testsuite/gas/mips/elf-rel8-mips16.d
@@ -0,0 +1,38 @@
+#as: -march=mips2 -mabi=32
+#objdump: -M gpr-names=numeric -dr
+#name: MIPS ELF reloc 8 (MIPS16 version)
+
+.*: file format .*
+
+Disassembly of section \.text:
+
+0+00 <foo>:
+ 0: 675c move \$2,\$28
+ 2: f000 6c00 li \$4,0
+ 2: R_MIPS16_HI16 gvar
+ 6: f400 3480 sll \$4,16
+ a: f000 4c00 addiu \$4,0
+ a: R_MIPS16_LO16 gvar
+ e: f000 9d80 lw \$4,0\(\$5\)
+ e: R_MIPS16_LO16 gvar
+ 12: f000 9982 lw \$4,2\(\$17\)
+ 16: f000 9a80 lw \$4,0\(\$2\)
+ 16: R_MIPS16_GOT16 \.data
+ 1a: f000 c4a0 sb \$5,0\(\$4\)
+ 1a: R_MIPS16_LO16 \.data
+ 1e: f000 9a80 lw \$4,0\(\$2\)
+ 1e: R_MIPS16_GOT16 \.data
+ 22: f000 4c00 addiu \$4,0
+ 22: R_MIPS16_LO16 \.data
+ 26: f000 9a60 lw \$3,0\(\$2\)
+ 26: R_MIPS16_CALL16 gfunc
+ 2a: f000 4c00 addiu \$4,0
+ 2a: R_MIPS16_CALL16 gfunc
+ 2e: f000 9a80 lw \$4,0\(\$2\)
+ 2e: R_MIPS16_GPREL gvar
+ 32: f000 da80 sw \$4,0\(\$2\)
+ 32: R_MIPS16_GPREL gvar
+ 36: f000 4c00 addiu \$4,0
+ 36: R_MIPS16_GPREL gvar
+ 3a: 6500 nop
+#pass
diff --git a/gas/testsuite/gas/mips/elf-rel8-mips16.s b/gas/testsuite/gas/mips/elf-rel8-mips16.s
new file mode 100644
index 0000000000..0c9eefe652
--- /dev/null
+++ b/gas/testsuite/gas/mips/elf-rel8-mips16.s
@@ -0,0 +1,39 @@
+ .equ $fprel, 2
+ .set mips16
+
+ .ent foo
+foo:
+ move $2,$gp
+
+ # Test various forms of relocation syntax.
+
+ li $4,(%hi gvar)
+ sll $4,16
+ addiu $4,(%lo (gvar))
+ lw $4,%lo gvar($5)
+
+ # Check that registers aren't confused with $ identifiers.
+
+ lw $4,($fprel)($17)
+
+ # Check various forms of paired relocations.
+
+ lw $4,%got(lvar)($2)
+ sb $5,%lo(lvar)($4)
+
+ lw $4,%got(lvar)($2)
+ addiu $4,%lo(lvar)
+
+ # Check individual relocations.
+
+ lw $3,%call16(gfunc)($2)
+ addiu $4,%call16(gfunc)
+
+ lw $4,%gprel(gvar)($2)
+ sw $4,%gprel(gvar)($2)
+ addiu $4,%gprel(gvar)
+ .align 6
+ .end foo
+
+ .data
+lvar: .word 1,2
diff --git a/gas/testsuite/gas/mips/elf-rel9-mips16.d b/gas/testsuite/gas/mips/elf-rel9-mips16.d
new file mode 100644
index 0000000000..738c6fdccd
--- /dev/null
+++ b/gas/testsuite/gas/mips/elf-rel9-mips16.d
@@ -0,0 +1,70 @@
+#as: -march=mips2 -mabi=32
+#objdump: -M gpr-names=numeric -dr
+#name: MIPS ELF reloc 9 (MIPS16 version)
+
+.*: file format .*
+
+Disassembly of section \.text:
+
+0+00 <foo>:
+ 0: 675c move \$2,\$28
+ 2: f000 9a80 lw \$4,0\(\$2\)
+ 2: R_MIPS16_GOT16 \.data
+ 6: f000 4c10 addiu \$4,16
+ 6: R_MIPS16_LO16 \.data
+ a: f000 9a80 lw \$4,0\(\$2\)
+ a: R_MIPS16_GOT16 \.data
+ e: f020 4c00 addiu \$4,32
+ e: R_MIPS16_LO16 \.data
+ 12: f000 9a80 lw \$4,0\(\$2\)
+ 12: R_MIPS16_GOT16 \.data
+ 16: f7ef 4c1c addiu \$4,32764
+ 16: R_MIPS16_LO16 \.data
+ 1a: f000 9a81 lw \$4,1\(\$2\)
+ 1a: R_MIPS16_GOT16 \.data
+ 1e: f010 4c00 addiu \$4,-32768
+ 1e: R_MIPS16_LO16 \.data
+ 22: f000 9a81 lw \$4,1\(\$2\)
+ 22: R_MIPS16_GOT16 \.data
+ 26: f7ff 4c1c addiu \$4,-4
+ 26: R_MIPS16_LO16 \.data
+ 2a: f000 9a81 lw \$4,1\(\$2\)
+ 2a: R_MIPS16_GOT16 \.data
+ 2e: f000 4c00 addiu \$4,0
+ 2e: R_MIPS16_LO16 \.data
+ 32: f000 9a82 lw \$4,2\(\$2\)
+ 32: R_MIPS16_GOT16 \.data
+ 36: f010 4c10 addiu \$4,-32752
+ 36: R_MIPS16_LO16 \.data
+ 3a: f000 9a82 lw \$4,2\(\$2\)
+ 3a: R_MIPS16_GOT16 \.data
+ 3e: f01e 4c00 addiu \$4,-4096
+ 3e: R_MIPS16_LO16 \.data
+ 42: f000 9a82 lw \$4,2\(\$2\)
+ 42: R_MIPS16_GOT16 \.data
+ 46: f7ff 4c1f addiu \$4,-1
+ 46: R_MIPS16_LO16 \.data
+ 4a: f000 9a82 lw \$4,2\(\$2\)
+ 4a: R_MIPS16_GOT16 \.data
+ 4e: f000 4c00 addiu \$4,0
+ 4e: R_MIPS16_LO16 \.data
+ 52: f000 9a83 lw \$4,3\(\$2\)
+ 52: R_MIPS16_GOT16 \.data
+ 56: f342 4c05 addiu \$4,4933
+ 56: R_MIPS16_LO16 \.data
+ 5a: f018 9a80 lw \$4,-16384\(\$2\)
+ 5a: R_MIPS16_GPREL \.sdata
+ 5e: f018 9a84 lw \$4,-16380\(\$2\)
+ 5e: R_MIPS16_GPREL \.sdata
+ 62: f018 9a84 lw \$4,-16380\(\$2\)
+ 62: R_MIPS16_GPREL \.sdata
+ 66: f018 9a88 lw \$4,-16376\(\$2\)
+ 66: R_MIPS16_GPREL \.sdata
+ 6a: f018 9a8c lw \$4,-16372\(\$2\)
+ 6a: R_MIPS16_GPREL \.sdata
+ 6e: f018 9a94 lw \$4,-16364\(\$2\)
+ 6e: R_MIPS16_GPREL \.sdata
+ 72: f018 9a98 lw \$4,-16360\(\$2\)
+ 72: R_MIPS16_GPREL \.sdata
+ 76: 6500 nop
+#pass
diff --git a/gas/testsuite/gas/mips/elf-rel9-mips16.s b/gas/testsuite/gas/mips/elf-rel9-mips16.s
new file mode 100644
index 0000000000..a4f54eddd3
--- /dev/null
+++ b/gas/testsuite/gas/mips/elf-rel9-mips16.s
@@ -0,0 +1,59 @@
+ .set mips16
+ .ent foo
+foo:
+ move $2,$28
+ lw $4,%got(l1)($2)
+ addiu $4,%lo(l1)
+
+ lw $4,%got(l1 + 16)($2)
+ addiu $4,%lo(l1 + 16)
+
+ lw $4,%got(l1 + 0x7fec)($2)
+ addiu $4,%lo(l1 + 0x7fec)
+
+ lw $4,%got(l1 + 0x7ff0)($2)
+ addiu $4,%lo(l1 + 0x7ff0)
+
+ lw $4,%got(l1 + 0xffec)($2)
+ addiu $4,%lo(l1 + 0xffec)
+
+ lw $4,%got(l1 + 0xfff0)($2)
+ addiu $4,%lo(l1 + 0xfff0)
+
+ lw $4,%got(l1 + 0x18000)($2)
+ addiu $4,%lo(l1 + 0x18000)
+
+ lw $4,%got(l2)($2)
+ addiu $4,%lo(l2)
+
+ lw $4,%got(l2 + 0xfff)($2)
+ addiu $4,%lo(l2 + 0xfff)
+
+ lw $4,%got(l2 + 0x1000)($2)
+ addiu $4,%lo(l2 + 0x1000)
+
+ lw $4,%got(l2 + 0x12345)($2)
+ addiu $4,%lo(l2 + 0x12345)
+
+ lw $4,%gprel(l3)($2)
+ lw $4,%gprel(l3 + 4)($2)
+ lw $4,%gprel(l4)($2)
+ lw $4,%gprel(l4 + 4)($2)
+ lw $4,%gprel(l5)($2)
+ lw $4,%gprel(l5 + 8)($2)
+ lw $4,%gprel(l5 + 12)($2)
+
+ .align 6
+ .end foo
+
+ .data
+ .word 1,2,3,4
+l1: .word 4,5
+ .space 0x1f000 - 24
+l2: .word 7,8
+
+ .sdata
+l3: .word 1
+l4: .word 2
+ .word 3
+l5: .word 4
diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp
index 16edfb73a9..3c4a919207 100644
--- a/gas/testsuite/gas/mips/mips.exp
+++ b/gas/testsuite/gas/mips/mips.exp
@@ -653,13 +653,16 @@ if { [istarget mips*-*-vxworks*] } {
}
run_dump_test "elf-rel7"
run_dump_test "elf-rel8"
+ run_dump_test "elf-rel8-mips16"
run_dump_test "elf-rel9"
+ run_dump_test "elf-rel9-mips16"
if $has_newabi {
run_dump_test "elf-rel10"
run_dump_test "elf-rel11"
}
run_dump_test "elf-rel12"
run_dump_test "elf-rel13"
+ run_dump_test "elf-rel13-mips16"
run_dump_test "elf-rel14"
if $has_newabi {