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 @@ -568,6 +568,7 @@ # ARGS # ENV # COMPILE_OPTIONS +# LINK_LIBRARIES # LOADER_ARGS # ) function(add_libc_hermetic_test test_name) @@ -579,7 +580,7 @@ "HERMETIC_TEST" "" # No optional arguments "SUITE" # Single value arguments - "SRCS;HDRS;DEPENDS;ARGS;ENV;COMPILE_OPTIONS;LOADER_ARGS" # Multi-value arguments + "SRCS;HDRS;DEPENDS;ARGS;ENV;COMPILE_OPTIONS;LINK_LIBRARIES;LOADER_ARGS" # Multi-value arguments ${ARGN} ) @@ -600,6 +601,7 @@ libc.startup.${LIBC_TARGET_OS}.crt1 # We always add the memory functions objects. This is because the # compiler's codegen can emit calls to the C memory functions. + libc.src.assert.__assert_fail libc.src.string.bcmp libc.src.string.bzero libc.src.string.memcmp @@ -660,13 +662,15 @@ target_link_options(${fq_build_target_name} PRIVATE -nostdlib -static) target_link_libraries( ${fq_build_target_name} - libc.startup.${LIBC_TARGET_OS}.crt1 - LibcHermeticTestMain LibcHermeticTest - # The NVIDIA 'nvlink' linker does not currently support static libraries. - $<$>:${fq_target_name}.__libc__>) + PRIVATE + ${HERMETIC_TEST_LINK_LIBRARIES} + libc.startup.${LIBC_TARGET_OS}.crt1 + LibcHermeticTestMain LibcHermeticTest + # The NVIDIA 'nvlink' linker does not currently support static libraries. + $<$>:${fq_target_name}.__libc__>) add_dependencies(${fq_build_target_name} LibcHermeticTest - ${HERMETIC_TEST_DEPENDS}) + ${fq_deps_list}) # Tests on the GPU require an external loader utility to launch the kernel. if(TARGET libc.utils.gpu.loader) diff --git a/libc/test/UnitTest/CMakeLists.txt b/libc/test/UnitTest/CMakeLists.txt --- a/libc/test/UnitTest/CMakeLists.txt +++ b/libc/test/UnitTest/CMakeLists.txt @@ -77,8 +77,6 @@ RoundingModeUtils.cpp RoundingModeUtils.h ) -target_include_directories(LibcFPTestHelpers PUBLIC ${LIBC_SOURCE_DIR}) -target_link_libraries(LibcFPTestHelpers LibcUnitTest) add_dependencies( LibcFPTestHelpers LibcUnitTest @@ -93,8 +91,6 @@ MemoryMatcher.h MemoryMatcher.cpp ) -target_include_directories(LibcMemoryHelpers PUBLIC ${LIBC_SOURCE_DIR}) -target_link_libraries(LibcMemoryHelpers LibcUnitTest) add_dependencies( LibcMemoryHelpers LibcUnitTest @@ -106,8 +102,6 @@ PrintfMatcher.h PrintfMatcher.cpp ) -target_include_directories(LibcPrintfHelpers PUBLIC ${LIBC_SOURCE_DIR}) -target_link_libraries(LibcPrintfHelpers LibcUnitTest) add_dependencies( LibcPrintfHelpers LibcUnitTest @@ -121,8 +115,6 @@ ScanfMatcher.h ScanfMatcher.cpp ) -target_include_directories(LibcScanfHelpers PUBLIC ${LIBC_SOURCE_DIR}) -target_link_libraries(LibcScanfHelpers LibcUnitTest) add_dependencies( LibcScanfHelpers LibcUnitTest @@ -130,3 +122,9 @@ libc.src.stdio.scanf_core.core_structs libc.test.UnitTest.string_utils ) + +foreach(lib LibcFPTestHelpers LibcMemoryHelpers LibcPrintfHelpers LibcScanfHelpers) + target_include_directories(${lib} PUBLIC ${LIBC_SOURCE_DIR}) + target_compile_options(${lib} PRIVATE -fno-exceptions -fno-rtti) +target_link_libraries(${lib} LibcUnitTest) +endforeach() diff --git a/libc/test/UnitTest/HermeticTestUtils.cpp b/libc/test/UnitTest/HermeticTestUtils.cpp --- a/libc/test/UnitTest/HermeticTestUtils.cpp +++ b/libc/test/UnitTest/HermeticTestUtils.cpp @@ -17,6 +17,8 @@ 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); +void __assert_fail(const char *str, const char *file, unsigned line, + const char *func); } // namespace __llvm_libc @@ -56,6 +58,10 @@ void *memset(void *ptr, int value, size_t count) { return __llvm_libc::memset(ptr, value, count); } +void __assert_fail(const char *str, const char *file, unsigned line, + const char *func) { + __llvm_libc::__assert_fail(str, file, line, func); +} void *malloc(size_t s) { void *mem = ptr;