[libc-commits] [PATCH] D146177: [libc] Add aliases to C memory functions for integration tests
Joseph Huber via Phabricator via libc-commits
libc-commits at lists.llvm.org
Wed Mar 15 16:18:50 PDT 2023
jhuber6 created this revision.
jhuber6 added reviewers: sivachandra, michaelrj, lntue.
Herald added subscribers: libc-commits, mikhail.ramalho, jeroen.dobbelaere, ecnelises, tschuett.
Herald added projects: libc-project, All.
jhuber6 requested review of this revision.
The integration tests require the C memory functions as the compiler may
emit calls to them directly. The tests normally use the `__internal__`
variant that is built for testing, but these memory functions were
linked directly to preserve the entrypoint. Instead, we forward delcare
the internal versions and map the entrypoints to them manually inside
the integration test. This allows us to use the internal versions of
these files like the rest of the test objects.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D146177
Files:
libc/cmake/modules/LLVMLibCTestRules.cmake
libc/test/IntegrationTest/test.cpp
Index: libc/test/IntegrationTest/test.cpp
===================================================================
--- libc/test/IntegrationTest/test.cpp
+++ libc/test/IntegrationTest/test.cpp
@@ -9,6 +9,42 @@
#include <stddef.h>
#include <stdint.h>
+// Integration tests rely on the following memory functions. This is because the
+// compiler code generation can emit calls to the "C" standard memory functions.
+// We want to map the external entrypoint to the internal implementation of the
+// function used for testing. This is done manually as not all target 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
Index: libc/cmake/modules/LLVMLibCTestRules.cmake
===================================================================
--- libc/cmake/modules/LLVMLibCTestRules.cmake
+++ libc/cmake/modules/LLVMLibCTestRules.cmake
@@ -449,7 +449,7 @@
libc.src.stdlib.exit
libc.src.unistd.environ
)
- list(APPEND memory_functions
+ list(APPEND fq_deps_list
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 $<TARGET_OBJECTS:${func}>)
- endforeach()
list(REMOVE_DUPLICATES link_object_files)
# Make a library of all deps
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D146177.505652.patch
Type: text/x-patch
Size: 3188 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libc-commits/attachments/20230315/622496fd/attachment.bin>
More information about the libc-commits
mailing list