+2003-02-21 Richard Sandiford <rsandifo@redhat.com>
+
+ * config/tc-mips.c (prev_reloc_op_frag): New variable.
+ (macro): Check it to decide whether a new frag is needed.
+ (my_getSmallExpression): Set it.
+
2003-02-20 jmc <jmc@prioris.mini.pw.edu.pl>
* cgen.c: Fix typo: intial -> initial.
static struct mips_hi_fixup *mips_hi_fixup_list;
+/* The frag containing the last explicit relocation operator.
+ Null if explicit relocations have not been used. */
+
+static fragS *prev_reloc_op_frag;
+
/* Map normal MIPS register numbers to mips16 register numbers. */
#define X ILLEGAL_REG
#2. This would confuse tc_gen_reloc, which expects the relocations
for #2 to be the last for that frag.
- If it looks like this situation could happen, put the macro
- in a new frag. */
- if (mips_hi_fixup_list != 0
- && mips_hi_fixup_list->fixp->fx_frag == frag_now)
+ Also, if tc_gen_reloc sees certain relocations in a variant frag,
+ it assumes that they belong to a relaxable macro. We mustn't put
+ other uses of such relocations into a variant frag.
+
+ To avoid both problems, finish the current frag it contains a
+ %reloc() operator. The macro then goes into a new frag. */
+ if (prev_reloc_op_frag == frag_now)
{
frag_wane (frag_now);
frag_new (0);
expr_end = str;
- reloc[0] = BFD_RELOC_LO16;
- for (i = 0; i < reloc_index; i++)
- reloc[i] = reversed_reloc[reloc_index - 1 - i];
+ if (reloc_index == 0)
+ reloc[0] = BFD_RELOC_LO16;
+ else
+ {
+ prev_reloc_op_frag = frag_now;
+ for (i = 0; i < reloc_index; i++)
+ reloc[i] = reversed_reloc[reloc_index - 1 - i];
+ }
return reloc_index;
}
+2003-02-21 Richard Sandiford <rsandifo@redhat.com>
+
+ * gas/mips/elf-rel14.[sd]: New test.
+ * gas/mips/mips.exp: Run it.
+
2003-02-07 Richard Sandiford <rsandifo@redhat.com>
* gas/mips/rel12.[sd], gas/mips/rel13.[sd]: New tests.
--- /dev/null
+#as: -march=mips1 -mabi=32 -KPIC
+#objdump: -M gpr-names=numeric -dr
+#name: MIPS ELF reloc 14
+
+.*: file format .*
+
+Disassembly of section \.text:
+
+0+00 <foo>:
+ 0: 8f840000 lw \$4,0\(\$28\)
+ 0: R_MIPS_CALL16 bar
+ 4: 8f850000 lw \$5,0\(\$28\)
+ 4: R_MIPS_GOT16 \.text
+ 8: 00000000 nop
+ c: 24a50014 addiu \$5,\$5,20
+ c: R_MIPS_LO16 \.text
+ 10: 24c60001 addiu \$6,\$6,1
+ \.\.\.