public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] libopcodes/ppc: add support for disassembler styling
@ 2022-07-12 13:36 Andrew Burgess
  2022-07-14  2:09 ` Alan Modra
  2022-07-18 16:31 ` [PATCHv2 0/2] PPC Styled Disassembler Support Andrew Burgess
  0 siblings, 2 replies; 10+ messages in thread
From: Andrew Burgess @ 2022-07-12 13:36 UTC (permalink / raw)
  To: binutils; +Cc: Andrew Burgess

This commit adds disassembler styling to the libopcodes ppc
disassembler.  This conversion was pretty straight forward, I just
converted the fprintf_func calls to fprintf_styled_func calls and
added an appropriate style.

For testing the new styling I just assembled then disassembled the
source files in gas/testsuite/gas/ppc and manually checked that the
styling looked reasonable.

I think the only slightly weird case was how things like '4*cr1+eq'
are styled.  As best I can tell, this construct, used for example in
this instruction:

  crand   4*cr1+lt,4*cr1+gt,4*cr1+eq

is used to access a field of a control register (NOTE: I know very
little about the PPC ISA, so please correct me if I'm wrong).  As
such, I have styled the entire construct as a register.  In some cases
constructs similar to the above can be simplified to just 'eq', as
this is still referencing a register field, this is still styled as a
register.

If the user does not request styled output from objdump, then there
should be no change in the disassembler output after this commit.
---
 opcodes/disassemble.c |   1 +
 opcodes/ppc-dis.c     | 107 ++++++++++++++++++++++++++++++------------
 2 files changed, 78 insertions(+), 30 deletions(-)

diff --git a/opcodes/disassemble.c b/opcodes/disassemble.c
index bd37f042b31..9c991b8121e 100644
--- a/opcodes/disassemble.c
+++ b/opcodes/disassemble.c
@@ -705,6 +705,7 @@ disassemble_init_for_target (struct disassemble_info * info)
 #endif
 #if defined (ARCH_powerpc) || defined (ARCH_rs6000)
       disassemble_init_powerpc (info);
+      info->created_styled_output = true;
       break;
 #endif
 #ifdef ARCH_riscv
diff --git a/opcodes/ppc-dis.c b/opcodes/ppc-dis.c
index 45e8faeef5e..1447afaecc3 100644
--- a/opcodes/ppc-dis.c
+++ b/opcodes/ppc-dis.c
@@ -829,12 +829,24 @@ print_got_plt (struct sec_buf *sb, uint64_t vma, struct disassemble_info *info)
 		    sym = (*info->symbol_at_address_func) (ent, info);
 		}
 	    }
+	  (*info->fprintf_styled_func) (info->stream, dis_style_text, " [");
 	  if (sym != NULL)
-	    (*info->fprintf_func) (info->stream, " [%s@%s]",
-				   bfd_asymbol_name (sym), sb->name + 1);
+	    {
+	      (*info->fprintf_styled_func) (info->stream, dis_style_symbol,
+					    "%s", bfd_asymbol_name (sym));
+	      (*info->fprintf_styled_func) (info->stream, dis_style_text, "@");
+	      (*info->fprintf_styled_func) (info->stream, dis_style_symbol,
+					    "%s", sb->name + 1);
+	    }
 	  else
-	    (*info->fprintf_func) (info->stream, " [%" PRIx64 "@%s]",
-				   ent, sb->name + 1);
+	    {
+	      (*info->fprintf_styled_func) (info->stream, dis_style_address,
+					    "%" PRIx64, ent);
+	      (*info->fprintf_styled_func) (info->stream, dis_style_text, "@");
+	      (*info->fprintf_styled_func) (info->stream, dis_style_symbol,
+					    "%s", sb->name + 1);
+	    }
+	  (*info->fprintf_styled_func) (info->stream, dis_style_text, "]");
 	  return true;
 	}
     }
