nuttx/libs/libc/machine/risc-v/Make.defs
ganjing 931d5f50d4 libs/libc/risc-v: Add optimized strlcpy.
Add word-at-a-time strlcpy using DETECTNULL for both the copy phase
and the strlen tail when truncated.  The copy loop aligns src and
processes a register at a time, falling to bytewise for the last word
containing the terminator.  When truncated, the remaining src length
is measured with a second word-at-a-time loop.

strlcpy has 46 call sites in a typical kernel image (more than strcpy)
and is not covered by newlib OPTSPEED, making it a high-value target.

Assisted-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: ganjing <ganjing@xiaomi.com>
2026-08-12 10:23:47 +08:00

104 lines
2.3 KiB
Text

############################################################################
# libs/libc/machine/risc-v/Make.defs
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership. The
# ASF licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the
# License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
############################################################################
ifeq ($(CONFIG_RISCV_MEMCPY),y)
ASRCS += arch_memcpy.S
endif
ifeq ($(CONFIG_RISCV_MEMSET),y)
ASRCS += arch_memset.S
endif
ifeq ($(CONFIG_RISCV_MEMMOVE),y)
ASRCS += arch_memmove.S
endif
ifeq ($(CONFIG_RISCV_MEMCMP),y)
ASRCS += arch_memcmp.S
endif
ifeq ($(CONFIG_RISCV_MEMCHR),y)
ASRCS += arch_memchr.S
endif
ifeq ($(CONFIG_RISCV_STRCMP),y)
ASRCS += arch_strcmp.S
endif
ifeq ($(CONFIG_RISCV_STRLEN),y)
ASRCS += arch_strlen.S
endif
ifeq ($(CONFIG_RISCV_STRNLEN),y)
ASRCS += arch_strnlen.S
endif
ifeq ($(CONFIG_RISCV_STRCPY),y)
ASRCS += arch_strcpy.S
endif
ifeq ($(CONFIG_RISCV_STRNCPY),y)
ASRCS += arch_strncpy.S
endif
ifeq ($(CONFIG_RISCV_STPCPY),y)
ASRCS += arch_stpcpy.S
endif
ifeq ($(CONFIG_RISCV_STPNCPY),y)
ASRCS += arch_stpncpy.S
endif
ifeq ($(CONFIG_RISCV_STRCHR),y)
ASRCS += arch_strchr.S
endif
ifeq ($(CONFIG_RISCV_STRCHRNUL),y)
ASRCS += arch_strchrnul.S
endif
ifeq ($(CONFIG_RISCV_STRRCHR),y)
ASRCS += arch_strrchr.S
endif
ifeq ($(CONFIG_RISCV_STRNCMP),y)
ASRCS += arch_strncmp.S
endif
ifeq ($(CONFIG_RISCV_STRLCPY),y)
ASRCS += arch_strlcpy.S
endif
ifeq ($(CONFIG_RISCV_STRCAT),y)
ASRCS += arch_strcat.S
endif
ifeq ($(CONFIG_ARCH_SETJMP_H),y)
ASRCS += arch_setjmp.S
endif
ifeq ($(CONFIG_LIBC_ARCH_ELF),y)
CSRCS += arch_elf.c
endif
DEPPATH += --dep-path machine/risc-v
VPATH += :machine/risc-v