Index: lib/libc/aarch64/string/Makefile.inc =================================================================== --- lib/libc/aarch64/string/Makefile.inc +++ lib/libc/aarch64/string/Makefile.inc @@ -1,20 +1,41 @@ # $FreeBSD$ # -# String handling from the Cortex Strings library -# https://git.linaro.org/toolchain/cortex-strings.git +# String handling from the Arm Optimized Routines +# https://github.com/ARM-software/optimized-routines # -.PATH: ${SRCTOP}/contrib/cortex-strings/src/aarch64 +AARCH64_STRING_FUNCS= \ + memchr \ + memcmp \ + memcpy \ + memmove \ + memrchr \ + memset \ + stpcpy \ + strchr \ + strchrnul \ + strcmp \ + strcpy \ + strlen \ + strncmp \ + strnlen \ + strrchr -MDSRCS+= \ - memchr.S \ - memcmp.S \ - memcpy.S \ - memmove.S \ - memset.S \ - strchr.S \ - strcmp.S \ - strcpy.S \ - strlen.S \ - strncmp.S \ - strnlen.S +# +# Add the above functions. Generate an asm file that includes the needed +# Arm Optimized Routines file defining the function name to the libc name. +# Some file need multiple macros defined or a weak symbol added we can +# override the generated file in these cases. +# +.for FUNC in ${AARCH64_STRING_FUNCS} +.if !exists(${FUNC}.S) +${FUNC}.S: + printf '/* %sgenerated by libc/aarch64/string/Makefile.inc */\n' @ > ${.TARGET} + printf '#define __%s_aarch64 %s\n' ${FUNC} ${FUNC} >> ${.TARGET} + printf '#include "aarch64/%s.S"\n' ${FUNC} >> ${.TARGET} +CLEANFILES+= ${FUNC}.S +.endif + +MDSRCS+= ${FUNC}.S +CFLAGS.${FUNC}.S+=-I${SRCTOP}/contrib/arm-optimized-routines/string +.endfor Index: lib/libc/aarch64/string/memcpy.S =================================================================== --- /dev/null +++ lib/libc/aarch64/string/memcpy.S @@ -0,0 +1,6 @@ +#define __memcpy_aarch64 memcpy +#define __memmove_aarch64 memmove +#include "aarch64/memcpy.S" + +.weak index +.equ index, strchr Index: lib/libc/aarch64/string/memmove.S =================================================================== --- /dev/null +++ lib/libc/aarch64/string/memmove.S @@ -0,0 +1,5 @@ +/* + * memmove is implemented in memcpy.S. Having this file simplifies the build + * as it stops MISRCS from picking up the C implementation and rtld expects + * to copy the memmove object file into its object directory. + */ Index: lib/libc/aarch64/string/strchr.S =================================================================== --- /dev/null +++ lib/libc/aarch64/string/strchr.S @@ -0,0 +1,5 @@ +#define __strchr_aarch64 strchr +#include "aarch64/strchr.S" + +.weak index +.equ index, strchr Index: lib/libc/aarch64/string/strrchr.S =================================================================== --- /dev/null +++ lib/libc/aarch64/string/strrchr.S @@ -0,0 +1,5 @@ +#define __strrchr_aarch64 strrchr +#include "aarch64/strrchr.S" + +.weak rindex +.equ rindex, strrchr