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
This commit is contained in:
parent
b9244ff551
commit
e141362aa1
|
@ -1171,7 +1171,7 @@ cc_library_static {
|
|||
"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",
|
||||
|
|
|
@ -34,10 +34,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
# 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 @@ name: \
|
|||
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 @@ L(bk_ssse3_cpy):
|
|||
#endif
|
||||
|
||||
END (MEMCPY)
|
||||
|
||||
ALIAS_SYMBOL(memmove_atom, MEMCPY)
|
||||
|
|
|
@ -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"
|
|
@ -93,13 +93,6 @@ DEFINE_IFUNC_FOR(__memset_chk) {
|
|||
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 @@ DEFINE_IFUNC_FOR(memmove) {
|
|||
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();
|
||||
|
|
|
@ -67,12 +67,6 @@ name: \
|
|||
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 @@ L(mm_large_page_loop_backward):
|
|||
jmp L(mm_recalc_len)
|
||||
|
||||
END (MEMMOVE)
|
||||
|
||||
ALIAS_SYMBOL(memcpy_generic, MEMMOVE)
|
||||
|
|
|
@ -36,7 +36,7 @@ END(name)
|
|||
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)
|
||||
|
|
Loading…
Reference in New Issue