13 Commits

Author SHA1 Message Date
9c82f17e20 Enable valgrind annotations for gcc build in jenkins
Some checks failed
Tests / 64 bit versions total: 8097, passed: 8097
weaselab/conflict-set/pipeline/head Something is wrong with the build of this commit
2024-11-12 18:13:32 -08:00
665a9313a4 Valgrind annotations for new free list 2024-11-12 18:11:09 -08:00
6e66202d5e Add to corpus
Some checks failed
Tests / 64 bit versions total: 8097, passed: 8097
Tests / Debug total: 8095, passed: 8095
Tests / SIMD fallback total: 8097, passed: 8097
Tests / Release [clang] total: 8097, passed: 8097
Clang |Total|New|Outstanding|Fixed|Trend |:-:|:-:|:-:|:-:|:-: |0|0|0|0|:clap:
Tests / Release [gcc] total: 8097, passed: 8097
GNU C Compiler (gcc) |Total|New|Outstanding|Fixed|Trend |:-:|:-:|:-:|:-:|:-: |0|0|0|0|:clap:
weaselab/conflict-set/pipeline/head There was a failure building this commit
2024-11-12 17:50:27 -08:00
a92271a205 Build with -Wunused-variable 2024-11-12 17:50:27 -08:00
0dbfb4deae Detect simd headers in c++ instead of cmake 2024-11-12 17:50:27 -08:00
6e229b6b36 Skip sorting if already sorted for skip list 2024-11-12 17:50:27 -08:00
2200de11c8 Point read/write workload for server_bench 2024-11-12 17:50:27 -08:00
b37feb58dd Require musttail and preserve_none for interleaved 2024-11-12 17:50:27 -08:00
94a4802824 Don't do hardening check if cross compiling 2024-11-12 17:50:27 -08:00
707dbdb391 Build binaries compatible with cf-protection 2024-11-12 17:50:27 -08:00
bdd343bb57 Use llvm-objcopy if using clang and it's available
This works around a weird error I was getting when trying to link a
translation unit that included Internal.h with libconflict-set-static.a
with clang + gnu objcopy
2024-11-12 17:50:27 -08:00
7b31bd5efe Use llvm 19 for macos package
Some checks failed
Tests / 64 bit versions total: 7949, passed: 7949
Tests / Debug total: 7947, passed: 7947
Tests / SIMD fallback total: 7949, passed: 7949
Tests / Release [clang] total: 7949, passed: 7949
Clang |Total|New|Outstanding|Fixed|Trend |:-:|:-:|:-:|:-:|:-: |0|0|0|0|:clap:
Tests / Release [gcc] total: 7949, passed: 7949
GNU C Compiler (gcc) |Total|New|Outstanding|Fixed|Trend |:-:|:-:|:-:|:-:|:-: |0|0|0|0|:clap:
Tests / Release [clang,aarch64] total: 5268, passed: 5268
weaselab/conflict-set/pipeline/head There was a failure building this commit
2024-11-10 21:47:26 -08:00
e255e1a926 Add missing symbol imports for macos 2024-11-10 21:05:42 -08:00
58 changed files with 160 additions and 92 deletions

View File

