Change memcpy ifunc to return memmove for x86
It is cleaner to do this with ifunc. This is a partial revert of:
https://android-review.googlesource.com/c/platform/bionic/+/693863
Test: run bionic unit test
Change-Id: I5fb5745fc98807805aedb94b683e959e2a76a25d
diff --git a/libc/Android.bp b/libc/Android.bp
index 2bce1f5..6209374 100644
--- a/libc/Android.bp
+++ b/libc/Android.bp
@@ -1171,7 +1171,7 @@
"arch-x86/atom/string/sse2-memset-atom.S",
"arch-x86/atom/string/sse2-strlen-atom.S",
"arch-x86/atom/string/ssse3-memcmp-atom.S",
- "arch-x86/atom/string/ssse3-memcpy-atom.S",
+ "arch-x86/atom/string/ssse3-memmove-atom.S",
"arch-x86/atom/string/ssse3-strcpy-atom.S",
"arch-x86/atom/string/ssse3-strncpy-atom.S",
"arch-x86/atom/string/ssse3-wmemcmp-atom.S",
diff --git a/libc/arch-x86/atom/string/ssse3-memcpy-atom.S b/libc/arch-x86/atom/string/ssse3-memcpy-atom.S
index fa67188..5532e2e 100644
--- a/libc/arch-x86/atom/string/ssse3-memcpy-atom.S
+++ b/libc/arch-x86/atom/string/ssse3-memcpy-atom.S
@@ -34,10 +34,6 @@
# define MEMCPY memcpy_atom
#endif
-#ifndef USE_AS_MEMMOVE
-# define USE_AS_MEMMOVE
-#endif
-
#ifndef L
# define L(label) .L##label
#endif
@@ -71,12 +67,6 @@
cfi_startproc
#endif
-#ifndef ALIAS_SYMBOL
-# define ALIAS_SYMBOL(alias, original) \
- .globl alias; \
- .equ alias, original
-#endif
-
#ifndef END
# define END(name) \
cfi_endproc; \
@@ -3132,5 +3122,3 @@
#endif
END (MEMCPY)
-
-ALIAS_SYMBOL(memmove_atom, MEMCPY)
diff --git a/libc/arch-x86/atom/string/ssse3-memmove-atom.S b/libc/arch-x86/atom/string/ssse3-memmove-atom.S
new file mode 100644
index 0000000..3572eac
--- /dev/null
+++ b/libc/arch-x86/atom/string/ssse3-memmove-atom.S
@@ -0,0 +1,34 @@
+/*
+Copyright (c) 2010, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+
+ * Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#define MEMCPY memmove_atom
+#define USE_AS_MEMMOVE
+#include "ssse3-memcpy-atom.S"
diff --git a/libc/arch-x86/dynamic_function_dispatch.cpp b/libc/arch-x86/dynamic_function_dispatch.cpp
index a925190..6624385 100644
--- a/libc/arch-x86/dynamic_function_dispatch.cpp
+++ b/libc/arch-x86/dynamic_function_dispatch.cpp
@@ -93,13 +93,6 @@
RETURN_FUNC(__memset_chk_func, __memset_chk_generic);
}
-typedef void* memcpy_func(void*, const void*, size_t);
-DEFINE_IFUNC_FOR(memcpy) {
- __builtin_cpu_init();
- if (cpu_is(ATOM)) RETURN_FUNC(memcpy_func, memcpy_atom);
- RETURN_FUNC(memcpy_func, memcpy_generic);
-}
-
typedef void* memmove_func(void* __dst, const void* __src, size_t __n);
DEFINE_IFUNC_FOR(memmove) {
__builtin_cpu_init();
@@ -107,6 +100,11 @@
RETURN_FUNC(memmove_func, memmove_generic);
}
+typedef void* memcpy_func(void*, const void*, size_t);
+DEFINE_IFUNC_FOR(memcpy) {
+ return memmove_resolver();
+}
+
typedef char* strcpy_func(char* __dst, const char* __src);
DEFINE_IFUNC_FOR(strcpy) {
__builtin_cpu_init();
diff --git a/libc/arch-x86/silvermont/string/sse2-memmove-slm.S b/libc/arch-x86/silvermont/string/sse2-memmove-slm.S
index 48087d8..da6456c 100644
--- a/libc/arch-x86/silvermont/string/sse2-memmove-slm.S
+++ b/libc/arch-x86/silvermont/string/sse2-memmove-slm.S
@@ -67,12 +67,6 @@
cfi_startproc
#endif
-#ifndef ALIAS_SYMBOL
-# define ALIAS_SYMBOL(alias, original) \
- .globl alias; \
- .equ alias, original
-#endif
-
#ifndef END
# define END(name) \
cfi_endproc; \
@@ -543,5 +537,3 @@
jmp L(mm_recalc_len)
END (MEMMOVE)
-
-ALIAS_SYMBOL(memcpy_generic, MEMMOVE)
diff --git a/libc/arch-x86/static_function_dispatch.S b/libc/arch-x86/static_function_dispatch.S
index 5f879ed..7e8e63d 100644
--- a/libc/arch-x86/static_function_dispatch.S
+++ b/libc/arch-x86/static_function_dispatch.S
@@ -36,7 +36,7 @@
FUNCTION_DELEGATE(memcmp, memcmp_generic)
FUNCTION_DELEGATE(memset, memset_generic)
FUNCTION_DELEGATE(__memset_chk, __memset_chk_generic)
-FUNCTION_DELEGATE(memcpy, memcpy_generic)
+FUNCTION_DELEGATE(memcpy, memmove_generic)
FUNCTION_DELEGATE(memmove, memmove_generic)
FUNCTION_DELEGATE(strcpy, strcpy_generic)
FUNCTION_DELEGATE(strncpy, strncpy_generic)