[ARC] Don't allow pc-rel relocations for J* instructions.
authorClaudiu Zissulescu <claziss@synopsys.com>
Tue, 5 Apr 2016 14:22:19 +0000 (16:22 +0200)
committerClaudiu Zissulescu <claziss@synopsys.com>
Tue, 5 Apr 2016 14:23:02 +0000 (16:23 +0200)
gas/
2016-04-05  Claudiu Zissulescu  <claziss@synopsys.com>

        * config/tc-arc.c (assemble_insn): Prohibit pc-rel relocations for
        JUMP instructions type.
        * testsuite/gas/arc/relocs-errors.d: New file.
        * testsuite/gas/arc/relocs-errors.err: Likewise.
        * testsuite/gas/arc/relocs-errors.s: Likewise.

gas/ChangeLog
gas/config/tc-arc.c
gas/testsuite/gas/arc/relocs-errors.d [new file with mode: 0644]
gas/testsuite/gas/arc/relocs-errors.err [new file with mode: 0644]
gas/testsuite/gas/arc/relocs-errors.s [new file with mode: 0644]

index 7c1c6a009ea1cc53252da9c28275f34bfba90da8..0f4d58fcfa459b21d61f963ead1d4b16bf2a0e08 100644 (file)
@@ -1,3 +1,11 @@
+2016-04-05  Claudiu Zissulescu  <claziss@synopsys.com>
+
+        * config/tc-arc.c (assemble_insn): Prohibit pc-rel relocations for
+       JUMP instructions type.
+        * testsuite/gas/arc/relocs-errors.d: New file.
+        * testsuite/gas/arc/relocs-errors.err: Likewise.
+        * testsuite/gas/arc/relocs-errors.s: Likewise.
+
 2016-04-04  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR gas/19498
index 4f9c336340536dae1925dba8735607621a10320d..40643ad5e082cb1030772e2566a4f8d3e40bbfcf 100644 (file)
@@ -3363,6 +3363,10 @@ assemble_insn (const struct arc_opcode *opcode,
          switch (t->X_md)
            {
            case O_plt:
+             if (opcode->class == JUMP)
+               as_bad_where (frag_now->fr_file, frag_now->fr_line,
+                             _("Unable to use @plt relocatio for insn %s"),
+                             opcode->name);
              needGOTSymbol = TRUE;
              reloc = find_reloc ("plt", opcode->name,
                                  pflags, nflg,
@@ -3376,7 +3380,7 @@ assemble_insn (const struct arc_opcode *opcode,
              break;
            case O_pcl:
              reloc = ARC_RELOC_TABLE (t->X_md)->reloc;
-             if (ARC_SHORT (opcode->mask))
+             if (ARC_SHORT (opcode->mask) || opcode->class == JUMP)
                as_bad_where (frag_now->fr_file, frag_now->fr_line,
                              _("Unable to use @pcl relocation for insn %s"),
                              opcode->name);
diff --git a/gas/testsuite/gas/arc/relocs-errors.d b/gas/testsuite/gas/arc/relocs-errors.d
new file mode 100644 (file)
index 0000000..29373a7
--- /dev/null
@@ -0,0 +1 @@
+#error-output: relocs-errors.err
diff --git a/gas/testsuite/gas/arc/relocs-errors.err b/gas/testsuite/gas/arc/relocs-errors.err
new file mode 100644 (file)
index 0000000..3bafa15
--- /dev/null
@@ -0,0 +1,7 @@
+[^:]*: Assembler messages:
+[^:]*:1: Error: Unable to use @plt relocatio for insn j
+[^:]*:2: Error: Unable to use @plt relocatio for insn jl
+[^:]*:3: Error: Unable to use @plt relocatio for insn j
+[^:]*:5: Error: Unable to use @pcl relocation for insn j
+[^:]*:6: Error: Unable to use @pcl relocation for insn jl
+[^:]*:7: Error: Unable to use @pcl relocation for insn j
diff --git a/gas/testsuite/gas/arc/relocs-errors.s b/gas/testsuite/gas/arc/relocs-errors.s
new file mode 100644 (file)
index 0000000..8e963a0
--- /dev/null
@@ -0,0 +1,7 @@
+       j    sym@plt
+       jl   sym@plt
+       jeq  sym@plt
+
+       j    sym@pcl
+       jl   sym@pcl
+       jeq  sym@pcl