@@ -31,11 +31,24 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
"MinSizeRel" "RelWithDebInfo") "MinSizeRel" "RelWithDebInfo")
endif() endif()
add_compile_options(-fdata-sections -ffunction-sections -Wswitch-enum add_compile_options(
-Werror=switch-enum -fPIC) -Werror=switch-enum
-Wswitch-enum
-Wunused-variable
-fPIC
-fdata-sections
-ffunction-sections
-fno-jump-tables # https://github.com/llvm/llvm-project/issues/54247
)
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
add_link_options("-Wno-unused-command-line-argument") add_link_options("-Wno-unused-command-line-argument")
find_program(LLVM_OBJCOPY llvm-objcopy)
if(LLVM_OBJCOPY)
set(CMAKE_OBJCOPY
${LLVM_OBJCOPY}
CACHE FILEPATH "path to objcopy binary" FORCE)
endif()
endif() endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
@@ -56,6 +69,21 @@ if(HAS_FULL_RELRO)
endif() endif()
cmake_pop_check_state() cmake_pop_check_state()
if(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
add_compile_options(-mbranch-protection=standard)
else()
add_compile_options(-fcf-protection)
set(rewrite_endbr_flags "-fuse-ld=mold;LINKER:-z,rewrite-endbr")
cmake_push_check_state()
list(APPEND CMAKE_REQUIRED_LINK_OPTIONS ${rewrite_endbr_flags})
check_cxx_source_compiles("int main(){}" HAS_REWRITE_ENDBR FAIL_REGEX
"warning:")
if(HAS_REWRITE_ENDBR)
add_link_options(${rewrite_endbr_flags})
endif()
cmake_pop_check_state()
endif()
set(version_script_flags set(version_script_flags
LINKER:--version-script=${CMAKE_CURRENT_SOURCE_DIR}/linker.map) LINKER:--version-script=${CMAKE_CURRENT_SOURCE_DIR}/linker.map)
cmake_push_check_state() cmake_push_check_state()
@@ -81,19 +109,11 @@ else()
add_link_options(-Wl,--gc-sections) add_link_options(-Wl,--gc-sections)
endif() endif()
if(NOT USE_SIMD_FALLBACK) if(USE_SIMD_FALLBACK)
cmake_push_check_state() add_compile_definitions(USE_SIMD_FALLBACK)
list(APPEND CMAKE_REQUIRED_FLAGS -mavx) else()
check_include_file_cxx("immintrin.h" HAS_AVX) if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64)
if(HAS_AVX)
add_compile_options(-mavx) add_compile_options(-mavx)
add_compile_definitions(HAS_AVX)
endif()
cmake_pop_check_state()
check_include_file_cxx("arm_neon.h" HAS_ARM_NEON)
if(HAS_ARM_NEON)
add_compile_definitions(HAS_ARM_NEON)
endif() endif()
endif() endif()
@@ -323,7 +343,8 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR AND BUILD_TESTING)
# c++98 # c++98
add_executable(conflict_set_cxx_api_test conflict_set_cxx_api_test.cpp) add_executable(conflict_set_cxx_api_test conflict_set_cxx_api_test.cpp)
target_compile_options(conflict_set_cxx_api_test PRIVATE ${TEST_FLAGS}) target_compile_options(conflict_set_cxx_api_test PRIVATE ${TEST_FLAGS})
target_link_libraries(conflict_set_cxx_api_test PRIVATE ${PROJECT_NAME}) target_link_libraries(conflict_set_cxx_api_test
PRIVATE ${PROJECT_NAME}-static)
set_target_properties(conflict_set_cxx_api_test PROPERTIES CXX_STANDARD 98) set_target_properties(conflict_set_cxx_api_test PROPERTIES CXX_STANDARD 98)
set_target_properties(conflict_set_cxx_api_test set_target_properties(conflict_set_cxx_api_test
PROPERTIES CXX_STANDARD_REQUIRED ON) PROPERTIES CXX_STANDARD_REQUIRED ON)
@@ -356,6 +377,15 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR AND BUILD_TESTING)
${symbol_imports}) ${symbol_imports})
endif() endif()
if(NOT CMAKE_CROSSCOMPILING)
find_program(HARDENING_CHECK hardening-check)
if(HARDENING_CHECK)
add_test(NAME hardening_check
COMMAND ${HARDENING_CHECK} $<TARGET_FILE:${PROJECT_NAME}>
--nofortify --nostackprotector)
endif()
endif()
# bench # bench
add_executable(conflict_set_bench Bench.cpp) add_executable(conflict_set_bench Bench.cpp)
target_link_libraries(conflict_set_bench PRIVATE ${PROJECT_NAME} nanobench) target_link_libraries(conflict_set_bench PRIVATE ${PROJECT_NAME} nanobench)

View File

