Skip to content

Commit e599422

Browse files
[runtimes] Fix parsing of LIB{CXX,CXXABI,UNWIND}_TEST_PARAMS (#67691)
Since 78d649a the recommended way to pass an executor is to use the _TEST_PARAMS variable, which means we now pass more complicated value (including ones that may contain multiple `=`) as part of this variable. However, the `REGEX REPLACE` being used has greedy matches so everything up to the last = becomes part of the variable name which results in invalid syntax in the generated lit config file. This was noticed due to builder failures for those using the CrossWinToARMLinux.cmake cache file. --------- Co-authored-by: Vladimir Vereschaka <vvereschaka@accesssoftek.com>
1 parent 5099dc3 commit e599422

File tree

5 files changed

+59
-52
lines changed

5 files changed

+59
-52
lines changed

clang/cmake/caches/CrossWinToARMLinux.cmake

+11-3
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,10 @@ set(RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS
151151

152152
find_package(Python3 COMPONENTS Interpreter)
153153

154+
set(RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBUNWIND_TEST_PARAMS_default "${RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_TEST_PARAMS}")
155+
set(RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBCXXABI_TEST_PARAMS_default "${RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_TEST_PARAMS}")
156+
set(RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBCXX_TEST_PARAMS_default "${RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_TEST_PARAMS}")
157+
154158
# Remote test configuration.
155159
if(DEFINED REMOTE_TEST_HOST)
156160
# Allow override with the custom values.
@@ -162,11 +166,15 @@ if(DEFINED REMOTE_TEST_HOST)
162166
"\\\"${Python3_EXECUTABLE}\\\" \\\"${LLVM_PROJECT_DIR}/llvm/utils/remote-exec.py\\\" --host=${REMOTE_TEST_USER}@${REMOTE_TEST_HOST}"
163167
CACHE STRING "")
164168

165-
set(RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBUNWIND_TEST_PARAMS "${RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_TEST_PARAMS} 'executor=${DEFAULT_TEST_EXECUTOR}'" CACHE STRING "")
166-
set(RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBCXXABI_TEST_PARAMS "${RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_TEST_PARAMS} 'executor=${DEFAULT_TEST_EXECUTOR}'" CACHE STRING "")
167-
set(RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBCXX_TEST_PARAMS "${RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_TEST_PARAMS} 'executor=${DEFAULT_TEST_EXECUTOR}'" CACHE STRING "")
169+
list(APPEND RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBUNWIND_TEST_PARAMS_default "executor=${DEFAULT_TEST_EXECUTOR}")
170+
list(APPEND RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBCXXABI_TEST_PARAMS_default "executor=${DEFAULT_TEST_EXECUTOR}")
171+
list(APPEND RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBCXX_TEST_PARAMS_default "executor=${DEFAULT_TEST_EXECUTOR}")
168172
endif()
169173

174+
set(RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBUNWIND_TEST_PARAMS "${RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBUNWIND_TEST_PARAMS_default}" CACHE INTERNAL "")
175+
set(RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBCXXABI_TEST_PARAMS "${RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBCXXABI_TEST_PARAMS_default}" CACHE INTERNAL "")
176+
set(RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBCXX_TEST_PARAMS "${RUNTIMES_${TOOLCHAIN_TARGET_TRIPLE}_LIBCXX_TEST_PARAMS_default}" CACHE INTERNAL "")
177+
170178
set(LLVM_INSTALL_TOOLCHAIN_ONLY ON CACHE BOOL "")
171179
set(LLVM_TOOLCHAIN_TOOLS
172180
llvm-ar

libcxx/test/CMakeLists.txt

+12-19
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
include(HandleLitArguments)
12
add_subdirectory(tools)
23

34
# By default, libcxx and libcxxabi share a library directory.
@@ -9,40 +10,32 @@ endif()
910
set(AUTO_GEN_COMMENT "## Autogenerated by libcxx configuration.\n# Do not edit!")
1011
set(SERIALIZED_LIT_PARAMS "# Lit parameters serialized here for llvm-lit to pick them up\n")
1112

12-
macro(serialize_lit_param param value)
13-
string(APPEND SERIALIZED_LIT_PARAMS "config.${param} = ${value}\n")
14-
endmacro()
15-
1613
if (LIBCXX_EXECUTOR)
1714
message(DEPRECATION "LIBCXX_EXECUTOR is deprecated, please add executor=... to LIBCXX_TEST_PARAMS")
18-
serialize_lit_param(executor "\"${LIBCXX_EXECUTOR}\"")
15+
serialize_lit_string_param(SERIALIZED_LIT_PARAMS executor "${LIBCXX_EXECUTOR}")
1916
endif()
2017

2118
if (NOT LIBCXX_ENABLE_EXCEPTIONS)
22-
serialize_lit_param(enable_exceptions False)
19+
serialize_lit_param(SERIALIZED_LIT_PARAMS enable_exceptions False)
2320
endif()
2421

2522
if (NOT LIBCXX_ENABLE_RTTI)
26-
serialize_lit_param(enable_rtti False)
23+
serialize_lit_param(SERIALIZED_LIT_PARAMS enable_rtti False)
2724
endif()
2825

29-
serialize_lit_param(hardening_mode "\"${LIBCXX_HARDENING_MODE}\"")
26+
serialize_lit_string_param(SERIALIZED_LIT_PARAMS hardening_mode "${LIBCXX_HARDENING_MODE}")
3027

3128
if (CMAKE_CXX_COMPILER_TARGET)
32-
serialize_lit_param(target_triple "\"${CMAKE_CXX_COMPILER_TARGET}\"")
29+
serialize_lit_string_param(SERIALIZED_LIT_PARAMS target_triple "${CMAKE_CXX_COMPILER_TARGET}")
3330
else()
34-
serialize_lit_param(target_triple "\"${LLVM_DEFAULT_TARGET_TRIPLE}\"")
31+
serialize_lit_string_param(SERIALIZED_LIT_PARAMS target_triple "${LLVM_DEFAULT_TARGET_TRIPLE}")
3532
endif()
3633

3734
if (LLVM_USE_SANITIZER)
38-
serialize_lit_param(use_sanitizer "\"${LLVM_USE_SANITIZER}\"")
35+
serialize_lit_string_param(SERIALIZED_LIT_PARAMS use_sanitizer "${LLVM_USE_SANITIZER}")
3936
endif()
4037

41-
foreach(param IN LISTS LIBCXX_TEST_PARAMS)
42-
string(REGEX REPLACE "(.+)=(.+)" "\\1" name "${param}")
43-
string(REGEX REPLACE "(.+)=(.+)" "\\2" value "${param}")
44-
serialize_lit_param("${name}" "\"${value}\"")
45-
endforeach()
38+
serialize_lit_params_list(SERIALIZED_LIT_PARAMS LIBCXX_TEST_PARAMS)
4639

4740
if (NOT DEFINED LIBCXX_TEST_DEPS)
4841
message(FATAL_ERROR "Expected LIBCXX_TEST_DEPS to be defined")
@@ -68,9 +61,9 @@ if (MSVC)
6861
set(cxx_lib "${cxx_lib}d")
6962
endif()
7063

71-
serialize_lit_param(dbg_include "\"${dbg_include}\"")
72-
serialize_lit_param(fms_runtime_lib "\"${fms_runtime_lib}\"")
73-
serialize_lit_param(cxx_lib "\"${cxx_lib}\"")
64+
serialize_lit_string_param(SERIALIZED_LIT_PARAMS dbg_include "${dbg_include}")
65+
serialize_lit_string_param(SERIALIZED_LIT_PARAMS fms_runtime_lib "${fms_runtime_lib}")
66+
serialize_lit_string_param(SERIALIZED_LIT_PARAMS cxx_lib "${cxx_lib}")
7467
endif()
7568

7669
if (LIBCXX_INCLUDE_TESTS)

libcxxabi/test/CMakeLists.txt

+9-16
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
include(AddLLVM) # for configure_lit_site_cfg and add_lit_testsuite
2+
include(HandleLitArguments)
23
macro(pythonize_bool var)
34
if (${var})
45
set(${var} True)
@@ -23,40 +24,32 @@ endif()
2324
set(AUTO_GEN_COMMENT "## Autogenerated by libcxxabi configuration.\n# Do not edit!")
2425
set(SERIALIZED_LIT_PARAMS "# Lit parameters serialized here for llvm-lit to pick them up\n")
2526

26-
macro(serialize_lit_param param value)
27-
string(APPEND SERIALIZED_LIT_PARAMS "config.${param} = ${value}\n")
28-
endmacro()
29-
3027
if (LIBCXXABI_EXECUTOR)
3128
message(DEPRECATION "LIBCXXABI_EXECUTOR is deprecated, please add executor=... to LIBCXXABI_TEST_PARAMS")
32-
serialize_lit_param(executor "\"${LIBCXXABI_EXECUTOR}\"")
29+
serialize_lit_string_param(SERIALIZED_LIT_PARAMS executor "${LIBCXXABI_EXECUTOR}")
3330
endif()
3431

3532
if (NOT LIBCXXABI_ENABLE_EXCEPTIONS)
36-
serialize_lit_param(enable_exceptions False)
33+
serialize_lit_param(SERIALIZED_LIT_PARAMS enable_exceptions False)
3734
endif()
3835

3936
if (LIBCXXABI_ENABLE_ASSERTIONS)
40-
serialize_lit_param(enable_assertions True)
37+
serialize_lit_param(SERIALIZED_LIT_PARAMS enable_assertions True)
4138
endif()
4239

43-
serialize_lit_param(enable_experimental False)
40+
serialize_lit_param(SERIALIZED_LIT_PARAMS enable_experimental False)
4441

4542
if (LLVM_USE_SANITIZER)
46-
serialize_lit_param(use_sanitizer "\"${LLVM_USE_SANITIZER}\"")
43+
serialize_lit_string_param(SERIALIZED_LIT_PARAMS use_sanitizer "${LLVM_USE_SANITIZER}")
4744
endif()
4845

4946
if (CMAKE_CXX_COMPILER_TARGET)
50-
serialize_lit_param(target_triple "\"${CMAKE_CXX_COMPILER_TARGET}\"")
47+
serialize_lit_string_param(SERIALIZED_LIT_PARAMS target_triple "${CMAKE_CXX_COMPILER_TARGET}")
5148
else()
52-
serialize_lit_param(target_triple "\"${LLVM_DEFAULT_TARGET_TRIPLE}\"")
49+
serialize_lit_string_param(SERIALIZED_LIT_PARAMS target_triple "${LLVM_DEFAULT_TARGET_TRIPLE}")
5350
endif()
5451

55-
foreach(param IN LISTS LIBCXXABI_TEST_PARAMS)
56-
string(REGEX REPLACE "(.+)=(.+)" "\\1" name "${param}")
57-
string(REGEX REPLACE "(.+)=(.+)" "\\2" value "${param}")
58-
serialize_lit_param("${name}" "\"${value}\"")
59-
endforeach()
52+
serialize_lit_params_list(SERIALIZED_LIT_PARAMS LIBCXXABI_TEST_PARAMS)
6053

6154
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/configs/cmake-bridge.cfg.in"
6255
"${CMAKE_CURRENT_BINARY_DIR}/cmake-bridge.cfg"

libunwind/test/CMakeLists.txt

+7-14
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
include(AddLLVM) # for add_lit_testsuite
2+
include(HandleLitArguments)
23
macro(pythonize_bool var)
34
if (${var})
45
set(${var} True)
@@ -14,32 +15,24 @@ pythonize_bool(LIBUNWIND_USES_ARM_EHABI)
1415
set(AUTO_GEN_COMMENT "## Autogenerated by libunwind configuration.\n# Do not edit!")
1516
set(SERIALIZED_LIT_PARAMS "# Lit parameters serialized here for llvm-lit to pick them up\n")
1617

17-
macro(serialize_lit_param param value)
18-
string(APPEND SERIALIZED_LIT_PARAMS "config.${param} = ${value}\n")
19-
endmacro()
20-
2118
if (LIBUNWIND_EXECUTOR)
2219
message(DEPRECATION "LIBUNWIND_EXECUTOR is deprecated, please add executor=... to LIBUNWIND_TEST_PARAMS")
23-
serialize_lit_param(executor "\"${LIBUNWIND_EXECUTOR}\"")
20+
serialize_lit_string_param(SERIALIZED_LIT_PARAMS executor "${LIBUNWIND_EXECUTOR}")
2421
endif()
2522

26-
serialize_lit_param(enable_experimental False)
23+
serialize_lit_param(SERIALIZED_LIT_PARAMS enable_experimental False)
2724

2825
if (LLVM_USE_SANITIZER)
29-
serialize_lit_param(use_sanitizer "\"${LLVM_USE_SANITIZER}\"")
26+
serialize_lit_string_param(SERIALIZED_LIT_PARAMS use_sanitizer "${LLVM_USE_SANITIZER}")
3027
endif()
3128

3229
if (CMAKE_CXX_COMPILER_TARGET)
33-
serialize_lit_param(target_triple "\"${CMAKE_CXX_COMPILER_TARGET}\"")
30+
serialize_lit_string_param(SERIALIZED_LIT_PARAMS target_triple "${CMAKE_CXX_COMPILER_TARGET}")
3431
else()
35-
serialize_lit_param(target_triple "\"${LLVM_DEFAULT_TARGET_TRIPLE}\"")
32+
serialize_lit_string_param(SERIALIZED_LIT_PARAMS target_triple "${LLVM_DEFAULT_TARGET_TRIPLE}")
3633
endif()
3734

38-
foreach(param IN LISTS LIBUNWIND_TEST_PARAMS)
39-
string(REGEX REPLACE "(.+)=(.+)" "\\1" name "${param}")
40-
string(REGEX REPLACE "(.+)=(.+)" "\\2" value "${param}")
41-
serialize_lit_param("${name}" "\"${value}\"")
42-
endforeach()
35+
serialize_lit_params_list(SERIALIZED_LIT_PARAMS LIBUNWIND_TEST_PARAMS)
4336

4437
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/configs/cmake-bridge.cfg.in"
4538
"${CMAKE_CURRENT_BINARY_DIR}/cmake-bridge.cfg"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
2+
macro(serialize_lit_param output_var param value)
3+
string(APPEND ${output_var} "config.${param} = ${value}\n")
4+
endmacro()
5+
6+
macro(serialize_lit_string_param output_var param value)
7+
# Ensure that all quotes in the value are escaped for a valid python string.
8+
string(REPLACE "\"" "\\\"" _escaped_value "${value}")
9+
string(APPEND ${output_var} "config.${param} = \"${_escaped_value}\"\n")
10+
endmacro()
11+
12+
macro(serialize_lit_params_list output_var list)
13+
foreach(param IN LISTS ${list})
14+
string(FIND "${param}" "=" _eq_index)
15+
string(SUBSTRING "${param}" 0 ${_eq_index} name)
16+
string(SUBSTRING "${param}" ${_eq_index} -1 value)
17+
string(SUBSTRING "${value}" 1 -1 value) # strip the leading =
18+
serialize_lit_string_param("${output_var}" "${name}" "${value}")
19+
endforeach()
20+
endmacro()

0 commit comments

Comments
 (0)