sim: fixes for libopcodes styled disassembler
authorAndrew Burgess <aburgess@redhat.com>
Mon, 4 Apr 2022 21:38:04 +0000 (22:38 +0100)
committerAndrew Burgess <aburgess@redhat.com>
Mon, 4 Apr 2022 21:41:24 +0000 (22:41 +0100)
In commit:

  commit 60a3da00bd5407f07d64dff82a4dae98230dfaac
  Date:   Sat Jan 22 11:38:18 2022 +0000

      objdump/opcodes: add syntax highlighting to disassembler output

I broke several sim/ targets by forgetting to update their uses of the
libopcodes disassembler to take account of the new styled printing.

These should all be fixed by this commit.

I've not tried to add actual styled output to the simulator traces,
instead, the styled print routines just ignore the style and print the
output unstyled.

sim/arm/wrapper.c
sim/common/cgen-trace.c
sim/common/cgen-trace.h
sim/common/sim-trace.c
sim/cris/sim-if.c
sim/erc32/interf.c
sim/erc32/sis.c
sim/erc32/sis.h
sim/m32c/trace.c
sim/rl78/trace.c
sim/rx/trace.c

index ab56bc4e7b82dd200ab54e9b4b36fbfbf3bb94f8..c97bae89dadf0844f8f7b4c79db9d9299913a87e 100644 (file)
@@ -76,6 +76,19 @@ op_printf (char *buf, const char *fmt, ...)
   return ret;
 }
 
+static int ATTRIBUTE_PRINTF (3, 4)
+op_styled_printf (char *buf, enum disassembler_style style,
+                 const char *fmt, ...)
+{
+  int ret;
+  va_list ap;
+
+  va_start (ap, fmt);
+  ret = vsprintf (opbuf + strlen (opbuf), fmt, ap);
+  va_end (ap);
+  return ret;
+}
+
 static int
 sim_dis_read (bfd_vma                     memaddr ATTRIBUTE_UNUSED,
              bfd_byte *                  ptr,
@@ -321,7 +334,7 @@ sim_create_inferior (SIM_DESC sd ATTRIBUTE_UNUSED,
     }
 
   memset (& info, 0, sizeof (info));
-  INIT_DISASSEMBLE_INFO (info, stdout, op_printf);
+  INIT_DISASSEMBLE_INFO (info, stdout, op_printf, op_styled_printf);
   info.read_memory_func = sim_dis_read;
   info.arch = bfd_get_arch (abfd);
   info.mach = bfd_get_mach (abfd);
index 149ea8a127cda6d10c031de3b1431ba5d6ffe766..12f6126d43f06bf0c18cc8b6bd15e3bda2740722 100644 (file)
@@ -320,6 +320,22 @@ sim_disasm_sprintf (SFILE *f, const char *format, ...)
   return n;
 }
 
+/* sprintf to a "stream" with styling.  */
+
+int
+sim_disasm_styled_sprintf (SFILE *f, enum disassembler_style style,
+                          const char *format, ...)
+{
+  int n;
+  va_list args;
+
+  va_start (args, format);
+  vsprintf (f->current, format, args);
+  f->current += n = strlen (f->current);
+  va_end (args);
+  return n;
+}
+
 /* Memory read support for an opcodes disassembler.  */
 
 int
