This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] arm: properly range check immediate operands of VSHL and VQSHL


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=cb3b1e65a9af9fd95dce40c4444050c30cd07a2b

commit cb3b1e65a9af9fd95dce40c4444050c30cd07a2b
Author: Jan Beulich <jbeulich@novell.com>
Date:   Mon Jan 12 09:05:19 2015 +0100

    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.

Diff:
---
 gas/ChangeLog                               |  5 +++++
 gas/config/tc-arm.c                         | 12 +++++++++---
 gas/testsuite/ChangeLog                     |  6 ++++++
 gas/testsuite/gas/arm/neon-addressing-bad.l | 12 ++++++++++++
 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]