aboutsummaryrefslogtreecommitdiff
path: root/sim
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2021-06-15 00:41:22 -0400
committerMike Frysinger <vapier@gentoo.org>2021-06-16 01:55:31 -0400
commit6828a30253e55983b887dcd8f947a4d771aff82b (patch)
tree0babfc0996ef0012f3fa30da3afe71add3580146 /sim
parentdf32b446c3f54ed1cc9d4435740bffb42993090c (diff)
downloadfsf-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/ChangeLog5
-rw-r--r--sim/mips/interp.c41
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;
}
}