demand_copy_C_string NUL check
[binutils-gdb.git] / opcodes / arc-dis.c
index ac8d6aa750018eae1de5db9c6b4a4b6f35d8f7bd..6a6404a162428bcc06fd1fddddc412e74c2ca936 100644 (file)
@@ -1,5 +1,5 @@
 /* Instruction printing code for the ARC.
-   Copyright (C) 1994-2020 Free Software Foundation, Inc.
+   Copyright (C) 1994-2021 Free Software Foundation, Inc.
 
    Contributed by Claudiu Zissulescu (claziss@synopsys.com)
 
@@ -90,7 +90,7 @@ static const char * const regnames[64] =
   "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39",
   "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47",
   "r48", "r49", "r50", "r51", "r52", "r53", "r54", "r55",
-  "r56", "r57", "ACCL", "ACCH", "lp_count", "rezerved", "LIMM", "pcl"
+  "r56", "r57", "r58", "r59", "lp_count", "reserved", "LIMM", "pcl"
 };
 
 static const char * const addrtypenames[ARC_NUM_ADDRTYPES] =
@@ -420,7 +420,7 @@ find_format (bfd_vma                       memaddr,
              struct arc_operand_iterator * iter)
 {
   const struct arc_opcode *opcode = NULL;
-  bfd_boolean needs_limm;
+  bfd_boolean needs_limm = FALSE;
   const extInstruction_t *einsn, *i;
   unsigned limm = 0;
   struct arc_disassemble_info *arc_infop = info->private_data;
@@ -436,8 +436,9 @@ find_format (bfd_vma                       memaddr,
          opcode = arcExtMap_genOpcode (i, isa_mask, &errmsg);
          if (opcode == NULL)
            {
-             (*info->fprintf_func) (info->stream, "\
-An error occured while generating the extension instruction operations");
+             (*info->fprintf_func) (info->stream,
+                                    _("An error occurred while generating the "
+                                      "extension instruction operations"));
              *opcode_result = NULL;
              return FALSE;
            }
@@ -452,7 +453,7 @@ An error occured while generating the extension instruction operations");
     opcode = find_format_from_table (info, arc_opcodes, insn, *insn_len,
                                     isa_mask, &needs_limm, TRUE);
 
-  if (needs_limm && opcode != NULL)
+  if (opcode != NULL && needs_limm)
     {
       bfd_byte buffer[4];
       int status;
@@ -482,7 +483,7 @@ An error occured while generating the extension instruction operations");
 
   /* Update private data.  */
   arc_infop->opcode = opcode;
-  arc_infop->limm = (needs_limm) ? limm : 0;
+  arc_infop->limm = limm;
   arc_infop->limm_p = needs_limm;
 
   return TRUE;
@@ -1268,11 +1269,19 @@ print_insn_arc (bfd_vma memaddr,
          if (!rname)
            rname = regnames[value];
          (*info->fprintf_func) (info->stream, "%s", rname);
+
+         /* Check if we have a double register to print.  */
          if (operand->flags & ARC_OPERAND_TRUNCATE)
            {
-             rname = arcExtMap_coreRegName (value + 1);
-             if (!rname)
-               rname = regnames[value + 1];
+             if ((value & 0x01) == 0)
+               {
+                 rname = arcExtMap_coreRegName (value + 1);
+                 if (!rname)
+                   rname = regnames[value + 1];
+               }
+             else
+               rname = _("\nWarning: illegal use of double register "
+                         "pair.\n");
              (*info->fprintf_func) (info->stream, "%s", rname);
            }
          if (value == 63)