* 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>
|
2003-02-20 jmc <jmc@prioris.mini.pw.edu.pl>
|
||||||
|
|
||||||
* cgen.c: Fix typo: intial -> initial.
|
* cgen.c: Fix typo: intial -> initial.
|
||||||
|
|
|
@ -555,6 +555,11 @@ struct mips_hi_fixup
|
||||||
|
|
||||||
static struct mips_hi_fixup *mips_hi_fixup_list;
|
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. */
|
/* Map normal MIPS register numbers to mips16 register numbers. */
|
||||||
|
|
||||||
#define X ILLEGAL_REG
|
#define X ILLEGAL_REG
|
||||||
|
@ -4106,10 +4111,13 @@ macro (ip)
|
||||||
#2. This would confuse tc_gen_reloc, which expects the relocations
|
#2. This would confuse tc_gen_reloc, which expects the relocations
|
||||||
for #2 to be the last for that frag.
|
for #2 to be the last for that frag.
|
||||||
|
|
||||||
If it looks like this situation could happen, put the macro
|
Also, if tc_gen_reloc sees certain relocations in a variant frag,
|
||||||
in a new frag. */
|
it assumes that they belong to a relaxable macro. We mustn't put
|
||||||
if (mips_hi_fixup_list != 0
|
other uses of such relocations into a variant frag.
|
||||||
&& mips_hi_fixup_list->fixp->fx_frag == frag_now)
|
|
||||||
|
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_wane (frag_now);
|
||||||
frag_new (0);
|
frag_new (0);
|
||||||
|
@ -10103,9 +10111,14 @@ my_getSmallExpression (ep, reloc, str)
|
||||||
|
|
||||||
expr_end = str;
|
expr_end = str;
|
||||||
|
|
||||||
reloc[0] = BFD_RELOC_LO16;
|
if (reloc_index == 0)
|
||||||
for (i = 0; i < reloc_index; i++)
|
reloc[0] = BFD_RELOC_LO16;
|
||||||
reloc[i] = reversed_reloc[reloc_index - 1 - i];
|
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;
|
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>
|
2003-02-07 Richard Sandiford <rsandifo@redhat.com>
|
||||||
|
|
||||||
* gas/mips/rel12.[sd], gas/mips/rel13.[sd]: New tests.
|
* 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-rel12"
|
||||||
run_dump_test "elf-rel13"
|
run_dump_test "elf-rel13"
|
||||||
|
run_dump_test "elf-rel14"
|
||||||
run_dump_test "${tmips}${el}empic"
|
run_dump_test "${tmips}${el}empic"
|
||||||
run_dump_test "empic2"
|
run_dump_test "empic2"
|
||||||
run_dump_test "empic3_e"
|
run_dump_test "empic3_e"
|
||||||
|
|
Loading…
Reference in a new issue