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 ---------------- */