* 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.
This commit is contained in:
Richard Sandiford 2003-02-21 10:28:27 +00:00
parent 36f63dca98
commit 64bdfcaf0d
6 changed files with 60 additions and 7 deletions

View File

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

View File

@ -555,6 +555,11 @@ struct mips_hi_fixup
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
@ -4106,10 +4111,13 @@ macro (ip)
#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);
@ -10103,9 +10111,14 @@ my_getSmallExpression (ep, reloc, str)
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;
}

View File

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

View File

@ -0,0 +1,18 @@
#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
\.\.\.

View File

@ -0,0 +1,10 @@
.ent foo
foo:
lw $4,%call16(bar)($28)
la $5,.L1
# Insert an instruction that doesn't use $5 to avoid a spurious
# nop after the previous load macro.
addiu $6,$6,1
.L1:
.space 32
.end foo

View File

@ -610,6 +610,7 @@ if { [istarget mips*-*-*] } then {
}
run_dump_test "elf-rel12"
run_dump_test "elf-rel13"
run_dump_test "elf-rel14"
run_dump_test "${tmips}${el}empic"
run_dump_test "empic2"
run_dump_test "empic3_e"