summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2018-03-29 12:31:04 +0100
committerNick Clifton <nickc@redhat.com>2018-03-29 12:31:04 +0100
commit763e359efaba5cc088604e3f3e1dda40fda06831 (patch)
tree81b7d48acc0a354961adef1d6312c0f9625c54c0
parent9f069cf64b3f36200ba1bbd5746b2a023059af53 (diff)
downloadbinutils-gdb-763e359efaba5cc088604e3f3e1dda40fda06831.tar.gz
Import patch from the mainline that fixes the ARM assembler's parsing of an illegal ORR instruction.users/ARM/embedded-binutils-2_30-branch-2018q2
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.
-rw-r--r--gas/ChangeLog12
-rw-r--r--gas/config/tc-arm.c8
-rw-r--r--gas/testsuite/gas/arm/pr22773.d2
-rw-r--r--gas/testsuite/gas/arm/pr22773.l3
-rw-r--r--gas/testsuite/gas/arm/pr22773.s11
5 files changed, 33 insertions, 3 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index c266eb46641..30bc4fd3c7c 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 4d82338d6e3..2ad31014981 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 00000000000..adb9681c92b
--- /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 00000000000..587c8a87843
--- /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 00000000000..9e5767c2a8a
--- /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. */
+
+