* config/tc-mips.c (prev_reloc_op_frag): New variable.
authorRichard Sandiford <rdsandiford@googlemail.com>
Fri, 21 Feb 2003 10:28:27 +0000 (10:28 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Fri, 21 Feb 2003 10:28:27 +0000 (10:28 +0000)
(macro): Check it to decide whether a new frag is needed.
(my_getSmallExpression): Set it.

gas/ChangeLog
gas/config/tc-mips.c
gas/testsuite/ChangeLog
gas/testsuite/gas/mips/elf-rel14.d [new file with mode: 0644]
gas/testsuite/gas/mips/elf-rel14.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips.exp

index be50f0d..d887b70 100644 (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.
index 4c0052b..e075cc9 100644 (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;
 }
index c9be2ed..58d8f0c 100644 (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.
diff --git a/gas/testsuite/gas/mips/elf-rel14.d b/gas/testsuite/gas/mips/elf-rel14.d
new file mode 100644 (file)
index 0000000..b6aec52
--- /dev/null
@@ -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
+       \.\.\.
diff --git a/gas/testsuite/gas/mips/elf-rel14.s b/gas/testsuite/gas/mips/elf-rel14.s
new file mode 100644 (file)
index 0000000..2edd5b3
--- /dev/null
@@ -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
index 9d950a4..eaf7d37 100644 (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"