* config/tc-mips.c (append_insn): Set fx_tcbit for composite relocs.
(md_apply_fix3): Don't treat composite relocs as done.
This commit is contained in:
parent
1fd8cd2072
commit
b1dca8ee5e
6 changed files with 45 additions and 11 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2004-10-07 Richard Sandiford <rsandifo@redhat.com>
|
||||||
|
|
||||||
|
* config/tc-mips.c (append_insn): Set fx_tcbit for composite relocs.
|
||||||
|
(md_apply_fix3): Don't treat composite relocs as done.
|
||||||
|
|
||||||
2004-10-07 Jan Beulich <jbeulich@novell.com>
|
2004-10-07 Jan Beulich <jbeulich@novell.com>
|
||||||
|
|
||||||
* macro.c (macro_expand_body): When ELF, use .LL rather than LL as
|
* macro.c (macro_expand_body): When ELF, use .LL rather than LL as
|
||||||
|
|
|
@ -2231,6 +2231,10 @@ append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
|
||||||
fixp[i] = fix_new_exp (frag_now, fixp[0]->fx_where,
|
fixp[i] = fix_new_exp (frag_now, fixp[0]->fx_where,
|
||||||
fixp[0]->fx_size, address_expr,
|
fixp[0]->fx_size, address_expr,
|
||||||
FALSE, reloc_type[i]);
|
FALSE, reloc_type[i]);
|
||||||
|
|
||||||
|
/* Use fx_tcbit to mark compound relocs. */
|
||||||
|
fixp[0]->fx_tcbit = 1;
|
||||||
|
fixp[i]->fx_tcbit = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10897,7 +10901,6 @@ md_apply_fix3 (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
bfd_byte *buf;
|
bfd_byte *buf;
|
||||||
long insn;
|
long insn;
|
||||||
static int previous_fx_r_type = 0;
|
|
||||||
reloc_howto_type *howto;
|
reloc_howto_type *howto;
|
||||||
|
|
||||||
/* We ignore generic BFD relocations we don't know about. */
|
/* We ignore generic BFD relocations we don't know about. */
|
||||||
|
@ -10915,18 +10918,20 @@ md_apply_fix3 (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
|
||||||
|
|
||||||
buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
|
buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
|
||||||
|
|
||||||
/* We are not done if this is a composite relocation to set up gp. */
|
|
||||||
assert (! fixP->fx_pcrel);
|
assert (! fixP->fx_pcrel);
|
||||||
if (fixP->fx_addsy == NULL
|
|
||||||
&& !(fixP->fx_r_type == BFD_RELOC_MIPS_SUB
|
/* Don't treat parts of a composite relocation as done. There are two
|
||||||
|| (fixP->fx_r_type == BFD_RELOC_64
|
reasons for this:
|
||||||
&& (previous_fx_r_type == BFD_RELOC_GPREL32
|
|
||||||
|| previous_fx_r_type == BFD_RELOC_GPREL16))
|
(1) The second and third parts will be against 0 (RSS_UNDEF) but
|
||||||
|| (previous_fx_r_type == BFD_RELOC_MIPS_SUB
|
should nevertheless be emitted if the first part is.
|
||||||
&& (fixP->fx_r_type == BFD_RELOC_HI16_S
|
|
||||||
|| fixP->fx_r_type == BFD_RELOC_LO16))))
|
(2) In normal usage, composite relocations are never assembly-time
|
||||||
|
constants. The easiest way of dealing with the pathological
|
||||||
|
exceptions is to generate a relocation against STN_UNDEF and
|
||||||
|
leave everything up to the linker. */
|
||||||
|
if (fixP->fx_addsy == NULL && fixP->fx_tcbit == 0)
|
||||||
fixP->fx_done = 1;
|
fixP->fx_done = 1;
|
||||||
previous_fx_r_type = fixP->fx_r_type;
|
|
||||||
|
|
||||||
switch (fixP->fx_r_type)
|
switch (fixP->fx_r_type)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2004-10-07 Richard Sandiford <rsandifo@redhat.com>
|
||||||
|
|
||||||
|
* gas/mips/elf-rel21.[sd]: New test.
|
||||||
|
* gas/mips/mips.exp: Run it.
|
||||||
|
|
||||||
2004-10-07 Jan Beulich <jbeulich@novell.com>
|
2004-10-07 Jan Beulich <jbeulich@novell.com>
|
||||||
|
|
||||||
* gas/cfi/cfi-common-4.[ds]: New.
|
* gas/cfi/cfi-common-4.[ds]: New.
|
||||||
|
|
9
gas/testsuite/gas/mips/elf-rel21.d
Normal file
9
gas/testsuite/gas/mips/elf-rel21.d
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#as: -march=mips3 -mabi=64
|
||||||
|
#readelf: --relocs
|
||||||
|
#name: MIPS ELF reloc 21
|
||||||
|
|
||||||
|
Relocation section '\.rela\.data' .*:
|
||||||
|
.*
|
||||||
|
.* R_MIPS_GPREL32 * 0+00 * \.data \+ c
|
||||||
|
* Type2: R_MIPS_NONE *
|
||||||
|
* Type3: R_MIPS_NONE *
|
7
gas/testsuite/gas/mips/elf-rel21.s
Normal file
7
gas/testsuite/gas/mips/elf-rel21.s
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
.abicalls
|
||||||
|
.data
|
||||||
|
.gpword foo
|
||||||
|
.8byte bar - foo
|
||||||
|
foo:
|
||||||
|
.word 0
|
||||||
|
bar:
|
|
@ -662,6 +662,9 @@ if { [istarget mips*-*-*] } then {
|
||||||
}
|
}
|
||||||
run_dump_test "elf-rel19"
|
run_dump_test "elf-rel19"
|
||||||
run_dump_test "elf-rel20"
|
run_dump_test "elf-rel20"
|
||||||
|
if $has_newabi {
|
||||||
|
run_dump_test "elf-rel21"
|
||||||
|
}
|
||||||
|
|
||||||
if { !$no_mips16 } {
|
if { !$no_mips16 } {
|
||||||
run_dump_test "${tmips}mips${el}16-e"
|
run_dump_test "${tmips}mips${el}16-e"
|
||||||
|
|
Loading…
Reference in a new issue