@@ -943,8 +955,9 @@ print_insn_powerpc (bfd_vma memaddr,
       uint64_t d34;
       int blanks;
 
-      (*info->fprintf_func) (info->stream, "%s", opcode->name);
-      /* gdb fprintf_func doesn't return count printed.  */
+      (*info->fprintf_styled_func) (info->stream, dis_style_mnemonic,
+				    "%s", opcode->name);
+      /* gdb fprintf_styled_func doesn't return count printed.  */
       blanks = 8 - strlen (opcode->name);
       if (blanks <= 0)
 	blanks = 1;
@@ -976,39 +989,49 @@ print_insn_powerpc (bfd_vma memaddr,
 	  value = operand_value_powerpc (operand, insn, dialect);
 
 	  if (op_separator == need_comma)
-	    (*info->fprintf_func) (info->stream, ",");
+	    (*info->fprintf_styled_func) (info->stream, dis_style_text, ",");
 	  else if (op_separator == need_paren)
-	    (*info->fprintf_func) (info->stream, "(");
+	    (*info->fprintf_styled_func) (info->stream, dis_style_text, "(");
 	  else
-	    (*info->fprintf_func) (info->stream, "%*s", op_separator, " ");
+	    (*info->fprintf_styled_func) (info->stream, dis_style_text, "%*s",
+					  op_separator, " ");
 
 	  /* Print the operand as directed by the flags.  */
 	  if ((operand->flags & PPC_OPERAND_GPR) != 0
 	      || ((operand->flags & PPC_OPERAND_GPR_0) != 0 && value != 0))
-	    (*info->fprintf_func) (info->stream, "r%" PRId64, value);
+	    (*info->fprintf_styled_func) (info->stream, dis_style_register,
+					  "r%" PRId64, value);
 	  else if ((operand->flags & PPC_OPERAND_FPR) != 0)
-	    (*info->fprintf_func) (info->stream, "f%" PRId64, value);
+	    (*info->fprintf_styled_func) (info->stream, dis_style_register,
+					  "f%" PRId64, value);
 	  else if ((operand->flags & PPC_OPERAND_VR) != 0)
-	    (*info->fprintf_func) (info->stream, "v%" PRId64, value);
+	    (*info->fprintf_styled_func) (info->stream, dis_style_register,
+					  "v%" PRId64, value);
 	  else if ((operand->flags & PPC_OPERAND_VSR) != 0)
-	    (*info->fprintf_func) (info->stream, "vs%" PRId64, value);
+	    (*info->fprintf_styled_func) (info->stream, dis_style_register,
+					  "vs%" PRId64, value);
 	  else if ((operand->flags & PPC_OPERAND_ACC) != 0)
-	    (*info->fprintf_func) (info->stream, "a%" PRId64, value);
+	    (*info->fprintf_styled_func) (info->stream, dis_style_register,
+					  "a%" PRId64, value);
 	  else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0)
 	    (*info->print_address_func) (memaddr + value, info);
 	  else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0)
 	    (*info->print_address_func) ((bfd_vma) value & 0xffffffff, info);
 	  else if ((operand->flags & PPC_OPERAND_FSL) != 0)
-	    (*info->fprintf_func) (info->stream, "fsl%" PRId64, value);
+	    (*info->fprintf_styled_func) (info->stream, dis_style_register,
+					  "fsl%" PRId64, value);
 	  else if ((operand->flags & PPC_OPERAND_FCR) != 0)
-	    (*info->fprintf_func) (info->stream, "fcr%" PRId64, value);
+	    (*info->fprintf_styled_func) (info->stream, dis_style_register,
+					  "fcr%" PRId64, value);
 	  else if ((operand->flags & PPC_OPERAND_UDI) != 0)
-	    (*info->fprintf_func) (info->stream, "%" PRId64, value);
+	    (*info->fprintf_styled_func) (info->stream, dis_style_text,
+					  "%" PRId64, value);
 	  else if ((operand->flags & PPC_OPERAND_CR_REG) != 0
 		   && (operand->flags & PPC_OPERAND_CR_BIT) == 0
 		   && (((dialect & PPC_OPCODE_PPC) != 0)
 		       || ((dialect & PPC_OPCODE_VLE) != 0)))
