opcodes/arc: Implement style support in the disassembler
authorClaudiu Zissulescu <claziss@gmail.com>
Mon, 18 Jul 2022 08:43:07 +0000 (11:43 +0300)
committerClaudiu Zissulescu <claziss@gmail.com>
Mon, 18 Jul 2022 11:25:31 +0000 (14:25 +0300)
Update the ARC disassembler to supply style information to the
disassembler output. The output formatting remains unchanged.

opcodes/ChangeLog:
* disassemble.c (disassemble_init_for_target): Set
created_styled_output for ARC based targets.
* arc-dis.c (find_format_from_table): Use fprintf_styled_ftype
instead of fprintf_ftype throughout.
(find_format): Likewise.
(print_flags): Likewise.
(print_insn_arc): Likewise.

Signed-off-by: Claudiu Zissulescu <claziss@gmail.com>
opcodes/ChangeLog
opcodes/arc-dis.c
opcodes/disassemble.c

index 3456b46f29e44e9e68de4b60c24912ede6b45971..3889a80f427ef3524ae390cedbebb74efcf36a1f 100644 (file)
@@ -1,3 +1,13 @@
+2022-07-18  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * disassemble.c (disassemble_init_for_target): Set
+       created_styled_output for ARC based targets.
+       * arc-dis.c (find_format_from_table): Use fprintf_styled_ftype
+       instead of fprintf_ftype throughout.
+       (find_format): Likewise.
+       (print_flags): Likewise.
+       (print_insn_arc): Likewise.
+
 2022-07-08  Nick Clifton  <nickc@redhat.com>
 
        * 2.39 branch created.
