From 1c97ec73d7efc412ae32bee4f88cbcd39ba3f146 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Sun, 29 Aug 2021 16:28:41 -0700 Subject: [PATCH 1/6] added qemu tests running zstd library on emulated targets --- .github/workflows/dev-long-tests.yml | 8 +++- .github/workflows/dev-short-tests.yml | 59 +++++++++++++++++++++++++-- 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dev-long-tests.yml b/.github/workflows/dev-long-tests.yml index bc88c4a6a..0f0c36e33 100644 --- a/.github/workflows/dev-long-tests.yml +++ b/.github/workflows/dev-long-tests.yml @@ -1,7 +1,7 @@ name: dev-long-tests # Tests longer than 10mn -concurrency: +concurrency: group: long-${{ github.ref }} cancel-in-progress: true @@ -10,6 +10,7 @@ on: branches: [ dev, release, actionsTest ] jobs: + # lasts ~24mn make-test: runs-on: ubuntu-latest env: @@ -20,6 +21,7 @@ jobs: - name: make test run: make test + # lasts ~26mn make-test-osx: runs-on: macos-latest steps: @@ -41,6 +43,7 @@ jobs: - name: thread sanitizer zstreamtest run: CC=clang ZSTREAM_TESTTIME=-T3mn make tsan-test-zstream + # lasts ~15mn tsan-fuzztest: runs-on: ubuntu-latest steps: @@ -48,6 +51,7 @@ jobs: - name: thread sanitizer fuzztest run: CC=clang make tsan-fuzztest + # lasts ~23mn gcc-8-asan-ubsan-testzstd: runs-on: ubuntu-latest steps: @@ -113,6 +117,7 @@ jobs: sudo apt-get install clang CC=clang FUZZER_FLAGS="--long-tests" make clean msan-fuzztest + # lasts ~24mn clang-msan-testzstd: runs-on: ubuntu-latest steps: @@ -145,6 +150,7 @@ jobs: make clean make -C tests test-fuzzer-stackmode + # lasts ~20mn oss-fuzz: runs-on: ubuntu-latest strategy: diff --git a/.github/workflows/dev-short-tests.yml b/.github/workflows/dev-short-tests.yml index 1f676c46b..a5b1b122c 100644 --- a/.github/workflows/dev-short-tests.yml +++ b/.github/workflows/dev-short-tests.yml @@ -2,7 +2,7 @@ name: dev-short-tests # Faster tests: mostly build tests, along with some other # misc tests -concurrency: +concurrency: group: fast-${{ github.ref }} cancel-in-progress: true @@ -140,7 +140,7 @@ jobs: sudo apt-get -qqq update make libc6install CFLAGS="-Werror -m32" make -j all32 - + gcc-8-make: runs-on: ubuntu-latest steps: @@ -184,7 +184,7 @@ jobs: run: > msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v140 /t:Clean,Build /p:Platform=${{matrix.platform}} /p:Configuration=${{matrix.configuration}} - + minimal-decompressor-macros: runs-on: ubuntu-latest steps: @@ -200,6 +200,59 @@ jobs: make clean && make -j all MOREFLAGS="-Werror -DZSTD_NO_INLINE -DZSTD_STRIP_ERROR_STRINGS" make clean && make check MOREFLAGS="-Werror -DZSTD_NO_INLINE -DZSTD_STRIP_ERROR_STRINGS" + + qemu-consistency: + name: QEMU ${{ matrix.name }} + runs-on: ubuntu-latest + strategy: + fail-fast: false # 'false' means Don't stop matrix workflows even if some matrix failed. + matrix: + include: [ + { name: ARM, xcc_pkg: gcc-arm-linux-gnueabi, xcc: arm-linux-gnueabi-gcc, xemu_pkg: qemu-system-arm, xemu: qemu-arm-static }, + { name: ARM64, xcc_pkg: gcc-aarch64-linux-gnu, xcc: aarch64-linux-gnu-gcc, xemu_pkg: qemu-system-arm, xemu: qemu-aarch64-static }, + { name: PPC64LE, xcc_pkg: gcc-powerpc64le-linux-gnu, xcc: powerpc64le-linux-gnu-gcc, xemu_pkg: qemu-system-ppc, xemu: qemu-ppc64le-static }, + { name: S390X, xcc_pkg: gcc-s390x-linux-gnu, xcc: s390x-linux-gnu-gcc, xemu_pkg: qemu-system-s390x, xemu: qemu-s390x-static }, + { name: MIPS, xcc_pkg: gcc-mips-linux-gnu, xcc: mips-linux-gnu-gcc, xemu_pkg: qemu-system-mips, xemu: qemu-mips-static }, + ] + env: # Set environment variables + XCC: ${{ matrix.xcc }} + XEMU: ${{ matrix.xemu }} + steps: + - uses: actions/checkout@v2 # https://github.com/actions/checkout + - name: apt update & install + run: | + sudo apt-get update + sudo apt-get install gcc-multilib g++-multilib qemu-utils qemu-user-static + sudo apt-get install ${{ matrix.xcc_pkg }} ${{ matrix.xemu_pkg }} + - name: Environment info + run: | + echo && which $XCC + echo && $XCC --version + echo && $XCC -v # Show built-in specs + echo && which $XEMU + echo && $XEMU --version + - name: ARM + if: ${{ matrix.name == 'ARM' }} + run: | + LDFLAGS="-static" CC=$XCC RUN_ENV=$XEMU make clean check + - name: ARM64 + if: ${{ matrix.name == 'ARM64' }} + run: | + LDFLAGS="-static" CC=$XCC RUN_ENV=$XEMU make clean check + - name: PPC64LE + if: ${{ matrix.name == 'PPC64LE' }} + run: | + LDFLAGS="-static" CC=$XCC RUN_ENV=$XEMU make clean check + - name: S390X + if: ${{ matrix.name == 'S390X' }} + run: | + LDFLAGS="-static" CC=$XCC RUN_ENV=$XEMU make clean check + - name: MIPS + if: ${{ matrix.name == 'MIPS' }} + run: | + LDFLAGS="-static" CC=$XCC RUN_ENV=$XEMU make clean check + + # For reference : icc tests # icc tests are currently failing on Github Actions, likely to issues during installation stage # To be fixed later From 18191c85c96e942e02f3eae6c255d7a7b5c34367 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Sun, 29 Aug 2021 16:43:32 -0700 Subject: [PATCH 2/6] adding optional QEMU_SYS --- .github/workflows/dev-short-tests.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/dev-short-tests.yml b/.github/workflows/dev-short-tests.yml index a5b1b122c..eca24be1c 100644 --- a/.github/workflows/dev-short-tests.yml +++ b/.github/workflows/dev-short-tests.yml @@ -234,23 +234,23 @@ jobs: - name: ARM if: ${{ matrix.name == 'ARM' }} run: | - LDFLAGS="-static" CC=$XCC RUN_ENV=$XEMU make clean check + LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check - name: ARM64 if: ${{ matrix.name == 'ARM64' }} run: | - LDFLAGS="-static" CC=$XCC RUN_ENV=$XEMU make clean check + LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check - name: PPC64LE if: ${{ matrix.name == 'PPC64LE' }} run: | - LDFLAGS="-static" CC=$XCC RUN_ENV=$XEMU make clean check + LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check - name: S390X if: ${{ matrix.name == 'S390X' }} run: | - LDFLAGS="-static" CC=$XCC RUN_ENV=$XEMU make clean check + LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check - name: MIPS if: ${{ matrix.name == 'MIPS' }} run: | - LDFLAGS="-static" CC=$XCC RUN_ENV=$XEMU make clean check + LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check # For reference : icc tests From f21977c5e6af6897435dce5645e538c2e36a14ea Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Sun, 29 Aug 2021 17:20:12 -0700 Subject: [PATCH 3/6] fix playTests.sh when EXE_PREFIX not null --- programs/Makefile | 6 +++--- tests/playTests.sh | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/programs/Makefile b/programs/Makefile index 599fb02fa..ad05dbe1d 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -156,7 +156,7 @@ endif # zlib detection NO_ZLIB_MSG := ==> no zlib, building zstd without .gz support -HAVE_ZLIB := $(shell printf '$(NUM_SYMBOL)include \nint main(void) { return 0; }' > have_zlib.c && $(CC) $(FLAGS) -o have_zlib$(EXT) have_zlib.c -lz 2> $(VOID) && rm have_zlib$(EXT) && echo 1 || echo 0; rm have_zlib.c) +HAVE_ZLIB ?= $(shell printf '$(NUM_SYMBOL)include \nint main(void) { return 0; }' > have_zlib.c && $(CC) $(FLAGS) -o have_zlib$(EXT) have_zlib.c -lz 2> $(VOID) && rm have_zlib$(EXT) && echo 1 || echo 0; rm have_zlib.c) ifeq ($(HAVE_ZLIB), 1) ZLIB_MSG := ==> building zstd with .gz compression support ZLIBCPP = -DZSTD_GZCOMPRESS -DZSTD_GZDECOMPRESS @@ -167,7 +167,7 @@ endif # lzma detection NO_LZMA_MSG := ==> no liblzma, building zstd without .xz/.lzma support -HAVE_LZMA := $(shell printf '$(NUM_SYMBOL)include \nint main(void) { return 0; }' > have_lzma.c && $(CC) $(FLAGS) -o have_lzma$(EXT) have_lzma.c -llzma 2> $(VOID) && rm have_lzma$(EXT) && echo 1 || echo 0; rm have_lzma.c) +HAVE_LZMA ?= $(shell printf '$(NUM_SYMBOL)include \nint main(void) { return 0; }' > have_lzma.c && $(CC) $(FLAGS) -o have_lzma$(EXT) have_lzma.c -llzma 2> $(VOID) && rm have_lzma$(EXT) && echo 1 || echo 0; rm have_lzma.c) ifeq ($(HAVE_LZMA), 1) LZMA_MSG := ==> building zstd with .xz/.lzma compression support LZMACPP = -DZSTD_LZMACOMPRESS -DZSTD_LZMADECOMPRESS @@ -178,7 +178,7 @@ endif # lz4 detection NO_LZ4_MSG := ==> no liblz4, building zstd without .lz4 support -HAVE_LZ4 := $(shell printf '$(NUM_SYMBOL)include \n$(NUM_SYMBOL)include \nint main(void) { return 0; }' > have_lz4.c && $(CC) $(FLAGS) -o have_lz4$(EXT) have_lz4.c -llz4 2> $(VOID) && rm have_lz4$(EXT) && echo 1 || echo 0; rm have_lz4.c) +HAVE_LZ4 ?= $(shell printf '$(NUM_SYMBOL)include \n$(NUM_SYMBOL)include \nint main(void) { return 0; }' > have_lz4.c && $(CC) $(FLAGS) -o have_lz4$(EXT) have_lz4.c -llz4 2> $(VOID) && rm have_lz4$(EXT) && echo 1 || echo 0; rm have_lz4.c) ifeq ($(HAVE_LZ4), 1) LZ4_MSG := ==> building zstd with .lz4 compression support LZ4CPP = -DZSTD_LZ4COMPRESS -DZSTD_LZ4DECOMPRESS diff --git a/tests/playTests.sh b/tests/playTests.sh index d83001fee..774655aa9 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -166,7 +166,8 @@ if [ -z "${DATAGEN_BIN}" ]; then DATAGEN_BIN="$TESTDIR/datagen" fi -ZSTD_BIN="$EXE_PREFIX$ZSTD_BIN" +# Why was this line here ? Generates a strange ZSTD_BIN when EXE_PREFIX is non empty +# ZSTD_BIN="$EXE_PREFIX$ZSTD_BIN" # assertions [ -n "$ZSTD_BIN" ] || die "zstd not found at $ZSTD_BIN! \n Please define ZSTD_BIN pointing to the zstd binary. You might also consider rebuilding zstd follwing the instructions in README.md" From 74b4171fb834c3dbab8e5939d3d7abd46d25b60b Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Sun, 29 Aug 2021 19:05:04 -0700 Subject: [PATCH 4/6] fix alignment condition in FSE_buildCTable 2-bytes alignment is enough for 16-bit fields --- lib/compress/fse_compress.c | 47 +++++++++++--------------- lib/compress/zstd_compress_sequences.c | 7 ++-- 2 files changed, 23 insertions(+), 31 deletions(-) diff --git a/lib/compress/fse_compress.c b/lib/compress/fse_compress.c index 52e0bdf2c..16948245e 100644 --- a/lib/compress/fse_compress.c +++ b/lib/compress/fse_compress.c @@ -78,12 +78,11 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, U32 const maxSV1 = maxSymbolValue+1; U16* cumul = (U16*)workSpace; /* size = maxSV1 */ - FSE_FUNCTION_TYPE* tableSymbol = (FSE_FUNCTION_TYPE*)(cumul + (maxSV1+1)); /* size = tableSize */ - BYTE* spread = tableSymbol + tableSize; /* size = tableSize */ + FSE_FUNCTION_TYPE* const tableSymbol = (FSE_FUNCTION_TYPE*)(cumul + (maxSV1+1)); /* size = tableSize */ U32 highThreshold = tableSize-1; - if ((size_t)workSpace & 3) return ERROR(GENERIC); /* Must be 4 byte aligned */ + assert(((size_t)workSpace & 1) == 0); /* Must be 2 bytes-aligned */ if (FSE_BUILD_CTABLE_WORKSPACE_SIZE(maxSymbolValue, tableLog) > wkspSize) return ERROR(tableLog_tooLarge); /* CTable header */ tableU16[-2] = (U16) tableLog; @@ -105,7 +104,9 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, cumul[u] = cumul[u-1] + 1; tableSymbol[highThreshold--] = (FSE_FUNCTION_TYPE)(u-1); } else { - cumul[u] = cumul[u-1] + normalizedCounter[u-1]; + assert(normalizedCounter[u-1] >= 0); + cumul[u] = cumul[u-1] + (U16)normalizedCounter[u-1]; + assert(cumul[u] >= cumul[u-1]); /* no overflow */ } } cumul[maxSV1] = (U16)(tableSize+1); } @@ -115,8 +116,8 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, /* Case for no low prob count symbols. Lay down 8 bytes at a time * to reduce branch misses since we are operating on a small block */ - { - U64 const add = 0x0101010101010101ull; + BYTE* const spread = tableSymbol + tableSize; /* size = tableSize */ + { U64 const add = 0x0101010101010101ull; size_t pos = 0; U64 sv = 0; U32 s; @@ -127,15 +128,15 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, for (i = 8; i < n; i += 8) { MEM_write64(spread + pos + i, sv); } - pos += n; + assert(n>=0); + pos += (size_t)n; } } /* Spread symbols across the table. Lack of lowprob symbols means that * we don't need variable sized inner loop, so we can unroll the loop and * reduce branch misses. */ - { - size_t position = 0; + { size_t position = 0; size_t s; size_t const unroll = 2; /* Experimentally determined optimal unroll */ assert(tableSize % unroll == 0); /* FSE_MIN_TABLELOG is 5 */ @@ -147,7 +148,7 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, } position = (position + (unroll * step)) & tableMask; } - assert(position == 0); + assert(position == 0); /* Must have initialized all positions */ } } else { U32 position = 0; @@ -161,7 +162,6 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, while (position > highThreshold) position = (position + step) & tableMask; /* Low proba area */ } } - assert(position==0); /* Must have initialized all positions */ } @@ -185,16 +185,17 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, case -1: case 1: symbolTT[s].deltaNbBits = (tableLog << 16) - (1< 1); + { U32 const maxBitsOut = tableLog - BIT_highbit32 ((U32)normalizedCounter[s]-1); + U32 const minStatePlus = (U32)normalizedCounter[s] << maxBitsOut; symbolTT[s].deltaNbBits = (maxBitsOut << 16) - minStatePlus; - symbolTT[s].deltaFindState = total - normalizedCounter[s]; - total += normalizedCounter[s]; + symbolTT[s].deltaFindState = (int)(total - (unsigned)normalizedCounter[s]); + total += (unsigned)normalizedCounter[s]; } } } } #if 0 /* debug : symbol costs */ @@ -205,26 +206,16 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, symbol, normalizedCounter[symbol], FSE_getMaxNbBits(symbolTT, symbol), (double)FSE_bitCost(symbolTT, tableLog, symbol, 8) / 256); - } - } + } } #endif return 0; } -#ifndef ZSTD_NO_UNUSED_FUNCTIONS -size_t FSE_buildCTable(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog) -{ - FSE_FUNCTION_TYPE tableSymbol[FSE_MAX_TABLESIZE]; /* memset() is not necessary, even if static analyzer complain about it */ - return FSE_buildCTable_wksp(ct, normalizedCounter, maxSymbolValue, tableLog, tableSymbol, sizeof(tableSymbol)); -} -#endif - #ifndef FSE_COMMONDEFS_ONLY - /*-************************************************************** * FSE NCount encoding ****************************************************************/ diff --git a/lib/compress/zstd_compress_sequences.c b/lib/compress/zstd_compress_sequences.c index 611eabdcb..44e1728ff 100644 --- a/lib/compress/zstd_compress_sequences.c +++ b/lib/compress/zstd_compress_sequences.c @@ -275,10 +275,11 @@ ZSTD_buildCTable(void* dst, size_t dstCapacity, assert(nbSeq_1 > 1); assert(entropyWorkspaceSize >= sizeof(ZSTD_BuildCTableWksp)); (void)entropyWorkspaceSize; - FORWARD_IF_ERROR(FSE_normalizeCount(wksp->norm, tableLog, count, nbSeq_1, max, ZSTD_useLowProbCount(nbSeq_1)), ""); - { size_t const NCountSize = FSE_writeNCount(op, oend - op, wksp->norm, max, tableLog); /* overflow protected */ + FORWARD_IF_ERROR(FSE_normalizeCount(wksp->norm, tableLog, count, nbSeq_1, max, ZSTD_useLowProbCount(nbSeq_1)), "FSE_normalizeCount failed"); + assert(oend >= op); + { size_t const NCountSize = FSE_writeNCount(op, (size_t)(oend - op), wksp->norm, max, tableLog); /* overflow protected */ FORWARD_IF_ERROR(NCountSize, "FSE_writeNCount failed"); - FORWARD_IF_ERROR(FSE_buildCTable_wksp(nextCTable, wksp->norm, max, tableLog, wksp->wksp, sizeof(wksp->wksp)), ""); + FORWARD_IF_ERROR(FSE_buildCTable_wksp(nextCTable, wksp->norm, max, tableLog, wksp->wksp, sizeof(wksp->wksp)), "FSE_buildCTable_wksp failed"); return NCountSize; } } From 2b27d07d06df02b0c0356c3c95b5a1ad05b0c1c4 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Sun, 29 Aug 2021 21:39:06 -0700 Subject: [PATCH 5/6] attempt at adding m68k qemu tests with optional success (for the time being) --- .github/workflows/dev-short-tests.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/dev-short-tests.yml b/.github/workflows/dev-short-tests.yml index eca24be1c..710a949b9 100644 --- a/.github/workflows/dev-short-tests.yml +++ b/.github/workflows/dev-short-tests.yml @@ -213,6 +213,7 @@ jobs: { name: PPC64LE, xcc_pkg: gcc-powerpc64le-linux-gnu, xcc: powerpc64le-linux-gnu-gcc, xemu_pkg: qemu-system-ppc, xemu: qemu-ppc64le-static }, { name: S390X, xcc_pkg: gcc-s390x-linux-gnu, xcc: s390x-linux-gnu-gcc, xemu_pkg: qemu-system-s390x, xemu: qemu-s390x-static }, { name: MIPS, xcc_pkg: gcc-mips-linux-gnu, xcc: mips-linux-gnu-gcc, xemu_pkg: qemu-system-mips, xemu: qemu-mips-static }, + { name: M68K, xcc_pkg: gcc-m68k-linux-gnu, xcc: m68k-linux-gnu-gcc, xemu_pkg: qemu-system-m68k, xemu: qemu-m68k-static }, ] env: # Set environment variables XCC: ${{ matrix.xcc }} @@ -251,6 +252,11 @@ jobs: if: ${{ matrix.name == 'MIPS' }} run: | LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check + - name: M68K + if: ${{ matrix.name == 'M68K' }} + continue-on-error: true + run: | + LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check # For reference : icc tests From 333ecf6865e8ea1a1c7b2f5618e7c6f045f86b26 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 30 Aug 2021 06:37:50 -0700 Subject: [PATCH 6/6] add powerpc qemu emulation --- .github/workflows/dev-short-tests.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/dev-short-tests.yml b/.github/workflows/dev-short-tests.yml index 710a949b9..86f2382f7 100644 --- a/.github/workflows/dev-short-tests.yml +++ b/.github/workflows/dev-short-tests.yml @@ -210,6 +210,7 @@ jobs: include: [ { name: ARM, xcc_pkg: gcc-arm-linux-gnueabi, xcc: arm-linux-gnueabi-gcc, xemu_pkg: qemu-system-arm, xemu: qemu-arm-static }, { name: ARM64, xcc_pkg: gcc-aarch64-linux-gnu, xcc: aarch64-linux-gnu-gcc, xemu_pkg: qemu-system-arm, xemu: qemu-aarch64-static }, + { name: PPC, xcc_pkg: gcc-powerpc-linux-gnu, xcc: powerpc-linux-gnu-gcc, xemu_pkg: qemu-system-ppc, xemu: qemu-ppc-static }, { name: PPC64LE, xcc_pkg: gcc-powerpc64le-linux-gnu, xcc: powerpc64le-linux-gnu-gcc, xemu_pkg: qemu-system-ppc, xemu: qemu-ppc64le-static }, { name: S390X, xcc_pkg: gcc-s390x-linux-gnu, xcc: s390x-linux-gnu-gcc, xemu_pkg: qemu-system-s390x, xemu: qemu-s390x-static }, { name: MIPS, xcc_pkg: gcc-mips-linux-gnu, xcc: mips-linux-gnu-gcc, xemu_pkg: qemu-system-mips, xemu: qemu-mips-static }, @@ -240,6 +241,10 @@ jobs: if: ${{ matrix.name == 'ARM64' }} run: | LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check + - name: PPC + if: ${{ matrix.name == 'PPC' }} + run: | + LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check - name: PPC64LE if: ${{ matrix.name == 'PPC64LE' }} run: | @@ -254,7 +259,7 @@ jobs: LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check - name: M68K if: ${{ matrix.name == 'M68K' }} - continue-on-error: true + continue-on-error: true # disable reporting errors (alignment issues) run: | LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check