Fix the AVR assembler so that it will correctly issue warnings about skipped instructions even if subsections are used.

PR 21621
	* config/tc-avr.h (struct avr_frag_data): Add prev_opcode field.
	(TC_FRAG_INIT): Define.
	(avr_frag_init): Add prototype.
	* config/tc-avr.c (avr_frag_init): New function.
	(avr_operands): Replace static local 'prev' variable with
	prev_opcode field in current frag.
	* testsuite/gas/avr/pr21621.s: New test source file.
	* testsuite/gas/avr/pr21621.d: New test driver file.
	* testsuite/gas/avr/pr21621.s: New test error output file.
This commit is contained in:
Nick Clifton 2017-10-19 16:21:51 +01:00
parent a75868f50b
commit 95e42ad442
6 changed files with 49 additions and 4 deletions

View File

@ -1,3 +1,16 @@
2017-10-19 Nick Clifton <nickc@redhat.com>
PR 21621
* config/tc-avr.h (struct avr_frag_data): Add prev_opcode field.
(TC_FRAG_INIT): Define.
(avr_frag_init): Add prototype.
* config/tc-avr.c (avr_frag_init): New function.
(avr_operands): Replace static local 'prev' variable with
prev_opcode field in current frag.
* testsuite/gas/avr/pr21621.s: New test source file.
* testsuite/gas/avr/pr21621.d: New test driver file.
* testsuite/gas/avr/pr21621.s: New test error output file.
2017-10-19 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* testsuite/gas/all/fill-1.s: Use normal labels. Change .text to

View File

@ -1326,6 +1326,15 @@ avr_operand (struct avr_opcodes_s *opcode,
return op_mask;
}
/* TC_FRAG_INIT hook */
void
avr_frag_init (fragS *frag)
{
memset (& frag->tc_frag_data, 0, sizeof frag->tc_frag_data);
}
/* Parse instruction operands.
Return binary opcode. */
@ -1337,7 +1346,6 @@ avr_operands (struct avr_opcodes_s *opcode, char **line)
char *frag = frag_more (opcode->insn_size * 2);
char *str = *line;
int where = frag - frag_now->fr_literal;
static unsigned int prev = 0; /* Previous opcode. */
int regno1 = -2;
int regno2 = -2;
@ -1403,7 +1411,7 @@ avr_operands (struct avr_opcodes_s *opcode, char **line)
(AVR core bug, fixed in the newer devices). */
if (!(avr_opt.no_skip_bug ||
(avr_mcu->isa & (AVR_ISA_MUL | AVR_ISA_MOVW)))
&& AVR_SKIP_P (prev))
&& AVR_SKIP_P (frag_now->tc_frag_data.prev_opcode))
as_warn (_("skipping two-word instruction"));
bfd_putl32 ((bfd_vma) bin, frag);
@ -1411,7 +1419,7 @@ avr_operands (struct avr_opcodes_s *opcode, char **line)
else
bfd_putl16 ((bfd_vma) bin, frag);
prev = bin;
frag_now->tc_frag_data.prev_opcode = bin;
*line = str;
return bin;
}

View File

@ -230,7 +230,7 @@ extern symbolS* avr_undefined_symbol (char*);
extern void avr_post_relax_hook (void);
#define HANDLE_ALIGN(fragP) avr_handle_align (fragP)
extern void avr_handle_align (fragS *fragP);
extern void avr_handle_align (fragS *);
struct avr_frag_data
{
@ -240,5 +240,8 @@ struct avr_frag_data
char fill;
offsetT alignment;
unsigned int prev_opcode;
};
#define TC_FRAG_TYPE struct avr_frag_data
#define TC_FRAG_INIT(frag) avr_frag_init (frag)
extern void avr_frag_init (fragS *);

View File

@ -0,0 +1,4 @@
#name: PR 21621 (correct generation of skip warnings)
#as:
#target: avr-*-*
#error-output: pr21621.l

View File

@ -0,0 +1,2 @@
[^:]*: Assembler messages:
[^:]*:15: Warning: skipping two-word instruction

View File

@ -0,0 +1,15 @@
.text
cpse 0,0
.subsection 1
lds 0,0
.previous
clc
.text
cpse 1,1
.subsection 1
sec
.previous
lds 1,1