(md_apply_fix3): Don't treat composite relocs as done.
+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>
* macro.c (macro_expand_body): When ELF, use .LL rather than LL as
2004-10-07 Jan Beulich <jbeulich@novell.com>
* macro.c (macro_expand_body): When ELF, use .LL rather than LL as
fixp[i] = fix_new_exp (frag_now, fixp[0]->fx_where,
fixp[0]->fx_size, address_expr,
FALSE, reloc_type[i]);
fixp[i] = fix_new_exp (frag_now, fixp[0]->fx_where,
fixp[0]->fx_size, address_expr,
FALSE, reloc_type[i]);
+
+ /* Use fx_tcbit to mark compound relocs. */
+ fixp[0]->fx_tcbit = 1;
+ fixp[i]->fx_tcbit = 1;
{
bfd_byte *buf;
long insn;
{
bfd_byte *buf;
long insn;
- static int previous_fx_r_type = 0;
reloc_howto_type *howto;
/* We ignore generic BFD relocations we don't know about. */
reloc_howto_type *howto;
/* We ignore generic BFD relocations we don't know about. */
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
- || (fixP->fx_r_type == BFD_RELOC_64
- && (previous_fx_r_type == BFD_RELOC_GPREL32
- || previous_fx_r_type == BFD_RELOC_GPREL16))
- || (previous_fx_r_type == BFD_RELOC_MIPS_SUB
- && (fixP->fx_r_type == BFD_RELOC_HI16_S
- || fixP->fx_r_type == BFD_RELOC_LO16))))
+
+ /* Don't treat parts of a composite relocation as done. There are two
+ reasons for this:
+
+ (1) The second and third parts will be against 0 (RSS_UNDEF) but
+ should nevertheless be emitted if the first part is.
+
+ (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)
- previous_fx_r_type = fixP->fx_r_type;
switch (fixP->fx_r_type)
{
switch (fixP->fx_r_type)
{
+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>
* gas/cfi/cfi-common-4.[ds]: New.
2004-10-07 Jan Beulich <jbeulich@novell.com>
* gas/cfi/cfi-common-4.[ds]: New.
--- /dev/null
+#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 *
--- /dev/null
+ .abicalls
+ .data
+ .gpword foo
+ .8byte bar - foo
+foo:
+ .word 0
+bar:
}
run_dump_test "elf-rel19"
run_dump_test "elf-rel20"
}
run_dump_test "elf-rel19"
run_dump_test "elf-rel20"
+ if $has_newabi {
+ run_dump_test "elf-rel21"
+ }
if { !$no_mips16 } {
run_dump_test "${tmips}mips${el}16-e"
if { !$no_mips16 } {
run_dump_test "${tmips}mips${el}16-e"