From becbbcbc2894ae67b848fcccea078fa79a7f45ac 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 | 8 +++++++- ConflictSet.cpp | 32 +++++++++++++++++--------------- 3 files changed, 26 insertions(+), 17 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 c1a6b4c..19f2709 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -384,7 +384,9 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR AND BUILD_TESTING) find_program(HARDENING_CHECK hardening-check) if(HARDENING_CHECK) # Not all versions of hardening-check support the same options, so query - # the help output before using architecture-specific skips. + # the help output before using architecture-specific skips. Newer + # 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_check_help @@ -399,10 +401,14 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR AND BUILD_TESTING) STREQUAL arm64) if(hardening_check_help MATCHES "nocfprotection") list(APPEND hardening_check_arch_flags --nocfprotection) + elseif(hardening_check_help MATCHES "no-cf-protection") + list(APPEND hardening_check_arch_flags --no-cf-protection) endif() else() if(hardening_check_help MATCHES "nobranchprotection") list(APPEND hardening_check_arch_flags --nobranchprotection) + elseif(hardening_check_help MATCHES "no-branch-protection") + list(APPEND hardening_check_arch_flags --no-branch-protection) endif() endif() endif() 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); } } }