public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Andrew Burgess <aburgess@redhat.com>
To: binutils@sourceware.org
Cc: Andrew Burgess <aburgess@redhat.com>
Subject: [PATCH 3/3] opcodes/i386: partially implement disassembler style support
Date: Wed, 16 Feb 2022 20:53:31 +0000	[thread overview]
Message-ID: <11996f886e69218629abf81f8041269e8740a60e.1645043588.git.aburgess@redhat.com> (raw)
In-Reply-To: <cover.1645043588.git.aburgess@redhat.com>

This commit adds partial support for disassembler styling in the i386
disassembler.

The i386 disassembler collects the instruction arguments into an array
of strings, and then loops over the array printing the arguments out
later on.  The problem is that by the time we print the arguments out
it's not obvious what the type of each argument is.

Obviously this can be fixed, but I'd like to not do that as part of
this commit, rather, I'd prefer to keep this commit as small as
possible to get the basic infrastructure in place, then we can improve
on this, to add additional styling, in later commits.

For now then, I think this commit should correctly style mnemonics,
some immediates, and comments.  Everything else will be printed as
plain text, which will include most instruction arguments, unless the
argument is printed as a symbol, by calling the print_address_func
callback.

Ignoring colours, there should be no other user visible changes in the
output of the disassembler in either objdump or gdb.

opcodes/ChangeLog:

	* disassembler.c (disassemble_init_for_target): Set
	created_styled_output for i386 based targets.
	* i386-dis.c: Changed throughout to use fprintf_styled_func
	instead of fprintf_func.
---
 opcodes/disassemble.c |  9 +++++-
 opcodes/i386-dis.c    | 71 +++++++++++++++++++++++++++++--------------
 2 files changed, 56 insertions(+), 24 deletions(-)

diff --git a/opcodes/disassemble.c b/opcodes/disassemble.c
index b8eed9695ea..81a90f20a9c 100644
--- a/opcodes/disassemble.c
+++ b/opcodes/disassemble.c
@@ -632,7 +632,14 @@ disassemble_init_for_target (struct disassemble_info * info)
       info->disassembler_needs_relocs = true;
       break;
 #endif
-
+#ifdef ARCH_i386
+    case bfd_arch_i386:
+    case bfd_arch_iamcu:
+    case bfd_arch_l1om:
+    case bfd_arch_k1om:
+      info->created_styled_output = true;
+      break;
+#endif
 #ifdef ARCH_ia64
     case bfd_arch_ia64:
       info->skip_zeroes = 16;
diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c
index a30bda0633b..f9a2e3d6357 100644
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -9402,8 +9402,8 @@ print_insn (bfd_vma pc, instr_info *ins)
 
   if (ins->address_mode == mode_64bit && sizeof (bfd_vma) < 8)
     {
-      (*ins->info->fprintf_func) (ins->info->stream,
-			     _("64-bit address is disabled"));
+      (*ins->info->fprintf_styled_func) (ins->info->stream, dis_style_text,
+					 _("64-bit address is disabled"));
       return -1;
     }
 
@@ -9456,12 +9456,18 @@ print_insn (bfd_vma pc, instr_info *ins)
 	{
 	  name = prefix_name (ins, priv.the_buffer[0], priv.orig_sizeflag);
 	  if (name != NULL)
-	    (*ins->info->fprintf_func) (ins->info->stream, "%s", name);
+	    (*ins->info->fprintf_styled_func)
+	      (ins->info->stream, dis_style_mnemonic, "%s", name);
 	  else
 	    {
 	      /* Just print the first byte as a .byte instruction.  */
-	      (*ins->info->fprintf_func) (ins->info->stream, ".byte 0x%x",
-				     (unsigned int) priv.the_buffer[0]);
+	      (*ins->info->fprintf_styled_func)
+		(ins->info->stream, dis_style_mnemonic, ".byte");
+	      (*ins->info->fprintf_styled_func)
+		(ins->info->stream, dis_style_text, " ");
+	      (*ins->info->fprintf_styled_func)
+		(ins->info->stream, dis_style_immediate, "0x%x",
+		 (unsigned int) priv.the_buffer[0]);
 	    }
 
 	  return 1;
@@ -9479,10 +9485,10 @@ print_insn (bfd_vma pc, instr_info *ins)
       for (i = 0;
 	   i < (int) ARRAY_SIZE (ins->all_prefixes) && ins->all_prefixes[i];
 	   i++)
-	(*ins->info->fprintf_func) (ins->info->stream, "%s%s",
-			       i == 0 ? "" : " ",
-			       prefix_name (ins, ins->all_prefixes[i],
-					    sizeflag));
+	(*ins->info->fprintf_styled_func)
+	  (ins->info->stream, dis_style_mnemonic, "%s%s",
+	   (i == 0 ? "" : " "), prefix_name (ins, ins->all_prefixes[i],
+					     sizeflag));
       return i;
     }
 
