]> granicus.if.org Git - strace/commitdiff
printxval: support more architectures
authorDmitry V. Levin <ldv@altlinux.org>
Sat, 4 May 2013 19:51:57 +0000 (19:51 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Sat, 4 May 2013 19:51:57 +0000 (19:51 +0000)
* configure.ac: Define SIZEOF_LONG_LONG.
* util.c (printllval): Handle all architectures with sizeof(long) > 4
and sizeof(long) == sizeof(long long).

configure.ac
util.c

index 28bf86c0bc5c7b7259bf88db120bb4a7afcfa0ea..c4896f3d06a0428a5725b5d19ebb56ed1a192b8c 100644 (file)
@@ -298,6 +298,7 @@ AC_CACHE_CHECK([for BLKGETSIZE64], [ac_cv_have_blkgetsize64],
        fi)
 
 AC_CHECK_SIZEOF([long])
+AC_CHECK_SIZEOF([long long])
 AC_CHECK_SIZEOF([rlim_t],,[#include <sys/resource.h>])
 
 AC_CHECK_HEADERS([libaio.h], [
diff --git a/util.c b/util.c
index 83fdf293a14793544b023fb7d721b618acff23fa..970faa44b1cc4274b34118ae930d99f7ab8041b5 100644 (file)
--- a/util.c
+++ b/util.c
@@ -177,29 +177,26 @@ printxval(const struct xlat *xlat, int val, const char *dflt)
 int
 printllval(struct tcb *tcp, const char *format, int arg_no)
 {
-#if defined(X86_64) || defined(POWERPC64) || defined(TILE) || defined(AARCH64) || \
-    defined(LINUX_MIPSN64) || defined(SPARC64)
-       if (current_personality == 0) {
-               /* Technically, format expects "long long",
-                * but we supply "long". We expect that
-                * on this arch, they are the same.
-                */
+#if SIZEOF_LONG > 4 && SIZEOF_LONG == SIZEOF_LONG_LONG
+# if SUPPORTED_PERSONALITIES > 1
+       if (current_wordsize > 4) {
+# endif
                tprintf(format, tcp->u_arg[arg_no]);
                arg_no++;
+# if SUPPORTED_PERSONALITIES > 1
        } else {
-# if defined(AARCH64) || defined(POWERPC64)
+#  if defined(AARCH64) || defined(POWERPC64)
                /* Align arg_no to the next even number. */
                arg_no = (arg_no + 1) & 0xe;
-# endif
+#  endif
                tprintf(format, LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]));
                arg_no += 2;
        }
-#elif defined IA64 || defined ALPHA || defined S390X
-       /* Technically, format expects "long long",
-        * but we supply "long". We expect that
-        * on this arch, they are the same.
-        */
-       tprintf(format, tcp->u_arg[arg_no]);
+# endif /* SUPPORTED_PERSONALITIES */
+#elif SIZEOF_LONG > 4
+#  error Unsupported configuration: SIZEOF_LONG > 4 && SIZEOF_LONG_LONG > SIZEOF_LONG
+#elif defined LINUX_MIPSN32
+       tprintf(format, tcp->ext_arg[arg_no]);
        arg_no++;
 #elif defined X32
        if (current_personality == 0) {
@@ -209,20 +206,15 @@ printllval(struct tcb *tcp, const char *format, int arg_no)
                tprintf(format, LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]));
                arg_no += 2;
        }
-#elif defined LINUX_MIPSN32
-       tprintf(format, tcp->ext_arg[arg_no]);
-       arg_no++;
 #else
-# if SIZEOF_LONG > 4
-#  error BUG: must not combine two args for long long on this arch
-# endif
-#if defined(ARM) || defined(POWERPC)
+# if defined(ARM) || defined(POWERPC)
        /* Align arg_no to the next even number. */
        arg_no = (arg_no + 1) & 0xe;
-#endif
+# endif
        tprintf(format, LONG_LONG(tcp->u_arg[arg_no], tcp->u_arg[arg_no + 1]));
        arg_no += 2;
 #endif
+
        return arg_no;
 }