* 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:
parent
36f63dca98
commit
64bdfcaf0d
6 changed files with 60 additions and 7 deletions
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
18
gas/testsuite/gas/mips/elf-rel14.d
Normal file
18
gas/testsuite/gas/mips/elf-rel14.d
Normal 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
|
||||
\.\.\.
|
10
gas/testsuite/gas/mips/elf-rel14.s
Normal file
10
gas/testsuite/gas/mips/elf-rel14.s
Normal 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
|
|
@ -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"
|
||||
|
|
Loading…
Reference in a new issue