diff options
author | Jan Beulich <jbeulich@novell.com> | 2015-01-12 09:05:19 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2015-01-12 09:05:19 +0100 |
commit | cb3b1e65a9af9fd95dce40c4444050c30cd07a2b (patch) | |
tree | 9d76a43911e5e45657fdfaafca29495f78e0cb8a /gas | |
parent | b38ead219b31fed4014cd5b1078da968744b879d (diff) | |
download | fsf-binutils-gdb-cb3b1e65a9af9fd95dce40c4444050c30cd07a2b.zip fsf-binutils-gdb-cb3b1e65a9af9fd95dce40c4444050c30cd07a2b.tar.gz fsf-binutils-gdb-cb3b1e65a9af9fd95dce40c4444050c30cd07a2b.tar.bz2 |
arm: properly range check immediate operands of VSHL and VQSHL
These two, other than VQSHLU, didn't have their immediates properly range
checked so far.
(Re-sending unchanged from the original v2 due to never having got an
answer to https://sourceware.org/ml/binutils/2013-04/msg00121.html.)
gas/
2015-01-12 Jan Beulich <jbeulich@suse.com>
* gas/config/tc-arm.c (do_neon_shl_imm): Check immediate range.
(do_neon_qshl_imm): Likewise.
gas/testsuite/
2015-01-12 Jan Beulich <jbeulich@suse.com>
* gas/arm/neon-addressing-bad.s: Add test for invalid VSHL,
VQSHL, and VQSHLU immediates.
* gas/arm/neon-addressing-bad.l: Update accordingly.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 5 | ||||
-rw-r--r-- | gas/config/tc-arm.c | 12 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/neon-addressing-bad.l | 12 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/neon-addressing-bad.s | 27 |
5 files changed, 59 insertions, 3 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index a0deb6a..2e3b2e9 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2015-01-12 Jan Beulich <jbeulich@suse.com> + + * gas/config/tc-arm.c (do_neon_shl_imm): Check immediate range. + (do_neon_qshl_imm): Likewise. + 2015-01-12 Alan Modra <amodra@gmail.com> * read.c (s_altmacro, s_reloc): Make definition static. diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 37d2e3e..e0de0d2 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -14102,8 +14102,12 @@ do_neon_shl_imm (void) { enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL); struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_KEY | N_I_ALL); + int imm = inst.operands[2].imm; + + constraint (imm < 0 || (unsigned)imm >= et.size, + _("immediate out of range for shift")); NEON_ENCODE (IMMED, inst); - neon_imm_shift (FALSE, 0, neon_quad (rs), et, inst.operands[2].imm); + neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm); } else { @@ -14134,10 +14138,12 @@ do_neon_qshl_imm (void) { enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL); struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY); + int imm = inst.operands[2].imm; + constraint (imm < 0 || (unsigned)imm >= et.size, + _("immediate out of range for shift")); NEON_ENCODE (IMMED, inst); - neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et, - inst.operands[2].imm); + neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et, imm); } else { diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index a547a3b..ef359a1 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-01-12 Jan Beulich <jbeulich@suse.com> + + * gas/arm/neon-addressing-bad.s: Add test for invalid VSHL, + VQSHL, and VQSHLU immediates. + * gas/arm/neon-addressing-bad.l: Update accordingly. + 2015-01-10 Andrew Burgess <andrew.burgess@embecosm.com> * gas/avr/large-debug-line-table.d: New file. diff --git a/gas/testsuite/gas/arm/neon-addressing-bad.l b/gas/testsuite/gas/arm/neon-addressing-bad.l index 38e1801..4f7f533 100644 --- a/gas/testsuite/gas/arm/neon-addressing-bad.l +++ b/gas/testsuite/gas/arm/neon-addressing-bad.l @@ -25,3 +25,15 @@ [^:]*:29: Error: r15 not allowed here -- `vst1.8 {Q1},R0' [^:]*:30: Error: r15 not allowed here -- `vst1.8 {D0},\[PC\]' [^:]*:31: Error: r15 not allowed here -- `vst1.8 {D0},\[PC,#0\]' +[^:]*:34: Error: immediate out of range for shift -- `vshl.i8 d0,d0,#8' +[^:]*:36: Error: immediate out of range for shift -- `vshl.i16 d0,d0,#16' +[^:]*:38: Error: immediate out of range for shift -- `vshl.i32 d0,d0,#32' +[^:]*:40: Error: .* -- `vshl.i64 d0,d0,#64' +[^:]*:43: Error: immediate out of range for shift -- `vqshl.s8 d0,d0,#8' +[^:]*:45: Error: immediate out of range for shift -- `vqshl.s16 d0,d0,#16' +[^:]*:47: Error: immediate out of range for shift -- `vqshl.s32 d0,d0,#32' +[^:]*:49: Error: .* -- `vqshl.s64 d0,d0,#64' +[^:]*:52: Error: immediate out of range for shift -- `vqshlu.s8 d0,d0,#8' +[^:]*:54: Error: immediate out of range for shift -- `vqshlu.s16 d0,d0,#16' +[^:]*:56: Error: immediate out of range for shift -- `vqshlu.s32 d0,d0,#32' +[^:]*:58: Error: .* -- `vqshlu.s64 d0,d0,#64' diff --git a/gas/testsuite/gas/arm/neon-addressing-bad.s b/gas/testsuite/gas/arm/neon-addressing-bad.s index 6f7e769..9cb7b4d 100644 --- a/gas/testsuite/gas/arm/neon-addressing-bad.s +++ b/gas/testsuite/gas/arm/neon-addressing-bad.s @@ -29,3 +29,30 @@ VST1.8 {D0}, R0 VST1.8 {Q1}, R0 VST1.8 {D0}, [PC] VST1.8 {D0}, [PC, #0] + +VSHL.I8 d0, d0, #7 +VSHL.I8 d0, d0, #8 +VSHL.I16 d0, d0, #15 +VSHL.I16 d0, d0, #16 +VSHL.I32 d0, d0, #31 +VSHL.I32 d0, d0, #32 +VSHL.I64 d0, d0, #63 +VSHL.I64 d0, d0, #64 + +VQSHL.S8 d0, d0, #7 +VQSHL.S8 d0, d0, #8 +VQSHL.S16 d0, d0, #15 +VQSHL.S16 d0, d0, #16 +VQSHL.S32 d0, d0, #31 +VQSHL.S32 d0, d0, #32 +VQSHL.S64 d0, d0, #63 +VQSHL.S64 d0, d0, #64 + +VQSHLU.S8 d0, d0, #7 +VQSHLU.S8 d0, d0, #8 +VQSHLU.S16 d0, d0, #15 +VQSHLU.S16 d0, d0, #16 +VQSHLU.S32 d0, d0, #31 +VQSHLU.S32 d0, d0, #32 +VQSHLU.S64 d0, d0, #63 +VQSHLU.S64 d0, d0, #64 |