[binutils-gdb] sim: mips: rework dynamic printf logic to avoid compiler warnings

Michael Frysinger vapier@sourceware.org
Wed Jun 16 05:55:49 GMT 2021


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=6828a30253e55983b887dcd8f947a4d771aff82b

commit 6828a30253e55983b887dcd8f947a4d771aff82b
Author: Mike Frysinger <vapier@gentoo.org>
Date:   Tue Jun 15 00:41:22 2021 -0400

    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.

Diff:
---
 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  <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
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,"<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;
 		      }
 		  }


More information about the Gdb-cvs mailing list