diff options
author | Nick Clifton <nickc@redhat.com> | 2018-03-29 12:31:04 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2018-03-29 12:31:04 +0100 |
commit | 763e359efaba5cc088604e3f3e1dda40fda06831 (patch) | |
tree | 81b7d48acc0a354961adef1d6312c0f9625c54c0 | |
parent | 9f069cf64b3f36200ba1bbd5746b2a023059af53 (diff) | |
download | binutils-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/ChangeLog | 12 | ||||
-rw-r--r-- | gas/config/tc-arm.c | 8 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/pr22773.d | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/pr22773.l | 3 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/pr22773.s | 11 |
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. */ + + |