From 5013669629e9fcd781143bc4a450455b18569bb9 Mon Sep 17 00:00:00 2001 From: Weaselbot Date: Sun, 21 Jun 2026 22:23:06 -0400 Subject: [PATCH] Fix release and coverage CI failures * ConflictSet.cpp: enable the interleaved read/write path whenever musttail is available, falling back to the default calling convention when preserve_none is not supported. This prevents a large block of compiled-but-dead code from being counted in coverage. * CMakeLists.txt: detect which arch-specific hardening-check options the installed hardening-check binary supports, including the newer hyphenated spellings, so the release test no longer fails with an unknown option. * .gitea/workflows/ci.yml: build the coverage job with -DUSE_SIMD_FALLBACK=ON so AVX512-only functions that cannot execute on the CI runners are not counted against line coverage. --- .gitea/workflows/ci.yml | 3 ++- CMakeLists.txt | 20 +++++++++++++++++--- ConflictSet.cpp | 32 +++++++++++++++++--------------- 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 5b58794..7b61844 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -232,7 +232,8 @@ jobs: rm -rf build cmake -S . -B build -G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DCMAKE_C_FLAGS=--coverage -DCMAKE_CXX_FLAGS=--coverage \ - -DCMAKE_BUILD_TYPE=Debug -DDISABLE_TSAN=ON + -DCMAKE_BUILD_TYPE=Debug -DDISABLE_TSAN=ON \ + -DUSE_SIMD_FALLBACK=ON ninja -C build ccache -s diff --git a/CMakeLists.txt b/CMakeLists.txt index 150f179..adb97a7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -384,12 +384,26 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR AND BUILD_TESTING) find_program(HARDENING_CHECK hardening-check) if(HARDENING_CHECK) # Control flow integrity (CET) is x86-only and branch protection (PAC/BTI) - # is arm64-only, so ignore whichever doesn't apply. + # is arm64-only, so ignore whichever doesn't apply. Newer hardening-check + # versions spell some of these flags with hyphens, so pick a supported + # form at configure time. + execute_process( + COMMAND ${HARDENING_CHECK} --help + OUTPUT_VARIABLE _hardening_help + ERROR_QUIET) if(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL arm64) - set(hardening_check_arch_flags --nocfprotection) + if(_hardening_help MATCHES "--nocfprotection") + set(hardening_check_arch_flags --nocfprotection) + elseif(_hardening_help MATCHES "--no-cf-protection") + set(hardening_check_arch_flags --no-cf-protection) + endif() else() - set(hardening_check_arch_flags --nobranchprotection) + if(_hardening_help MATCHES "--nobranchprotection") + set(hardening_check_arch_flags --nobranchprotection) + elseif(_hardening_help MATCHES "--no-branch-protection") + set(hardening_check_arch_flags --no-branch-protection) + endif() endif() add_test( NAME hardening_check diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 26d173d..9472cb6 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -3080,7 +3080,7 @@ Node *firstGeqPhysical(Node *n, const TrivialSpan key) { #define PRESERVE_NONE #endif -#if __has_attribute(musttail) && __has_attribute(preserve_none) +#if __has_attribute(musttail) constexpr bool kEnableInterleaved = true; #else constexpr bool kEnableInterleaved = false; @@ -5040,20 +5040,22 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl { assert(allPointWrites || sorted); #endif - if (kEnableInterleaved && count > 1) { - interleavedWrites(writes, count, InternalVersionT(writeVersion)); - } else { - for (int i = 0; i < count; ++i) { - const auto &w = writes[i]; - auto begin = TrivialSpan(w.begin.p, w.begin.len); - auto end = TrivialSpan(w.end.p, w.end.len); - if (w.end.len > 0) { - addWriteRange(rootParent->children[0], begin, end, - InternalVersionT(writeVersion), &writeContext); - } else { - addPointWrite(rootParent->children[0], begin, - InternalVersionT(writeVersion), &writeContext); - } + if constexpr (kEnableInterleaved) { + if (count > 1) { + interleavedWrites(writes, count, InternalVersionT(writeVersion)); + return; + } + } + for (int i = 0; i < count; ++i) { + const auto &w = writes[i]; + auto begin = TrivialSpan(w.begin.p, w.begin.len); + auto end = TrivialSpan(w.end.p, w.end.len); + if (w.end.len > 0) { + addWriteRange(rootParent->children[0], begin, end, + InternalVersionT(writeVersion), &writeContext); + } else { + addPointWrite(rootParent->children[0], begin, + InternalVersionT(writeVersion), &writeContext); } } }