mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 12:02:48 +01:00
Squashed 'src/minisketch/' changes from a571ba20f9..3472e2f5ec
3472e2f5ec Merge sipa/minisketch#81: Avoid overflowing shift by special casing inverse of 1 653d8b2e26 Avoid overflowing shift by special casing inverse of 1 33b7c200b9 Merge sipa/minisketch#80: Add c++20 version of CountBits 4a48f31a37 Merge sipa/minisketch#83: ci: Fix "s390x (big-endian)" task 82b6488acb Add c++20 version of CountBits 0498084d31 ci: Fix "s390x (big-endian)" task 71709dca9e Merge sipa/minisketch#82: ci: Fix `x86_64-w64-mingw32` task 9e6127fa98 Merge sipa/minisketch#74: Avoid >> above type width in BitWriter ed420bc170 ci: Fix `x86_64-w64-mingw32` task fe1040f227 Drop -Wno-shift-count-overflow compile flag 154bcd43bd Avoid >> above type width in BitWriter 67b87acdb6 Merge sipa/minisketch#78: ci: Update macOS image for CI 7de7250416 ci: Update macOS image for CI 83d812ea9f Merge sipa/minisketch#73: ci: Use correct variable to designate C++ compiler e051a7d690 ci: Install wine32 package for Windows tests 2d2c695d78 build: Drop unused `CC` variable 1810fcbd11 ci: Use correct variable to designate C++ compiler 022b959049 Merge sipa/minisketch#77: Add missing include 08443c4892 Add missing include git-subtree-dir: src/minisketch git-subtree-split: 3472e2f5ec75ace39ce9243af6b3fee233a67492
This commit is contained in:
parent
1c94f1a3c3
commit
9540ecbc34
57
.cirrus.yml
57
.cirrus.yml
@ -36,17 +36,6 @@ env_matrix_snippet: &ENV_MATRIX_VALGRIND
|
||||
TESTRUNS: 1
|
||||
BUILD:
|
||||
|
||||
env_matrix_snippet: &ENV_MATRIX_SAN
|
||||
- env:
|
||||
ENABLE_FIELDS: 28
|
||||
- env:
|
||||
BUILD: distcheck
|
||||
- env:
|
||||
CXXFLAGS: "-fsanitize=undefined -fno-omit-frame-pointer"
|
||||
LDFLAGS: "-fsanitize=undefined -fno-omit-frame-pointer"
|
||||
UBSAN_OPTIONS: "print_stacktrace=1:halt_on_error=1"
|
||||
BENCH: no
|
||||
|
||||
env_matrix_snippet: &ENV_MATRIX_SAN_VALGRIND
|
||||
- env:
|
||||
ENABLE_FIELDS: "11,64,37"
|
||||
@ -72,9 +61,9 @@ task:
|
||||
<< : *ENV_MATRIX_SAN_VALGRIND
|
||||
matrix:
|
||||
- env:
|
||||
CC: gcc
|
||||
CXX: g++
|
||||
- env:
|
||||
CC: clang
|
||||
CXX: clang++ -gdwarf-4
|
||||
<< : *MERGE_BASE
|
||||
test_script:
|
||||
- ./ci/cirrus.sh
|
||||
@ -92,30 +81,45 @@ task:
|
||||
<< : *ENV_MATRIX_VALGRIND
|
||||
matrix:
|
||||
- env:
|
||||
CC: i686-linux-gnu-gcc
|
||||
CXX: i686-linux-gnu-g++
|
||||
- env:
|
||||
CC: clang --target=i686-pc-linux-gnu -isystem /usr/i686-linux-gnu/include
|
||||
CXX: clang++ --target=i686-linux-gnu -gdwarf-4
|
||||
CXXFLAGS: -g -O2 -isystem /usr/i686-linux-gnu/include -isystem /usr/i686-linux-gnu/include/c++/10/i686-linux-gnu
|
||||
test_script:
|
||||
- ./ci/cirrus.sh
|
||||
<< : *CAT_LOGS
|
||||
|
||||
task:
|
||||
name: "x86_64: macOS Catalina"
|
||||
name: "arm64: macOS Monterey"
|
||||
macos_instance:
|
||||
image: catalina-base
|
||||
image: ghcr.io/cirruslabs/macos-monterey-base:latest
|
||||
env:
|
||||
# Cirrus gives us a fixed number of 12 virtual CPUs.
|
||||
MAKEFLAGS: -j13
|
||||
matrix:
|
||||
<< : *ENV_MATRIX_SAN
|
||||
# Cirrus gives us a fixed number of 4 virtual CPUs.
|
||||
MAKEFLAGS: -j5
|
||||
matrix:
|
||||
- env:
|
||||
CC: gcc-9
|
||||
CXX: g++-11
|
||||
# Homebrew's gcc for arm64 has no libubsan.
|
||||
matrix:
|
||||
- env:
|
||||
ENABLE_FIELDS: 28
|
||||
- env:
|
||||
BUILD: distcheck
|
||||
- env:
|
||||
CC: clang
|
||||
CXX: clang++
|
||||
matrix:
|
||||
- env:
|
||||
ENABLE_FIELDS: 28
|
||||
- env:
|
||||
BUILD: distcheck
|
||||
- env:
|
||||
CXXFLAGS: "-fsanitize=undefined -fno-omit-frame-pointer"
|
||||
LDFLAGS: "-fsanitize=undefined -fno-omit-frame-pointer"
|
||||
UBSAN_OPTIONS: "print_stacktrace=1:halt_on_error=1"
|
||||
BENCH: no
|
||||
brew_script:
|
||||
- brew update
|
||||
- brew install automake libtool gcc@9
|
||||
- brew install automake libtool gcc@11
|
||||
<< : *MERGE_BASE
|
||||
test_script:
|
||||
- ./ci/cirrus.sh
|
||||
@ -128,13 +132,11 @@ task:
|
||||
cpu: 4
|
||||
memory: 2G
|
||||
env:
|
||||
EXEC_CMD: qemu-s390x -L /usr/s390x-linux-gnu
|
||||
EXEC_CMD: qemu-s390x
|
||||
HOST: s390x-linux-gnu
|
||||
BUILD:
|
||||
<< : *MERGE_BASE
|
||||
test_script:
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=27008
|
||||
- rm /etc/ld.so.cache
|
||||
- ./ci/cirrus.sh
|
||||
<< : *CAT_LOGS
|
||||
|
||||
@ -146,6 +148,7 @@ task:
|
||||
memory: 2G
|
||||
env:
|
||||
EXEC_CMD: wine
|
||||
EXEC_EXT: .exe
|
||||
HOST: x86_64-w64-mingw32
|
||||
BUILD:
|
||||
<< : *MERGE_BASE
|
||||
|
@ -7,7 +7,7 @@ export LC_ALL=C
|
||||
|
||||
env >> test_env.log
|
||||
|
||||
$CC -v || true
|
||||
$CXX -v || true
|
||||
valgrind --version || true
|
||||
|
||||
./autogen.sh
|
||||
@ -32,10 +32,10 @@ then
|
||||
fi
|
||||
|
||||
if [ -n "$EXEC_CMD" ]; then
|
||||
$EXEC_CMD ./test $TESTRUNS
|
||||
$EXEC_CMD ./test-verify $TESTRUNS
|
||||
$EXEC_CMD "./test$EXEC_EXT" $TESTRUNS
|
||||
$EXEC_CMD "./test-verify$EXEC_EXT" $TESTRUNS
|
||||
fi
|
||||
|
||||
if [ "$BENCH" = "yes" ]; then
|
||||
$EXEC_CMD ./bench
|
||||
$EXEC_CMD "./bench$EXEC_EXT"
|
||||
fi
|
||||
|
@ -8,10 +8,10 @@ RUN apt-get update
|
||||
RUN apt-get install --no-install-recommends --no-upgrade -y \
|
||||
git ca-certificates \
|
||||
make automake libtool pkg-config dpkg-dev valgrind qemu-user \
|
||||
gcc g++ clang libc6-dbg \
|
||||
gcc g++ clang libclang-rt-dev libc6-dbg \
|
||||
gcc-i686-linux-gnu g++-i686-linux-gnu libc6-dev-i386-cross libc6-dbg:i386 \
|
||||
g++-s390x-linux-gnu gcc-s390x-linux-gnu libc6-dev-s390x-cross libc6-dbg:s390x \
|
||||
wine g++-mingw-w64-x86-64
|
||||
g++-s390x-linux-gnu libstdc++6:s390x gcc-s390x-linux-gnu libc6-dev-s390x-cross libc6-dbg:s390x \
|
||||
wine wine64 g++-mingw-w64-x86-64
|
||||
|
||||
# Run a dummy command in wine to make it set up configuration
|
||||
RUN wine true || true
|
||||
|
@ -104,11 +104,6 @@ esac
|
||||
AX_CHECK_COMPILE_FLAG([-Wall],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wall"],,[[$CXXFLAG_WERROR]])
|
||||
AX_CHECK_COMPILE_FLAG([-fvisibility=hidden],[CXXFLAGS="$CXXFLAGS -fvisibility=hidden"],[],[$CXXFLAG_WERROR])
|
||||
|
||||
## Some compilers (gcc) ignore unknown -Wno-* options, but warn about all
|
||||
## unknown options if any other warning is produced. Test the -Wfoo case, and
|
||||
## set the -Wno-foo case if it works.
|
||||
AX_CHECK_COMPILE_FLAG([-Wshift-count-overflow],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-shift-count-overflow"],,[[$CXXFLAG_WERROR]])
|
||||
|
||||
if test "x$use_ccache" != "xno"; then
|
||||
AC_MSG_CHECKING(if ccache should be used)
|
||||
if test x$CCACHE = x; then
|
||||
@ -119,7 +114,6 @@ if test "x$use_ccache" != "xno"; then
|
||||
fi
|
||||
else
|
||||
use_ccache=yes
|
||||
CC="$ac_cv_path_CCACHE $CC"
|
||||
CXX="$ac_cv_path_CCACHE $CXX"
|
||||
fi
|
||||
AC_MSG_RESULT($use_ccache)
|
||||
|
@ -7,13 +7,16 @@
|
||||
#ifndef _MINISKETCH_INT_UTILS_H_
|
||||
#define _MINISKETCH_INT_UTILS_H_
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <limits>
|
||||
#include <algorithm>
|
||||
#include <type_traits>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#if defined(__cpp_lib_int_pow2) && __cpp_lib_int_pow2 >= 202002L
|
||||
# include <bit>
|
||||
#elif defined(_MSC_VER)
|
||||
# include <intrin.h>
|
||||
#endif
|
||||
|
||||
@ -54,11 +57,10 @@ class BitWriter {
|
||||
int offset = 0;
|
||||
unsigned char* out;
|
||||
|
||||
public:
|
||||
BitWriter(unsigned char* output) : out(output) {}
|
||||
|
||||
template<int BITS, typename I>
|
||||
inline void Write(I val) {
|
||||
inline void WriteInner(I val) {
|
||||
// We right shift by up to 8 bits below. Verify that's well defined for the type I.
|
||||
static_assert(std::numeric_limits<I>::digits > 8, "BitWriter::WriteInner needs I > 8 bits");
|
||||
int bits = BITS;
|
||||
if (bits + offset >= 8) {
|
||||
state |= ((val & ((I(1) << (8 - offset)) - 1)) << offset);
|
||||
@ -77,6 +79,19 @@ public:
|
||||
offset += bits;
|
||||
}
|
||||
|
||||
|
||||
public:
|
||||
BitWriter(unsigned char* output) : out(output) {}
|
||||
|
||||
template<int BITS, typename I>
|
||||
inline void Write(I val) {
|
||||
// If I is smaller than an unsigned int, invoke WriteInner with argument converted to unsigned.
|
||||
using compute_type = typename std::conditional<
|
||||
(std::numeric_limits<I>::digits < std::numeric_limits<unsigned>::digits),
|
||||
unsigned, I>::type;
|
||||
return WriteInner<BITS, compute_type>(val);
|
||||
}
|
||||
|
||||
inline void Flush() {
|
||||
if (offset) {
|
||||
*(out++) = state;
|
||||
@ -129,7 +144,11 @@ constexpr inline I Mask() { return ((I((I(-1)) << (std::numeric_limits<I>::digit
|
||||
/** Compute the smallest power of two that is larger than val. */
|
||||
template<typename I>
|
||||
static inline int CountBits(I val, int max) {
|
||||
#ifdef _MSC_VER
|
||||
#if defined(__cpp_lib_int_pow2) && __cpp_lib_int_pow2 >= 202002L
|
||||
// c++20 impl
|
||||
(void)max;
|
||||
return std::bit_width(val);
|
||||
#elif defined(_MSC_VER)
|
||||
(void)max;
|
||||
unsigned long index;
|
||||
unsigned char ret;
|
||||
@ -175,6 +194,7 @@ public:
|
||||
}
|
||||
|
||||
static constexpr inline bool IsZero(I a) { return a == 0; }
|
||||
static constexpr inline bool IsOne(I a) { return a == 1; }
|
||||
static constexpr inline I Mask(I val) { return val & MASK; }
|
||||
static constexpr inline I Shift(I val, int bits) { return ((val << bits) & MASK); }
|
||||
static constexpr inline I UnsafeShift(I val, int bits) { return (val << bits); }
|
||||
@ -233,7 +253,7 @@ template<typename I, int N, typename L, typename F> inline constexpr I GFMul(con
|
||||
template<typename I, typename F, int BITS, uint32_t MOD>
|
||||
inline I InvExtGCD(I x)
|
||||
{
|
||||
if (F::IsZero(x)) return x;
|
||||
if (F::IsZero(x) || F::IsOne(x)) return x;
|
||||
I t(0), newt(1);
|
||||
I r(MOD), newr = x;
|
||||
int rlen = BITS + 1, newrlen = F::Bits(newr, BITS);
|
||||
|
Loading…
Reference in New Issue
Block a user