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
+