gas/
authorRichard Sandiford <rdsandiford@googlemail.com>
Sun, 13 Sep 2009 19:18:11 +0000 (19:18 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Sun, 13 Sep 2009 19:18:11 +0000 (19:18 +0000)
* config/tc-mips.c (MIPS_JALR_HINT_P): Take an expr argument.
Require the target to be a bare symbol on targets with
in-place addends.
(macro_build_jalr): Update accordingly.
(mips_fix_adjustable): Don't reduce R_MIPS_JALRs on targets
with in-place addends.

gas/testsuite/
* gas/mips/jalr2.s, gas/mips/jalr2.d: New test.
* gas/mips/jal-svr4pic.d: Don't expect R_MIPS_JALRs to be reduced.
* gas/mips/jal-xgot.d: Likewise.
* gas/mips/mips-abi32-pic2.d: Likewise.
* gas/mips/mips.exp: Run it.

gas/ChangeLog
gas/config/tc-mips.c
gas/testsuite/ChangeLog
gas/testsuite/gas/mips/jal-svr4pic.d
gas/testsuite/gas/mips/jal-xgot.d
gas/testsuite/gas/mips/jalr2.d [new file with mode: 0644]
gas/testsuite/gas/mips/jalr2.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips-abi32-pic2.d
gas/testsuite/gas/mips/mips.exp

index fe66a379fb59dd95a047c281259f72a73fd2a766..46969c0cb344c4a4ff61f0bbd70c4be8e60341f9 100644 (file)
@@ -1,3 +1,12 @@
+2009-09-13  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * config/tc-mips.c (MIPS_JALR_HINT_P): Take an expr argument.
+       Require the target to be a bare symbol on targets with
+       in-place addends.
+       (macro_build_jalr): Update accordingly.
+       (mips_fix_adjustable): Don't reduce R_MIPS_JALRs on targets
+       with in-place addends.
+
 2009-09-11  Nick Clifton  <nickc@redhat.com>
 
        * po/gas.pot: Updated by the Translation project.
index e1d63881e5d03db880125a5cb9b402b689e8d52a..1c96480224828ec845dfcdea1746ddc27ffb5996 100644 (file)
@@ -292,10 +292,14 @@ static int file_ase_mips16;
 
 /* True if we want to create R_MIPS_JALR for jalr $25.  */
 #ifdef TE_IRIX
-#define MIPS_JALR_HINT_P HAVE_NEWABI
+#define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
 #else
-/* As a GNU extension, we use R_MIPS_JALR for o32 too.  */
-#define MIPS_JALR_HINT_P 1
+/* As a GNU extension, we use R_MIPS_JALR for o32 too.  However,
+   because there's no place for any addend, the only acceptable
+   expression is a bare symbol.  */
+#define MIPS_JALR_HINT_P(EXPR) \
+  (!HAVE_IN_PLACE_ADDENDS \
+   || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
 #endif
 
 /* True if -mips3d was passed or implied by arguments passed on the
@@ -3930,13 +3934,13 @@ macro_build_jalr (expressionS *ep)
 {
   char *f = NULL;
 
-  if (MIPS_JALR_HINT_P)
+  if (MIPS_JALR_HINT_P (ep))
     {
       frag_grow (8);
       f = frag_more (0);
     }
   macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
-  if (MIPS_JALR_HINT_P)
+  if (MIPS_JALR_HINT_P (ep))
     fix_new_exp (frag_now, f - frag_now->fr_literal,
                 4, ep, FALSE, BFD_RELOC_MIPS_JALR);
 }
@@ -14097,6 +14101,10 @@ mips_fix_adjustable (fixS *fixp)
       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
     return 0;
 
+  /* There is no place to store an in-place offset for JALR relocations.  */
+  if (fixp->fx_r_type == BFD_RELOC_MIPS_JALR && HAVE_IN_PLACE_ADDENDS)
+    return 0;
+
 #ifdef OBJ_ELF
   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
      to a floating-point stub.  The same is true for non-R_MIPS16_26
index 3d737c2c767ee3ef0ef3e59d39423c3a660475f8..6f2333407175ce537c452058ea3410fcd09cd400 100644 (file)
@@ -1,3 +1,11 @@
+2009-09-13  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * gas/mips/jalr2.s, gas/mips/jalr2.d: New test.
+       * gas/mips/jal-svr4pic.d: Don't expect R_MIPS_JALRs to be reduced.
+       * gas/mips/jal-xgot.d: Likewise.
+       * gas/mips/mips-abi32-pic2.d: Likewise.
+       * gas/mips/mips.exp: Run it.
+
 2009-09-13  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * gas/mips/mips16-dwarf2-n32.d: Expect odd addresses.
index ef51f4bcc71d4d004ca811ce39a9e98e62c078be..3fc206de2831825bab2a40a1b6cb14f29ef668f4 100644 (file)
@@ -26,7 +26,7 @@ Disassembly of section .text:
 0+0034 <[^>]*> addiu   t9,t9,0
 [      ]*34: R_MIPS_LO16       .text
 0+0038 <[^>]*> jalr    t9
-[      ]*38: R_MIPS_JALR       .text
+[      ]*38: R_MIPS_JALR       text_label
 0+003c <[^>]*> nop
 0+0040 <[^>]*> lw      gp,0\(sp\)
 0+0044 <[^>]*> nop
index 89a9b42b507a55e58b5e623f149fc0f2df9ec43c..2ece1578beed849fc5f1d226fc42fa227d1988df 100644 (file)
@@ -27,7 +27,7 @@ Disassembly of section .text:
 0+0034 <[^>]*> addiu   t9,t9,0
 [      ]*34: R_MIPS_LO16       .text
 0+0038 <[^>]*> jalr    t9
-[      ]*38: R_MIPS_JALR       .text
+[      ]*38: R_MIPS_JALR       text_label
 0+003c <[^>]*> nop
 0+0040 <[^>]*> lw      gp,0\(sp\)
 0+0044 <[^>]*> lui     t9,0x0
diff --git a/gas/testsuite/gas/mips/jalr2.d b/gas/testsuite/gas/mips/jalr2.d
new file mode 100644 (file)
index 0000000..6509a18
--- /dev/null
@@ -0,0 +1,41 @@
+#as: -mips2 -32 -KPIC
+#objdump: -dr
+
+.*
+
+
+Disassembly of section \.text:
+
+.* <test>:
+.*:    afbc0010        sw      gp,16\(sp\)
+.*:    8f990000        lw      t9,0\(gp\)
+.*: R_MIPS_GOT16       \.text
+.*:    2739004c        addiu   t9,t9,76
+.*: R_MIPS_LO16        \.text
+.*:    0320f809        jalr    t9
+.*: R_MIPS_JALR        local
+.*:    00000000        nop
+.*:    8fbc0010        lw      gp,16\(sp\)
+.*:    8f990000        lw      t9,0\(gp\)
+.*: R_MIPS_GOT16       \.text
+.*:    27390058        addiu   t9,t9,88
+.*: R_MIPS_LO16        \.text
+# No R_MIPS_JALR here, because the target address had an addend.
+.*:    0320f809        jalr    t9
+.*:    00000000        nop
+.*:    8fbc0010        lw      gp,16\(sp\)
+.*:    8f990000        lw      t9,0\(gp\)
+.*: R_MIPS_CALL16      global
+.*:    0320f809        jalr    t9
+.*: R_MIPS_JALR        global
+.*:    00000000        nop
+.*:    8fbc0010        lw      gp,16\(sp\)
+.*:    8f99000c        lw      t9,12\(gp\)
+.*: R_MIPS_CALL16      global
+# No R_MIPS_JALR here either, for the same reason.
+.*:    0320f809        jalr    t9
+.*:    00000000        nop
+.*:    8fbc0010        lw      gp,16\(sp\)
+
+.* <local>:
+       \.\.\.
diff --git a/gas/testsuite/gas/mips/jalr2.s b/gas/testsuite/gas/mips/jalr2.s
new file mode 100644 (file)
index 0000000..6b100d7
--- /dev/null
@@ -0,0 +1,15 @@
+       .ent    test
+test:
+       .frame  $sp,32,$31
+       .cprestore 16
+       jal     local
+       jal     local+12
+       jal     global
+       jal     global+12
+       .end    test
+
+local:
+       nop
+       nop
+       nop
+       nop
index 533678089102055f3cb4cbcb90d48864900f668d..aca0dbda176f4a31bc3a0765315ece365aac4017 100644 (file)
@@ -16,7 +16,7 @@ Disassembly of section \.text:
 0+014 <[^>]*> 273900cc         addiu   t9,t9,204
                        14: R_MIPS_LO16 \.text
 0+018 <[^>]*> 0320f809         jalr    t9
-                       18: R_MIPS_JALR \.text
+                       18: R_MIPS_JALR end
 0+01c <[^>]*> 00000000         nop
 0+020 <[^>]*> 8fbc0008         lw      gp,8\(sp\)
 0+024 <[^>]*> 00000000         nop
@@ -36,7 +36,7 @@ Disassembly of section \.text:
 0+050 <[^>]*> 273900cc         addiu   t9,t9,204
                        50: R_MIPS_LO16 \.text
 0+054 <[^>]*> 0320f809         jalr    t9
-                       54: R_MIPS_JALR \.text
+                       54: R_MIPS_JALR end
 0+058 <[^>]*> 00000000         nop
 0+05c <[^>]*> 3c010001         lui     at,0x1
 0+060 <[^>]*> 003d0821         addu    at,at,sp
@@ -60,7 +60,7 @@ Disassembly of section \.text:
 0+09c <[^>]*> 273900cc         addiu   t9,t9,204
                        9c: R_MIPS_LO16 \.text
 0+0a0 <[^>]*> 0320f809         jalr    t9
-                       a0: R_MIPS_JALR \.text
+                       a0: R_MIPS_JALR end
 0+0a4 <[^>]*> 00000000         nop
 0+0a8 <[^>]*> 3c010001         lui     at,0x1
 0+0ac <[^>]*> 003d0821         addu    at,at,sp
index ebe17c57bc7af4049332ac1e447ffc894d2687c7..6f82f46f499e74e269a75096b4825e58755eab02 100644 (file)
@@ -706,6 +706,7 @@ if { [istarget mips*-*-vxworks*] } {
 
        run_list_test "tls-ill" "-32"
        run_dump_test "tls-o32"
+       run_dump_test "jalr2"
     }
 
     if $has_newabi {