From 008a97eff0cabd416d18239eccd5267af6e965f3 Mon Sep 17 00:00:00 2001 From: Renlin Li Date: Wed, 19 Oct 2016 11:18:56 +0100 Subject: [PATCH] [GAS][ARM]Generate unpredictable warning for pc used in data processing instructions with register-shifted register operand. gas/ 2016-10-19 Renlin Li * config/tc-arm.c (encode_arm_shift): Generate unpredictable warning for register-shifted register instructions. * testsuite/gas/arm/shift-bad-pc.d: New. * testsuite/gas/arm/shift-bad-pc.l: New. * testsuite/gas/arm/shift-bad-pc.s: New. --- gas/ChangeLog | 8 ++++ gas/config/tc-arm.c | 15 ++++++++ gas/testsuite/gas/arm/shift-bad-pc.d | 3 ++ gas/testsuite/gas/arm/shift-bad-pc.l | 56 ++++++++++++++++++++++++++++ gas/testsuite/gas/arm/shift-bad-pc.s | 21 +++++++++++ 5 files changed, 103 insertions(+) create mode 100644 gas/testsuite/gas/arm/shift-bad-pc.d create mode 100644 gas/testsuite/gas/arm/shift-bad-pc.l create mode 100644 gas/testsuite/gas/arm/shift-bad-pc.s diff --git a/gas/ChangeLog b/gas/ChangeLog index e5df7830f6..2e3adbe6c1 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2016-10-19 Renlin Li + + * config/tc-arm.c (encode_arm_shift): Generate unpredictable warning + for register-shifted register instructions. + * testsuite/gas/arm/shift-bad-pc.d: New. + * testsuite/gas/arm/shift-bad-pc.l: New. + * testsuite/gas/arm/shift-bad-pc.s: New. + 2016-10-17 Cupertino Miranda * testsuite/arc/dis-inv.d: Fixed matching. diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 526131c5ea..73f8396396 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -7427,6 +7427,21 @@ encode_arm_vfp_reg (int reg, enum vfp_reg_pos pos) static void encode_arm_shift (int i) { + /* register-shifted register. */ + if (inst.operands[i].immisreg) + { + int index; + for (index = 0; index <= i; ++index) + { + gas_assert (inst.operands[index].present); + if (inst.operands[index].isreg && inst.operands[index].reg == REG_PC) + as_warn (UNPRED_REG ("r15")); + } + + if (inst.operands[i].imm == REG_PC) + as_warn (UNPRED_REG ("r15")); + } + if (inst.operands[i].shift_kind == SHIFT_RRX) inst.instruction |= SHIFT_ROR << 5; else diff --git a/gas/testsuite/gas/arm/shift-bad-pc.d b/gas/testsuite/gas/arm/shift-bad-pc.d new file mode 100644 index 0000000000..17edcd3587 --- /dev/null +++ b/gas/testsuite/gas/arm/shift-bad-pc.d @@ -0,0 +1,3 @@ +# name: pc used in instructions with register-shifted register +# as: +# error-output: shift-bad-pc.l diff --git a/gas/testsuite/gas/arm/shift-bad-pc.l b/gas/testsuite/gas/arm/shift-bad-pc.l new file mode 100644 index 0000000000..55a3295e3d --- /dev/null +++ b/gas/testsuite/gas/arm/shift-bad-pc.l @@ -0,0 +1,56 @@ +.*shift-bad-pc.s: Assembler messages: +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:20: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour +.*shift-bad-pc.s:21: Warning: using r15 results in unpredictable behaviour diff --git a/gas/testsuite/gas/arm/shift-bad-pc.s b/gas/testsuite/gas/arm/shift-bad-pc.s new file mode 100644 index 0000000000..43fca393ff --- /dev/null +++ b/gas/testsuite/gas/arm/shift-bad-pc.s @@ -0,0 +1,21 @@ + .syntax unified + + .macro insn4 rd rn rm rs + .irp insn, and, eor, sub, rsb, add, adc, sbc, rsc, orr, bic + \insn pc, \rn, \rm, lsr \rs + \insn \rd, pc, \rm, lsr \rs + \insn \rd, \rn, pc, lsr \rs + \insn \rd, \rn, \rm, lsr pc + .endr + .endm + + .macro insn3 rn rm rs + .irp insn, tst, teq, cmp, cmn, mvn + \insn pc, \rm, lsr \rs + \insn \rn, pc, lsr \rs + \insn \rn, \rm, lsr pc + .endr + .endm + + insn4 r0 r1 r2 r3 + insn3 r0 r1 r2