From 6828a30253e55983b887dcd8f947a4d771aff82b Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Tue, 15 Jun 2021 00:41:22 -0400 Subject: [PATCH] sim: mips: rework dynamic printf logic to avoid compiler warnings The compiler doesn't like passing non-constant strings to printf functions, so tweak the code to always pass one in. This code is a little more verbose, but it's probably the same performance. The macro usage is a bit ugly, but maybe less than copying & pasting the extended conditional format logic. --- sim/mips/ChangeLog | 5 +++++ sim/mips/interp.c | 41 +++++++++++++++++++++++++++++++++-------- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/sim/mips/ChangeLog b/sim/mips/ChangeLog index 28a33c78995..c36e01fa19e 100644 --- a/sim/mips/ChangeLog +++ b/sim/mips/ChangeLog @@ -1,3 +1,8 @@ +2021-06-16 Mike Frysinger + + * interp.c (sim_monitor): Change ap type to address_word*. + (_P, P): New macros. Rewrite dynamic printf logic to use these. + 2021-06-16 Mike Frysinger * dv-tx3904sio.c (tx3904sio_fifo_push): Change next_buf to diff --git a/sim/mips/interp.c b/sim/mips/interp.c index 38338fbfa7f..5645f01ed22 100644 --- a/sim/mips/interp.c +++ b/sim/mips/interp.c @@ -1388,7 +1388,7 @@ sim_monitor (SIM_DESC sd, { address_word s = A0; unsigned char c; - signed_word *ap = &A1; /* 1st argument */ + address_word *ap = &A1; /* 1st argument */ /* This isn't the quickest way, since we call the host print routine for every character almost. But it does avoid having to allocate and manage a temporary string buffer. */ @@ -1471,18 +1471,43 @@ sim_monitor (SIM_DESC sd, sim_io_printf(sd,""); else { - sprintf (tmp, "%%%s%c", longlong ? "ll" : "", c); - if (longlong) - sim_io_printf(sd, tmp, lv); - else - sim_io_printf(sd, tmp, (int)lv); +#define _P(c, fmt64, fmt32) \ + case c: \ + if (longlong) \ + sim_io_printf (sd, "%" fmt64, lv); \ + else \ + sim_io_printf (sd, "%" fmt32, (int)lv); \ + break; +#define P(c, fmtc) _P(c, PRI##fmtc##64, PRI##fmtc##32) + switch (c) + { + P('d', d) + P('o', o) + P('x', x) + P('X', X) + P('u', u) + } } +#undef P +#undef _P } else if (strchr ("eEfgG", c)) { double dbl = *(double*)(ap++); - sprintf (tmp, "%%%d.%d%c", width, trunc, c); - sim_io_printf (sd, tmp, dbl); + +#define P(c, fmtc) \ + case c: \ + sim_io_printf (sd, "%*.*" #fmtc, width, trunc, dbl); \ + break; + switch (c) + { + P('e', e) + P('E', E) + P('f', f) + P('g', g) + P('G', G) + } +#undef P trunc = 0; } } -- 2.30.2