tests: run tests for each supported personality

When strace supports more than one personality, run test suite
for each personality supported by the host system.

* bootstrap: Create tests-m32 and tests-mx32 subtrees from tests.
* configure.ac: Check for -m32 and -mx32 runtime support.
(AC_CONFIG_FILES): Add tests-m32/Makefile and tests-mx32/Makefile.
* Makefile.am [HAVE_M32_RUNTIME] (TESTS_M32): Define.
[HAVE_MX32_RUNTIME] (TESTS_MX32): Define.
(SUBDIRS): Add $(TESTS_M32) $(TESTS_MX32).
* .gitignore: Add /tests-m32 and /tests-mx32.
diff --git a/.gitignore b/.gitignore
index 8fac8fa..770bba7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,13 +29,14 @@
 /stamp-h1
 
 /*.gdb
-/ioctls.h
-/ioctldefs.h
-/ioctlsort
 /strace
 /test-driver
 
 /ioctlent[012].h
 /ioctls_all[012].h
+/ioctlsort[012]
 
 /strace-*.tar.xz
+
+/tests-m32
+/tests-mx32
diff --git a/Makefile.am b/Makefile.am
index 83eef2e..a00aad2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,6 +1,12 @@
 # Automake input for strace.
 
-SUBDIRS = tests
+if HAVE_M32_RUNTIME
+TESTS_M32 = tests-m32
+endif
+if HAVE_MX32_RUNTIME
+TESTS_MX32 = tests-mx32
+endif
+SUBDIRS = tests $(TESTS_M32) $(TESTS_MX32)
 
 bin_PROGRAMS = strace
 man_MANS = strace.1
diff --git a/bootstrap b/bootstrap
index 91d1a8f..9624fec 100755
--- a/bootstrap
+++ b/bootstrap
@@ -1,3 +1,17 @@
-#!/bin/sh
+#!/bin/sh -eu
+
+for m in -m32 -mx32; do
+	mkdir tests$m ||
+		continue
+	sed "s/^AM_CFLAGS[[:space:]]*=.*/& $m/" \
+		tests/Makefile.am > tests$m/Makefile.am
+	for f in tests/*; do
+		[ "${f##*/}" != Makefile.am ] ||
+			continue
+		ln -s ../"$f" tests$m/
+	done
+done
+
 ./xlat/gen.sh
+
 exec autoreconf -f -i "$@"
diff --git a/configure.ac b/configure.ac
index 315d078..ea55c6e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -816,5 +816,33 @@
 	fi
 fi
 
-AC_CONFIG_FILES([Makefile tests/Makefile])
+have_m32=no
+case "$arch" in
+	aarch64|powerpc64|sparc64|tile|x32|x86_64)
+	AC_MSG_CHECKING([for -m32 runtime support])
+	saved_CFLAGS="$CFLAGS"
+	CFLAGS="$CFLAGS -m32"
+	AC_RUN_IFELSE([AC_LANG_SOURCE([[int main(){return 0;}]])],
+		[have_m32=yes],[have_m32=no],[have_m32=no])
+	CFLAGS="$saved_CFLAGS"
+	AC_MSG_RESULT($have_m32)
+	;;
+esac
+AM_CONDITIONAL([HAVE_M32_RUNTIME], [test "$have_m32" = yes])
+
+have_mx32=no
+case "$arch" in
+	x86_64)
+	AC_MSG_CHECKING([for -mx32 runtime support])
+	saved_CFLAGS="$CFLAGS"
+	CFLAGS="$CFLAGS -mx32"
+	AC_RUN_IFELSE([AC_LANG_SOURCE([[int main(){return 0;}]])],
+		[have_mx32=yes],[have_mx32=no],[have_mx32=no])
+	CFLAGS="$saved_CFLAGS"
+	AC_MSG_RESULT($have_mx32)
+	;;
+esac
+AM_CONDITIONAL([HAVE_MX32_RUNTIME], [test "$have_mx32" = yes])
+
+AC_CONFIG_FILES([Makefile tests/Makefile tests-m32/Makefile tests-mx32/Makefile])
 AC_OUTPUT