[libc-commits] [libc] [libc] Add hooks for extra options in running hermetic tests (PR #147931)
William Huynh via libc-commits
libc-commits at lists.llvm.org
Mon Jul 14 07:48:57 PDT 2025
https://github.com/saturn691 updated https://github.com/llvm/llvm-project/pull/147931
>From aa3b5ef27245f35afd1e7a3717d6282ff2be1c0c Mon Sep 17 00:00:00 2001
From: William Huynh <William.Huynh at arm.com>
Date: Thu, 10 Jul 2025 11:09:22 +0100
Subject: [PATCH 1/3] [libc] Add hooks for extra options in running hermetic
tests
---
libc/cmake/modules/LLVMLibCTestRules.cmake | 25 +++++++++++++++++-----
1 file changed, 20 insertions(+), 5 deletions(-)
diff --git a/libc/cmake/modules/LLVMLibCTestRules.cmake b/libc/cmake/modules/LLVMLibCTestRules.cmake
index 1cd09816e223f..739fd6639a976 100644
--- a/libc/cmake/modules/LLVMLibCTestRules.cmake
+++ b/libc/cmake/modules/LLVMLibCTestRules.cmake
@@ -288,7 +288,9 @@ function(create_libc_unittest fq_target_name)
target_include_directories(${fq_build_target_name} SYSTEM PRIVATE ${LIBC_INCLUDE_DIR})
target_include_directories(${fq_build_target_name} PRIVATE ${LIBC_SOURCE_DIR})
target_compile_options(${fq_build_target_name} PRIVATE ${compile_options})
- target_link_options(${fq_build_target_name} PRIVATE ${link_options})
+
+ string(REPLACE " " ";" EXTRA_LINK_OPTIONS "${LIBC_TEST_EXTRA_LINK_OPTIONS}")
+ target_link_options(${fq_build_target_name} PRIVATE ${link_options} ${EXTRA_LINK_OPTIONS})
if(NOT LIBC_UNITTEST_CXX_STANDARD)
set(LIBC_UNITTEST_CXX_STANDARD ${CMAKE_CXX_STANDARD})
@@ -580,7 +582,9 @@ function(add_integration_test test_name)
-march=${LIBC_GPU_TARGET_ARCHITECTURE} -nostdlib -static
"--cuda-path=${LIBC_CUDA_ROOT}")
elseif(LIBC_CC_SUPPORTS_NOSTDLIBPP)
- target_link_options(${fq_build_target_name} PRIVATE -nolibc -nostartfiles -nostdlib++ -static)
+ string(REPLACE " " ";" EXTRA_LINK_OPTIONS "${LIBC_TEST_EXTRA_LINK_OPTIONS}")
+ target_link_options(${fq_build_target_name} PRIVATE
+ -nolibc -nostartfiles -nostdlib++ -static ${EXTRA_LINK_OPTIONS})
else()
# Older version of gcc does not support `nostdlib++` flag. We use
# `nostdlib` and link against libgcc_s, which cannot be linked statically.
@@ -774,7 +778,9 @@ function(add_libc_hermetic test_name)
-march=${LIBC_GPU_TARGET_ARCHITECTURE} -nostdlib -static
"--cuda-path=${LIBC_CUDA_ROOT}")
elseif(LIBC_CC_SUPPORTS_NOSTDLIBPP)
- target_link_options(${fq_build_target_name} PRIVATE -nolibc -nostartfiles -nostdlib++ -static)
+ string(REPLACE " " ";" EXTRA_LINK_OPTIONS "${LIBC_TEST_EXTRA_LINK_OPTIONS}")
+ target_link_options(${fq_build_target_name} PRIVATE
+ -nolibc -nostartfiles -nostdlib++ -static ${EXTRA_LINK_OPTIONS})
else()
# Older version of gcc does not support `nostdlib++` flag. We use
# `nostdlib` and link against libgcc_s, which cannot be linked statically.
@@ -809,9 +815,16 @@ function(add_libc_hermetic test_name)
endif()
if(NOT HERMETIC_TEST_NO_RUN_POSTBUILD)
- set(test_cmd ${HERMETIC_TEST_ENV}
+ if (LIBC_TEST_CMD)
+ # In the form of "<command> binary=@BINARY@", e.g. "qemu-system-arm -loader$<COMMA>file=@BINARY@"
+ string(REPLACE "@BINARY@" "$<TARGET_FILE:${fq_build_target_name}>" test_cmd_parsed ${LIBC_TEST_CMD})
+ string(REPLACE " " ";" test_cmd "${test_cmd_parsed}")
+ else()
+ set(test_cmd ${HERMETIC_TEST_ENV}
$<$<BOOL:${LIBC_TARGET_OS_IS_GPU}>:${gpu_loader_exe}> ${CMAKE_CROSSCOMPILING_EMULATOR} ${HERMETIC_TEST_LOADER_ARGS}
$<TARGET_FILE:${fq_build_target_name}> ${HERMETIC_TEST_ARGS})
+ endif()
+
add_custom_target(
${fq_target_name}
DEPENDS ${fq_target_name}.__cmd__
@@ -863,7 +876,9 @@ function(add_libc_test test_name)
# Tests like the file tests perform file operations on disk file. If we
# don't chain up the unit test and hermetic test, then those tests will
# step on each other's files.
- add_dependencies(${fq_test_name}.__hermetic__ ${fq_test_name}.__unit__)
+ if(NOT LIBC_TEST_HERMETIC_ONLY)
+ add_dependencies(${fq_test_name}.__hermetic__ ${fq_test_name}.__unit__)
+ endif()
endif()
endif()
endfunction(add_libc_test)
>From ff479099b99a22583e80d46d50458a1d760bf516 Mon Sep 17 00:00:00 2001
From: William Huynh <William.Huynh at arm.com>
Date: Mon, 14 Jul 2025 15:38:23 +0100
Subject: [PATCH 2/3] Apply suggestions from lntue
---
libc/CMakeLists.txt | 5 ++
libc/cmake/modules/LLVMLibCTestRules.cmake | 53 ++++++++++++++++------
2 files changed, 45 insertions(+), 13 deletions(-)
diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt
index 507b3aa88babf..b12e9c781a674 100644
--- a/libc/CMakeLists.txt
+++ b/libc/CMakeLists.txt
@@ -76,6 +76,11 @@ add_compile_definitions(LIBC_NAMESPACE=${LIBC_NAMESPACE})
set(LIBC_COMPILE_OPTIONS_DEFAULT "" CACHE STRING "Architecture to tell clang to optimize for (e.g. -march=... or -mcpu=...)")
set(LIBC_TEST_COMPILE_OPTIONS_DEFAULT "" CACHE STRING "Common compile options for all the tests.")
+set(LIBC_LINK_OPTIONS_DEFAULT "" CACHE STRING "Arguments used when linking.")
+set(LIBC_TEST_LINK_OPTIONS_DEFAULT "" CACHE STRING "Common link options for all the tests.")
+
+set(LIBC_TEST_HERMETIC_ONLY "" OFF CACHE BOOL "Only enable hermetic tests.")
+
list(APPEND LIBC_COMPILE_OPTIONS_DEFAULT ${LIBC_COMMON_TUNE_OPTIONS})
# Check --print-resource-dir to find the compiler resource dir if this flag
diff --git a/libc/cmake/modules/LLVMLibCTestRules.cmake b/libc/cmake/modules/LLVMLibCTestRules.cmake
index 739fd6639a976..659ab15b944ba 100644
--- a/libc/cmake/modules/LLVMLibCTestRules.cmake
+++ b/libc/cmake/modules/LLVMLibCTestRules.cmake
@@ -233,7 +233,11 @@ function(create_libc_unittest fq_target_name)
_get_common_test_compile_options(compile_options "${LIBC_UNITTEST_C_TEST}"
"${LIBC_UNITTEST_FLAGS}")
# TODO: Ideally we would have a separate function for link options.
- set(link_options ${compile_options})
+ set(link_options
+ ${compile_options}
+ ${LIBC_LINK_OPTIONS_DEFAULT}
+ ${LIBC_TEST_LINK_OPTIONS_DEFAULT}
+ )
list(APPEND compile_options ${LIBC_UNITTEST_COMPILE_OPTIONS})
if(SHOW_INTERMEDIATE_OBJECTS)
@@ -288,9 +292,7 @@ function(create_libc_unittest fq_target_name)
target_include_directories(${fq_build_target_name} SYSTEM PRIVATE ${LIBC_INCLUDE_DIR})
target_include_directories(${fq_build_target_name} PRIVATE ${LIBC_SOURCE_DIR})
target_compile_options(${fq_build_target_name} PRIVATE ${compile_options})
-
- string(REPLACE " " ";" EXTRA_LINK_OPTIONS "${LIBC_TEST_EXTRA_LINK_OPTIONS}")
- target_link_options(${fq_build_target_name} PRIVATE ${link_options} ${EXTRA_LINK_OPTIONS})
+ target_link_options(${fq_build_target_name} PRIVATE ${link_options})
if(NOT LIBC_UNITTEST_CXX_STANDARD)
set(LIBC_UNITTEST_CXX_STANDARD ${CMAKE_CXX_STANDARD})
@@ -582,14 +584,26 @@ function(add_integration_test test_name)
-march=${LIBC_GPU_TARGET_ARCHITECTURE} -nostdlib -static
"--cuda-path=${LIBC_CUDA_ROOT}")
elseif(LIBC_CC_SUPPORTS_NOSTDLIBPP)
- string(REPLACE " " ";" EXTRA_LINK_OPTIONS "${LIBC_TEST_EXTRA_LINK_OPTIONS}")
- target_link_options(${fq_build_target_name} PRIVATE
- -nolibc -nostartfiles -nostdlib++ -static ${EXTRA_LINK_OPTIONS})
+ set(link_options
+ -nolibc
+ -nostartfiles
+ -nostdlib++
+ -static
+ ${LIBC_LINK_OPTIONS_DEFAULT}
+ ${LIBC_TEST_LINK_OPTIONS_DEFAULT}
+ )
+ target_link_options(${fq_build_target_name} PRIVATE ${link_options})
else()
# Older version of gcc does not support `nostdlib++` flag. We use
# `nostdlib` and link against libgcc_s, which cannot be linked statically.
- target_link_options(${fq_build_target_name} PRIVATE -nolibc -nostartfiles -nostdlib)
- list(APPEND link_libraries ${LIBGCC_S_LOCATION})
+ set(link_options
+ -nolibc
+ -nostartfiles
+ -static
+ ${LIBC_LINK_OPTIONS_DEFAULT}
+ ${LIBC_TEST_LINK_OPTIONS_DEFAULT}
+ )
+ target_link_options(${fq_build_target_name} PRIVATE ${link_options})
endif()
target_link_libraries(
${fq_build_target_name}
@@ -778,13 +792,26 @@ function(add_libc_hermetic test_name)
-march=${LIBC_GPU_TARGET_ARCHITECTURE} -nostdlib -static
"--cuda-path=${LIBC_CUDA_ROOT}")
elseif(LIBC_CC_SUPPORTS_NOSTDLIBPP)
- string(REPLACE " " ";" EXTRA_LINK_OPTIONS "${LIBC_TEST_EXTRA_LINK_OPTIONS}")
- target_link_options(${fq_build_target_name} PRIVATE
- -nolibc -nostartfiles -nostdlib++ -static ${EXTRA_LINK_OPTIONS})
+ set(link_options
+ -nolibc
+ -nostartfiles
+ -nostdlib++
+ -static
+ ${LIBC_LINK_OPTIONS_DEFAULT}
+ ${LIBC_TEST_LINK_OPTIONS_DEFAULT}
+ )
+ target_link_options(${fq_build_target_name} PRIVATE ${link_options})
else()
# Older version of gcc does not support `nostdlib++` flag. We use
# `nostdlib` and link against libgcc_s, which cannot be linked statically.
- target_link_options(${fq_build_target_name} PRIVATE -nolibc -nostartfiles -nostdlib)
+ set(link_options
+ -nolibc
+ -nostartfiles
+ -static
+ ${LIBC_LINK_OPTIONS_DEFAULT}
+ ${LIBC_TEST_LINK_OPTIONS_DEFAULT}
+ )
+ target_link_options(${fq_build_target_name} PRIVATE ${link_options})
list(APPEND link_libraries ${LIBGCC_S_LOCATION})
endif()
target_link_libraries(
>From fe801d8e57760cf90161ba34b0f95c07edd7cf06 Mon Sep 17 00:00:00 2001
From: William Huynh <William.Huynh at arm.com>
Date: Mon, 14 Jul 2025 15:48:46 +0100
Subject: [PATCH 3/3] Apply suggestions from lntue 2
---
libc/CMakeLists.txt | 2 ++
libc/cmake/modules/LLVMLibCTestRules.cmake | 16 ++++++++--------
2 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt
index b12e9c781a674..4f3704ec9aa9b 100644
--- a/libc/CMakeLists.txt
+++ b/libc/CMakeLists.txt
@@ -79,6 +79,8 @@ set(LIBC_TEST_COMPILE_OPTIONS_DEFAULT "" CACHE STRING "Common compile options fo
set(LIBC_LINK_OPTIONS_DEFAULT "" CACHE STRING "Arguments used when linking.")
set(LIBC_TEST_LINK_OPTIONS_DEFAULT "" CACHE STRING "Common link options for all the tests.")
+set(LIBC_TEST_CMD "" CACHE STRING
+ "The full test command in the form <command> binary=@BINARY@, if using another program to test (e.g. QEMU)")
set(LIBC_TEST_HERMETIC_ONLY "" OFF CACHE BOOL "Only enable hermetic tests.")
list(APPEND LIBC_COMPILE_OPTIONS_DEFAULT ${LIBC_COMMON_TUNE_OPTIONS})
diff --git a/libc/cmake/modules/LLVMLibCTestRules.cmake b/libc/cmake/modules/LLVMLibCTestRules.cmake
index 659ab15b944ba..905df118311b0 100644
--- a/libc/cmake/modules/LLVMLibCTestRules.cmake
+++ b/libc/cmake/modules/LLVMLibCTestRules.cmake
@@ -584,14 +584,14 @@ function(add_integration_test test_name)
-march=${LIBC_GPU_TARGET_ARCHITECTURE} -nostdlib -static
"--cuda-path=${LIBC_CUDA_ROOT}")
elseif(LIBC_CC_SUPPORTS_NOSTDLIBPP)
- set(link_options
- -nolibc
- -nostartfiles
- -nostdlib++
- -static
- ${LIBC_LINK_OPTIONS_DEFAULT}
- ${LIBC_TEST_LINK_OPTIONS_DEFAULT}
- )
+ set(link_options
+ -nolibc
+ -nostartfiles
+ -nostdlib++
+ -static
+ ${LIBC_LINK_OPTIONS_DEFAULT}
+ ${LIBC_TEST_LINK_OPTIONS_DEFAULT}
+ )
target_link_options(${fq_build_target_name} PRIVATE ${link_options})
else()
# Older version of gcc does not support `nostdlib++` flag. We use
More information about the libc-commits
mailing list