diff --git a/gas/ChangeLog b/gas/ChangeLog index 7c1c6a009e..0f4d58fcfa 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2016-04-05 Claudiu Zissulescu + + * 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 PR gas/19498 diff --git a/gas/config/tc-arc.c b/gas/config/tc-arc.c index 4f9c336340..40643ad5e0 100644 --- a/gas/config/tc-arc.c +++ b/gas/config/tc-arc.c @@ -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 index 0000000000..29373a72e2 --- /dev/null +++ b/gas/testsuite/gas/arc/relocs-errors.d @@ -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 index 0000000000..3bafa151f9 --- /dev/null +++ b/gas/testsuite/gas/arc/relocs-errors.err @@ -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 index 0000000000..8e963a0b37 --- /dev/null +++ b/gas/testsuite/gas/arc/relocs-errors.s @@ -0,0 +1,7 @@ + j sym@plt + jl sym@plt + jeq sym@plt + + j sym@pcl + jl sym@pcl + jeq sym@pcl