gas/
authorRichard Sandiford <rdsandiford@googlemail.com>
Thu, 20 Mar 2014 21:18:43 +0000 (21:18 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Thu, 20 Mar 2014 21:18:43 +0000 (21:18 +0000)
* config/tc-mips.h (DIFF_EXPR_OK, CFI_DIFF_EXPR_OK): Define.
* config/tc-mips.c (md_pcrel_from): Remove error message.
(md_apply_fix): Convert PC-relative BFD_RELOC_32s to
BFD_RELOC_32_PCREL.  Report a specific error message for unhandled
PC-relative expressions.  Handle BFD_RELOC_8.

gas/testsuite/
* gas/all/gas.exp: Remove XFAIL of forward.d for MIPS.
* gas/mips/pcrel-1.s, gas/mips/pcrel-1.d, gas/mips/pcrel-2.s,
gas/mips/pcrel-2.d, gas/mips/pcrel-3.s, gas/mips/pcrel-3.l,
gas/mips/pcrel-4.s, gas/mips/pcrel-4-32.d, gas/mips/pcrel-4-n32.d,
gas/mips/pcrel-4-64.d: New tests.
* gas/mips/mips.exp: Run them.
* gas/mips/lui-2.l: Tweak error message for line 7.

ld/testsuite/
* ld-elf/merge.d: Remove MIPS XFAIL.

19 files changed:
gas/ChangeLog
gas/config/tc-mips.c
gas/config/tc-mips.h
gas/testsuite/ChangeLog
gas/testsuite/gas/all/gas.exp
gas/testsuite/gas/mips/lui-2.l
gas/testsuite/gas/mips/mips.exp
gas/testsuite/gas/mips/pcrel-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/pcrel-1.s [new file with mode: 0644]
gas/testsuite/gas/mips/pcrel-2.d [new file with mode: 0644]
gas/testsuite/gas/mips/pcrel-2.s [new file with mode: 0644]
gas/testsuite/gas/mips/pcrel-3.l [new file with mode: 0644]
gas/testsuite/gas/mips/pcrel-3.s [new file with mode: 0644]
gas/testsuite/gas/mips/pcrel-4-32.d [new file with mode: 0644]
gas/testsuite/gas/mips/pcrel-4-64.d [new file with mode: 0644]
gas/testsuite/gas/mips/pcrel-4-n32.d [new file with mode: 0644]
gas/testsuite/gas/mips/pcrel-4.s [new file with mode: 0644]
ld/testsuite/ChangeLog
ld/testsuite/ld-elf/merge.d

index f232916..231c8c5 100644 (file)
@@ -1,3 +1,11 @@
+2014-03-20  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * config/tc-mips.h (DIFF_EXPR_OK, CFI_DIFF_EXPR_OK): Define.
+       * config/tc-mips.c (md_pcrel_from): Remove error message.
+       (md_apply_fix): Convert PC-relative BFD_RELOC_32s to
+       BFD_RELOC_32_PCREL.  Report a specific error message for unhandled
+       PC-relative expressions.  Handle BFD_RELOC_8.
+
 2014-03-19  Jose E. Marchesi  <jose.marchesi@oracle.com>
 
        * config/tc-sparc.c (hpriv_reg_table): Added entries for
index 74c7a10..318b0b5 100644 (file)
@@ -14057,15 +14057,7 @@ md_pcrel_from (fixS *fixP)
       /* Return the address of the delay slot.  */
       return addr + 4;
 
-    case BFD_RELOC_32_PCREL:
-      return addr;
-
     default:
-      /* We have no relocation type for PC relative MIPS16 instructions.  */
-      if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
-       as_bad_where (fixP->fx_file, fixP->fx_line,
-                     _("PC relative MIPS16 instruction references"
-                       " a different section"));
       return addr;
     }
 }
@@ -14262,13 +14254,38 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
   unsigned long insn;
   reloc_howto_type *howto;
 
