diff --git a/libc/cmake/modules/LLVMLibCTestRules.cmake b/libc/cmake/modules/LLVMLibCTestRules.cmake --- a/libc/cmake/modules/LLVMLibCTestRules.cmake +++ b/libc/cmake/modules/LLVMLibCTestRules.cmake @@ -448,8 +448,8 @@ libc.src.stdlib.atexit libc.src.stdlib.exit libc.src.unistd.environ - ) - list(APPEND memory_functions + # We always add the memory functions objects. This is because the + # compiler's codegen can emit calls to the C memory functions. libc.src.string.bcmp libc.src.string.bzero libc.src.string.memcmp @@ -457,9 +457,6 @@ libc.src.string.memmove libc.src.string.memset ) - # We remove the memory function deps because we want to explicitly add the - # object files which include the public symbols of the memory functions. - list(REMOVE_ITEM fq_deps_list ${memory_functions}) list(REMOVE_DUPLICATES fq_deps_list) # TODO: Instead of gathering internal object files from entrypoints, @@ -474,13 +471,6 @@ endif() return() endif() - # We add the memory functions objects explicitly. Note that we - # are adding objects of the targets which contain the public - # C symbols. This is because compiler codegen can emit calls to - # the C memory functions. - foreach(func IN LISTS memory_functions) - list(APPEND link_object_files $) - endforeach() list(REMOVE_DUPLICATES link_object_files) # Make a library of all deps diff --git a/libc/test/IntegrationTest/test.cpp b/libc/test/IntegrationTest/test.cpp --- a/libc/test/IntegrationTest/test.cpp +++ b/libc/test/IntegrationTest/test.cpp @@ -9,6 +9,43 @@ #include #include +// Integration tests rely on the following memory functions. This is because the +// compiler code generation can emit calls to them. We want to map the external +// entrypoint to the internal implementation of the function used for testing. +// This is done manually as not all targets support aliases. + +namespace __llvm_libc { + +int bcmp(const void *lhs, const void *rhs, size_t count); +void bzero(void *ptr, size_t count); +int memcmp(const void *lhs, const void *rhs, size_t count); +void *memcpy(void *__restrict, const void *__restrict, size_t); +void *memmove(void *dst, const void *src, size_t count); +void *memset(void *ptr, int value, size_t count); + +} // namespace __llvm_libc + +extern "C" { + +int bcmp(const void *lhs, const void *rhs, size_t count) { + __llvm_libc::bcmp(lhs, rhs, count); +} +void bzero(void *ptr, size_t count) { __llvm_libc::bzero(ptr, count); } +int memcmp(const void *lhs, const void *rhs, size_t count) { + __llvm_libc::memcmp(lhs, rhs, count); +} +void *memcpy(void *__restrict dst, const void *__restrict src, size_t count) { + __llvm_libc::memcpy(dst, src, count); +} +void *memmove(void *dst, const void *src, size_t count) { + __llvm_libc::memmove(dst, src, count); +} +void *memset(void *ptr, int value, size_t count) { + __llvm_libc::memset(ptr, value, count); +} + +} // extern "C" + // Integration tests cannot use the SCUDO standalone allocator as SCUDO pulls // various other parts of the libc. Since SCUDO development does not use // LLVM libc build rules, it is very hard to keep track or pull all that SCUDO