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/binutils-2_30-branch] Import patch from the mainline that fixes the ARM assembler's parsing of an illegal ORR instruction.


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

commit 763e359efaba5cc088604e3f3e1dda40fda06831
Author: Nick Clifton <nickc@redhat.com>
Date:   Thu Mar 29 12:31:04 2018 +0100

    Import patch from the mainline that fixes the ARM assembler's parsing of an illegal ORR instruction.
    
    	PR 22773
    	* config/tc-arm.c (md_apply_fix): Test Rn field of Thumb ORR
    	instruction before assuming that it is a MOV instruction.
    	* testsuite/gas/arm/pr22773.s: New test.
    	* testsuite/gas/arm/pr22773.d: New test driver.
    	* testsuite/gas/arm/pr22773.l: New expected output.

Diff:
---
 gas/ChangeLog                   | 12 ++++++++++++
 gas/config/tc-arm.c             |  8 +++++---
 gas/testsuite/gas/arm/pr22773.d |  2 ++
 gas/testsuite/gas/arm/pr22773.l |  3 +++
 gas/testsuite/gas/arm/pr22773.s | 11 +++++++++++
 5 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index c266eb4..30bc4fd 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,15 @@
+2018-03-29  Nick Clifton  <nickc@redhat.com>
+
+	Import from mainline:
+	2018-02-13  Nick Clifton  <nickc@redhat.com>
+
+	PR 22773
+	* config/tc-arm.c (md_apply_fix): Test Rn field of Thumb ORR
+	instruction before assuming that it is a MOV instruction.
+	* testsuite/gas/arm/pr22773.s: New test.
+	* testsuite/gas/arm/pr22773.d: New test driver.
+	* testsuite/gas/arm/pr22773.l: New expected output.
+
 2018-03-21  Alan Modra  <amodra@gmail.com>
 
 	Apply from master
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 4d82338..2ad3101 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -23587,12 +23587,14 @@ md_apply_fix (fixS *	fixP,
 	      /* MOV accepts both Thumb2 modified immediate (T2 encoding) and
 		 UINT16 (T3 encoding), MOVW only accepts UINT16.  When
 		 disassembling, MOV is preferred when there is no encoding
-		 overlap.
-		 NOTE: MOV is using ORR opcode under Thumb 2 mode.  */
+		 overlap.  */
 	      if (((newval >> T2_DATA_OP_SHIFT) & 0xf) == T2_OPCODE_ORR
+		  /* NOTE: MOV uses the ORR opcode in Thumb 2 mode
+		     but with the Rn field [19:16] set to 1111.  */
+		  && (((newval >> 16) & 0xf) == 0xf)
 		  && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2_v8m)
 		  && !((newval >> T2_SBIT_SHIFT) & 0x1)
-		  && value >= 0 && value <=0xffff)
+		  && value >= 0 && value <= 0xffff)
 		{
 		  /* Toggle bit[25] to change encoding from T2 to T3.  */
 		  newval ^= 1 << 25;
diff --git a/gas/testsuite/gas/arm/pr22773.d b/gas/testsuite/gas/arm/pr22773.d
new file mode 100644
index 0000000..adb9681
--- /dev/null
+++ b/gas/testsuite/gas/arm/pr22773.d
@@ -0,0 +1,2 @@
+# name: PR 22773: Invalid immediate constants produce incorrect instruction
+# error-output: pr22773.l
diff --git a/gas/testsuite/gas/arm/pr22773.l b/gas/testsuite/gas/arm/pr22773.l
new file mode 100644
index 0000000..587c8a8
--- /dev/null
+++ b/gas/testsuite/gas/arm/pr22773.l
@@ -0,0 +1,3 @@
+[^:]*: Assembler messages:
+[^:]*:8: Error: invalid constant \(3201\) after fixup
+#pass
diff --git a/gas/testsuite/gas/arm/pr22773.s b/gas/testsuite/gas/arm/pr22773.s
new file mode 100644
index 0000000..9e5767c
--- /dev/null
+++ b/gas/testsuite/gas/arm/pr22773.s
@@ -0,0 +1,11 @@
+	.syntax unified
+	.cpu cortex-m4
+	.thumb
+
+	.section  .text
+
+	orr r1, #12800	 	/* This is OK.  */
+	orr r1, #12801		/* This cannot be encoded in Thumb mode.  */
+	/* GAS used to accept it though, and produce a MOV instruction instead.  */
+
+


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