[libc-commits] [libc] fd3295f - [libc] Skip entrypoints not present in the entrypoints list.
Siva Chandra Reddy via libc-commits
libc-commits at lists.llvm.org
Tue Jun 9 14:54:00 PDT 2020
Author: Siva Chandra Reddy
Date: 2020-06-09T14:40:28-07:00
New Revision: fd3295fb6f981a5c030d7540b9eda67f9c723e0f
URL: https://github.com/llvm/llvm-project/commit/fd3295fb6f981a5c030d7540b9eda67f9c723e0f
DIFF: https://github.com/llvm/llvm-project/commit/fd3295fb6f981a5c030d7540b9eda67f9c723e0f.diff
LOG: [libc] Skip entrypoints not present in the entrypoints list.
Summary:
If a test depends on a skipped entrypoint, then the test is also
skipped. This setup will be useful as we gradually add support for
more operating systems and target architectures.
Reviewers: asteinhauser
Differential Revision: https://reviews.llvm.org/D81489
Added:
Modified:
libc/CMakeLists.txt
libc/cmake/modules/LLVMLibCObjectRules.cmake
libc/cmake/modules/LLVMLibCTestRules.cmake
libc/config/linux/x86_64/entrypoints.txt
libc/config/linux/x86_64/headers.txt
libc/lib/CMakeLists.txt
libc/loader/linux/CMakeLists.txt
libc/test/loader/CMakeLists.txt
libc/test/loader/linux/CMakeLists.txt
libc/test/src/CMakeLists.txt
Removed:
################################################################################
diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt
index df0448b74edf..b774eac6273a 100644
--- a/libc/CMakeLists.txt
+++ b/libc/CMakeLists.txt
@@ -68,6 +68,22 @@ include(LLVMLibCCheckCpuFeatures)
add_subdirectory(include)
add_subdirectory(config)
+
+include("${LIBC_SOURCE_DIR}/config/${LIBC_TARGET_OS}/${LIBC_TARGET_MACHINE}/entrypoints.txt")
+include("${LIBC_SOURCE_DIR}/config/${LIBC_TARGET_OS}/${LIBC_TARGET_MACHINE}/headers.txt")
+
+set(TARGET_ENTRYPOINT_NAME_LIST "")
+foreach(entrypoint IN LISTS TARGET_LIBC_ENTRYPOINTS TARGET_LIBM_ENTRYPOINTS)
+ string(FIND ${entrypoint} "." last_dot_loc REVERSE)
+ if(${last_dot_loc} EQUAL -1)
+ message(FATAL "Invalid entrypoint target name ${entrypoint}; Expected a '.' "
+ "(dot) in the name.")
+ endif()
+ math(EXPR name_loc "${last_dot_loc} + 1")
+ string(SUBSTRING ${entrypoint} ${name_loc} -1 entrypoint_name)
+ list(APPEND TARGET_ENTRYPOINT_NAME_LIST ${entrypoint_name})
+endforeach()
+
add_subdirectory(src)
add_subdirectory(utils)
diff --git a/libc/cmake/modules/LLVMLibCObjectRules.cmake b/libc/cmake/modules/LLVMLibCObjectRules.cmake
index d1d098d3dc38..32900d825531 100644
--- a/libc/cmake/modules/LLVMLibCObjectRules.cmake
+++ b/libc/cmake/modules/LLVMLibCObjectRules.cmake
@@ -86,6 +86,23 @@ function(add_entrypoint_object target_name)
set(entrypoint_name ${ADD_ENTRYPOINT_OBJ_NAME})
endif()
+ list(FIND TARGET_ENTRYPOINT_NAME_LIST ${entrypoint_name} entrypoint_name_index)
+ if(${entrypoint_name_index} EQUAL -1)
+ add_custom_target(${fq_target_name})
+ set_target_properties(
+ ${fq_target_name}
+ PROPERTIES
+ "ENTRYPOINT_NAME" ${entrypoint_name}
+ "TARGET_TYPE" ${ENTRYPOINT_OBJ_TARGET_TYPE}
+ "OBJECT_FILE" ""
+ "OBJECT_FILE_RAW" ""
+ "DEPS" ""
+ "SKIPPED" "YES"
+ )
+ message(STATUS "Skipping libc entrypoint ${fq_target_name}.")
+ return()
+ endif()
+
if(ADD_ENTRYPOINT_OBJ_ALIAS)
# Alias targets help one add aliases to other entrypoint object targets.
# One can use alias targets setup OS/machine independent entrypoint targets.
diff --git a/libc/cmake/modules/LLVMLibCTestRules.cmake b/libc/cmake/modules/LLVMLibCTestRules.cmake
index 831cbc010285..e33f5289c405 100644
--- a/libc/cmake/modules/LLVMLibCTestRules.cmake
+++ b/libc/cmake/modules/LLVMLibCTestRules.cmake
@@ -3,12 +3,18 @@
# recursively produced by "add_entrypoint_object" and "add_object_library"
# targets.
# Usage:
-# get_object_files_for_test(<result var> <target0> [<target1> ...])
+# get_object_files_for_test(<result var>
+# <skipped_entrypoints_var>
+# <target0> [<target1> ...])
#
+# The list of object files is collected in <result_var>.
+# If skipped entrypoints were found, then <skipped_entrypoints_var> is
+# set to a true value.
# targetN is either an "add_entrypoint_target" target or an
# "add_object_library" target.
-function(get_object_files_for_test result)
+function(get_object_files_for_test result skipped_entrypoints_list)
set(object_files "")
+ set(skipped_list "")
foreach(dep IN LISTS ARGN)
get_target_property(dep_type ${dep} "TARGET_TYPE")
if(NOT dep_type)
@@ -23,6 +29,11 @@ function(get_object_files_for_test result)
list(APPEND object_files ${dep_object_files})
endif()
elseif(${dep_type} STREQUAL ${ENTRYPOINT_OBJ_TARGET_TYPE})
+ get_target_property(is_skipped ${dep} "SKIPPED")
+ if(is_skipped)
+ list(APPEND skipped_list ${dep})
+ continue()
+ endif()
get_target_property(object_file_raw ${dep} "OBJECT_FILE_RAW")
if(object_file_raw)
list(APPEND object_files ${object_file_raw})
@@ -30,11 +41,17 @@ function(get_object_files_for_test result)
endif()
get_target_property(indirect_deps ${dep} "DEPS")
- get_object_files_for_test(indirect_objfiles ${indirect_deps})
+ get_object_files_for_test(
+ indirect_objfiles indirect_skipped_list ${indirect_deps})
list(APPEND object_files ${indirect_objfiles})
+ if(indirect_skipped_list)
+ list(APPEND skipped_list ${indirect_skipped_list})
+ endif()
endforeach(dep)
list(REMOVE_DUPLICATES object_files)
set(${result} ${object_files} PARENT_SCOPE)
+ list(REMOVE_DUPLICATES skipped_list)
+ set(${skipped_entrypoints_list} ${skipped_list} PARENT_SCOPE)
endfunction(get_object_files_for_test)
# Rule to add a libc unittest.
@@ -68,8 +85,43 @@ function(add_libc_unittest target_name)
"'add_entrypoint_object' targets.")
endif()
-
get_fq_target_name(${target_name} fq_target_name)
+ get_fq_deps_list(fq_deps_list ${LIBC_UNITTEST_DEPENDS})
+ get_object_files_for_test(
+ link_object_files skipped_entrypoints_list ${fq_deps_list})
+ if(skipped_entrypoints_list)
+ # If a test is OS/target machine independent, it has to be skipped if the
+ # OS/target machine combination does not provide any dependent entrypoints.
+ # If a test is OS/target machine specific, then such a test will live is a
+ # OS/target machine specific directory and will be skipped at the directory
+ # level if required.
+ #
+ # There can potentially be a setup like this: A unittest is setup for a
+ # OS/target machine independent object library, which in turn depends on a
+ # machine specific object library. Such a test would be testing internals of
+ # the libc and it is assumed that they will be rare in practice. So, they
+ # can be skipped in the corresponding CMake files using platform specific
+ # logic. This pattern is followed in the loader tests for example.
+ #
+ # Another pattern that is present currently is to detect machine
+ # capabilities and add entrypoints and tests accordingly. That approach is
+ # much lower level approach and is independent of the kind of skipping that
+ # is happening here at the entrypoint level.
+
+ set(msg "Skipping unittest ${fq_target_name} as it has missing deps: "
+ "${skipped_entrypoints_list}.")
+ message(STATUS ${msg})
+ add_custom_target(${fq_target_name})
+
+ # A post build custom command is used to avoid running the command always.
+ add_custom_command(
+ TARGET ${fq_target_name}
+ POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E echo ${msg}
+ )
+ return()
+ endif()
+
add_executable(
${fq_target_name}
EXCLUDE_FROM_ALL
@@ -90,8 +142,6 @@ function(add_libc_unittest target_name)
)
endif()
- get_fq_deps_list(fq_deps_list ${LIBC_UNITTEST_DEPENDS})
- get_object_files_for_test(link_object_files ${fq_deps_list})
target_link_libraries(${fq_target_name} PRIVATE ${link_object_files})
set_target_properties(${fq_target_name}
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 9e93ee5dfa33..47329d281a2b 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -1,4 +1,4 @@
-set(LIBC_ENTRYPOINTS
+set(TARGET_LIBC_ENTRYPOINTS
# assert.h entrypoints
libc.src.assert.__assert_fail
@@ -43,7 +43,7 @@ set(LIBC_ENTRYPOINTS
libc.src.unistd.write
)
-set(LIBM_ENTRYPOINTS
+set(TARGET_LIBM_ENTRYPOINTS
# math.h entrypoints
libc.src.math.ceil
libc.src.math.ceilf
diff --git a/libc/config/linux/x86_64/headers.txt b/libc/config/linux/x86_64/headers.txt
index 8c7d71eb4601..b44681a5db4e 100644
--- a/libc/config/linux/x86_64/headers.txt
+++ b/libc/config/linux/x86_64/headers.txt
@@ -1,4 +1,4 @@
-set(PUBLIC_HEADERS
+set(TARGET_PUBLIC_HEADERS
libc.include.assert_h
libc.include.errno
libc.include.math
diff --git a/libc/lib/CMakeLists.txt b/libc/lib/CMakeLists.txt
index deae56e874ec..16340531e9d1 100644
--- a/libc/lib/CMakeLists.txt
+++ b/libc/lib/CMakeLists.txt
@@ -1,16 +1,13 @@
-include("${LIBC_SOURCE_DIR}/config/${LIBC_TARGET_OS}/${LIBC_TARGET_MACHINE}/entrypoints.txt")
-include("${LIBC_SOURCE_DIR}/config/${LIBC_TARGET_OS}/${LIBC_TARGET_MACHINE}/headers.txt")
-
add_entrypoint_library(
llvmlibc
DEPENDS
- ${LIBC_ENTRYPOINTS}
+ ${TARGET_LIBC_ENTRYPOINTS}
)
add_entrypoint_library(
llvmlibm
DEPENDS
- ${LIBM_ENTRYPOINTS}
+ ${TARGET_LIBM_ENTRYPOINTS}
)
add_redirector_library(
diff --git a/libc/loader/linux/CMakeLists.txt b/libc/loader/linux/CMakeLists.txt
index b972f72e182f..5cb184a56aac 100644
--- a/libc/loader/linux/CMakeLists.txt
+++ b/libc/loader/linux/CMakeLists.txt
@@ -56,6 +56,11 @@ function(add_loader_object name)
)
endfunction()
+if(NOT (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_MACHINE}))
+ message(STATUS "Skipping loader for target machine ${LIBC_TARGET_MACHINE}")
+ return()
+endif()
+
add_subdirectory(${LIBC_TARGET_MACHINE})
add_loader_object(
diff --git a/libc/test/loader/CMakeLists.txt b/libc/test/loader/CMakeLists.txt
index 56b4c34229d6..a38d3884ded6 100644
--- a/libc/test/loader/CMakeLists.txt
+++ b/libc/test/loader/CMakeLists.txt
@@ -38,7 +38,7 @@ function(add_loader_test target_name)
)
get_fq_deps_list(fq_deps_list ${ADD_LOADER_TEST_DEPENDS})
- get_object_files_for_test(link_object_files ${fq_deps_list})
+ get_object_files_for_test(link_object_files has_skipped_entrypoint_list ${fq_deps_list})
target_link_libraries(${fq_target_name} ${link_object_files})
target_link_options(
diff --git a/libc/test/loader/linux/CMakeLists.txt b/libc/test/loader/linux/CMakeLists.txt
index 887f9efe603a..1f47b2ce3f06 100644
--- a/libc/test/loader/linux/CMakeLists.txt
+++ b/libc/test/loader/linux/CMakeLists.txt
@@ -1,3 +1,8 @@
+if(NOT (EXISTS ${LIBC_SOURCE_DIR}/loader/linux/${LIBC_TARGET_MACHINE}))
+ message("Skipping loader tests for target machine ${LIBC_TARGET_MACHINE}.")
+ return()
+endif()
+
add_loader_test(
loader_args_test
SRC
diff --git a/libc/test/src/CMakeLists.txt b/libc/test/src/CMakeLists.txt
index c6bcdae5bee4..3dc939493b01 100644
--- a/libc/test/src/CMakeLists.txt
+++ b/libc/test/src/CMakeLists.txt
@@ -9,13 +9,10 @@ add_subdirectory(sys)
add_subdirectory(threads)
add_subdirectory(unistd)
-include("${LIBC_SOURCE_DIR}/config/${LIBC_TARGET_OS}/${LIBC_TARGET_MACHINE}/entrypoints.txt")
-include("${LIBC_SOURCE_DIR}/config/${LIBC_TARGET_OS}/${LIBC_TARGET_MACHINE}/headers.txt")
-
set(public_test ${CMAKE_CURRENT_BINARY_DIR}/public_integration_test.cpp)
set(entrypoints_name_list "")
-foreach(entry IN LISTS LIBC_ENTRYPOINTS LIBM_ENTRYPOINTS)
+foreach(entry IN LISTS TARGET_LIBC_ENTRYPOINTS TARGET_LIBM_ENTRYPOINTS)
get_target_property(entry_name ${entry} "ENTRYPOINT_NAME")
list(APPEND entrypoints_name_list ${entry_name})
endforeach()
More information about the libc-commits
mailing list