@@ -14,6 +14,16 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
#if !defined(USE_SIMD_FALLBACK) && defined(__has_include)
#if __has_include("immintrin.h")
#define HAS_AVX 1
#include <immintrin.h>
#elif __has_include("arm_neon.h")
#define HAS_ARM_NEON 1
#include <arm_neon.h>
#endif
#endif
#include "ConflictSet.h" #include "ConflictSet.h"
#include "Internal.h" #include "Internal.h"
#include "LongestCommonPrefix.h" #include "LongestCommonPrefix.h"
@@ -34,12 +44,6 @@ limitations under the License.
#include <type_traits> #include <type_traits>
#include <utility> #include <utility>
#ifdef HAS_AVX
#include <immintrin.h>
#elif defined(HAS_ARM_NEON)
#include <arm_neon.h>
#endif
#ifndef __SANITIZE_THREAD__ #ifndef __SANITIZE_THREAD__
#if defined(__has_feature) #if defined(__has_feature)
#if __has_feature(thread_sanitizer) #if __has_feature(thread_sanitizer)
@@ -696,8 +700,6 @@ constexpr int64_t kMaxFreeListBytes = 1 << 20;
// doesn't meet the capacity constraints, it's freed and a new node is allocated // doesn't meet the capacity constraints, it's freed and a new node is allocated
// with the minimum capacity. The hope is that "unfit" nodes don't get stuck in // with the minimum capacity. The hope is that "unfit" nodes don't get stuck in
// the free list. // the free list.
//
// TODO valgrind annotations
template <class T> struct NodeAllocator { template <class T> struct NodeAllocator {
static_assert(std::derived_from<T, Node>); static_assert(std::derived_from<T, Node>);
@@ -734,6 +736,7 @@ template <class T> struct NodeAllocator {
p->parent = freeList; p->parent = freeList;
freeList = p; freeList = p;
freeListSize += sizeof(T) + p->partialKeyCapacity; freeListSize += sizeof(T) + p->partialKeyCapacity;
VALGRIND_MAKE_MEM_NOACCESS(p, sizeof(T) + p->partialKeyCapacity);
} }
void deferRelease(T *p, Node *forwardTo) { void deferRelease(T *p, Node *forwardTo) {
@@ -755,6 +758,13 @@ template <class T> struct NodeAllocator {
void releaseDeferred() { void releaseDeferred() {
if (deferredList != nullptr) { if (deferredList != nullptr) {
deferredListFront->parent = freeList; deferredListFront->parent = freeList;
#ifndef NVALGRIND
for (auto *iter = deferredList; iter != freeList;) {
auto *tmp = iter;
iter = (T *)iter->parent;
VALGRIND_MAKE_MEM_NOACCESS(tmp, sizeof(T) + tmp->partialKeyCapacity);
}
#endif
freeList = std::exchange(deferredList, nullptr); freeList = std::exchange(deferredList, nullptr);
} }
for (T *n = std::exchange(deferredListOverflow, nullptr); n != nullptr;) { for (T *n = std::exchange(deferredListOverflow, nullptr); n != nullptr;) {
@@ -775,6 +785,7 @@ template <class T> struct NodeAllocator {
assert(deferredList == nullptr); assert(deferredList == nullptr);
assert(deferredListOverflow == nullptr); assert(deferredListOverflow == nullptr);
for (T *iter = freeList; iter != nullptr;) { for (T *iter = freeList; iter != nullptr;) {
VALGRIND_MAKE_MEM_DEFINED(iter, sizeof(T));
auto *tmp = iter; auto *tmp = iter;
iter = (T *)iter->parent; iter = (T *)iter->parent;
removeNode(tmp); removeNode(tmp);
@@ -792,6 +803,7 @@ private:
T *allocate_helper(int minCapacity, int maxCapacity) { T *allocate_helper(int minCapacity, int maxCapacity) {
if (freeList != nullptr) { if (freeList != nullptr) {
VALGRIND_MAKE_MEM_DEFINED(freeList, sizeof(T));
freeListSize -= sizeof(T) + freeList->partialKeyCapacity; freeListSize -= sizeof(T) + freeList->partialKeyCapacity;
assume(freeList->partialKeyCapacity >= 0); assume(freeList->partialKeyCapacity >= 0);
assume(minCapacity >= 0); assume(minCapacity >= 0);
@@ -800,6 +812,11 @@ private:
freeList->partialKeyCapacity <= maxCapacity) { freeList->partialKeyCapacity <= maxCapacity) {
auto *result = freeList; auto *result = freeList;
freeList = (T *)freeList->parent; freeList = (T *)freeList->parent;
VALGRIND_MAKE_MEM_UNDEFINED(result,
sizeof(T) + result->partialKeyCapacity);
VALGRIND_MAKE_MEM_DEFINED(&result->partialKeyCapacity,
sizeof(result->partialKeyCapacity));
VALGRIND_MAKE_MEM_DEFINED(&result->type, sizeof(result->type));
return result; return result;
} else { } else {
auto *p = freeList; auto *p = freeList;
@@ -3183,6 +3200,12 @@ Node *firstGeqPhysical(Node *n, const TrivialSpan key) {
#define PRESERVE_NONE #define PRESERVE_NONE
#endif #endif
#if __has_attribute(musttail) && __has_attribute(preserve_none)
constexpr bool kEnableInterleaved = true;
#else
constexpr bool kEnableInterleaved = false;
#endif
namespace check { namespace check {
typedef PRESERVE_NONE void (*Continuation)(struct Job *, struct Context *); typedef PRESERVE_NONE void (*Continuation)(struct Job *, struct Context *);
@@ -4969,7 +4992,7 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
check::Context context; check::Context context;
context.readContext.impl = this; context.readContext.impl = this;
#if __has_attribute(musttail) if constexpr (kEnableInterleaved) {
if (count == 1) { if (count == 1) {
useSequential(reads, result, count, context); useSequential(reads, result, count, context);
} else { } else {
@@ -4995,8 +5018,8 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
inProgress[0].prev = inProgress + started - 1; inProgress[0].prev = inProgress + started - 1;
inProgress[started - 1].next = inProgress; inProgress[started - 1].next = inProgress;
// Kick off the sequence of tail calls that finally returns once all jobs // Kick off the sequence of tail calls that finally returns once all
// are done // jobs are done
inProgress->continuation(inProgress, &context); inProgress->continuation(inProgress, &context);
#ifndef NDEBUG #ifndef NDEBUG
@@ -5009,10 +5032,9 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
assert(context.readContext == context2.readContext); assert(context.readContext == context2.readContext);
#endif #endif
} }
} else {
#else
useSequential(reads, result, count, context); useSequential(reads, result, count, context);
#endif }
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
assert(reads[i].readVersion >= 0); assert(reads[i].readVersion >= 0);
@@ -5186,11 +5208,6 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
assert(allPointWrites || sorted); assert(allPointWrites || sorted);
#endif #endif
#if __has_attribute(musttail)
constexpr bool kEnableInterleaved = true;
#else
constexpr bool kEnableInterleaved = false;
#endif
if (kEnableInterleaved && count > 1) { if (kEnableInterleaved && count > 1) {
interleavedWrites(writes, count, InternalVersionT(writeVersion)); interleavedWrites(writes, count, InternalVersionT(writeVersion));
} else { } else {
@@ -5858,13 +5875,13 @@ void checkVersionsGeqOldestExtant(Node *n,
case Type_Node0: { case Type_Node0: {
} break; } break;
case Type_Node3: { case Type_Node3: {
auto *self = static_cast<Node3 *>(n); [[maybe_unused]] auto *self = static_cast<Node3 *>(n);
for (int i = 0; i < 3; ++i) { for (int i = 0; i < 3; ++i) {
assert(self->childMaxVersion[i] >= oldestExtantVersion); assert(self->childMaxVersion[i] >= oldestExtantVersion);
} }
} break; } break;
case Type_Node16: { case Type_Node16: {
auto *self = static_cast<Node16 *>(n); [[maybe_unused]] auto *self = static_cast<Node16 *>(n);
for (int i = 0; i < 16; ++i) { for (int i = 0; i < 16; ++i) {
assert(self->childMaxVersion[i] >= oldestExtantVersion); assert(self->childMaxVersion[i] >= oldestExtantVersion);
} }
@@ -5874,7 +5891,7 @@ void checkVersionsGeqOldestExtant(Node *n,
for (int i = 0; i < 48; ++i) { for (int i = 0; i < 48; ++i) {
assert(self->childMaxVersion[i] >= oldestExtantVersion); assert(self->childMaxVersion[i] >= oldestExtantVersion);
} }
for (auto m : self->maxOfMax) { for ([[maybe_unused]] auto m : self->maxOfMax) {
assert(m >= oldestExtantVersion); assert(m >= oldestExtantVersion);
} }
} break; } break;
@@ -5883,7 +5900,7 @@ void checkVersionsGeqOldestExtant(Node *n,
for (int i = 0; i < 256; ++i) { for (int i = 0; i < 256; ++i) {
assert(self->childMaxVersion[i] >= oldestExtantVersion); assert(self->childMaxVersion[i] >= oldestExtantVersion);
} }
for (auto m : self->maxOfMax) { for ([[maybe_unused]] auto m : self->maxOfMax) {
assert(m >= oldestExtantVersion); assert(m >= oldestExtantVersion);
} }
} break; } break;

View File

@@ -13,12 +13,14 @@ RUN TZ=America/Los_Angeles DEBIAN_FRONTEND=noninteractive apt-get install -y \
ccache \ ccache \
cmake \ cmake \
curl \ curl \
devscripts \
g++-aarch64-linux-gnu \ g++-aarch64-linux-gnu \
gcovr \ gcovr \
git \ git \
gnupg \ gnupg \
libc6-dbg \ libc6-dbg \
lsb-release \ lsb-release \
mold \
ninja-build \ ninja-build \
pre-commit \ pre-commit \
python3-requests \ python3-requests \

4
Jenkinsfile vendored
View File

@@ -91,7 +91,7 @@ pipeline {
minio bucket: 'jenkins', credentialsId: 'jenkins-minio', excludes: '', host: 'minio.weaselab.dev', includes: 'build/*.deb,build/*.rpm,paper/*.pdf', targetFolder: '${JOB_NAME}/${BUILD_NUMBER}/${STAGE_NAME}/' minio bucket: 'jenkins', credentialsId: 'jenkins-minio', excludes: '', host: 'minio.weaselab.dev', includes: 'build/*.deb,build/*.rpm,paper/*.pdf', targetFolder: '${JOB_NAME}/${BUILD_NUMBER}/${STAGE_NAME}/'
} }
} }
stage('Release [gcc]') { stage('gcc') {
agent { agent {
dockerfile { dockerfile {
args '-v /home/jenkins/ccache:/ccache' args '-v /home/jenkins/ccache:/ccache'
@@ -99,7 +99,7 @@ pipeline {
} }
} }
steps { steps {
CleanBuildAndTest("-DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_CXX_FLAGS=-DNVALGRIND") CleanBuildAndTest("-DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++")
recordIssues(tools: [gcc()]) recordIssues(tools: [gcc()])
} }
} }

View File

@@ -5,7 +5,7 @@
#include <cstdio> #include <cstdio>
#include <cstring> #include <cstring>
#include <fcntl.h> #include <fcntl.h>
#include <string_view> #include <span>
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
@@ -64,7 +64,7 @@ int main(int argc, const char **argv) {
auto *const mapOriginal = begin; auto *const mapOriginal = begin;
const auto sizeOriginal = size; const auto sizeOriginal = size;
using StringView = std::basic_string_view<uint8_t>; using StringView = std::span<const uint8_t>;
StringView write; StringView write;
std::vector<StringView> reads; std::vector<StringView> reads;
@@ -78,9 +78,9 @@ int main(int argc, const char **argv) {
end = (uint8_t *)memchr(begin, '\n', size); end = (uint8_t *)memchr(begin, '\n', size);
if (line.size() > 0 && line[0] == 'P') { if (line.size() > 0 && line[0] == 'P') {
write = line.substr(2, line.size()); write = line.subspan(2, line.size());
} else if (line.size() > 0 && line[0] == 'L') { } else if (line.size() > 0 && line[0] == 'L') {
reads.push_back(line.substr(2, line.size())); reads.push_back(line.subspan(2, line.size()));
} else if (line.empty()) { } else if (line.empty()) {
{ {
readRanges.resize(reads.size()); readRanges.resize(reads.size());

View File

@@ -64,31 +64,47 @@ template <class... Ts> std::string tupleKey(const Ts &...ts) {
return result; return result;
} }
constexpr int kWindowSize = 300000; constexpr int kTotalKeyRange = 1'000'000'000;
constexpr int kWindowSize = 1'000'000;
constexpr int kNumKeys = 10;
void workload(weaselab::ConflictSet *cs) { void workload(weaselab::ConflictSet *cs) {
int64_t version = kWindowSize; int64_t version = kWindowSize;
constexpr int kNumWrites = 16;
for (;; transactions.fetch_add(1, std::memory_order_relaxed)) { for (;; transactions.fetch_add(1, std::memory_order_relaxed)) {
std::vector<int64_t> keyIndices; std::vector<int64_t> keyIndices;
for (int i = 0; i < kNumWrites; ++i) { for (int i = 0; i < kNumKeys; ++i) {
keyIndices.push_back(rand() % 100'000'000); keyIndices.push_back(rand() % kTotalKeyRange);
} }
std::sort(keyIndices.begin(), keyIndices.end()); std::sort(keyIndices.begin(), keyIndices.end());
std::vector<std::string> keys; std::vector<std::string> keys;
std::vector<weaselab::ConflictSet::WriteRange> writes; constexpr std::string_view fullString =
constexpr std::string_view suffix = "this is a suffix"; "this is a string, where a prefix of it is used as an element of the "
for (int i = 0; i < kNumWrites; ++i) { "tuple forming the key";
keys.push_back(tupleKey(0x100, i, keyIndices[i], for (int i = 0; i < kNumKeys; ++i) {
suffix.substr(0, rand() % suffix.size()), keys.push_back(
rand())); tupleKey(0x100, keyIndices[i] / fullString.size(),
fullString.substr(0, keyIndices[i] % fullString.size())));
// printf("%s\n", printable(keys.back()).c_str()); // printf("%s\n", printable(keys.back()).c_str());
} }
for (int i = 0; i < kNumWrites; ++i) {
std::vector<weaselab::ConflictSet::ReadRange> reads;
std::vector<weaselab::ConflictSet::WriteRange> writes;
std::vector<weaselab::ConflictSet::Result> results;
for (int i = 0; i < kNumKeys; ++i) {
writes.push_back({{(const uint8_t *)keys[i].data(), int(keys[i].size())}, writes.push_back({{(const uint8_t *)keys[i].data(), int(keys[i].size())},
{nullptr, 0}}); {nullptr, 0}});
reads.push_back({{(const uint8_t *)keys[i].data(), int(keys[i].size())},
{nullptr, 0},
version - kWindowSize});
} }
cs->addWrites(writes.data(), writes.size(), version); results.resize(reads.size());
cs->check(reads.data(), results.data(), reads.size());
bool ok = true;
for (auto result : results) {
ok &= result == weaselab::ConflictSet::Commit;
}
cs->addWrites(writes.data(), ok ? writes.size() : 0, version);
cs->setOldestVersion(version - kWindowSize); cs->setOldestVersion(version - kWindowSize);
++version; ++version;
} }

View File

@@ -767,7 +767,9 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
false, true); false, true);
} }
if (!std::is_sorted(points.begin(), points.end())) {
sortPoints(points); sortPoints(points);
}
int activeWriteCount = 0; int activeWriteCount = 0;
std::vector<std::pair<StringRef, StringRef>> combinedWriteConflictRanges; std::vector<std::pair<StringRef, StringRef>> combinedWriteConflictRanges;
@@ -794,7 +796,6 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
int temp[stripeSize]; int temp[stripeSize];
int stripes = (stringCount + stripeSize - 1) / stripeSize; int stripes = (stringCount + stripeSize - 1) / stripeSize;
StringRef values[stripeSize]; StringRef values[stripeSize];
int64_t writeVersions[stripeSize / 2];
int ss = stringCount - (stripes - 1) * stripeSize; int ss = stringCount - (stripes - 1) * stripeSize;
int64_t entryDelta = 0; int64_t entryDelta = 0;
for (int s = stripes - 1; s >= 0; s--) { for (int s = stripes - 1; s >= 0; s--) {

View File

@@ -1,3 +1,4 @@
___chkstk_darwin
___stack_chk_fail ___stack_chk_fail
___stack_chk_guard ___stack_chk_guard
__tlv_bootstrap __tlv_bootstrap
@@ -5,6 +6,7 @@ _abort
_bzero _bzero
_free _free
_malloc _malloc
_memcmp
_memcpy _memcpy
_memmove _memmove
dyld_stub_binder dyld_stub_binder

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -8,7 +8,7 @@ SRC_DIR="${0%/*}"
BUILD_ARM="$(mktemp -d -t conflict-set-arm)" BUILD_ARM="$(mktemp -d -t conflict-set-arm)"
BUILD_X86="$(mktemp -d -t conflict-set-x86)" BUILD_X86="$(mktemp -d -t conflict-set-x86)"
cmake_args=(-DCMAKE_CXX_FLAGS=-DNVALGRIND -DCPACK_PACKAGING_INSTALL_PREFIX=/usr/local) cmake_args=(-DCMAKE_CXX_FLAGS=-DNVALGRIND -DCPACK_PACKAGING_INSTALL_PREFIX=/usr/local -DCMAKE_CXX_COMPILER=/opt/homebrew/opt/llvm/bin/clang++)
cmake -S"$SRC_DIR" -B"$BUILD_ARM" -DCMAKE_OSX_ARCHITECTURES=arm64 "${cmake_args[@]}" cmake -S"$SRC_DIR" -B"$BUILD_ARM" -DCMAKE_OSX_ARCHITECTURES=arm64 "${cmake_args[@]}"
cmake --build "$BUILD_ARM" --target conflict-set --target conflict-set-static cmake --build "$BUILD_ARM" --target conflict-set --target conflict-set-static