-  /* We ignore generic BFD relocations we don't know about.  */
-  howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
-  if (! howto)
-    return;
+  if (fixP->fx_pcrel)
+    switch (fixP->fx_r_type)
+      {
+      case BFD_RELOC_16_PCREL_S2:
+      case BFD_RELOC_MICROMIPS_7_PCREL_S1:
+      case BFD_RELOC_MICROMIPS_10_PCREL_S1:
+      case BFD_RELOC_MICROMIPS_16_PCREL_S1:
+      case BFD_RELOC_32_PCREL:
+       break;
+
+      case BFD_RELOC_32:
+       fixP->fx_r_type = BFD_RELOC_32_PCREL;
+       break;
+
+      default:
+       as_bad_where (fixP->fx_file, fixP->fx_line,
+                     _("PC-relative reference to a different section"));
+       break;
+      }
+
+  /* Handle BFD_RELOC_8, since it's easy.  Punt on other bfd relocations
+     that have no MIPS ELF equivalent.  */
+  if (fixP->fx_r_type != BFD_RELOC_8)
+    {
+      howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
+      if (!howto)
+       return;
+    }
 
   gas_assert (fixP->fx_size == 2
              || fixP->fx_size == 4
+             || fixP->fx_r_type == BFD_RELOC_8
              || fixP->fx_r_type == BFD_RELOC_16
              || fixP->fx_r_type == BFD_RELOC_64
              || fixP->fx_r_type == BFD_RELOC_CTOR
@@ -14280,12 +14297,6 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
 
   buf = fixP->fx_frag->fr_literal + fixP->fx_where;
 
-  gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2
-             || fixP->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1
-             || fixP->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1
-             || fixP->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1
-             || fixP->fx_r_type == BFD_RELOC_32_PCREL);
-
   /* Don't treat parts of a composite relocation as done.  There are two
      reasons for this:
 
@@ -14435,6 +14446,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
     case BFD_RELOC_32:
     case BFD_RELOC_32_PCREL:
     case BFD_RELOC_16:
+    case BFD_RELOC_8:
       /* If we are deleting this reloc entry, we must fill in the
         value now.  This can happen if we have a .word which is not
         resolved when it appears but is later defined.  */
index 97627df..510e811 100644 (file)
@@ -189,4 +189,9 @@ extern int tc_mips_regname_to_dw2regnum (char *regname);
 #define DWARF2_DEFAULT_RETURN_COLUMN 31
 #define DWARF2_CIE_DATA_ALIGNMENT (-4)
 
+#define DIFF_EXPR_OK
+/* We define DIFF_EXPR_OK because of R_MIPS_PC32, but we have no
+   64-bit form for n64 CFIs.  */
+#define CFI_DIFF_EXPR_OK 0
+
 #endif /* TC_MIPS */
index 18ef92f..a7bec28 100644 (file)
@@ -1,3 +1,13 @@
+2014-03-20  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * gas/all/gas.exp: Remove XFAIL of forward.d for MIPS.
+       * gas/mips/pcrel-1.s, gas/mips/pcrel-1.d, gas/mips/pcrel-2.s,
+       gas/mips/pcrel-2.d, gas/mips/pcrel-3.s, gas/mips/pcrel-3.l,
+       gas/mips/pcrel-4.s, gas/mips/pcrel-4-32.d, gas/mips/pcrel-4-n32.d,
+       gas/mips/pcrel-4-64.d: New tests.
+       * gas/mips/mips.exp: Run them.
+       * gas/mips/lui-2.l: Tweak error message for line 7.
+
 2014-03-20  Ilya Tocar  <ilya.tocar@intel.com>
 
        * gas/i386/avx512pf-intel.d: Change memory size for vgatherpf0qps,
