Fix the AVR assembler so that it will correctly issue warnings about skipped instruct...
authorNick Clifton <nickc@redhat.com>
Thu, 19 Oct 2017 15:21:51 +0000 (16:21 +0100)
committerNick Clifton <nickc@redhat.com>
Thu, 19 Oct 2017 15:21:51 +0000 (16:21 +0100)
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.

gas/ChangeLog
gas/config/tc-avr.c
gas/config/tc-avr.h
gas/testsuite/gas/avr/pr21621.d [new file with mode: 0644]
gas/testsuite/gas/avr/pr21621.l [new file with mode: 0644]
gas/testsuite/gas/avr/pr21621.s [new file with mode: 0644]

index 23b2faa19af485e78307be2916c10110b2625cab..3e41860119cfa6f4d7c08d715960a640e46798af 100644 (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
index 067657b7d43a01af6ea652e1f2a3567cf36ee953..51f1b9385095d0efeec829d215618026f01a687e 100644 (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;
 }
index 0cfe9ff92a0803b32bb012e754dacc3b7d51b6f5..96f6890d81fbfcb0df2f80fcac8597a95e127459 100644 (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 *);
diff --git a/gas/testsuite/gas/avr/pr21621.d b/gas/testsuite/gas/avr/pr21621.d
new file mode 100644 (file)
index 0000000..6354c85
--- /dev/null
@@ -0,0 +1,4 @@
+#name: PR 21621 (correct generation of skip warnings)
+#as: 
+#target: avr-*-*
+#error-output: pr21621.l
diff --git a/gas/testsuite/gas/avr/pr21621.l b/gas/testsuite/gas/avr/pr21621.l
new file mode 100644 (file)
index 0000000..a356bc7
--- /dev/null
@@ -0,0 +1,2 @@
+[^:]*: Assembler messages:
+[^:]*:15: Warning: skipping two-word instruction
diff --git a/gas/testsuite/gas/avr/pr21621.s b/gas/testsuite/gas/avr/pr21621.s
new file mode 100644 (file)
index 0000000..6ada2ca
--- /dev/null
@@ -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