From f7e91f2b824a2abe50433febe506b9aeb36245d9 Mon Sep 17 00:00:00 2001 From: Siva Chandra Date: Mon, 6 Mar 2023 22:19:37 +0000 Subject: [PATCH] [libc] Add riscv64 config. Memory functions get the basic implementation. They can be tuned as a follow up. Reviewed By: michaelrj, lntue Differential Revision: https://reviews.llvm.org/D145433 --- libc/cmake/modules/LLVMLibCArchitectures.cmake | 4 + libc/config/linux/riscv64/entrypoints.txt | 106 +++++++++++++++++++++ libc/config/linux/riscv64/headers.txt | 8 ++ .../src/string/memory_utils/bcmp_implementations.h | 6 +- .../string/memory_utils/memcmp_implementations.h | 6 +- .../string/memory_utils/memcpy_implementations.h | 5 +- .../string/memory_utils/memmove_implementations.h | 6 +- .../string/memory_utils/memset_implementations.h | 6 +- 8 files changed, 124 insertions(+), 23 deletions(-) create mode 100644 libc/config/linux/riscv64/entrypoints.txt create mode 100644 libc/config/linux/riscv64/headers.txt diff --git a/libc/cmake/modules/LLVMLibCArchitectures.cmake b/libc/cmake/modules/LLVMLibCArchitectures.cmake index e2ae2e3..77d2b54 100644 --- a/libc/cmake/modules/LLVMLibCArchitectures.cmake +++ b/libc/cmake/modules/LLVMLibCArchitectures.cmake @@ -55,6 +55,8 @@ function(get_arch_and_system_from_triple triple arch_var sys_var) set(target_arch "x86_64") elseif(target_arch MATCHES "^(powerpc|ppc)") set(target_arch "power") + elseif(target_arch MATCHES "^riscv64") + set(target_arch "riscv64") else() return() endif() @@ -146,6 +148,8 @@ elseif(LIBC_TARGET_ARCHITECTURE STREQUAL "aarch64") set(LIBC_TARGET_ARCHITECTURE_IS_AARCH64 TRUE) elseif(LIBC_TARGET_ARCHITECTURE STREQUAL "x86_64") set(LIBC_TARGET_ARCHITECTURE_IS_X86 TRUE) +elseif(LIBC_TARGET_ARCHITECTURE STREQUAL "riscv64") + set(LIBC_TARGET_ARCHITECTURE_IS_RISCV64 TRUE) else() message(FATAL_ERROR "Unsupported libc target architecture ${LIBC_TARGET_ARCHITECTURE}") diff --git a/libc/config/linux/riscv64/entrypoints.txt b/libc/config/linux/riscv64/entrypoints.txt new file mode 100644 index 0000000..183cf1b --- /dev/null +++ b/libc/config/linux/riscv64/entrypoints.txt @@ -0,0 +1,106 @@ +set(TARGET_LIBC_ENTRYPOINTS + # ctype.h entrypoints + libc.src.ctype.isalnum + libc.src.ctype.isalpha + libc.src.ctype.isascii + libc.src.ctype.isblank + libc.src.ctype.iscntrl + libc.src.ctype.isdigit + libc.src.ctype.isgraph + libc.src.ctype.islower + libc.src.ctype.isprint + libc.src.ctype.ispunct + libc.src.ctype.isspace + libc.src.ctype.isupper + libc.src.ctype.isxdigit + libc.src.ctype.toascii + libc.src.ctype.tolower + libc.src.ctype.toupper + + # errno.h entrypoints + libc.src.errno.errno + + # string.h entrypoints + libc.src.string.bcmp + libc.src.string.bcopy + libc.src.string.bzero + libc.src.string.memccpy + libc.src.string.memchr + libc.src.string.memcmp + libc.src.string.memcpy + libc.src.string.memmove + libc.src.string.mempcpy + libc.src.string.memrchr + libc.src.string.memset + libc.src.string.stpcpy + libc.src.string.stpncpy + libc.src.string.strcasecmp + libc.src.string.strcasestr + libc.src.string.strcat + libc.src.string.strchr + libc.src.string.strcmp + libc.src.string.strcpy + libc.src.string.strcspn + libc.src.string.strlcat + libc.src.string.strlcpy + libc.src.string.strlen + libc.src.string.strncasecmp + libc.src.string.strncat + libc.src.string.strncmp + libc.src.string.strncpy + libc.src.string.strnlen + libc.src.string.strpbrk + libc.src.string.strrchr + libc.src.string.strspn + libc.src.string.strstr + libc.src.string.strtok + libc.src.string.strtok_r + + # inttypes.h entrypoints + libc.src.inttypes.imaxabs + libc.src.inttypes.imaxdiv + libc.src.inttypes.strtoimax + libc.src.inttypes.strtoumax + + # stdlib.h entrypoints + libc.src.stdlib.abs + libc.src.stdlib.atoi + libc.src.stdlib.atof + libc.src.stdlib.atol + libc.src.stdlib.atoll + libc.src.stdlib.bsearch + libc.src.stdlib.div + libc.src.stdlib.labs + libc.src.stdlib.ldiv + libc.src.stdlib.llabs + libc.src.stdlib.lldiv + libc.src.stdlib.qsort + libc.src.stdlib.strtod + libc.src.stdlib.strtof + libc.src.stdlib.strtol + libc.src.stdlib.strtold + libc.src.stdlib.strtoll + libc.src.stdlib.strtoul + libc.src.stdlib.strtoull +) + +set(TARGET_LIBM_ENTRYPOINTS + # math.h entrypoints + libc.src.math.fabs + libc.src.math.fabsf + libc.src.math.fabsl + libc.src.math.fdim + libc.src.math.fdimf + libc.src.math.fdiml + libc.src.math.fmax + libc.src.math.fmaxf + libc.src.math.fmaxl + libc.src.math.fmin + libc.src.math.fminf + libc.src.math.fminl +) + +set(TARGET_LLVMLIBC_ENTRYPOINTS + ${TARGET_LIBC_ENTRYPOINTS} + ${TARGET_LIBM_ENTRYPOINTS} +) diff --git a/libc/config/linux/riscv64/headers.txt b/libc/config/linux/riscv64/headers.txt new file mode 100644 index 0000000..cc436c7 --- /dev/null +++ b/libc/config/linux/riscv64/headers.txt @@ -0,0 +1,8 @@ +set(TARGET_PUBLIC_HEADERS + libc.include.ctype + libc.include.errno + libc.include.inttypes + libc.include.math + libc.include.stdlib + libc.include.string +) diff --git a/libc/src/string/memory_utils/bcmp_implementations.h b/libc/src/string/memory_utils/bcmp_implementations.h index 483d3c2..1c238cb 100644 --- a/libc/src/string/memory_utils/bcmp_implementations.h +++ b/libc/src/string/memory_utils/bcmp_implementations.h @@ -167,12 +167,8 @@ LIBC_INLINE BcmpReturnType inline_bcmp(CPtr p1, CPtr p2, size_t count) { return inline_bcmp_x86(p1, p2, count); #elif defined(LIBC_TARGET_ARCH_IS_AARCH64) return inline_bcmp_aarch64(p1, p2, count); -#elif defined(LIBC_TARGET_ARCH_IS_ARM) - return inline_bcmp_embedded_tiny(p1, p2, count); -#elif defined(LIBC_TARGET_ARCH_IS_GPU) - return inline_bcmp_embedded_tiny(p1, p2, count); #else -#error "Unsupported platform" + return inline_bcmp_embedded_tiny(p1, p2, count); #endif } diff --git a/libc/src/string/memory_utils/memcmp_implementations.h b/libc/src/string/memory_utils/memcmp_implementations.h index f99e2e4..01c524d 100644 --- a/libc/src/string/memory_utils/memcmp_implementations.h +++ b/libc/src/string/memory_utils/memcmp_implementations.h @@ -139,12 +139,8 @@ LIBC_INLINE MemcmpReturnType inline_memcmp(CPtr p1, CPtr p2, size_t count) { else return inline_memcmp_generic_gt16(p1, p2, count); #endif -#elif defined(LIBC_TARGET_ARCH_IS_ARM) - return inline_memcmp_embedded_tiny(p1, p2, count); -#elif defined(LIBC_TARGET_ARCH_IS_GPU) - return inline_memcmp_embedded_tiny(p1, p2, count); #else -#error "Unsupported platform" + return inline_memcmp_embedded_tiny(p1, p2, count); #endif } diff --git a/libc/src/string/memory_utils/memcpy_implementations.h b/libc/src/string/memory_utils/memcpy_implementations.h index f0344b3..b1b60ff 100644 --- a/libc/src/string/memory_utils/memcpy_implementations.h +++ b/libc/src/string/memory_utils/memcpy_implementations.h @@ -36,15 +36,14 @@ inline_memcpy_embedded_tiny(Ptr __restrict dst, CPtr __restrict src, LIBC_INLINE void inline_memcpy(Ptr __restrict dst, CPtr __restrict src, size_t count) { using namespace __llvm_libc::builtin; -#if defined(LIBC_COPT_MEMCPY_USE_EMBEDDED_TINY) || \ - defined(LIBC_TARGET_ARCH_IS_ARM) || defined(LIBC_TARGET_ARCH_IS_GPU) +#if defined(LIBC_COPT_MEMCPY_USE_EMBEDDED_TINY) return inline_memcpy_embedded_tiny(dst, src, count); #elif defined(LIBC_TARGET_ARCH_IS_X86) return inline_memcpy_x86_maybe_interpose_repmovsb(dst, src, count); #elif defined(LIBC_TARGET_ARCH_IS_AARCH64) return inline_memcpy_aarch64(dst, src, count); #else -#error "Unsupported platform" + return inline_memcpy_embedded_tiny(dst, src, count); #endif } diff --git a/libc/src/string/memory_utils/memmove_implementations.h b/libc/src/string/memory_utils/memmove_implementations.h index 2d920da..1eb6d4e 100644 --- a/libc/src/string/memory_utils/memmove_implementations.h +++ b/libc/src/string/memory_utils/memmove_implementations.h @@ -102,12 +102,8 @@ LIBC_INLINE void inline_memmove(Ptr dst, CPtr src, size_t count) { return generic::Memmove<64, kMaxSize>::loop_and_tail_backward(dst, src, count); } -#elif defined(LIBC_TARGET_ARCH_IS_ARM) - return inline_memmove_embedded_tiny(dst, src, count); -#elif defined(LIBC_TARGET_ARCH_IS_GPU) - return inline_memmove_embedded_tiny(dst, src, count); #else -#error "Unsupported platform" + return inline_memmove_embedded_tiny(dst, src, count); #endif } diff --git a/libc/src/string/memory_utils/memset_implementations.h b/libc/src/string/memory_utils/memset_implementations.h index 089d749..16c1147 100644 --- a/libc/src/string/memory_utils/memset_implementations.h +++ b/libc/src/string/memory_utils/memset_implementations.h @@ -106,12 +106,8 @@ LIBC_INLINE static void inline_memset(Ptr dst, uint8_t value, size_t count) { #elif defined(LIBC_TARGET_ARCH_IS_AARCH64) static constexpr size_t kMaxSize = aarch64::kNeon ? 16 : 8; return inline_memset_aarch64(dst, value, count); -#elif defined(LIBC_TARGET_ARCH_IS_ARM) - return inline_memset_embedded_tiny(dst, value, count); -#elif defined(LIBC_TARGET_ARCH_IS_GPU) - return inline_memset_embedded_tiny(dst, value, count); #else -#error "Unsupported platform" + return inline_memset_embedded_tiny(dst, value, count); #endif } -- 2.7.4