* 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.
This commit is contained in:
Richard Sandiford 2014-03-20 21:18:43 +00:00
parent 1bff71c325
commit d56a8dda6d
19 changed files with 187 additions and 21 deletions

View File

@ -1,3 +1,11 @@
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

View File

@ -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. */

View File

@ -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 */

View File

@ -1,3 +1,13 @@
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,

View File

@ -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
}

View File

@ -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}

View File

@ -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"
}
}

View File

@ -0,0 +1,14 @@
#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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,7 @@
.data
.byte 0xff
.byte frob-.
.half frob-.
.word frob-.
.quad frob-.
frob:

View File

@ -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

View File

@ -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-.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,6 @@
.data
.word foo-.
.word foo-(.-4)
.word foo+8-.
.word foo-.-16

View File

@ -1,3 +1,7 @@
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.

View File

@ -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-*-*"