From 6fa4fa72b4c84e585d44439aa2133ccd4839312f Mon Sep 17 00:00:00 2001 From: Jonathon Penix Date: Thu, 14 May 2026 11:04:05 -0700 Subject: [PATCH 1/3] [cpullvm] Force a consistent TLS model for all library builds Previously, a TLS model was only ever explicitly set for picolibc--other projects (libc++, etc.) would use whatever the compiler selected. This shouldn't necessarily be a problem, but in practice can cause issues when global-dynamic is selected and is implemented via calls to `__tls_get_addr` (ex: in our 32bit Arm and 32/64bit RISC-V PIC configs). Given we don't provide an implementation and we don't expect people to use a dynamic linker that would implement this, people will generally get undefined reference errors. See the discussion in https://github.com/qualcomm/cpullvm-toolchain/pull/341. To try and address this, consistently specify a TLS model across all of the libraries we are building. Note that this seems to primarily be an issue with picolibc as it uses "normal" TLS mechanisms [1]. musl-embedded doesn't seem to (see ex: `__errno_location`) and consequently I don't see any obvious TLS usage in any of our libraries built with musl-embedded as the libc. However, I don't know if this holds true in general (if ex: libc++ itself will never have "normal" TLS accesses of it's own). And, given that the usecases we expect for our picolibc variants are the same as for our musl-embedded variants (and these expectations in turn match the restrictions imposed by the given TLS model), I'm erring on the side of specifying the TLS model for variants which use musl-embedded as well. [1] https://github.com/picolibc/picolibc/blob/main/doc/tls.md Signed-off-by: Jonathon Penix --- .../json/variants/aarch64a_pacret_bkey_bti_tlsie.json | 4 ++-- .../json/variants/aarch64a_soft_nofp_tlsie.json | 4 ++-- .../embedded-multilib/json/variants/aarch64a_tlsie.json | 4 ++-- qualcomm-software/embedded-runtimes/CMakeLists.txt | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/qualcomm-software/embedded-multilib/json/variants/aarch64a_pacret_bkey_bti_tlsie.json b/qualcomm-software/embedded-multilib/json/variants/aarch64a_pacret_bkey_bti_tlsie.json index a347461a27ba..3fe74dc4f433 100644 --- a/qualcomm-software/embedded-multilib/json/variants/aarch64a_pacret_bkey_bti_tlsie.json +++ b/qualcomm-software/embedded-multilib/json/variants/aarch64a_pacret_bkey_bti_tlsie.json @@ -4,6 +4,7 @@ "TARGET_ARCH": "aarch64a", "VARIANT": "aarch64a_pacret_bkey_bti_tlsie", "COMPILE_FLAGS": "-march=armv8.5a -mbranch-protection=pac-ret+leaf+b-key+bti -fPIC", + "TLS_MODEL": "initial-exec", "ENABLE_EXCEPTIONS": "OFF", "ENABLE_RTTI": "OFF", "TEST_EXECUTOR": "qemu", @@ -19,8 +20,7 @@ "ENABLE_CXX_LIBS": "ON", "ENABLE_LIBC_TESTS": "OFF", "ENABLE_COMPILER_RT_TESTS": "OFF", - "ENABLE_LIBCXX_TESTS": "OFF", - "TLS_MODEL": "initial-exec" + "ENABLE_LIBCXX_TESTS": "OFF" }, "musl-embedded": { "ENABLE_CXX_LIBS": "ON", diff --git a/qualcomm-software/embedded-multilib/json/variants/aarch64a_soft_nofp_tlsie.json b/qualcomm-software/embedded-multilib/json/variants/aarch64a_soft_nofp_tlsie.json index 0fa221f6956d..618d7a926e31 100644 --- a/qualcomm-software/embedded-multilib/json/variants/aarch64a_soft_nofp_tlsie.json +++ b/qualcomm-software/embedded-multilib/json/variants/aarch64a_soft_nofp_tlsie.json @@ -4,6 +4,7 @@ "TARGET_ARCH": "aarch64a", "VARIANT": "aarch64a_soft_nofp_tlsie", "COMPILE_FLAGS": "-march=armv8-a+nofp+nosimd -mabi=aapcs-soft -fPIC", + "TLS_MODEL": "initial-exec", "ENABLE_EXCEPTIONS": "OFF", "ENABLE_RTTI": "OFF", "TEST_EXECUTOR": "qemu", @@ -19,8 +20,7 @@ "ENABLE_CXX_LIBS": "OFF", "ENABLE_LIBC_TESTS": "ON", "ENABLE_COMPILER_RT_TESTS": "OFF", - "ENABLE_LIBCXX_TESTS": "OFF", - "TLS_MODEL": "initial-exec" + "ENABLE_LIBCXX_TESTS": "OFF" }, "musl-embedded": { "ENABLE_CXX_LIBS": "OFF", diff --git a/qualcomm-software/embedded-multilib/json/variants/aarch64a_tlsie.json b/qualcomm-software/embedded-multilib/json/variants/aarch64a_tlsie.json index 55f1be57f4c9..5ac7510350a4 100644 --- a/qualcomm-software/embedded-multilib/json/variants/aarch64a_tlsie.json +++ b/qualcomm-software/embedded-multilib/json/variants/aarch64a_tlsie.json @@ -4,6 +4,7 @@ "TARGET_ARCH": "aarch64a", "VARIANT": "aarch64a_tlsie", "COMPILE_FLAGS": "-march=armv8-a -fPIC", + "TLS_MODEL": "initial-exec", "ENABLE_EXCEPTIONS": "OFF", "ENABLE_RTTI": "OFF", "TEST_EXECUTOR": "qemu", @@ -19,8 +20,7 @@ "ENABLE_CXX_LIBS": "ON", "ENABLE_LIBC_TESTS": "ON", "ENABLE_COMPILER_RT_TESTS": "OFF", - "ENABLE_LIBCXX_TESTS": "OFF", - "TLS_MODEL": "initial-exec" + "ENABLE_LIBCXX_TESTS": "OFF" }, "musl-embedded": { "ENABLE_CXX_LIBS": "ON", diff --git a/qualcomm-software/embedded-runtimes/CMakeLists.txt b/qualcomm-software/embedded-runtimes/CMakeLists.txt index b93cb35e54a7..fdebf1643366 100644 --- a/qualcomm-software/embedded-runtimes/CMakeLists.txt +++ b/qualcomm-software/embedded-runtimes/CMakeLists.txt @@ -92,7 +92,7 @@ elseif(NOT TLS_MODEL_def IN_LIST SUPPORTED_TLS_MODELS) string(REPLACE ";" ", " SUPPORTED_TLS_MODELS_STR "${SUPPORTED_TLS_MODELS}") message(FATAL_ERROR "Unsupported TLS_MODEL value. Supported values are ${SUPPORTED_TLS_MODELS_STR}") endif() -set(TLS_MODEL ${TLS_MODEL_def} CACHE STRING "TLS model to use. Currently only used by picolibc, other projects use the project/toolchain defaults.") +set(TLS_MODEL ${TLS_MODEL_def} CACHE STRING "TLS model to use when building libraries.") set_property(CACHE TLS_MODEL PROPERTY STRINGS ${SUPPORTED_TLS_MODELS}) set(LLVM_BINARY_DIR "" CACHE PATH "Path to LLVM toolchain root to build libraries with") @@ -228,7 +228,7 @@ endif() set(compile_arch_flags "--target=${target_triple} ${COMPILE_FLAGS} --sysroot ${TEMP_LIB_DIR}") # Compiling the libraries benefits from some extra optimization # flags, and requires a sysroot. -set(lib_compile_flags "${compile_arch_flags} -ffunction-sections -fdata-sections") +set(lib_compile_flags "${compile_arch_flags} -ffunction-sections -fdata-sections -ftls-model=${TLS_MODEL}") # Generic target names for the C library. # Declare these now, since compiler-rt requires the 'install' dependency. From 51a4adf57d22280df835868870924046bb622db2 Mon Sep 17 00:00:00 2001 From: Jonathon Penix Date: Wed, 20 May 2026 12:22:20 -0700 Subject: [PATCH 2/3] omit musl-embedded again Signed-off-by: Jonathon Penix --- .../variants/aarch64a_pacret_bkey_bti_tlsie.json | 4 ++-- .../json/variants/aarch64a_soft_nofp_tlsie.json | 4 ++-- .../json/variants/aarch64a_tlsie.json | 4 ++-- qualcomm-software/embedded-runtimes/CMakeLists.txt | 13 ++++++++++--- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/qualcomm-software/embedded-multilib/json/variants/aarch64a_pacret_bkey_bti_tlsie.json b/qualcomm-software/embedded-multilib/json/variants/aarch64a_pacret_bkey_bti_tlsie.json index 3fe74dc4f433..a347461a27ba 100644 --- a/qualcomm-software/embedded-multilib/json/variants/aarch64a_pacret_bkey_bti_tlsie.json +++ b/qualcomm-software/embedded-multilib/json/variants/aarch64a_pacret_bkey_bti_tlsie.json @@ -4,7 +4,6 @@ "TARGET_ARCH": "aarch64a", "VARIANT": "aarch64a_pacret_bkey_bti_tlsie", "COMPILE_FLAGS": "-march=armv8.5a -mbranch-protection=pac-ret+leaf+b-key+bti -fPIC", - "TLS_MODEL": "initial-exec", "ENABLE_EXCEPTIONS": "OFF", "ENABLE_RTTI": "OFF", "TEST_EXECUTOR": "qemu", @@ -20,7 +19,8 @@ "ENABLE_CXX_LIBS": "ON", "ENABLE_LIBC_TESTS": "OFF", "ENABLE_COMPILER_RT_TESTS": "OFF", - "ENABLE_LIBCXX_TESTS": "OFF" + "ENABLE_LIBCXX_TESTS": "OFF", + "TLS_MODEL": "initial-exec" }, "musl-embedded": { "ENABLE_CXX_LIBS": "ON", diff --git a/qualcomm-software/embedded-multilib/json/variants/aarch64a_soft_nofp_tlsie.json b/qualcomm-software/embedded-multilib/json/variants/aarch64a_soft_nofp_tlsie.json index 618d7a926e31..0fa221f6956d 100644 --- a/qualcomm-software/embedded-multilib/json/variants/aarch64a_soft_nofp_tlsie.json +++ b/qualcomm-software/embedded-multilib/json/variants/aarch64a_soft_nofp_tlsie.json @@ -4,7 +4,6 @@ "TARGET_ARCH": "aarch64a", "VARIANT": "aarch64a_soft_nofp_tlsie", "COMPILE_FLAGS": "-march=armv8-a+nofp+nosimd -mabi=aapcs-soft -fPIC", - "TLS_MODEL": "initial-exec", "ENABLE_EXCEPTIONS": "OFF", "ENABLE_RTTI": "OFF", "TEST_EXECUTOR": "qemu", @@ -20,7 +19,8 @@ "ENABLE_CXX_LIBS": "OFF", "ENABLE_LIBC_TESTS": "ON", "ENABLE_COMPILER_RT_TESTS": "OFF", - "ENABLE_LIBCXX_TESTS": "OFF" + "ENABLE_LIBCXX_TESTS": "OFF", + "TLS_MODEL": "initial-exec" }, "musl-embedded": { "ENABLE_CXX_LIBS": "OFF", diff --git a/qualcomm-software/embedded-multilib/json/variants/aarch64a_tlsie.json b/qualcomm-software/embedded-multilib/json/variants/aarch64a_tlsie.json index 5ac7510350a4..55f1be57f4c9 100644 --- a/qualcomm-software/embedded-multilib/json/variants/aarch64a_tlsie.json +++ b/qualcomm-software/embedded-multilib/json/variants/aarch64a_tlsie.json @@ -4,7 +4,6 @@ "TARGET_ARCH": "aarch64a", "VARIANT": "aarch64a_tlsie", "COMPILE_FLAGS": "-march=armv8-a -fPIC", - "TLS_MODEL": "initial-exec", "ENABLE_EXCEPTIONS": "OFF", "ENABLE_RTTI": "OFF", "TEST_EXECUTOR": "qemu", @@ -20,7 +19,8 @@ "ENABLE_CXX_LIBS": "ON", "ENABLE_LIBC_TESTS": "ON", "ENABLE_COMPILER_RT_TESTS": "OFF", - "ENABLE_LIBCXX_TESTS": "OFF" + "ENABLE_LIBCXX_TESTS": "OFF", + "TLS_MODEL": "initial-exec" }, "musl-embedded": { "ENABLE_CXX_LIBS": "ON", diff --git a/qualcomm-software/embedded-runtimes/CMakeLists.txt b/qualcomm-software/embedded-runtimes/CMakeLists.txt index fdebf1643366..cc585781f89f 100644 --- a/qualcomm-software/embedded-runtimes/CMakeLists.txt +++ b/qualcomm-software/embedded-runtimes/CMakeLists.txt @@ -87,12 +87,16 @@ set(ENABLE_LIBCXX_TESTS ${ENABLE_LIBCXX_TESTS_def} CACHE BOOL "Enable libcxx tes set(DISABLE_THREADS ${DISABLE_THREADS_def} CACHE BOOL "Disable threads/atomic/TLS (picolibc only).") set(SUPPORTED_TLS_MODELS local-exec initial-exec local-dynamic global-dynamic) if(NOT DEFINED TLS_MODEL_def) - set(TLS_MODEL_def local-exec) + if(C_LIBRARY STREQUAL musl-embedded) + message(FATAL_ERROR "TLS_MODEL is currently unsupported when using musl-embedded.") + else() + set(TLS_MODEL_def local-exec) + endif() elseif(NOT TLS_MODEL_def IN_LIST SUPPORTED_TLS_MODELS) string(REPLACE ";" ", " SUPPORTED_TLS_MODELS_STR "${SUPPORTED_TLS_MODELS}") message(FATAL_ERROR "Unsupported TLS_MODEL value. Supported values are ${SUPPORTED_TLS_MODELS_STR}") endif() -set(TLS_MODEL ${TLS_MODEL_def} CACHE STRING "TLS model to use when building libraries.") +set(TLS_MODEL ${TLS_MODEL_def} CACHE STRING "TLS model to use when building libraries. Unsupported for variants using musl-embedded.") set_property(CACHE TLS_MODEL PROPERTY STRINGS ${SUPPORTED_TLS_MODELS}) set(LLVM_BINARY_DIR "" CACHE PATH "Path to LLVM toolchain root to build libraries with") @@ -228,7 +232,10 @@ endif() set(compile_arch_flags "--target=${target_triple} ${COMPILE_FLAGS} --sysroot ${TEMP_LIB_DIR}") # Compiling the libraries benefits from some extra optimization # flags, and requires a sysroot. -set(lib_compile_flags "${compile_arch_flags} -ffunction-sections -fdata-sections -ftls-model=${TLS_MODEL}") +set(lib_compile_flags "${compile_arch_flags} -ffunction-sections -fdata-sections") +if(NOT C_LIBRARY STREQUAL musl-embedded) + string(APPEND lib_compile_flags " -ftls-model=${TLS_MODEL}") +endif() # Generic target names for the C library. # Declare these now, since compiler-rt requires the 'install' dependency. From ef41663c8823d92396515c9daf6cc9852e6120b0 Mon Sep 17 00:00:00 2001 From: Jonathon Penix Date: Wed, 20 May 2026 12:33:00 -0700 Subject: [PATCH 3/3] fix bad error handling logic Signed-off-by: Jonathon Penix --- qualcomm-software/embedded-runtimes/CMakeLists.txt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/qualcomm-software/embedded-runtimes/CMakeLists.txt b/qualcomm-software/embedded-runtimes/CMakeLists.txt index cc585781f89f..4eaf9951f89d 100644 --- a/qualcomm-software/embedded-runtimes/CMakeLists.txt +++ b/qualcomm-software/embedded-runtimes/CMakeLists.txt @@ -87,11 +87,9 @@ set(ENABLE_LIBCXX_TESTS ${ENABLE_LIBCXX_TESTS_def} CACHE BOOL "Enable libcxx tes set(DISABLE_THREADS ${DISABLE_THREADS_def} CACHE BOOL "Disable threads/atomic/TLS (picolibc only).") set(SUPPORTED_TLS_MODELS local-exec initial-exec local-dynamic global-dynamic) if(NOT DEFINED TLS_MODEL_def) - if(C_LIBRARY STREQUAL musl-embedded) - message(FATAL_ERROR "TLS_MODEL is currently unsupported when using musl-embedded.") - else() - set(TLS_MODEL_def local-exec) - endif() + set(TLS_MODEL_def local-exec) +elseif(C_LIBRARY STREQUAL musl-embedded) + message(FATAL_ERROR "TLS_MODEL is currently unsupported when using musl-embedded.") elseif(NOT TLS_MODEL_def IN_LIST SUPPORTED_TLS_MODELS) string(REPLACE ";" ", " SUPPORTED_TLS_MODELS_STR "${SUPPORTED_TLS_MODELS}") message(FATAL_ERROR "Unsupported TLS_MODEL value. Supported values are ${SUPPORTED_TLS_MODELS_STR}")