sim: fixes for libopcodes styled disassembler

In commit:

  commit 60a3da00bd
  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.
This commit is contained in:
Andrew Burgess
2022-04-04 22:38:04 +01:00
parent 0578e87f93
commit 7b01c1cc1d
11 changed files with 109 additions and 9 deletions

View File

@@ -76,6 +76,19 @@ op_printf (char *buf, const char *fmt, ...)
return ret; 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 static int
sim_dis_read (bfd_vma memaddr ATTRIBUTE_UNUSED, sim_dis_read (bfd_vma memaddr ATTRIBUTE_UNUSED,
bfd_byte * ptr, bfd_byte * ptr,
@@ -321,7 +334,7 @@ sim_create_inferior (SIM_DESC sd ATTRIBUTE_UNUSED,
} }
memset (& info, 0, sizeof (info)); 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.read_memory_func = sim_dis_read;
info.arch = bfd_get_arch (abfd); info.arch = bfd_get_arch (abfd);
info.mach = bfd_get_mach (abfd); info.mach = bfd_get_mach (abfd);

View File

@@ -320,6 +320,22 @@ sim_disasm_sprintf (SFILE *f, const char *format, ...)
return n; 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. */ /* Memory read support for an opcodes disassembler. */
int int
@@ -383,7 +399,8 @@ sim_cgen_disassemble_insn (SIM_CPU *cpu, const CGEN_INSN *insn,
sfile.buffer = sfile.current = buf; sfile.buffer = sfile.current = buf;
INIT_DISASSEMBLE_INFO (disasm_info, (FILE *) &sfile, 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 = disasm_info.endian =
(bfd_big_endian (STATE_PROG_BFD (sd)) ? BFD_ENDIAN_BIG (bfd_big_endian (STATE_PROG_BFD (sd)) ? BFD_ENDIAN_BIG
: bfd_little_endian (STATE_PROG_BFD (sd)) ? BFD_ENDIAN_LITTLE : bfd_little_endian (STATE_PROG_BFD (sd)) ? BFD_ENDIAN_LITTLE

View File

@@ -78,6 +78,7 @@ typedef struct {
/* String printer for the disassembler. */ /* String printer for the disassembler. */
extern int sim_disasm_sprintf (SFILE *, const char *, ...) ATTRIBUTE_PRINTF_2; 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. */ /* For opcodes based disassemblers. */
#ifdef __BFD_H_SEEN__ #ifdef __BFD_H_SEEN__

View File

@@ -906,6 +906,18 @@ dis_printf (SIM_CPU *cpu, const char *fmt, ...)
return 0; 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 void
trace_disasm (SIM_DESC sd, sim_cpu *cpu, address_word addr) 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_big_endian (trace_data->dis_bfd),
bfd_get_mach (trace_data->dis_bfd), bfd_get_mach (trace_data->dis_bfd),
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->read_memory_func = dis_read;
info->arch = bfd_get_arch (bfd); info->arch = bfd_get_arch (bfd);
info->mach = bfd_get_mach (bfd); info->mach = bfd_get_mach (bfd);

View File

@@ -1017,7 +1017,8 @@ cris_disassemble_insn (SIM_CPU *cpu,
sfile.buffer = sfile.current = buf; sfile.buffer = sfile.current = buf;
INIT_DISASSEMBLE_INFO (disasm_info, (FILE *) &sfile, 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.endian = BFD_ENDIAN_LITTLE;
disasm_info.read_memory_func = sim_disasm_read_memory; disasm_info.read_memory_func = sim_disasm_read_memory;
disasm_info.memory_error_func = sim_disasm_perror_memory; disasm_info.memory_error_func = sim_disasm_perror_memory;

View File

@@ -244,7 +244,8 @@ sim_open (SIM_OPEN_KIND kind, struct host_callback_struct *callback,
#ifdef F_GETFL #ifdef F_GETFL
termsave = fcntl(0, F_GETFL, 0); termsave = fcntl(0, F_GETFL, 0);
#endif #endif
INIT_DISASSEMBLE_INFO(dinfo, stdout,(fprintf_ftype)fprintf); INIT_DISASSEMBLE_INFO(dinfo, stdout,(fprintf_ftype)fprintf,
fprintf_styled);
#ifdef HOST_LITTLE_ENDIAN #ifdef HOST_LITTLE_ENDIAN
dinfo.endian = BFD_ENDIAN_LITTLE; dinfo.endian = BFD_ENDIAN_LITTLE;
#else #else

View File

@@ -138,6 +138,21 @@ run_sim(struct pstate *sregs, uint64_t icount, int dis)
return TIME_OUT; 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 int
main(int argc, char **argv) main(int argc, char **argv)
{ {
@@ -212,7 +227,8 @@ main(int argc, char **argv)
#endif #endif
sregs.freq = freq; 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 #ifdef HOST_LITTLE_ENDIAN
dinfo.endian = BFD_ENDIAN_LITTLE; dinfo.endian = BFD_ENDIAN_LITTLE;
#else #else

View File

@@ -18,6 +18,7 @@
#include "sim/sim.h" #include "sim/sim.h"
#include <sim-config.h> #include <sim-config.h>
#include <stdint.h> #include <stdint.h>
#include "dis-asm.h"
#if HOST_BYTE_ORDER == BIG_ENDIAN #if HOST_BYTE_ORDER == BIG_ENDIAN
#define HOST_BIG_ENDIAN #define HOST_BIG_ENDIAN
@@ -203,6 +204,8 @@ extern void init_regs (struct pstate *sregs);
/* interf.c */ /* interf.c */
extern int run_sim (struct pstate *sregs, extern int run_sim (struct pstate *sregs,
uint64_t icount, int dis); uint64_t icount, int dis);
extern int fprintf_styled (void *stream, enum disassembler_style style,
const char *fmt, ...) ATTRIBUTE_PRINTF (3, 4);
/* float.c */ /* float.c */
extern int get_accex (void); extern int get_accex (void);

View File

@@ -101,6 +101,18 @@ op_printf (char *buf, char *fmt, ...)
return ret; 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; static bfd *current_bfd;
void void
@@ -210,7 +222,7 @@ sim_disasm_one (void)
{ {
initted = 1; initted = 1;
memset (&info, 0, sizeof (info)); 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.read_memory_func = sim_dis_read;
info.arch = bfd_get_arch (current_bfd); info.arch = bfd_get_arch (current_bfd);
info.mach = bfd_get_mach (current_bfd); info.mach = bfd_get_mach (current_bfd);

View File

@@ -104,6 +104,18 @@ op_printf (char *buf, char *fmt, ...)
return ret; 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 bfd * current_bfd = NULL;
static asymbol ** symtab = NULL; static asymbol ** symtab = NULL;
static int symcount = 0; static int symcount = 0;
@@ -205,7 +217,7 @@ sim_get_current_source_location (const char ** pfilename,
initted = 1; initted = 1;
memset (& info, 0, sizeof (info)); 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.read_memory_func = sim_dis_read;
info.arch = bfd_get_arch (current_bfd); info.arch = bfd_get_arch (current_bfd);
info.mach = bfd_get_mach (current_bfd); info.mach = bfd_get_mach (current_bfd);

View File

@@ -109,6 +109,18 @@ op_printf (char *buf, char *fmt, ...)
return ret; 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 bfd * current_bfd = NULL;
static asymbol ** symtab = NULL; static asymbol ** symtab = NULL;
static int symcount = 0; static int symcount = 0;
@@ -209,7 +221,7 @@ sim_get_current_source_location (const char ** pfilename,
initted = 1; initted = 1;
memset (& info, 0, sizeof (info)); 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.read_memory_func = sim_dis_read;
info.arch = bfd_get_arch (current_bfd); info.arch = bfd_get_arch (current_bfd);
info.mach = bfd_get_mach (current_bfd); info.mach = bfd_get_mach (current_bfd);