glibc/sysdeps/unix/sysv/linux/riscv/Makefile
Adhemerval Zanella 2149da3683 riscv: Fix alignment-ignorant memcpy implementation
The memcpy optimization (commit 587a1290a1) has a series
of mistakes:

  - The implementation is wrong: the chunk size calculation is wrong
    leading to invalid memory access.

  - It adds ifunc supports as default, so --disable-multi-arch does
    not work as expected for riscv.

  - It mixes Linux files (memcpy ifunc selection which requires the
    vDSO/syscall mechanism)  with generic support (the memcpy
    optimization itself).

  - There is no __libc_ifunc_impl_list, which makes testing only
    check the selected implementation instead of all supported
    by the system.

This patch also simplifies the required bits to enable ifunc: there
is no need to memcopy.h; nor to add Linux-specific files.

The __memcpy_noalignment tail handling now uses a branchless strategy
similar to aarch64 (overlap 32-bits copies for sizes 4..7 and byte
copies for size 1..3).

Checked on riscv64 and riscv32 by explicitly enabling the function
on __libc_ifunc_impl_list on qemu-system.

Changes from v1:
* Implement the memcpy in assembly to correctly handle RISCV
  strict-alignment.
Reviewed-by: Evan Green <evan@rivosinc.com>
Acked-by: Palmer Dabbelt <palmer@rivosinc.com>
2024-03-12 14:38:08 -03:00

28 lines
720 B
Makefile

ifeq ($(subdir),misc)
sysdep_headers += \
sys/cachectl.h \
sys/hwprobe.h \
# sysdep_headers
sysdep_routines += \
flush-icache \
hwprobe \
# sysdep_routines
endif
ifeq ($(subdir),stdlib)
gen-as-const-headers += ucontext_i.sym
endif
abi-variants := ilp32 ilp32d lp64 lp64d
ifeq (,$(filter $(default-abi),$(abi-variants)))
$(error Unknown ABI $(default-abi), must be one of $(abi-variants))
endif
abi-ilp32-condition := __WORDSIZE == 32 && defined __riscv_float_abi_soft
abi-ilp32d-condition := __WORDSIZE == 32 && defined __riscv_float_abi_double
abi-lp64-condition := __WORDSIZE == 64 && defined __riscv_float_abi_soft
abi-lp64d-condition := __WORDSIZE == 64 && defined __riscv_float_abi_double