@@ -383,7 +399,8 @@ sim_cgen_disassemble_insn (SIM_CPU *cpu, const CGEN_INSN *insn,
 
   sfile.buffer = sfile.current = buf;
   INIT_DISASSEMBLE_INFO (disasm_info, (FILE *) &sfile,
-                        (fprintf_ftype) sim_disasm_sprintf);
+                        (fprintf_ftype) sim_disasm_sprintf,
+                        (fprintf_styled_ftype) sim_disasm_styled_sprintf);
   disasm_info.endian =
     (bfd_big_endian (STATE_PROG_BFD (sd)) ? BFD_ENDIAN_BIG
      : bfd_little_endian (STATE_PROG_BFD (sd)) ? BFD_ENDIAN_LITTLE
index 84b4935f1481684eb37b4060492e1a18b523e464..3e2b4a9e9d7e1e0a129323e31cc3524365dfa5bb 100644 (file)
@@ -78,6 +78,7 @@ typedef struct {
 
 /* String printer for the disassembler.  */
 extern int sim_disasm_sprintf (SFILE *, const char *, ...) ATTRIBUTE_PRINTF_2;
+extern int sim_disasm_styled_sprintf (SFILE *, enum disassembler_style, const char *, ...) ATTRIBUTE_PRINTF_3;
 
 /* For opcodes based disassemblers.  */
 #ifdef __BFD_H_SEEN__
index 0b63bdb07b656cc76e5324ed6aa8c6a5cef5d30d..952c3514087e3c8d30c03f1cb9f3f0f28d2d095d 100644 (file)
@@ -906,6 +906,18 @@ dis_printf (SIM_CPU *cpu, const char *fmt, ...)
   return 0;
 }
 
+static int ATTRIBUTE_PRINTF (3, 4)
+dis_styled_printf (SIM_CPU *cpu, enum disassembler_style style,
+                  const char *fmt, ...)
+{
+  SIM_DESC sd = CPU_STATE (cpu);
+  va_list ap;
+  va_start (ap, fmt);
+  trace_vprintf (sd, cpu, fmt, ap);
+  va_end (ap);
+  return 0;
+}
+
 void
 trace_disasm (SIM_DESC sd, sim_cpu *cpu, address_word addr)
 {
@@ -922,7 +934,7 @@ trace_disasm (SIM_DESC sd, sim_cpu *cpu, address_word addr)
                        bfd_big_endian (trace_data->dis_bfd),
                        bfd_get_mach (trace_data->dis_bfd),
                        trace_data->dis_bfd);
-      INIT_DISASSEMBLE_INFO (*info, cpu, dis_printf);
+      INIT_DISASSEMBLE_INFO (*info, cpu, dis_printf, dis_styled_printf);
       info->read_memory_func = dis_read;
       info->arch = bfd_get_arch (bfd);
       info->mach = bfd_get_mach (bfd);
index c72edc752b6fcb89d39118ce3541d045f49f6b31..3589f5bfdceb3f2c4619c7d2e91cbe2d718dc5f8 100644 (file)
@@ -1017,7 +1017,8 @@ cris_disassemble_insn (SIM_CPU *cpu,
 
   sfile.buffer = sfile.current = buf;
   INIT_DISASSEMBLE_INFO (disasm_info, (FILE *) &sfile,
-                        (fprintf_ftype) sim_disasm_sprintf);
+                        (fprintf_ftype) sim_disasm_sprintf,
+                        (fprintf_styled_ftype) sim_disasm_styled_sprintf);
   disasm_info.endian = BFD_ENDIAN_LITTLE;
   disasm_info.read_memory_func = sim_disasm_read_memory;
   disasm_info.memory_error_func = sim_disasm_perror_memory;
index d04d07c08c86e03bc896f4e5458b70dde7941f13..78dec6f4b9bcb0b82e76d48c08b25a209a5eeb7b 100644 (file)
@@ -244,7 +244,8 @@ sim_open (SIM_OPEN_KIND kind, struct host_callback_struct *callback,
 #ifdef F_GETFL
     termsave = fcntl(0, F_GETFL, 0);
 #endif
-    INIT_DISASSEMBLE_INFO(dinfo, stdout,(fprintf_ftype)fprintf);
+    INIT_DISASSEMBLE_INFO(dinfo, stdout,(fprintf_ftype)fprintf,
+                         fprintf_styled);
 #ifdef HOST_LITTLE_ENDIAN
     dinfo.endian = BFD_ENDIAN_LITTLE;
 #else
index 66a27d0750644803a557bf8af678789bf920b8e8..12eb21f15a74177f8521dfdbedb9632f7d959e92 100644 (file)
@@ -138,6 +138,21 @@ run_sim(struct pstate *sregs, uint64_t icount, int dis)
     return TIME_OUT;
 }
 
+int
+fprintf_styled (void *stream, enum disassembler_style style,
+               const char *fmt, ...)
+{
+  int ret;
+  FILE *out = (FILE *) stream;
+  va_list args;
+
+  va_start (args, fmt);
+  ret = vfprintf (out, fmt, args);
+  va_end (args);
+
+  return ret;
+}
+
 int
 main(int argc, char **argv)
 {
@@ -212,7 +227,8 @@ main(int argc, char **argv)
 #endif
     sregs.freq = freq;
 
-    INIT_DISASSEMBLE_INFO(dinfo, stdout, (fprintf_ftype) fprintf);
+    INIT_DISASSEMBLE_INFO(dinfo, stdout, (fprintf_ftype) fprintf,
+                         (fprintf_styled_ftype) fprintf_styled);
 #ifdef HOST_LITTLE_ENDIAN
     dinfo.endian = BFD_ENDIAN_LITTLE;
 #else
index 33f16c77ca47b26bf2ef901f4c07fc263fcf309f..3a27667040264ee79537dc74ff249057811eb23f 100644 (file)
@@ -18,6 +18,7 @@
 #include "sim/sim.h"
 #include <sim-config.h>
 #include <stdint.h>
+#include "dis-asm.h"
 
 #if HOST_BYTE_ORDER == BIG_ENDIAN
 #define HOST_BIG_ENDIAN
@@ -203,6 +204,8 @@ extern void init_regs (struct pstate *sregs);
 /* interf.c */
 extern int     run_sim (struct pstate *sregs,
                         uint64_t icount, int dis);
+extern int      fprintf_styled (void *stream, enum disassembler_style style,
+                               const char *fmt, ...) ATTRIBUTE_PRINTF (3, 4);
 
 /* float.c */
 extern int     get_accex (void);
index 571df1a1e2a0b46311973b5bc5552eda2f506b7c..f5171c298c54705768213b75dd3a99424b56e580 100644 (file)
@@ -101,6 +101,18 @@ op_printf (char *buf, char *fmt, ...)
   return ret;
 }
 
+static int
+op_styled_printf (char *buf, enum disassembler_style style, char *fmt, ...)
+{
+  int ret;
+  va_list ap;
+
+  va_start (ap, fmt);
+  ret = vsprintf (opbuf + strlen (opbuf), fmt, ap);
+  va_end (ap);
+  return ret;
+}
+
 static bfd *current_bfd;
 
 void
@@ -210,7 +222,7 @@ sim_disasm_one (void)
     {
       initted = 1;
       memset (&info, 0, sizeof (info));
-      INIT_DISASSEMBLE_INFO (info, stdout, op_printf);
+      INIT_DISASSEMBLE_INFO (info, stdout, op_printf, op_styled_printf);
       info.read_memory_func = sim_dis_read;
       info.arch = bfd_get_arch (current_bfd);
       info.mach = bfd_get_mach (current_bfd);
index df75d793f695cc1957ec0b889ae2c7d8dfb827e2..a485c4c004d732985e74ebfae4602bdab503c700 100644 (file)
@@ -104,6 +104,18 @@ op_printf (char *buf, char *fmt, ...)
   return ret;
 }
 
+static int
+op_styled_printf (char *buf, enum disassembler_style style, char *fmt, ...)
+{
+  int ret;
+  va_list ap;
+
+  va_start (ap, fmt);
+  ret = vsprintf (opbuf + strlen (opbuf), fmt, ap);
+  va_end (ap);
+  return ret;
+}
+
 static bfd *       current_bfd = NULL;
 static asymbol **  symtab = NULL;
 static int         symcount = 0;
@@ -205,7 +217,7 @@ sim_get_current_source_location (const char **  pfilename,
 
       initted = 1;
       memset (& info, 0, sizeof (info));
-      INIT_DISASSEMBLE_INFO (info, stdout, op_printf);
+      INIT_DISASSEMBLE_INFO (info, stdout, op_printf, op_styled_printf);
       info.read_memory_func = sim_dis_read;
       info.arch = bfd_get_arch (current_bfd);
       info.mach = bfd_get_mach (current_bfd);
index 6e9a266ca3ad7c1995b6356805104a67fd1d4e5a..df83dc14a1b4218d723e772eaf0e9fd80c11f81b 100644 (file)
@@ -109,6 +109,18 @@ op_printf (char *buf, char *fmt, ...)
   return ret;
 }
 
+static int ATTRIBUTE_PRINTF (3, 4)
+op_styled_printf (char *buf, enum disassembler_style style, char *fmt, ...)
+{
+  int ret;
+  va_list ap;
+
+  va_start (ap, fmt);
+  ret = vsprintf (opbuf + strlen (opbuf), fmt, ap);
+  va_end (ap);
+  return ret;
+}
+
 static bfd *       current_bfd = NULL;
 static asymbol **  symtab = NULL;
 static int         symcount = 0;
@@ -209,7 +221,7 @@ sim_get_current_source_location (const char **  pfilename,
 
       initted = 1;
       memset (& info, 0, sizeof (info));
-      INIT_DISASSEMBLE_INFO (info, stdout, op_printf);
+      INIT_DISASSEMBLE_INFO (info, stdout, op_printf, op_styled_printf);
       info.read_memory_func = sim_dis_read;
       info.arch = bfd_get_arch (current_bfd);
       info.mach = bfd_get_mach (current_bfd);