[binutils-gdb] AVR: PR34307 - Fix diagnostic for opcode unknown to MCU
Georg-Johann Lay via Binutils-cvs <[email protected]> Sun, 21 Jun 2026 16:53:45 +0000 (GMT)
| Newsgroups | gmane.comp.gnu.binutils.cvs |
|---|---|
| Message-ID | <[email protected]> |
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=185f2c03f6dbbb1d739be919cf625d687872b50d commit 185f2c03f6dbbb1d739be919cf625d687872b50d Author: Georg-Johann Lay <[email protected]> Date: Sun Jun 21 18:33:26 2026 +0200 AVR: PR34307 - Fix diagnostic for opcode unknown to MCU When there is an AVR instruction in include/opcode/avr.h that is not supported by a specific MCU, then gas will diagnose with the mnemonic of the next instruction: mul 1,2 mulsu 1,1 lat $ avr-as x.sx x.sx: Assembler messages: x.sx:1: Error: illegal opcode or for mcu avr2 x.sx:2: Error: illegal opcode fmul for mcu avr2 x.sx:3: Error: illegal opcode movw for mcu avr2 The reason is that in gas/config/tc-avr.c::md_assemble() we have: while ((opcode->isa & avr_mcu->isa) != opcode->isa) { opcode++; if (opcode->name && strcmp(op, opcode->name)) { as_bad (_("illegal opcode %s for mcu %s"), opcode->name, avr_mcu->name); return; } } which in the as_bad case prints the next instruction's mnemonic due to the opcode++ above. gas/ * config/tc-avr.c (md_assemble): Use right index to diagnose an opcode that are not supported by the MCU. * testsuite/gas/avr/pr34307-1.d: New test. * testsuite/gas/avr/pr34307-1.s: New test source. * testsuite/gas/avr/pr34307-2.d: New test. * testsuite/gas/avr/pr34307-2.s: New test source. Diff: --- gas/config/tc-avr.c | 4 ++-- gas/testsuite/gas/avr/pr34307-1.d | 4 ++++ gas/testsuite/gas/avr/pr34307-1.s | 1 + gas/testsuite/gas/avr/pr34307-2.d | 4 ++++ gas/testsuite/gas/avr/pr34307-2.s | 1 + 5 files changed, 12 insertions(+), 2 deletions(-) diff --git a/gas/config/tc-avr.c b/gas/config/tc-avr.c index 1fd35f1b71b..819349a6fdd 100644 --- a/gas/config/tc-avr.c +++ b/gas/config/tc-avr.c @@ -1900,8 +1900,8 @@ md_assemble (char *str) if (opcode->name && strcmp(op, opcode->name)) { - as_bad (_("illegal opcode %s for mcu %s"), - opcode->name, avr_mcu->name); + as_bad (_("illegal opcode `%s' for mcu %s"), + (opcode - 1)->name, avr_mcu->name); return; } } diff --git a/gas/testsuite/gas/avr/pr34307-1.d b/gas/testsuite/gas/avr/pr34307-1.d new file mode 100644 index 00000000000..1651d28c2dd --- /dev/null +++ b/gas/testsuite/gas/avr/pr34307-1.d @@ -0,0 +1,4 @@ +#name: Unknown opcode DES diagnostic +#as: +#error: illegal opcode `des' for mcu +#target: avr-*-* diff --git a/gas/testsuite/gas/avr/pr34307-1.s b/gas/testsuite/gas/avr/pr34307-1.s new file mode 100644 index 00000000000..80d9dcd2bbe --- /dev/null +++ b/gas/testsuite/gas/avr/pr34307-1.s @@ -0,0 +1 @@ + des diff --git a/gas/testsuite/gas/avr/pr34307-2.d b/gas/testsuite/gas/avr/pr34307-2.d new file mode 100644 index 00000000000..5c5df64db0b --- /dev/null +++ b/gas/testsuite/gas/avr/pr34307-2.d @@ -0,0 +1,4 @@ +#name: Unknown opcode LAT diagnostic +#as: -mmcu=avr4 +#error: illegal opcode `lat' for mcu +#target: avr-*-* diff --git a/gas/testsuite/gas/avr/pr34307-2.s b/gas/testsuite/gas/avr/pr34307-2.s new file mode 100644 index 00000000000..ea364345738 --- /dev/null +++ b/gas/testsuite/gas/avr/pr34307-2.s @@ -0,0 +1 @@ + lat 0,z