From 17114f8b19fda6d0413a5edf4dbabaea992ed778 Mon Sep 17 00:00:00 2001 From: Siva Chandra Date: Wed, 13 Sep 2023 22:17:00 -0700 Subject: [PATCH] [libc] Remove common_libc_tuners.cmake and move options into config.json. (#66226) The name has been changed to adhere to the config option naming format. The necessary build changes to use the new option have also been made. --- libc/CMakeLists.txt | 2 -- libc/cmake/modules/LLVMLibCObjectRules.cmake | 2 ++ libc/common_libc_tuners.cmake | 14 -------------- libc/config/config.json | 6 ++++++ libc/docs/configure.rst | 2 ++ libc/src/string/CMakeLists.txt | 8 ++++++++ libc/src/string/string_utils.h | 4 ++-- 7 files changed, 20 insertions(+), 18 deletions(-) delete mode 100644 libc/common_libc_tuners.cmake diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt index 752b048cd397a2..f81fe01b391874 100644 --- a/libc/CMakeLists.txt +++ b/libc/CMakeLists.txt @@ -64,8 +64,6 @@ add_compile_definitions(LIBC_NAMESPACE=${LIBC_NAMESPACE}) # Flags to pass down to the compiler while building the libc functions. set(LIBC_COMPILE_OPTIONS_DEFAULT "" CACHE STRING "Architecture to tell clang to optimize for (e.g. -march=... or -mcpu=...)") -include(common_libc_tuners.cmake) - 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/LLVMLibCObjectRules.cmake b/libc/cmake/modules/LLVMLibCObjectRules.cmake index 4d5835cc6b4d80..891c298855e613 100644 --- a/libc/cmake/modules/LLVMLibCObjectRules.cmake +++ b/libc/cmake/modules/LLVMLibCObjectRules.cmake @@ -672,6 +672,7 @@ function(create_entrypoint_object fq_target_name) target_compile_options(${internal_target_name} BEFORE PRIVATE ${common_compile_options}) target_include_directories(${internal_target_name} PRIVATE ${include_dirs}) add_dependencies(${internal_target_name} ${full_deps_list}) + target_link_libraries(${internal_target_name} ${full_deps_list}) add_library( ${fq_target_name} @@ -685,6 +686,7 @@ function(create_entrypoint_object fq_target_name) target_compile_options(${fq_target_name} BEFORE PRIVATE ${common_compile_options} -DLIBC_COPT_PUBLIC_PACKAGING) target_include_directories(${fq_target_name} PRIVATE ${include_dirs}) add_dependencies(${fq_target_name} ${full_deps_list}) + target_link_libraries(${fq_target_name} ${full_deps_list}) endif() set_target_properties( diff --git a/libc/common_libc_tuners.cmake b/libc/common_libc_tuners.cmake deleted file mode 100644 index 20aee489962349..00000000000000 --- a/libc/common_libc_tuners.cmake +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------------------ -# Common tuning option definitions. -# ------------------------------------------------------------------------------ - -set(LIBC_COMMON_TUNE_OPTIONS "") - -option(LIBC_UNSAFE_STRING_WIDE_READ "Functions searching for the first character in a string such as strlen will read the string as int sized blocks instead of bytes. This relies on undefined behavior and may fail on some systems, but improves performance on long strings." OFF) -if(LIBC_UNSAFE_STRING_WIDE_READ) - if(LLVM_USE_SANITIZER) - message(FATAL_ERROR "LIBC_UNSAFE_STRING_WIDE_READ is set at the same time as a sanitizer. LIBC_UNSAFE_STRING_WIDE_READ causes strlen and memchr to read beyond the end of their target strings, which is undefined behavior caught by sanitizers.") - else() - list(APPEND LIBC_COMMON_TUNE_OPTIONS "-DLIBC_COPT_UNSAFE_STRING_WIDE_READ") - endif() -endif() diff --git a/libc/config/config.json b/libc/config/config.json index 134cf06a73b3ab..3c74e0ed1eddf4 100644 --- a/libc/config/config.json +++ b/libc/config/config.json @@ -16,5 +16,11 @@ "value": true, "doc": "Use large table for better printf long double performance." } + }, + "string": { + "LIBC_CONF_STRING_UNSAFE_WIDE_READ": { + "value": false, + "doc": "Read more than a byte at a time to perform byte-string operations like strlen." + } } } diff --git a/libc/docs/configure.rst b/libc/docs/configure.rst index a667316bd39915..0a1b3ea87a2133 100644 --- a/libc/docs/configure.rst +++ b/libc/docs/configure.rst @@ -30,3 +30,5 @@ to learn about the defaults for your platform and target. - ``LIBC_CONF_PRINTF_DISABLE_INDEX_MODE``: Disable index mode in the printf format string. - ``LIBC_CONF_PRINTF_DISABLE_WRITE_INT``: Disable handling of %n in printf format string. - ``LIBC_CONF_PRINTF_FLOAT_TO_STR_USE_MEGA_LONG_DOUBLE_TABLE``: Use large table for better printf long double performance. +* **"string" options** + - ``LIBC_CONF_STRING_UNSAFE_WIDE_READ``: Read more than a byte at a time to perform byte-string operations like strlen. diff --git a/libc/src/string/CMakeLists.txt b/libc/src/string/CMakeLists.txt index b073a62f957a73..f2e5654d03ccec 100644 --- a/libc/src/string/CMakeLists.txt +++ b/libc/src/string/CMakeLists.txt @@ -1,5 +1,12 @@ add_subdirectory(memory_utils) +if(LIBC_CONF_STRING_UNSAFE_WIDE_READ) + list(APPEND string_config_options "-DLIBC_COPT_STRING_UNSAFE_WIDE_READ") +endif() +if(string_config_options) + list(PREPEND string_config_options "COMPILE_OPTIONS") +endif() + add_header_library( string_utils HDRS @@ -10,6 +17,7 @@ add_header_library( libc.include.stdlib libc.src.__support.common libc.src.__support.CPP.bitset + ${string_config_options} ) add_header_library( diff --git a/libc/src/string/string_utils.h b/libc/src/string/string_utils.h index e2e7722e392a7f..87dc4c6cd2b4c5 100644 --- a/libc/src/string/string_utils.h +++ b/libc/src/string/string_utils.h @@ -88,7 +88,7 @@ LIBC_INLINE size_t string_length_byte_read(const char *src) { // Returns the length of a string, denoted by the first occurrence // of a null terminator. LIBC_INLINE size_t string_length(const char *src) { -#ifdef LIBC_COPT_UNSAFE_STRING_WIDE_READ +#ifdef LIBC_COPT_STRING_UNSAFE_WIDE_READ // Unsigned int is the default size for most processors, and on x86-64 it // performs better than larger sizes when the src pointer can't be assumed to // be aligned to a word boundary, so it's the size we use for reading the @@ -143,7 +143,7 @@ LIBC_INLINE void *find_first_character_byte_read(const unsigned char *src, // 'src'. If 'ch' is not found, returns nullptr. LIBC_INLINE void *find_first_character(const unsigned char *src, unsigned char ch, size_t max_strlen) { -#ifdef LIBC_COPT_UNSAFE_STRING_WIDE_READ +#ifdef LIBC_COPT_STRING_UNSAFE_WIDE_READ // If the maximum size of the string is small, the overhead of aligning to a // word boundary and generating a bitmask of the appropriate size may be // greater than the gains from reading larger chunks. Based on some testing,