diff options
author | Renlin Li <renlin.li@arm.com> | 2016-10-19 11:18:56 +0100 |
---|---|---|
committer | Renlin Li <renlin.li@arm.com> | 2016-10-19 11:27:35 +0100 |
commit | 008a97eff0cabd416d18239eccd5267af6e965f3 (patch) | |
tree | 6406986f43b1b34a0cfa6720c572ee71784c9893 | |
parent | bbb76b184f645ffc466baa1e5b3164d1e3febd93 (diff) | |
download | gdb-008a97eff0cabd416d18239eccd5267af6e965f3.zip gdb-008a97eff0cabd416d18239eccd5267af6e965f3.tar.gz gdb-008a97eff0cabd416d18239eccd5267af6e965f3.tar.bz2 |
[GAS][ARM]Generate unpredictable warning for pc used in data processing instructions with register-shifted register operand.
gas/
2016-10-19 Renlin Li <renlin.li@arm.com>
* 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.
-rw-r--r-- | gas/ChangeLog | 8 | ||||
-rw-r--r-- | gas/config/tc-arm.c | 15 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/shift-bad-pc.d | 3 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/shift-bad-pc.l | 56 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/shift-bad-pc.s | 21 |
5 files changed, 103 insertions, 0 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index e5df783..2e3adbe 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2016-10-19 Renlin Li <renlin.li@arm.com> + + * 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 <cmiranda@synopsys.com> * testsuite/arc/dis-inv.d: Fixed matching. diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 526131c..73f8396 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 0000000..17edcd3 --- /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 0000000..55a3295 --- /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 0000000..43fca39 --- /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 |