diff options
author | Mike Frysinger <vapier@gentoo.org> | 2021-06-15 00:41:22 -0400 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2021-06-16 01:55:31 -0400 |
commit | 6828a30253e55983b887dcd8f947a4d771aff82b (patch) | |
tree | 0babfc0996ef0012f3fa30da3afe71add3580146 /sim | |
parent | df32b446c3f54ed1cc9d4435740bffb42993090c (diff) | |
download | fsf-binutils-gdb-6828a30253e55983b887dcd8f947a4d771aff82b.zip fsf-binutils-gdb-6828a30253e55983b887dcd8f947a4d771aff82b.tar.gz fsf-binutils-gdb-6828a30253e55983b887dcd8f947a4d771aff82b.tar.bz2 |
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.
Diffstat (limited to 'sim')
-rw-r--r-- | sim/mips/ChangeLog | 5 | ||||
-rw-r--r-- | sim/mips/interp.c | 41 |
2 files changed, 38 insertions, 8 deletions
diff --git a/sim/mips/ChangeLog b/sim/mips/ChangeLog index 28a33c7..c36e01f 100644 --- a/sim/mips/ChangeLog +++ b/sim/mips/ChangeLog @@ -1,5 +1,10 @@ 2021-06-16 Mike Frysinger <vapier@gentoo.org> + * 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 <vapier@gentoo.org> + * dv-tx3904sio.c (tx3904sio_fifo_push): Change next_buf to unsigned_1. diff --git a/sim/mips/interp.c b/sim/mips/interp.c index 38338fb..5645f01 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,"<binary not supported>"); 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; } } |