@@ -9497,10 +9503,15 @@ print_insn (bfd_vma pc, instr_info *ins)
       /* Handle ins->prefixes before fwait.  */
       for (i = 0; i < ins->fwait_prefix && ins->all_prefixes[i];
 	   i++)
-	(*ins->info->fprintf_func) (ins->info->stream, "%s ",
-				    prefix_name (ins, ins->all_prefixes[i],
-						 sizeflag));
-      (*ins->info->fprintf_func) (ins->info->stream, "fwait");
+	{
+	  (*ins->info->fprintf_styled_func)
+	    (ins->info->stream, dis_style_mnemonic, "%s",
+	     prefix_name (ins, ins->all_prefixes[i], sizeflag));
+	  (*ins->info->fprintf_styled_func)
+	    (ins->info->stream, dis_style_mnemonic, " ");
+	}
+      (*ins->info->fprintf_styled_func)
+	(ins->info->stream, dis_style_mnemonic, "fwait");
       return i + 1;
     }
 
@@ -9649,14 +9660,16 @@ print_insn (bfd_vma pc, instr_info *ins)
      are all 0s in inverted form.  */
   if (ins->need_vex && ins->vex.register_specifier != 0)
     {
-      (*ins->info->fprintf_func) (ins->info->stream, "(bad)");
+      (*ins->info->fprintf_styled_func) (ins->info->stream, dis_style_text,
+					 "(bad)");
       return ins->end_codep - priv.the_buffer;
     }
 
   /* If EVEX.z is set, there must be an actual mask register in use.  */
   if (ins->vex.zeroing && ins->vex.mask_register_specifier == 0)
     {
-      (*ins->info->fprintf_func) (ins->info->stream, "(bad)");
+      (*ins->info->fprintf_styled_func) (ins->info->stream, dis_style_text,
+					 "(bad)");
       return ins->end_codep - priv.the_buffer;
     }
 
@@ -9667,7 +9680,8 @@ print_insn (bfd_vma pc, instr_info *ins)
 	 the encoding invalid.  Most other PREFIX_OPCODE rules still apply.  */
       if (ins->need_vex ? !ins->vex.prefix : !(ins->prefixes & PREFIX_DATA))
 	{
-	  (*ins->info->fprintf_func) (ins->info->stream, "(bad)");
+	  (*ins->info->fprintf_styled_func) (ins->info->stream,
+					     dis_style_text, "(bad)");
 	  return ins->end_codep - priv.the_buffer;
 	}
       ins->used_prefixes |= PREFIX_DATA;
@@ -9694,7 +9708,8 @@ print_insn (bfd_vma pc, instr_info *ins)
 	  || (ins->vex.evex && dp->prefix_requirement != PREFIX_DATA
 	      && !ins->vex.w != !(ins->used_prefixes & PREFIX_DATA)))
 	{
-	  (*ins->info->fprintf_func) (ins->info->stream, "(bad)");
+	  (*ins->info->fprintf_styled_func) (ins->info->stream,
+					     dis_style_text, "(bad)");
 	  return ins->end_codep - priv.the_buffer;
 	}
       break;
@@ -9744,13 +9759,17 @@ print_insn (bfd_vma pc, instr_info *ins)
 	if (name == NULL)
 	  abort ();
 	prefix_length += strlen (name) + 1;
-	(*ins->info->fprintf_func) (ins->info->stream, "%s ", name);
+	(*ins->info->fprintf_styled_func)
+	  (ins->info->stream, dis_style_mnemonic, "%s", name);
+	(*ins->info->fprintf_styled_func)
+	  (ins->info->stream, dis_style_text, " ");
       }
 
   /* Check maximum code length.  */
   if ((ins->codep - ins->start_codep) > MAX_CODE_LENGTH)
     {
-      (*ins->info->fprintf_func) (ins->info->stream, "(bad)");
+      (*ins->info->fprintf_styled_func)
+	(ins->info->stream, dis_style_text, "(bad)");
       return MAX_CODE_LENGTH;
     }
 
