aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Burgess <aburgess@redhat.com>2022-04-04 22:38:04 +0100
committerAndrew Burgess <aburgess@redhat.com>2022-04-04 22:41:24 +0100
commit7b01c1cc1d111ba0afa51e60fa9842d3b971e2d1 (patch)
treeba53406de8080613704aa3247a77dd9a360e1521
parent0578e87f93b09e4cc41d3982eb1672bcfc81042d (diff)
downloadgdb-7b01c1cc1d111ba0afa51e60fa9842d3b971e2d1.zip
gdb-7b01c1cc1d111ba0afa51e60fa9842d3b971e2d1.tar.gz
gdb-7b01c1cc1d111ba0afa51e60fa9842d3b971e2d1.tar.bz2
sim: fixes for libopcodes styled disassembler
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.
-rw-r--r--sim/arm/wrapper.c15
-rw-r--r--sim/common/cgen-trace.c19
-rw-r--r--sim/common/cgen-trace.h1
-rw-r--r--sim/common/sim-trace.c14
-rw-r--r--sim/cris/sim-if.c3
-rw-r--r--sim/erc32/interf.c3
-rw-r--r--sim/erc32/sis.c18
-rw-r--r--sim/erc32/sis.h3
-rw-r--r--sim/m32c/trace.c14
-rw-r--r--sim/rl78/trace.c14
-rw-r--r--sim/rx/trace.c14
11 files changed, 109 insertions, 9 deletions
diff --git a/sim/arm/wrapper.c b/sim/arm/wrapper.c
index ab56bc4..c97bae8 100644
--- a/sim/arm/wrapper.c
+++ b/sim/arm/wrapper.c
@@ -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);
diff --git a/sim/common/cgen-trace.c b/sim/common/cgen-trace.c
index 149ea8a..12f6126 100644
--- a/sim/common/cgen-trace.c
+++ b/sim/common/cgen-trace.c
@@ -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
diff --git a/sim/common/cgen-trace.h b/sim/common/cgen-trace.h
index 84b4935..3e2b4a9 100644
--- a/sim/common/cgen-trace.h
+++ b/sim/common/cgen-trace.h
@@ -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__
diff --git a/sim/common/sim-trace.c b/sim/common/sim-trace.c
index 0b63bdb..952c351 100644
--- a/sim/common/sim-trace.c
+++ b/sim/common/sim-trace.c
@@ -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);
diff --git a/sim/cris/sim-if.c b/sim/cris/sim-if.c
index c72edc7..3589f5b 100644
--- a/sim/cris/sim-if.c
+++ b/sim/cris/sim-if.c
@@ -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;
diff --git a/sim/erc32/interf.c b/sim/erc32/interf.c
index d04d07c..78dec6f 100644
--- a/sim/erc32/interf.c
+++ b/sim/erc32/interf.c
@@ -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
diff --git a/sim/erc32/sis.c b/sim/erc32/sis.c
index 66a27d0..12eb21f 100644
--- a/sim/erc32/sis.c
+++ b/sim/erc32/sis.c
@@ -139,6 +139,21 @@ run_sim(struct pstate *sregs, uint64_t icount, int dis)
}
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
diff --git a/sim/erc32/sis.h b/sim/erc32/sis.h
index 33f16c7..3a27667 100644
--- a/sim/erc32/sis.h
+++ b/sim/erc32/sis.h
@@ -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);
diff --git a/sim/m32c/trace.c b/sim/m32c/trace.c
index 571df1a..f5171c2 100644
--- a/sim/m32c/trace.c
+++ b/sim/m32c/trace.c
@@ -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);
diff --git a/sim/rl78/trace.c b/sim/rl78/trace.c
index df75d79..a485c4c 100644
--- a/sim/rl78/trace.c
+++ b/sim/rl78/trace.c
@@ -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);
diff --git a/sim/rx/trace.c b/sim/rx/trace.c
index 6e9a266..df83dc1 100644
--- a/sim/rx/trace.c
+++ b/sim/rx/trace.c
@@ -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);