-	    (*info->fprintf_func) (info->stream, "cr%" PRId64, value);
+	    (*info->fprintf_styled_func) (info->stream, dis_style_register,
+					  "cr%" PRId64, value);
 	  else if ((operand->flags & PPC_OPERAND_CR_BIT) != 0
 		   && (operand->flags & PPC_OPERAND_CR_REG) == 0
 		   && (((dialect & PPC_OPCODE_PPC) != 0)
@@ -1019,13 +1042,27 @@ print_insn_powerpc (bfd_vma memaddr,
 	      int cc;
 
 	      cr = value >> 2;
-	      if (cr != 0)
-		(*info->fprintf_func) (info->stream, "4*cr%d+", cr);
 	      cc = value & 3;
-	      (*info->fprintf_func) (info->stream, "%s", cbnames[cc]);
+	      if (cr != 0)
+		(*info->fprintf_styled_func) (info->stream, dis_style_register,
+					      "4*cr%d+%s", cr, cbnames[cc]);
+	      else
+		(*info->fprintf_styled_func) (info->stream, dis_style_register,
+					      "%s", cbnames[cc]);
 	    }
 	  else
-	    (*info->fprintf_func) (info->stream, "%" PRId64, value);
+	    {
+	      /* An immediate, but what style?  */
+	      enum disassembler_style style;
+
+	      if ((operand->flags & PPC_OPERAND_PARENS) != 0)
+		style = dis_style_address_offset;
+	      else
+		style = dis_style_immediate;
+
+	      (*info->fprintf_styled_func) (info->stream, style,
+					    "%" PRId64, value);
+	    }
 
 	  if (operand->shift == 52)
 	    is_pcrel = value != 0;
@@ -1033,7 +1070,7 @@ print_insn_powerpc (bfd_vma memaddr,
 	    d34 = value;
 
 	  if (op_separator == need_paren)
-	    (*info->fprintf_func) (info->stream, ")");
+	    (*info->fprintf_styled_func) (info->stream, dis_style_text, ")");
 
 	  op_separator = need_comma;
 	  if ((operand->flags & PPC_OPERAND_PARENS) != 0)
@@ -1043,11 +1080,13 @@ print_insn_powerpc (bfd_vma memaddr,
       if (is_pcrel)
 	{
 	  d34 += memaddr;
-	  (*info->fprintf_func) (info->stream, "\t# %" PRIx64, d34);
+	  (*info->fprintf_styled_func) (info->stream,
+					dis_style_comment_start,
+					"\t# %" PRIx64, d34);
 	  asymbol *sym = (*info->symbol_at_address_func) (d34, info);
 	  if (sym)
-	    (*info->fprintf_func) (info->stream, " <%s>",
-				   bfd_asymbol_name (sym));
+	    (*info->fprintf_styled_func) (info->stream, dis_style_text,
+					  " <%s>", bfd_asymbol_name (sym));
 
 	  if (info->private_data != NULL
 	      && info->section != NULL
@@ -1069,11 +1108,19 @@ print_insn_powerpc (bfd_vma memaddr,
 
   /* We could not find a match.  */
   if (insn_length == 4)
-    (*info->fprintf_func) (info->stream, ".long 0x%x",
-			   (unsigned int) insn);
+    (*info->fprintf_styled_func) (info->stream,
+				  dis_style_assembler_directive, ".long");
   else
-    (*info->fprintf_func) (info->stream, ".word 0x%x",
-			   (unsigned int) insn >> 16);
+    {
+      (*info->fprintf_styled_func) (info->stream,
+				    dis_style_assembler_directive, ".word");
+      insn >>= 16;
+    }
+  (*info->fprintf_styled_func) (info->stream, dis_style_text, " ");
+  (*info->fprintf_styled_func) (info->stream, dis_style_immediate, "0x%x",
+				(unsigned int) insn);
+
+
   return insn_length;
 }
 
-- 
2.25.4


^ permalink raw reply	[flat|nested] 10+ messages in thread
* [PATCH 0/2] AArch64 libopcodes styling
@ 2022-06-21 11:22 Andrew Burgess
  2022-07-05 12:45 ` [PATCHv2 " Andrew Burgess
  0 siblings, 1 reply; 10+ messages in thread
From: Andrew Burgess @ 2022-06-21 11:22 UTC (permalink / raw)
  To: binutils; +Cc: Andrew Burgess

This series adds libopcodes based styling to the AArch64 disassembler
output, this enables 'objdump -d --disassembler-color=extended-color'
to work for AArch64.

The first commit is a small refactor, while the second commit actually
adds the styling support.

There's a couple of questions that I still have, which I've detailed
in the commit message of the second patch.

All feedback welcome.

Thanks,
Andrew


---

Andrew Burgess (2):
  opcodes/aarch64: split off creation of comment text in disassembler
  libopcodes/aarch64: add support for disassembler styling

 gas/config/tc-aarch64.c                       |  21 +-
 gas/testsuite/gas/aarch64/alias.d             |  26 +-
 gas/testsuite/gas/aarch64/b_c_1.d             |  42 +-
 gas/testsuite/gas/aarch64/float-fp16.d        |  12 +-
 gas/testsuite/gas/aarch64/int-insns.d         |   4 +-
 gas/testsuite/gas/aarch64/no-aliases.d        |  26 +-
 .../gas/aarch64/programmer-friendly.d         |   2 +-
 include/opcode/aarch64.h                      |  10 +-
 opcodes/aarch64-dis.c                         | 185 +++++++--
 opcodes/aarch64-opc.c                         | 367 +++++++++++++-----
 10 files changed, 504 insertions(+), 191 deletions(-)

-- 
2.25.4


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2022-07-25 13:14 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-12 13:36 [PATCH] libopcodes/ppc: add support for disassembler styling Andrew Burgess
2022-07-14  2:09 ` Alan Modra
2022-07-14  6:08   ` Jan Beulich
2022-07-14 11:18     ` Alan Modra
2022-07-18 16:31 ` [PATCHv2 0/2] PPC Styled Disassembler Support Andrew Burgess
2022-07-18 16:31   ` [PATCHv2 1/2] opcodes: add new sub-mnemonic disassembler style Andrew Burgess
2022-07-18 16:31   ` [PATCHv2 2/2] libopcodes/ppc: add support for disassembler styling Andrew Burgess
2022-07-21  9:31     ` Alan Modra
2022-07-25 13:14       ` Andrew Burgess
  -- strict thread matches above, loose matches on Subject: below --
2022-06-21 11:22 [PATCH 0/2] AArch64 libopcodes styling Andrew Burgess
2022-07-05 12:45 ` [PATCHv2 " Andrew Burgess
2022-07-05 12:46   ` [PATCHv2 1/2] opcodes: add new sub-mnemonic disassembler style Andrew Burgess

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).