valgrind: Fix build with gcc 4.8 and clang

gcc 4.8 can detect memmove-like code (such as parts of
cachesim_*_doref in cg_sim.c) and create a memmove reference
instead -- so like memcpy and memset, memmove needs to be
made available.

clang has similar code, but generates calls to __aeabi_memcpy,
__aeabi_memmove and __aeabi_memset rather than memcpy/memmove/memset.
Make those available too.

Change-Id: I8fae9afc956f6b2bd6cca4c74e0c1e8307485abd
Signed-off-by: Bernhard Rosenkränzer <Bernhard.Rosenkranzer@linaro.org>
diff --git a/main/coregrind/m_main.c b/main/coregrind/m_main.c
index 9ac8387..77dcdc5 100644
--- a/main/coregrind/m_main.c
+++ b/main/coregrind/m_main.c
@@ -2660,6 +2660,23 @@
 void* memcpy(void *dest, const void *src, SizeT n) {
    return VG_(memcpy)(dest,src,n);
 }
+void* memmove(void *dest, const void *src, SizeT n);
+void* memmove(void *a, const void *b, SizeT size) {
+  char *A = (char*)a;
+  const char *B = (const char*)b;
+  if (A < B) {
+    unsigned long i;
+    for (i = 0; i < size; i++) {
+      A[i] = B[i];
+    }
+  } else if(A > B) {
+    unsigned long i;
+    for (i = 0; i < size; i++) {
+      A[size - i - 1] = B[size - i - 1];
+    }
+  }
+  return a;
+}
 void* memset(void *s, int c, SizeT n);
 void* memset(void *s, int c, SizeT n) {
   return VG_(memset)(s,c,n);
@@ -2693,6 +2710,21 @@
    VG_(printf)("Something called __aeabi_unwind_cpp_pr1()\n");
    vg_assert(0);
 }
+
+void __aeabi_memcpy(void *d, const void *s, SizeT n);
+void __aeabi_memcpy(void *d, const void *s, SizeT n) {
+   memcpy(d, s, n);
+}
+
+void __aeabi_memmove(void *d, const void *s, SizeT n);
+void __aeabi_memmove(void *d, const void *s, SizeT n) {
+   memmove(d, s, n);
+}
+
+void __aeabi_memset(void *d, SizeT n, int c);
+void __aeabi_memset(void *d, SizeT n, int c) {
+   memset(d, c, n);
+}
 #endif
 
 /* ---------------- Requirement 2 ---------------- */