index 4c63efb..7d635b7 100644 (file)
@@ -99,7 +99,7 @@ case $target_triplet in {
     default {
        # Some targets don't manage to resolve BFD_RELOC_8 for constants.
        setup_xfail "alpha*-*-*" "*c30*-*-*" "*c4x*-*-*" \
-           "d\[13\]0v*-*-*" "i860-*-*" "mips*-*-*" \
+           "d\[13\]0v*-*-*" "i860-*-*" \
            "nds32*-*-*" "pdp11-*-*" "xtensa*-*-*"
        run_dump_test forward
     }
index ed97e85..635f97d 100644 (file)
@@ -1,5 +1,5 @@
 .*\.s: Assembler messages:
 .*\.s:10: Error: invalid operands \(\*UND\* and \*UND\* sections\) for `/'
-.*\.s:7: Error: can't resolve `bar' {\*UND\* section} - `foo' {\.text section}
+.*\.s:7: Error: PC-relative reference to a different section
 .*\.s:8: Error: can't resolve `baz' {\*UND\* section} - `bar' {\*UND\* section}
 .*\.s:9: Error: can't resolve `\.text' {\.text section} - `baz' {\*UND\* section}
index e3c4e93..628f482 100644 (file)
@@ -1169,4 +1169,13 @@ if { [istarget mips*-*-vxworks*] } {
     run_dump_test_arches "msa64"       [mips_arch_list_matching mips64r2]
     run_dump_test_arches "msa-relax"   [mips_arch_list_matching mips32r2]
     run_dump_test_arches "msa-branch"  [mips_arch_list_matching mips32r2]
+
+    run_dump_test "pcrel-1"
+    run_dump_test "pcrel-2"
+    run_list_test "pcrel-3" "" "Invalid cross-section PC-relative references"
+    run_dump_test "pcrel-4-32"
+    if $has_newabi {
+       run_dump_test "pcrel-4-n32"
+       run_dump_test "pcrel-4-64"
+    }
 }
diff --git a/gas/testsuite/gas/mips/pcrel-1.d b/gas/testsuite/gas/mips/pcrel-1.d
new file mode 100644 (file)
index 0000000..5c9f655
--- /dev/null
@@ -0,0 +1,14 @@
+#objdump: -dr
+#name: Locally-resolvable PC-relative code references
+
+.*:     file format .*
+
+Disassembly of section .text:
+
+00000000 <func>:
+       0:      3c040001        lui     a0,0x1
+       4:      2484800c        addiu   a0,a0,-32756
+       ...
+
+00008010 <foo>:
+#pass
diff --git a/gas/testsuite/gas/mips/pcrel-1.s b/gas/testsuite/gas/mips/pcrel-1.s
new file mode 100644 (file)
index 0000000..ba93a5b
--- /dev/null
@@ -0,0 +1,13 @@
+       .text
+       .ent    func
+func:
+       lui     $4,%hi(foo-.)
+       addiu   $4,%lo(foo-.)
+       .end    func
+
+       .space  0x8008
+
+       .ent    foo
+foo:
+       nop
+       .end    foo
diff --git a/gas/testsuite/gas/mips/pcrel-2.d b/gas/testsuite/gas/mips/pcrel-2.d
new file mode 100644 (file)
index 0000000..e1692e0
--- /dev/null
@@ -0,0 +1,8 @@
+#objdump: -s
+#name: Locally-resolvable PC-relative data references
+#as: -EB
+
+#...
+Contents of section \.data:
+ 0000 ff0f000e 0000000c 00000000 00000008  .*
+#pass
diff --git a/gas/testsuite/gas/mips/pcrel-2.s b/gas/testsuite/gas/mips/pcrel-2.s
new file mode 100644 (file)
index 0000000..781141e
--- /dev/null
@@ -0,0 +1,7 @@
+       .data
+       .byte   0xff
+       .byte   frob-.
+       .half   frob-.
+       .word   frob-.
+       .quad   frob-.
+frob:
diff --git a/gas/testsuite/gas/mips/pcrel-3.l b/gas/testsuite/gas/mips/pcrel-3.l
new file mode 100644 (file)
index 0000000..f2bfc51
--- /dev/null
@@ -0,0 +1,7 @@
+.*: Assembler messages:
+.*:4: Error: PC-relative reference to a different section
+.*:5: Error: PC-relative reference to a different section
+.*:6: Error: PC-relative reference to a different section
+.*:9: Error: PC-relative reference to a different section
+.*:10: Error: PC-relative reference to a different section
+.*:11: Error: PC-relative reference to a different section
diff --git a/gas/testsuite/gas/mips/pcrel-3.s b/gas/testsuite/gas/mips/pcrel-3.s
new file mode 100644 (file)
index 0000000..6db741c
--- /dev/null
@@ -0,0 +1,11 @@
+       .text
+       .ent    func
+func:
+       lui     $4,%hi(foo-.)
+       addiu   $4,%lo(foo-.)
+       lw      $4,%got(foo-.)($gp)
+       .end    func
+
+       .byte   foo-.
+       .half   foo-.
+       .quad   foo-.
diff --git a/gas/testsuite/gas/mips/pcrel-4-32.d b/gas/testsuite/gas/mips/pcrel-4-32.d
new file mode 100644 (file)
index 0000000..06bc52b
--- /dev/null
@@ -0,0 +1,18 @@
+#objdump: -sr
+#name: Valid cross-section PC-relative references (o32)
+#as: -32 -EB
+#source: pcrel-4.s
+
+.*:     file format .*
+
+RELOCATION RECORDS FOR \[\.data\]:
+OFFSET   TYPE              VALUE 
+00000000 R_MIPS_PC32       foo
+00000004 R_MIPS_PC32       foo
+00000008 R_MIPS_PC32       foo
+0000000c R_MIPS_PC32       foo
+
+#...
+Contents of section \.data:
+ 0000 00000000 00000004 00000008 fffffff0  ................
+#pass
diff --git a/gas/testsuite/gas/mips/pcrel-4-64.d b/gas/testsuite/gas/mips/pcrel-4-64.d
new file mode 100644 (file)
index 0000000..931ff96
--- /dev/null
@@ -0,0 +1,21 @@
+#objdump: -r
+#name: Valid cross-section PC-relative references (n64)
+#as: -64 -mips3
+#source: pcrel-4.s
+
+.*:     file format .*
+
+RELOCATION RECORDS FOR \[\.data\]:
+OFFSET           TYPE              VALUE 
+0+000 R_MIPS_PC32       foo
+0+000 R_MIPS_NONE       \*ABS\*
+0+000 R_MIPS_NONE       \*ABS\*
+0+004 R_MIPS_PC32       foo\+0x0+004
+0+004 R_MIPS_NONE       \*ABS\*\+0x0+004
+0+004 R_MIPS_NONE       \*ABS\*\+0x0+004
+0+008 R_MIPS_PC32       foo\+0x0+008
+0+008 R_MIPS_NONE       \*ABS\*\+0x0+008
+0+008 R_MIPS_NONE       \*ABS\*\+0x0+008
+0+00c R_MIPS_PC32       foo-0x0+010
+0+00c R_MIPS_NONE       \*ABS\*-0x0+010
+0+00c R_MIPS_NONE       \*ABS\*-0x0+010
diff --git a/gas/testsuite/gas/mips/pcrel-4-n32.d b/gas/testsuite/gas/mips/pcrel-4-n32.d
new file mode 100644 (file)
index 0000000..56ec6ef
--- /dev/null
@@ -0,0 +1,13 @@
+#objdump: -r
+#name: Valid cross-section PC-relative references (n32)
+#as: -n32 -mips3
+#source: pcrel-4.s
+
+.*:     file format .*
+
+RELOCATION RECORDS FOR \[\.data\]:
+OFFSET   TYPE              VALUE 
+00000000 R_MIPS_PC32       foo
+00000004 R_MIPS_PC32       foo\+0x00000004
+00000008 R_MIPS_PC32       foo\+0x00000008
+0000000c R_MIPS_PC32       foo-0x00000010
diff --git a/gas/testsuite/gas/mips/pcrel-4.s b/gas/testsuite/gas/mips/pcrel-4.s
new file mode 100644 (file)
index 0000000..8f332dc
--- /dev/null
@@ -0,0 +1,6 @@
+       .data
+       .word   foo-.
+       .word   foo-(.-4)
+       .word   foo+8-.
+       .word   foo-.-16
+
index 9e4ce82..c83b4e1 100644 (file)
@@ -1,3 +1,7 @@
+2014-03-20  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * ld-elf/merge.d: Remove MIPS XFAIL.
+
 2014-03-20  Will Newton  <will.newton@linaro.org>
 
        * ld-arm/ifunc-14.rd: Update symbol values.
index c50de10..450ee07 100644 (file)
@@ -4,7 +4,7 @@
 #xfail: "arc-*-*" "avr-*-*" "bfin-*-*" "cr16-*-*" "cris*-*-*" "crx-*-*" "d10v-*-*" "d30v-*-*"
 #xfail: "dlx-*-*" "fr30-*-*" "frv-*-*" "hppa*64*-*-*" "h8300-*-*" "score-*-*"
 #xfail: "i370-*-*" "i860-*-*" "i960-*-*" "ip2k-*-*" "iq2000-*-*" "lm32-*-*"
-#xfail: "mcore-*-*" "mn102*-*-*" "mips*-*-*" "ms1-*-*" "mep-*-*"
+#xfail: "mcore-*-*" "mn102*-*-*" "ms1-*-*" "mep-*-*"
 #xfail: "or32-*-*" "pj-*-*" "sparc*-*-*" "tic6x-*-*" "vax-*-*" "xstormy16-*-*"
 #xfail: "xtensa*-*-*" "metag-*-*"