mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-23 03:29:47 +08:00
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:
@ -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>
|
2017-10-19 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||||
|
|
||||||
* testsuite/gas/all/fill-1.s: Use normal labels. Change .text to
|
* testsuite/gas/all/fill-1.s: Use normal labels. Change .text to
|
||||||
|
@ -1326,6 +1326,15 @@ avr_operand (struct avr_opcodes_s *opcode,
|
|||||||
return op_mask;
|
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.
|
/* Parse instruction operands.
|
||||||
Return binary opcode. */
|
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 *frag = frag_more (opcode->insn_size * 2);
|
||||||
char *str = *line;
|
char *str = *line;
|
||||||
int where = frag - frag_now->fr_literal;
|
int where = frag - frag_now->fr_literal;
|
||||||
static unsigned int prev = 0; /* Previous opcode. */
|
|
||||||
int regno1 = -2;
|
int regno1 = -2;
|
||||||
int regno2 = -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). */
|
(AVR core bug, fixed in the newer devices). */
|
||||||
if (!(avr_opt.no_skip_bug ||
|
if (!(avr_opt.no_skip_bug ||
|
||||||
(avr_mcu->isa & (AVR_ISA_MUL | AVR_ISA_MOVW)))
|
(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"));
|
as_warn (_("skipping two-word instruction"));
|
||||||
|
|
||||||
bfd_putl32 ((bfd_vma) bin, frag);
|
bfd_putl32 ((bfd_vma) bin, frag);
|
||||||
@ -1411,7 +1419,7 @@ avr_operands (struct avr_opcodes_s *opcode, char **line)
|
|||||||
else
|
else
|
||||||
bfd_putl16 ((bfd_vma) bin, frag);
|
bfd_putl16 ((bfd_vma) bin, frag);
|
||||||
|
|
||||||
prev = bin;
|
frag_now->tc_frag_data.prev_opcode = bin;
|
||||||
*line = str;
|
*line = str;
|
||||||
return bin;
|
return bin;
|
||||||
}
|
}
|
||||||
|
@ -230,7 +230,7 @@ extern symbolS* avr_undefined_symbol (char*);
|
|||||||
extern void avr_post_relax_hook (void);
|
extern void avr_post_relax_hook (void);
|
||||||
|
|
||||||
#define HANDLE_ALIGN(fragP) avr_handle_align (fragP)
|
#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
|
struct avr_frag_data
|
||||||
{
|
{
|
||||||
@ -240,5 +240,8 @@ struct avr_frag_data
|
|||||||
|
|
||||||
char fill;
|
char fill;
|
||||||
offsetT alignment;
|
offsetT alignment;
|
||||||
|
unsigned int prev_opcode;
|
||||||
};
|
};
|
||||||
#define TC_FRAG_TYPE struct avr_frag_data
|
#define TC_FRAG_TYPE struct avr_frag_data
|
||||||
|
#define TC_FRAG_INIT(frag) avr_frag_init (frag)
|
||||||
|
extern void avr_frag_init (fragS *);
|
||||||
|
4
gas/testsuite/gas/avr/pr21621.d
Normal file
4
gas/testsuite/gas/avr/pr21621.d
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#name: PR 21621 (correct generation of skip warnings)
|
||||||
|
#as:
|
||||||
|
#target: avr-*-*
|
||||||
|
#error-output: pr21621.l
|
2
gas/testsuite/gas/avr/pr21621.l
Normal file
2
gas/testsuite/gas/avr/pr21621.l
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[^:]*: Assembler messages:
|
||||||
|
[^:]*:15: Warning: skipping two-word instruction
|
15
gas/testsuite/gas/avr/pr21621.s
Normal file
15
gas/testsuite/gas/avr/pr21621.s
Normal 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
|
Reference in New Issue
Block a user