* 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.
+2014-03-20 Richard Sandiford <rdsandiford@googlemail.com>
+
+ * 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 <jose.marchesi@oracle.com>
* config/tc-sparc.c (hpriv_reg_table): Added entries for
/* 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;
}
}
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
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:
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. */
#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 */
+2014-03-20 Richard Sandiford <rdsandiford@googlemail.com>
+
+ * 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 <ilya.tocar@intel.com>
* gas/i386/avx512pf-intel.d: Change memory size for vgatherpf0qps,
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
}
.*\.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}
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"
+ }
}
--- /dev/null
+#objdump: -dr
+#name: Locally-resolvable PC-relative code references
+
+.*: file format .*
+
+Disassembly of section .text:
+
+00000000 <func>:
+ 0: 3c040001 lui a0,0x1
+ 4: 2484800c addiu a0,a0,-32756
+ ...
+
+00008010 <foo>:
+#pass
--- /dev/null
+ .text
+ .ent func
+func:
+ lui $4,%hi(foo-.)
+ addiu $4,%lo(foo-.)
+ .end func
+
+ .space 0x8008
+
+ .ent foo
+foo:
+ nop
+ .end foo
--- /dev/null
+#objdump: -s
+#name: Locally-resolvable PC-relative data references
+#as: -EB
+
+#...
+Contents of section \.data:
+ 0000 ff0f000e 0000000c 00000000 00000008 .*
+#pass
--- /dev/null
+ .data
+ .byte 0xff
+ .byte frob-.
+ .half frob-.
+ .word frob-.
+ .quad frob-.
+frob:
--- /dev/null
+.*: 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
--- /dev/null
+ .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-.
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+ .data
+ .word foo-.
+ .word foo-(.-4)
+ .word foo+8-.
+ .word foo-.-16
+
+2014-03-20 Richard Sandiford <rdsandiford@googlemail.com>
+
+ * ld-elf/merge.d: Remove MIPS XFAIL.
+
2014-03-20 Will Newton <will.newton@linaro.org>
* ld-arm/ifunc-14.rd: Update symbol values.
#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-*-*"