Don't leave DLX the_insn uninitialised
authorAlan Modra <amodra@gmail.com>
Mon, 16 Jun 2014 00:32:59 +0000 (10:02 +0930)
committerAlan Modra <amodra@gmail.com>
Mon, 16 Jun 2014 03:03:42 +0000 (12:33 +0930)
In particular the_insn.reloc must be initialised, otherwise the early
exit cases for bad opcodes will result in cascading errors if
write_object_file is called after an error.

* config/tc-dlx.c (machine_ip): Move initialisation of the_insn
earlier.

gas/ChangeLog
gas/config/tc-dlx.c

index 568df4e..8f1aec1 100644 (file)
@@ -1,5 +1,10 @@
 2014-06-16  Alan Modra  <amodra@gmail.com>
 
+       * config/tc-dlx.c (machine_ip): Move initialisation of the_insn
+       earlier.
+
+2014-06-16  Alan Modra  <amodra@gmail.com>
+
        * config/tc-i386.c (reloc): Don't avoid pcrel check for
        BFD_RELOC_SIZE64.  Return NO_RELOC on failing pcrel check.
 
index 4cbc5c0..3c487f2 100644 (file)
@@ -666,6 +666,9 @@ machine_ip (char *str)
   expressionS *operand = &the_operand;
   unsigned int reg, reg_shift = 0;
 
+  memset (&the_insn, '\0', sizeof (the_insn));
+  the_insn.reloc = NO_RELOC;
+
   /* Fixup the opcode string to all lower cases, and also
      allow numerical digits.  */
   s = str;
@@ -690,19 +693,12 @@ machine_ip (char *str)
       return;
     }
 
-  /* Hash the opcode, insn will have the string from opcode table.
-     also initialized the_insn struct.  */
+  /* Hash the opcode, insn will have the string from opcode table.  */
   if ((insn = (struct machine_opcode *) hash_find (op_hash, str)) == NULL)
     {
       /* Handle the ret and return macro here.  */
       if ((strcmp (str, "ret") == 0) || (strcmp (str, "return") == 0))
-       {
-         memset (&the_insn, '\0', sizeof (the_insn));
-         the_insn.reloc = NO_RELOC;
-         the_insn.pcrel = 0;
-         the_insn.opcode =
-           (unsigned long)(JROP | 0x03e00000);    /* 0x03e00000 = r31 << 21 */
-       }
+       the_insn.opcode = JROP | 0x03e00000;    /* 0x03e00000 = r31 << 21 */
       else
        as_bad (_("Unknown opcode `%s'."), str);
 
@@ -710,9 +706,6 @@ machine_ip (char *str)
     }
 
   opcode = insn->opcode;
-  memset (&the_insn, '\0', sizeof (the_insn));
-  the_insn.reloc = NO_RELOC;
-  the_insn.pcrel = 0;
 
   /* Set the sip reloc HI16 flag.  */
   if (!set_dlx_skip_hi16_flag (1))