index 771f786d18e5b40dce14f9a705e74945a43f19e8..dbaa96178a8e0f62782b00352992878d609fd1b2 100644 (file)
@@ -375,11 +375,12 @@ find_format_from_table (struct disassemble_info *info,
 
   if (warn_p)
     {
-      info->fprintf_func (info->stream,
-                         _("\nWarning: disassembly may be wrong due to "
-                           "guessed opcode class choice.\n"
-                           "Use -M<class[,class]> to select the correct "
-                           "opcode class(es).\n\t\t\t\t"));
+      info->fprintf_styled_func
+       (info->stream, dis_style_text,
+        _("\nWarning: disassembly may be wrong due to "
+          "guessed opcode class choice.\n"
+          "Use -M<class[,class]> to select the correct "
+          "opcode class(es).\n\t\t\t\t"));
       return t_op;
     }
 
@@ -436,9 +437,10 @@ find_format (bfd_vma                       memaddr,
          opcode = arcExtMap_genOpcode (i, isa_mask, &errmsg);
          if (opcode == NULL)
            {
-             (*info->fprintf_func) (info->stream,
-                                    _("An error occurred while generating the "
-                                      "extension instruction operations"));
+             (*info->fprintf_styled_func)
+               (info->stream, dis_style_text,
+                _("An error occurred while generating "
+                  "the extension instruction operations"));
              *opcode_result = NULL;
              return false;
            }
@@ -514,7 +516,8 @@ print_flags (const struct arc_opcode *opcode,
          name = arcExtMap_condCodeName (value);
          if (name)
            {
-             (*info->fprintf_func) (info->stream, ".%s", name);
+             (*info->fprintf_styled_func) (info->stream, dis_style_mnemonic,
+                                           ".%s", name);
              continue;
            }
        }
@@ -545,7 +548,8 @@ print_flags (const struct arc_opcode *opcode,
            {
               /* FIXME!: print correctly nt/t flag.  */
              if (!special_flag_p (opcode->name, flg_operand->name))
-               (*info->fprintf_func) (info->stream, ".");
+               (*info->fprintf_styled_func) (info->stream,
+                                             dis_style_mnemonic, ".");
              else if (info->insn_type == dis_dref)
                {
                  switch (flg_operand->name[0])
@@ -580,7 +584,8 @@ print_flags (const struct arc_opcode *opcode,
              if (cl_flags->flag_class & F_CLASS_WB)
                arc_infop->writeback_mode = flg_operand->code;
 
-             (*info->fprintf_func) (info->stream, "%s", flg_operand->name);
+             (*info->fprintf_styled_func) (info->stream, dis_style_mnemonic,
+                                           "%s", flg_operand->name);
            }
        }
     }
@@ -1061,13 +1066,28 @@ print_insn_arc (bfd_vma memaddr,
       switch (size)
        {
        case 1:
-         (*info->fprintf_func) (info->stream, ".byte\t0x%02lx", data);
+         (*info->fprintf_styled_func) (info->stream,
+                                       dis_style_assembler_directive,
+                                       ".byte");
+         (*info->fprintf_styled_func) (info->stream, dis_style_text, "\t");
+         (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
+                                       "0x%02lx", data);
          break;
        case 2:
-         (*info->fprintf_func) (info->stream, ".short\t0x%04lx", data);
+         (*info->fprintf_styled_func) (info->stream,
+                                       dis_style_assembler_directive,
+                                       ".short");
+         (*info->fprintf_styled_func) (info->stream, dis_style_text, "\t");
+         (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
+                                       "0x%04lx", data);
          break;
        case 4:
-         (*info->fprintf_func) (info->stream, ".word\t0x%08lx", data);
+         (*info->fprintf_styled_func) (info->stream,
+                                       dis_style_assembler_directive,
+                                       ".word");
+         (*info->fprintf_styled_func) (info->stream, dis_style_text, "\t");
+         (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
+                                       "0x%08lx", data);
          break;
        default:
          return -1;
@@ -1157,27 +1177,45 @@ print_insn_arc (bfd_vma memaddr,
       switch (insn_len)
        {
        case 2:
-         (*info->fprintf_func) (info->stream, ".shor\t%#04llx",
-                                insn & 0xffff);
+         (*info->fprintf_styled_func) (info->stream,
+                                       dis_style_assembler_directive,
+                                       ".short");
+         (*info->fprintf_styled_func) (info->stream, dis_style_text, "\t");
+         (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
+                                       "0x%04llx", insn & 0xffff);
          break;
 
        case 4:
-         (*info->fprintf_func) (info->stream, ".word\t%#08llx",
-                                insn & 0xffffffff);
+         (*info->fprintf_styled_func) (info->stream,
+                                       dis_style_assembler_directive,
+                                       ".word");
+         (*info->fprintf_styled_func) (info->stream, dis_style_text, "\t");
+         (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
+                                       "0x%08llx", insn & 0xffffffff);
          break;
 
        case 6:
-         (*info->fprintf_func) (info->stream, ".long\t%#08llx",
-                                insn & 0xffffffff);
-         (*info->fprintf_func) (info->stream, ".long\t%#04llx",
-                                (insn >> 32) & 0xffff);
+         (*info->fprintf_styled_func) (info->stream,
+                                       dis_style_assembler_directive,
+                                       ".long");
+         (*info->fprintf_styled_func) (info->stream, dis_style_text, "\t");
+         (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
+                                      "0x%08llx", insn & 0xffffffff);
+         (*info->fprintf_styled_func) (info->stream, dis_style_text, " ");
+         (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
+                                       "0x%04llx", (insn >> 32) & 0xffff);
          break;
 
        case 8:
-         (*info->fprintf_func) (info->stream, ".long\t%#08llx",
-                                insn & 0xffffffff);
-         (*info->fprintf_func) (info->stream, ".long\t%#08llx",
-                                insn >> 32);
+         (*info->fprintf_styled_func) (info->stream,
+                                       dis_style_assembler_directive,
+                                       ".long");
+         (*info->fprintf_styled_func) (info->stream, dis_style_text, "\t");
+         (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
+                                       "0x%08llx", insn & 0xffffffff);
+         (*info->fprintf_styled_func) (info->stream, dis_style_text, " ");
+         (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
+                                       "0x%08llx", (insn >> 32));
          break;
 
        default:
@@ -1189,7 +1227,8 @@ print_insn_arc (bfd_vma memaddr,
     }
 
   /* Print the mnemonic.  */
-  (*info->fprintf_func) (info->stream, "%s", opcode->name);
+  (*info->fprintf_styled_func) (info->stream, dis_style_mnemonic,
+                               "%s", opcode->name);
 
   /* Preselect the insn class.  */
   info->insn_type = arc_opcode_to_insn_type (opcode);
@@ -1199,7 +1238,7 @@ print_insn_arc (bfd_vma memaddr,
   print_flags (opcode, &insn, info);
 
   if (opcode->operands[0] != 0)
-    (*info->fprintf_func) (info->stream, "\t");
+    (*info->fprintf_styled_func) (info->stream, dis_style_text, "\t");
 
   need_comma = false;
   open_braket = false;
@@ -1212,7 +1251,7 @@ print_insn_arc (bfd_vma memaddr,
     {
       if (open_braket && (operand->flags & ARC_OPERAND_BRAKET))
        {
-         (*info->fprintf_func) (info->stream, "]");
+         (*info->fprintf_styled_func) (info->stream, dis_style_text, "]");
          open_braket = false;
          continue;
        }
@@ -1228,16 +1267,16 @@ print_insn_arc (bfd_vma memaddr,
 
       if (operand->flags & ARC_OPERAND_COLON)
        {
-         (*info->fprintf_func) (info->stream, ":");
+         (*info->fprintf_styled_func) (info->stream, dis_style_text, ":");
          continue;
        }
 
       if (need_comma)
-       (*info->fprintf_func) (info->stream, ",");
+       (*info->fprintf_styled_func) (info->stream, dis_style_text,",");
 
       if (!open_braket && (operand->flags & ARC_OPERAND_BRAKET))
        {
-         (*info->fprintf_func) (info->stream, "[");
+         (*info->fprintf_styled_func) (info->stream, dis_style_text, "[");
          open_braket = true;
          need_comma = false;
          continue;
@@ -1268,7 +1307,8 @@ print_insn_arc (bfd_vma memaddr,
          rname = arcExtMap_coreRegName (value);
          if (!rname)
            rname = regnames[value];
-         (*info->fprintf_func) (info->stream, "%s", rname);
+         (*info->fprintf_styled_func) (info->stream, dis_style_register,
+                                       "%s", rname);
 
          /* Check if we have a double register to print.  */
          if (operand->flags & ARC_OPERAND_TRUNCATE)
@@ -1282,7 +1322,8 @@ print_insn_arc (bfd_vma memaddr,
              else
                rname = _("\nWarning: illegal use of double register "
                          "pair.\n");
-             (*info->fprintf_func) (info->stream, "%s", rname);
+             (*info->fprintf_styled_func) (info->stream, dis_style_register,
+                                           "%s", rname);
            }
          if (value == 63)
            rpcl = true;
@@ -1294,10 +1335,12 @@ print_insn_arc (bfd_vma memaddr,
          const char *rname = get_auxreg (opcode, value, isa_mask);
 
          if (rname && open_braket)
-           (*info->fprintf_func) (info->stream, "%s", rname);
+           (*info->fprintf_styled_func) (info->stream, dis_style_register,
+                                         "%s", rname);
          else
            {
-             (*info->fprintf_func) (info->stream, "%#x", value);
+             (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
+                                           "%#x", value);
              if (info->insn_type == dis_branch
                  || info->insn_type == dis_jsr)
                info->target = (bfd_vma) value;
@@ -1307,19 +1350,23 @@ print_insn_arc (bfd_vma memaddr,
        {
          const char *rname = get_auxreg (opcode, value, isa_mask);
          if (rname && open_braket)
-           (*info->fprintf_func) (info->stream, "%s", rname);
+           (*info->fprintf_styled_func) (info->stream, dis_style_register,
+                                         "%s", rname);
          else
            {
              if (print_hex)
-               (*info->fprintf_func) (info->stream, "%#x", value);
+               (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
+                                             "%#x", value);
              else
-               (*info->fprintf_func) (info->stream, "%d", value);
+               (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
+                                             "%d", value);
            }
        }
       else if (operand->flags & ARC_OPERAND_ADDRTYPE)
        {
          const char *addrtype = get_addrtype (value);
-         (*info->fprintf_func) (info->stream, "%s", addrtype);
+         (*info->fprintf_styled_func) (info->stream, dis_style_address,
+                                       "%s", addrtype);
          /* A colon follow an address type.  */
          need_comma = false;
        }
@@ -1337,11 +1384,17 @@ print_insn_arc (bfd_vma memaddr,
                  need_comma = false;
                  break;
                case 1:
-                 (*info->fprintf_func) (info->stream, "r13");
+                 (*info->fprintf_styled_func) (info->stream,
+                                               dis_style_register, "r13");
                  break;
                default:
-                 (*info->fprintf_func) (info->stream, "r13-%s",
-                                        regnames[13 + value - 1]);
+                 (*info->fprintf_styled_func) (info->stream,
+                                               dis_style_register, "r13");
+                 (*info->fprintf_styled_func) (info->stream,
+                                               dis_style_text, "-");
+                 (*info->fprintf_styled_func) (info->stream,
+                                               dis_style_register, "%s",
+                                               regnames[13 + value - 1]);
                  break;
                }
              rpcl = false;
@@ -1351,9 +1404,11 @@ print_insn_arc (bfd_vma memaddr,
            {
              const char *rname = get_auxreg (opcode, value, isa_mask);
              if (rname && open_braket)
-               (*info->fprintf_func) (info->stream, "%s", rname);
+               (*info->fprintf_styled_func) (info->stream, dis_style_register,
+                                             "%s", rname);
              else
-               (*info->fprintf_func) (info->stream, "%#x", value);
+               (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
+                                             "%" PRIx32, value);
            }
        }
 
@@ -1387,7 +1442,8 @@ print_insn_arc (bfd_vma memaddr,
           the addend is not currently pc-relative.  */
        memaddr = 0;
 
-      (*info->fprintf_func) (info->stream, "\t;");
+      (*info->fprintf_styled_func) (info->stream,
+                                   dis_style_comment_start, "\t;");
       (*info->print_address_func) ((memaddr & ~3) + vpcl, info);
     }
 
index bd37f042b316c92dcc200a70eabeab353b56b323..e2e5a2608d6f581ddc14c15eb8cd5f3f85739175 100644 (file)
@@ -612,6 +612,11 @@ disassemble_init_for_target (struct disassemble_info * info)
       info->disassembler_needs_relocs = true;
       break;
 #endif
+#ifdef ARCH_arc
+    case bfd_arch_arc:
+      info->created_styled_output = true;
+      break;
+#endif
 #ifdef ARCH_arm
     case bfd_arch_arm:
       info->symbol_is_valid = arm_symbol_is_valid;