aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernhard Rosenkränzer <Bernhard.Rosenkranzer@linaro.org>2013-03-27 14:43:56 +0100
committerAmit Pundir <amit.pundir@linaro.org>2013-07-25 17:02:11 +0530
commita9e44692ff649edae6bade0e92bdcfe2f2645391 (patch)
tree7ea2e38c662cbe1ca5dc1454812a00469663fc20
parent99cfba5460bef5032a52e432ce0936b731e6d8e2 (diff)
downloadvalgrind-linaro_android_4.4.3.tar.gz
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>
-rw-r--r--main/coregrind/m_main.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/main/coregrind/m_main.c b/main/coregrind/m_main.c
index 9ac838737..77dcdc59a 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);
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 @@ void __aeabi_unwind_cpp_pr1(void){
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 ---------------- */