From d56a8dda6d5a1864b54230b356d92ce60397f0e8 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 20 Mar 2014 21:18:43 +0000 Subject: [PATCH] gas/ * config/tc-mips.h (DIFF_EXPR_OK, CFI_DIFF_EXPR_OK): Define. * config/tc-mips.c (md_pcrel_from): Remove error message. (md_apply_fix): Convert PC-relative BFD_RELOC_32s to BFD_RELOC_32_PCREL. Report a specific error message for unhandled PC-relative expressions. Handle BFD_RELOC_8. gas/testsuite/ * gas/all/gas.exp: Remove XFAIL of forward.d for MIPS. * gas/mips/pcrel-1.s, gas/mips/pcrel-1.d, gas/mips/pcrel-2.s, gas/mips/pcrel-2.d, gas/mips/pcrel-3.s, gas/mips/pcrel-3.l, gas/mips/pcrel-4.s, gas/mips/pcrel-4-32.d, gas/mips/pcrel-4-n32.d, gas/mips/pcrel-4-64.d: New tests. * gas/mips/mips.exp: Run them. * gas/mips/lui-2.l: Tweak error message for line 7. ld/testsuite/ * ld-elf/merge.d: Remove MIPS XFAIL. --- gas/ChangeLog | 8 +++++ gas/config/tc-mips.c | 48 +++++++++++++++++----------- gas/config/tc-mips.h | 5 +++ gas/testsuite/ChangeLog | 10 ++++++ gas/testsuite/gas/all/gas.exp | 2 +- gas/testsuite/gas/mips/lui-2.l | 2 +- gas/testsuite/gas/mips/mips.exp | 9 ++++++ gas/testsuite/gas/mips/pcrel-1.d | 14 ++++++++ gas/testsuite/gas/mips/pcrel-1.s | 13 ++++++++ gas/testsuite/gas/mips/pcrel-2.d | 8 +++++ gas/testsuite/gas/mips/pcrel-2.s | 7 ++++ gas/testsuite/gas/mips/pcrel-3.l | 7 ++++ gas/testsuite/gas/mips/pcrel-3.s | 11 +++++++ gas/testsuite/gas/mips/pcrel-4-32.d | 18 +++++++++++ gas/testsuite/gas/mips/pcrel-4-64.d | 21 ++++++++++++ gas/testsuite/gas/mips/pcrel-4-n32.d | 13 ++++++++ gas/testsuite/gas/mips/pcrel-4.s | 6 ++++ ld/testsuite/ChangeLog | 4 +++ ld/testsuite/ld-elf/merge.d | 2 +- 19 files changed, 187 insertions(+), 21 deletions(-) create mode 100644 gas/testsuite/gas/mips/pcrel-1.d create mode 100644 gas/testsuite/gas/mips/pcrel-1.s create mode 100644 gas/testsuite/gas/mips/pcrel-2.d create mode 100644 gas/testsuite/gas/mips/pcrel-2.s create mode 100644 gas/testsuite/gas/mips/pcrel-3.l create mode 100644 gas/testsuite/gas/mips/pcrel-3.s create mode 100644 gas/testsuite/gas/mips/pcrel-4-32.d create mode 100644 gas/testsuite/gas/mips/pcrel-4-64.d create mode 100644 gas/testsuite/gas/mips/pcrel-4-n32.d create mode 100644 gas/testsuite/gas/mips/pcrel-4.s diff --git a/gas/ChangeLog b/gas/ChangeLog index f2329163241..231c8c5e892 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2014-03-20 Richard Sandiford + + * config/tc-mips.h (DIFF_EXPR_OK, CFI_DIFF_EXPR_OK): Define. + * config/tc-mips.c (md_pcrel_from): Remove error message. + (md_apply_fix): Convert PC-relative BFD_RELOC_32s to + BFD_RELOC_32_PCREL. Report a specific error message for unhandled + PC-relative expressions. Handle BFD_RELOC_8. + 2014-03-19 Jose E. Marchesi * config/tc-sparc.c (hpriv_reg_table): Added entries for diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index 74c7a10dbb6..318b0b56cff 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -14057,15 +14057,7 @@ md_pcrel_from (fixS *fixP) /* Return the address of the delay slot. */ return addr + 4; - case BFD_RELOC_32_PCREL: - return addr; - default: - /* We have no relocation type for PC relative MIPS16 instructions. */ - if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg) - as_bad_where (fixP->fx_file, fixP->fx_line, - _("PC relative MIPS16 instruction references" - " a different section")); return addr; } } @@ -14262,13 +14254,38 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) unsigned long insn; reloc_howto_type *howto; - /* We ignore generic BFD relocations we don't know about. */ - howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type); - if (! howto) - return; + if (fixP->fx_pcrel) + switch (fixP->fx_r_type) + { + case BFD_RELOC_16_PCREL_S2: + case BFD_RELOC_MICROMIPS_7_PCREL_S1: + case BFD_RELOC_MICROMIPS_10_PCREL_S1: + case BFD_RELOC_MICROMIPS_16_PCREL_S1: + case BFD_RELOC_32_PCREL: + break; + + case BFD_RELOC_32: + fixP->fx_r_type = BFD_RELOC_32_PCREL; + break; + + default: + as_bad_where (fixP->fx_file, fixP->fx_line, + _("PC-relative reference to a different section")); + break; + } + + /* Handle BFD_RELOC_8, since it's easy. Punt on other bfd relocations + that have no MIPS ELF equivalent. */ + if (fixP->fx_r_type != BFD_RELOC_8) + { + howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type); + if (!howto) + return; + } gas_assert (fixP->fx_size == 2 || fixP->fx_size == 4 + || fixP->fx_r_type == BFD_RELOC_8 || fixP->fx_r_type == BFD_RELOC_16 || fixP->fx_r_type == BFD_RELOC_64 || fixP->fx_r_type == BFD_RELOC_CTOR @@ -14280,12 +14297,6 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) buf = fixP->fx_frag->fr_literal + fixP->fx_where; - gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2 - || fixP->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1 - || fixP->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1 - || fixP->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1 - || fixP->fx_r_type == BFD_RELOC_32_PCREL); - /* Don't treat parts of a composite relocation as done. There are two reasons for this: @@ -14435,6 +14446,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) case BFD_RELOC_32: case BFD_RELOC_32_PCREL: case BFD_RELOC_16: + case BFD_RELOC_8: /* If we are deleting this reloc entry, we must fill in the value now. This can happen if we have a .word which is not resolved when it appears but is later defined. */ diff --git a/gas/config/tc-mips.h b/gas/config/tc-mips.h index 97627df833c..510e8116b94 100644 --- a/gas/config/tc-mips.h +++ b/gas/config/tc-mips.h @@ -189,4 +189,9 @@ extern int tc_mips_regname_to_dw2regnum (char *regname); #define DWARF2_DEFAULT_RETURN_COLUMN 31 #define DWARF2_CIE_DATA_ALIGNMENT (-4) +#define DIFF_EXPR_OK +/* We define DIFF_EXPR_OK because of R_MIPS_PC32, but we have no + 64-bit form for n64 CFIs. */ +#define CFI_DIFF_EXPR_OK 0 + #endif /* TC_MIPS */ diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 18ef92f84ae..a7bec28ccfd 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2014-03-20 Richard Sandiford + + * gas/all/gas.exp: Remove XFAIL of forward.d for MIPS. + * gas/mips/pcrel-1.s, gas/mips/pcrel-1.d, gas/mips/pcrel-2.s, + gas/mips/pcrel-2.d, gas/mips/pcrel-3.s, gas/mips/pcrel-3.l, + gas/mips/pcrel-4.s, gas/mips/pcrel-4-32.d, gas/mips/pcrel-4-n32.d, + gas/mips/pcrel-4-64.d: New tests. + * gas/mips/mips.exp: Run them. + * gas/mips/lui-2.l: Tweak error message for line 7. + 2014-03-20 Ilya Tocar * gas/i386/avx512pf-intel.d: Change memory size for vgatherpf0qps, diff --git a/gas/testsuite/gas/all/gas.exp b/gas/testsuite/gas/all/gas.exp index 4c63efbdc57..7d635b7edff 100644 --- a/gas/testsuite/gas/all/gas.exp +++ b/gas/testsuite/gas/all/gas.exp @@ -99,7 +99,7 @@ case $target_triplet in { default { # Some targets don't manage to resolve BFD_RELOC_8 for constants. setup_xfail "alpha*-*-*" "*c30*-*-*" "*c4x*-*-*" \ - "d\[13\]0v*-*-*" "i860-*-*" "mips*-*-*" \ + "d\[13\]0v*-*-*" "i860-*-*" \ "nds32*-*-*" "pdp11-*-*" "xtensa*-*-*" run_dump_test forward } diff --git a/gas/testsuite/gas/mips/lui-2.l b/gas/testsuite/gas/mips/lui-2.l index ed97e858465..635f97d2a8c 100644 --- a/gas/testsuite/gas/mips/lui-2.l +++ b/gas/testsuite/gas/mips/lui-2.l @@ -1,5 +1,5 @@ .*\.s: Assembler messages: .*\.s:10: Error: invalid operands \(\*UND\* and \*UND\* sections\) for `/' -.*\.s:7: Error: can't resolve `bar' {\*UND\* section} - `foo' {\.text section} +.*\.s:7: Error: PC-relative reference to a different section .*\.s:8: Error: can't resolve `baz' {\*UND\* section} - `bar' {\*UND\* section} .*\.s:9: Error: can't resolve `\.text' {\.text section} - `baz' {\*UND\* section} diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp index e3c4e932364..628f4828135 100644 --- a/gas/testsuite/gas/mips/mips.exp +++ b/gas/testsuite/gas/mips/mips.exp @@ -1169,4 +1169,13 @@ if { [istarget mips*-*-vxworks*] } { run_dump_test_arches "msa64" [mips_arch_list_matching mips64r2] run_dump_test_arches "msa-relax" [mips_arch_list_matching mips32r2] run_dump_test_arches "msa-branch" [mips_arch_list_matching mips32r2] + + run_dump_test "pcrel-1" + run_dump_test "pcrel-2" + run_list_test "pcrel-3" "" "Invalid cross-section PC-relative references" + run_dump_test "pcrel-4-32" + if $has_newabi { + run_dump_test "pcrel-4-n32" + run_dump_test "pcrel-4-64" + } } diff --git a/gas/testsuite/gas/mips/pcrel-1.d b/gas/testsuite/gas/mips/pcrel-1.d new file mode 100644 index 00000000000..5c9f655d95a --- /dev/null +++ b/gas/testsuite/gas/mips/pcrel-1.d @@ -0,0 +1,14 @@ +#objdump: -dr +#name: Locally-resolvable PC-relative code references + +.*: file format .* + +Disassembly of section .text: + +00000000 : + 0: 3c040001 lui a0,0x1 + 4: 2484800c addiu a0,a0,-32756 + ... + +00008010 : +#pass diff --git a/gas/testsuite/gas/mips/pcrel-1.s b/gas/testsuite/gas/mips/pcrel-1.s new file mode 100644 index 00000000000..ba93a5b818a --- /dev/null +++ b/gas/testsuite/gas/mips/pcrel-1.s @@ -0,0 +1,13 @@ + .text + .ent func +func: + lui $4,%hi(foo-.) + addiu $4,%lo(foo-.) + .end func + + .space 0x8008 + + .ent foo +foo: + nop + .end foo diff --git a/gas/testsuite/gas/mips/pcrel-2.d b/gas/testsuite/gas/mips/pcrel-2.d new file mode 100644 index 00000000000..e1692e07fcf --- /dev/null +++ b/gas/testsuite/gas/mips/pcrel-2.d @@ -0,0 +1,8 @@ +#objdump: -s +#name: Locally-resolvable PC-relative data references +#as: -EB + +#... +Contents of section \.data: + 0000 ff0f000e 0000000c 00000000 00000008 .* +#pass diff --git a/gas/testsuite/gas/mips/pcrel-2.s b/gas/testsuite/gas/mips/pcrel-2.s new file mode 100644 index 00000000000..781141e514c --- /dev/null +++ b/gas/testsuite/gas/mips/pcrel-2.s @@ -0,0 +1,7 @@ + .data + .byte 0xff + .byte frob-. + .half frob-. + .word frob-. + .quad frob-. +frob: diff --git a/gas/testsuite/gas/mips/pcrel-3.l b/gas/testsuite/gas/mips/pcrel-3.l new file mode 100644 index 00000000000..f2bfc514e9b --- /dev/null +++ b/gas/testsuite/gas/mips/pcrel-3.l @@ -0,0 +1,7 @@ +.*: Assembler messages: +.*:4: Error: PC-relative reference to a different section +.*:5: Error: PC-relative reference to a different section +.*:6: Error: PC-relative reference to a different section +.*:9: Error: PC-relative reference to a different section +.*:10: Error: PC-relative reference to a different section +.*:11: Error: PC-relative reference to a different section diff --git a/gas/testsuite/gas/mips/pcrel-3.s b/gas/testsuite/gas/mips/pcrel-3.s new file mode 100644 index 00000000000..6db741cb378 --- /dev/null +++ b/gas/testsuite/gas/mips/pcrel-3.s @@ -0,0 +1,11 @@ + .text + .ent func +func: + lui $4,%hi(foo-.) + addiu $4,%lo(foo-.) + lw $4,%got(foo-.)($gp) + .end func + + .byte foo-. + .half foo-. + .quad foo-. diff --git a/gas/testsuite/gas/mips/pcrel-4-32.d b/gas/testsuite/gas/mips/pcrel-4-32.d new file mode 100644 index 00000000000..06bc52b79cb --- /dev/null +++ b/gas/testsuite/gas/mips/pcrel-4-32.d @@ -0,0 +1,18 @@ +#objdump: -sr +#name: Valid cross-section PC-relative references (o32) +#as: -32 -EB +#source: pcrel-4.s + +.*: file format .* + +RELOCATION RECORDS FOR \[\.data\]: +OFFSET TYPE VALUE +00000000 R_MIPS_PC32 foo +00000004 R_MIPS_PC32 foo +00000008 R_MIPS_PC32 foo +0000000c R_MIPS_PC32 foo + +#... +Contents of section \.data: + 0000 00000000 00000004 00000008 fffffff0 ................ +#pass diff --git a/gas/testsuite/gas/mips/pcrel-4-64.d b/gas/testsuite/gas/mips/pcrel-4-64.d new file mode 100644 index 00000000000..931ff966546 --- /dev/null +++ b/gas/testsuite/gas/mips/pcrel-4-64.d @@ -0,0 +1,21 @@ +#objdump: -r +#name: Valid cross-section PC-relative references (n64) +#as: -64 -mips3 +#source: pcrel-4.s + +.*: file format .* + +RELOCATION RECORDS FOR \[\.data\]: +OFFSET TYPE VALUE +0+000 R_MIPS_PC32 foo +0+000 R_MIPS_NONE \*ABS\* +0+000 R_MIPS_NONE \*ABS\* +0+004 R_MIPS_PC32 foo\+0x0+004 +0+004 R_MIPS_NONE \*ABS\*\+0x0+004 +0+004 R_MIPS_NONE \*ABS\*\+0x0+004 +0+008 R_MIPS_PC32 foo\+0x0+008 +0+008 R_MIPS_NONE \*ABS\*\+0x0+008 +0+008 R_MIPS_NONE \*ABS\*\+0x0+008 +0+00c R_MIPS_PC32 foo-0x0+010 +0+00c R_MIPS_NONE \*ABS\*-0x0+010 +0+00c R_MIPS_NONE \*ABS\*-0x0+010 diff --git a/gas/testsuite/gas/mips/pcrel-4-n32.d b/gas/testsuite/gas/mips/pcrel-4-n32.d new file mode 100644 index 00000000000..56ec6efe87a --- /dev/null +++ b/gas/testsuite/gas/mips/pcrel-4-n32.d @@ -0,0 +1,13 @@ +#objdump: -r +#name: Valid cross-section PC-relative references (n32) +#as: -n32 -mips3 +#source: pcrel-4.s + +.*: file format .* + +RELOCATION RECORDS FOR \[\.data\]: +OFFSET TYPE VALUE +00000000 R_MIPS_PC32 foo +00000004 R_MIPS_PC32 foo\+0x00000004 +00000008 R_MIPS_PC32 foo\+0x00000008 +0000000c R_MIPS_PC32 foo-0x00000010 diff --git a/gas/testsuite/gas/mips/pcrel-4.s b/gas/testsuite/gas/mips/pcrel-4.s new file mode 100644 index 00000000000..8f332dc0f12 --- /dev/null +++ b/gas/testsuite/gas/mips/pcrel-4.s @@ -0,0 +1,6 @@ + .data + .word foo-. + .word foo-(.-4) + .word foo+8-. + .word foo-.-16 + diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 9e4ce823942..c83b4e15b97 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-03-20 Richard Sandiford + + * ld-elf/merge.d: Remove MIPS XFAIL. + 2014-03-20 Will Newton * ld-arm/ifunc-14.rd: Update symbol values. diff --git a/ld/testsuite/ld-elf/merge.d b/ld/testsuite/ld-elf/merge.d index c50de10300d..450ee07ff60 100644 --- a/ld/testsuite/ld-elf/merge.d +++ b/ld/testsuite/ld-elf/merge.d @@ -4,7 +4,7 @@ #xfail: "arc-*-*" "avr-*-*" "bfin-*-*" "cr16-*-*" "cris*-*-*" "crx-*-*" "d10v-*-*" "d30v-*-*" #xfail: "dlx-*-*" "fr30-*-*" "frv-*-*" "hppa*64*-*-*" "h8300-*-*" "score-*-*" #xfail: "i370-*-*" "i860-*-*" "i960-*-*" "ip2k-*-*" "iq2000-*-*" "lm32-*-*" -#xfail: "mcore-*-*" "mn102*-*-*" "mips*-*-*" "ms1-*-*" "mep-*-*" +#xfail: "mcore-*-*" "mn102*-*-*" "ms1-*-*" "mep-*-*" #xfail: "or32-*-*" "pj-*-*" "sparc*-*-*" "tic6x-*-*" "vax-*-*" "xstormy16-*-*" #xfail: "xtensa*-*-*" "metag-*-*" -- 2.30.2