For ppc64, use the endianess of the running program, rather
than an harcoded endness.
(this is because ppc64 supports 2 endness, decided at runtime)
For mips, use BE if running on a non mips system, otherwise
use the endness of the running program
(this is because mips supports 2 endness, but decided at compile time).
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15113 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/none/tests/libvex_test.c b/none/tests/libvex_test.c
index 0f4395b..2e0bfb9 100644
--- a/none/tests/libvex_test.c
+++ b/none/tests/libvex_test.c
@@ -1,5 +1,6 @@
#include <stdio.h>
#include <stdlib.h>
+#include <endian.h>
#include "../../VEX/pub/libvex.h"
Bool return_false(void*cb, Addr ad)
@@ -33,6 +34,49 @@
printf("%*s", (int)nbytes, chars);
}
+// Returns the endness of the system we are running on.
+// We use that as the endness of arch that supports both
+// little and big endian.
+static VexEndness running_endness (void)
+{
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ return VexEndnessLE;
+#elif __BYTE_ORDER == __BIG_ENDIAN
+ return VexEndnessBE;
+#else
+ fprintf(stderr, "cannot determine endianess\n");
+ exit(1);
+#endif
+}
+
+// noinline, as this function is also the one we decode.
+__attribute__((noinline)) static void get_guest_arch(VexArch *ga)
+{
+#if defined(VGA_x86)
+ *ga = VexArchX86;
+#elif defined(VGA_amd64)
+ *ga = VexArchAMD64;
+#elif defined(VGA_arm)
+ *ga = VexArchARM;
+#elif defined(VGA_arm64)
+ *ga = VexArchARM64;
+#elif defined(VGA_ppc32)
+ *ga = VexArchPPC32;
+#elif defined(VGA_ppc64be) || defined(VGA_ppc64le)
+ *ga = VexArchPPC64;
+#elif defined(VGA_s390x)
+ *ga = VexArchS390X;
+#elif defined(VGA_mips32)
+ *ga = VexArchMIPS32;
+#elif defined(VGA_mips64)
+ *ga = VexArchMIPS64;
+#elif defined(VGA_tilegx)
+ *ga = VexArchTILEGX;
+#else
+ missing arch;
+#endif
+}
+
static VexEndness arch_endness (VexArch va) {
switch (va) {
case VexArch_INVALID: failure_exit();
@@ -41,10 +85,29 @@
case VexArchARM: return VexEndnessLE;
case VexArchARM64: return VexEndnessLE;
case VexArchPPC32: return VexEndnessBE;
- case VexArchPPC64: return VexEndnessBE;
+ case VexArchPPC64:
+ /* ppc64 supports BE or LE at run time. So, on a LE system,
+ returns LE, on a BE system, return BE. */
+ return running_endness();
case VexArchS390X: return VexEndnessBE;
- case VexArchMIPS32: return VexEndnessBE;
- case VexArchMIPS64: return VexEndnessBE;
+ case VexArchMIPS32:
+ case VexArchMIPS64:
+ /* mips32/64 supports BE or LE, but at compile time.
+ If mips64 is compiled on a non mips system, the VEX lib
+ is missing bit and pieces of code related to endianess.
+ The mandatory code for this test is then compiled as BE.
+ So, if this test runs on a mips system, returns the
+ running endianess. Otherwise, returns BE as this one
+ has the more chances to work. */
+ {
+ VexArch ga;
+ get_guest_arch( &ga);
+
+ if (ga == VexArchMIPS64 || ga == VexArchMIPS32)
+ return running_endness();
+ else
+ return VexEndnessBE;
+ }
case VexArchTILEGX: return VexEndnessLE;
default: failure_exit();
}
@@ -86,34 +149,6 @@
}
}
-// noinline, as this function is also the one we decode.
-__attribute__((noinline)) void get_guest_arch(VexArch *ga)
-{
-#if defined(VGA_x86)
- *ga = VexArchX86;
-#elif defined(VGA_amd64)
- *ga = VexArchAMD64;
-#elif defined(VGA_arm)
- *ga = VexArchARM;
-#elif defined(VGA_arm64)
- *ga = VexArchARM64;
-#elif defined(VGA_ppc32)
- *ga = VexArchPPC32;
-#elif defined(VGA_ppc64be) || defined(VGA_ppc64le)
- *ga = VexArchPPC64;
-#elif defined(VGA_s390x)
- *ga = VexArchS390X;
-#elif defined(VGA_mips32)
- *ga = VexArchMIPS32;
-#elif defined(VGA_mips64)
- *ga = VexArchMIPS64;
-#elif defined(VGA_tilegx)
- *ga = VexArchTILEGX;
-#else
- missing arch;
-#endif
-}
-
static void show_vta(char *msg, VexTranslateArgs *vta)
{
printf("//// %s translating guest %s(%d) %s %dbits to host %s(%d)"