@@ -9758,7 +9777,8 @@ print_insn (bfd_vma pc, instr_info *ins)
   for (i = strlen (ins->obuf) + prefix_length; i < 6; i++)
     oappend (ins, " ");
   oappend (ins, " ");
-  (*ins->info->fprintf_func) (ins->info->stream, "%s", ins->obuf);
+  (*ins->info->fprintf_styled_func)
+    (ins->info->stream, dis_style_mnemonic, "%s", ins->obuf);
 
   /* The enter and bound instructions are printed with operands in the same
      order as the intel book; everything else is printed in reverse order.  */
@@ -9797,7 +9817,8 @@ print_insn (bfd_vma pc, instr_info *ins)
     if (*op_txt[i])
       {
 	if (needcomma)
-	  (*ins->info->fprintf_func) (ins->info->stream, ",");
+	  (*ins->info->fprintf_styled_func) (ins->info->stream,
+					     dis_style_text, ",");
 	if (ins->op_index[i] != -1 && !ins->op_riprel[i])
 	  {
 	    bfd_vma target = (bfd_vma) ins->op_address[ins->op_index[i]];
@@ -9813,14 +9834,18 @@ print_insn (bfd_vma pc, instr_info *ins)
 	    (*ins->info->print_address_func) (target, ins->info);
 	  }
 	else
-	  (*ins->info->fprintf_func) (ins->info->stream, "%s", op_txt[i]);
+	  (*ins->info->fprintf_styled_func) (ins->info->stream,
+					     dis_style_text, "%s",
+					     op_txt[i]);
 	needcomma = 1;
       }
 
   for (i = 0; i < MAX_OPERANDS; i++)
     if (ins->op_index[i] != -1 && ins->op_riprel[i])
       {
-	(*ins->info->fprintf_func) (ins->info->stream, "        # ");
+	(*ins->info->fprintf_styled_func) (ins->info->stream,
+					   dis_style_comment_start,
+					   "        # ");
 	(*ins->info->print_address_func) ((bfd_vma)
 			(ins->start_pc + (ins->codep - ins->start_codep)
 			 + ins->op_address[ins->op_index[i]]), ins->info);
-- 
2.25.4


  parent reply	other threads:[~2022-02-16 20:53 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-16 20:53 [PATCH 0/3] disassembler syntax highlighting in objdump (via libopcodes) Andrew Burgess
2022-02-16 20:53 ` [PATCH 1/3] objdump/opcodes: add syntax highlighting to disassembler output Andrew Burgess
2022-02-28 15:54   ` Tom Tromey
2022-02-16 20:53 ` [PATCH 2/3] opcodes/riscv: implement style support in the disassembler Andrew Burgess
2022-02-19 10:24   ` Andrew Burgess
2022-02-16 20:53 ` Andrew Burgess [this message]
2022-02-17  9:35   ` [PATCH 3/3] opcodes/i386: partially implement disassembler style support Jan Beulich
2022-02-17 16:15     ` Andrew Burgess
2022-02-17 16:29       ` Jan Beulich
2022-02-17 22:37         ` Andrew Burgess
2022-02-18  7:14           ` Jan Beulich
2022-02-19 10:54             ` Andrew Burgess
2022-02-21 13:08               ` Jan Beulich
2022-02-21 18:01                 ` Andrew Burgess
2022-02-17  3:57 ` [PATCH 0/3] disassembler syntax highlighting in objdump (via libopcodes) Nelson Chu
2022-02-17 16:17   ` Andrew Burgess
2022-03-21 14:33 ` [PATCHv2 " Andrew Burgess
2022-03-21 14:33   ` [PATCHv2 1/3] objdump/opcodes: add syntax highlighting to disassembler output Andrew Burgess
2022-03-21 14:33   ` [PATCHv2 2/3] opcodes/riscv: implement style support in the disassembler Andrew Burgess
2022-03-21 14:33   ` [PATCHv2 3/3] opcodes/i386: partially implement disassembler style support Andrew Burgess
2022-03-24 17:08   ` [PATCHv2 0/3] disassembler syntax highlighting in objdump (via libopcodes) Nick Clifton

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=11996f886e69218629abf81f8041269e8740a60e.1645043588.git.aburgess@redhat.com \
    --to=aburgess@redhat.com \
    --cc=binutils@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).