mips: add allexec tests for mips64

Initial patch for none/tests/mips64/.
allexec tests added.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13385 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/configure.in b/configure.in
index 9a1db0c..464ba42 100644
--- a/configure.in
+++ b/configure.in
@@ -2662,6 +2662,7 @@
    none/tests/arm/Makefile
    none/tests/s390x/Makefile
    none/tests/mips32/Makefile
+   none/tests/mips64/Makefile
    none/tests/linux/Makefile
    none/tests/darwin/Makefile
    none/tests/x86-linux/Makefile
diff --git a/none/tests/Makefile.am b/none/tests/Makefile.am
index 2c70374..e9c4fdb 100644
--- a/none/tests/Makefile.am
+++ b/none/tests/Makefile.am
@@ -25,6 +25,9 @@
 if VGCONF_ARCHS_INCLUDE_MIPS32
 SUBDIRS += mips32
 endif
+if VGCONF_ARCHS_INCLUDE_MIPS64
+SUBDIRS += mips64
+endif
 
 # OS-specific tests
 if VGCONF_OS_IS_LINUX
@@ -39,7 +42,8 @@
 SUBDIRS += x86-linux
 endif
 
-DIST_SUBDIRS = x86 amd64 ppc32 ppc64 arm s390x mips32 linux darwin x86-linux .
+DIST_SUBDIRS = x86 amd64 ppc32 ppc64 arm s390x mips32 mips64 linux darwin \
+               x86-linux .
 
 dist_noinst_SCRIPTS = \
 	filter_cmdline0 \
diff --git a/none/tests/allexec_prepare_prereq b/none/tests/allexec_prepare_prereq
index d1fa03c..b8f5bc3 100755
--- a/none/tests/allexec_prepare_prereq
+++ b/none/tests/allexec_prepare_prereq
@@ -32,6 +32,6 @@
 pair ppc32                      ppc64
 pair s390x_unexisting_in_32bits s390x
 pair arm                        arm_unexisting_in_64bits
-pair mips32                     mips_unexisting_in_64bits
+pair mips32                     mips64
 
 exit 0
diff --git a/none/tests/mips64/Makefile.am b/none/tests/mips64/Makefile.am
new file mode 100644
index 0000000..1c7ef44
--- /dev/null
+++ b/none/tests/mips64/Makefile.am
@@ -0,0 +1,14 @@
+
+include $(top_srcdir)/Makefile.tool-tests.am
+
+dist_noinst_SCRIPTS = filter_stderr
+
+check_PROGRAMS = \
+	allexec
+
+AM_CFLAGS    += @FLAG_M64@
+AM_CXXFLAGS  += @FLAG_M64@
+AM_CCASFLAGS += @FLAG_M64@
+
+allexec_CFLAGS          = $(AM_CFLAGS) @FLAG_W_NO_NONNULL@
+
diff --git a/none/tests/mips64/allexec.c b/none/tests/mips64/allexec.c
new file mode 100644
index 0000000..b7177e8
--- /dev/null
+++ b/none/tests/mips64/allexec.c
@@ -0,0 +1,50 @@
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+extern char **environ;
+
+#define S(...) (fprintf(stdout, __VA_ARGS__),fflush(stdout))
+#define FORKEXECWAIT(exec_call) do { \
+      int status;\
+      pid_t child = fork(); \
+      if (child == 0) {exec_call; perror ("exec failed");} \
+      else if (child == -1) perror ("cannot fork\n"); \
+      else if (child != wait (&status)) perror ("error waiting child"); \
+      else S("child exited\n"); \
+   } while (0)
+
+void test_allexec (char *exec)
+{
+   FORKEXECWAIT (execlp(exec, exec, NULL));
+   FORKEXECWAIT (execlp(exec, exec, "constant_arg1", "constant_arg2", NULL));
+   FORKEXECWAIT (execve(exec, NULL, environ));
+}
+
+
+/* If a single argument "exec" is given, will execute itself
+   (in bi-arch, a 32 bit and 64 bit variant) via various exec system calls.
+   Note that this test can only be run after the prerequisite have been
+   prepared by allexec_prepare_prereq, which will a.o. make links
+   for the allexec32 and allexec64 executables. On single arch build,
+   these links points to the same executable to ensure this test works
+   everywhere the same.
+   No arguments or more arguments means just print its args. */
+int main(int argc, char **argv, char **envp) 
+{
+   if ( (argc == 2) && (strcmp (argv[1], "exec") == 0)) {
+      S("%s will exec ./allexec32\n", argv[0]);
+      test_allexec ("./allexec32");
+      S("%s will exec ./allexec64\n", argv[0]);
+      test_allexec ("./allexec64");
+   } else {
+      int i;
+      S("program exec-ed:");
+      for (i = 0; i < argc; i++) S(" %s", argv[i]);
+      S("\n");
+   }
+   return 0;
+}
diff --git a/none/tests/mips64/filter_stderr b/none/tests/mips64/filter_stderr
new file mode 100755
index 0000000..616ce05
--- /dev/null
+++ b/none/tests/mips64/filter_stderr
@@ -0,0 +1,4 @@
+#! /bin/sh
+
+../filter_stderr
+