diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml index 56b6324c5..b6793f9a4 100644 --- a/.github/workflows/test-build.yml +++ b/.github/workflows/test-build.yml @@ -86,6 +86,7 @@ jobs: if: needs.pre_job.outputs.should_skip != 'true' env: CC: clang + UBSAN_OPTIONS: halt_on_error=1 strategy: matrix: os: [ubuntu-latest, macos-latest] diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index b00cde28e..d35756d4e 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -2936,7 +2936,10 @@ bool AstNode::simplify(bool const_fold, int stage, int width_hint, bool sign_hin lsb_expr->children[stride_ix]->detectSignWidth(stride_width, stride_sign); max_width = std::max(i_width, stride_width); // Stride width calculated from actual stride value. - stride_width = std::ceil(std::log2(std::abs(stride))); + if (stride == 0) + stride_width = 0; + else + stride_width = std::ceil(std::log2(std::abs(stride))); if (i_width + stride_width > max_width) { // For (truncated) i*stride to be within the range of dst, the following must hold: diff --git a/kernel/celledges.cc b/kernel/celledges.cc index bad7124d9..68e55db02 100644 --- a/kernel/celledges.cc +++ b/kernel/celledges.cc @@ -253,13 +253,13 @@ void shift_op(AbstractCellEdgesDatabase *db, RTLIL::Cell *cell) if (a_width == 1 && is_signed) { int skip = 1 << (k + 1); int base = skip -1; - if (i % skip != base && i - a_width + 2 < 1 << b_width) + if (i % skip != base && i - a_width + 2 < 1 << b_width_capped) db->add_edge(cell, ID::B, k, ID::Y, i, -1); } else if (is_signed) { - if (i - a_width + 2 < 1 << b_width) + if (i - a_width + 2 < 1 << b_width_capped) db->add_edge(cell, ID::B, k, ID::Y, i, -1); } else { - if (i - a_width + 1 < 1 << b_width) + if (i - a_width + 1 < 1 << b_width_capped) db->add_edge(cell, ID::B, k, ID::Y, i, -1); } // right shifts diff --git a/libs/fst/00_PATCH_strict_alignment.patch b/libs/fst/00_PATCH_strict_alignment.patch new file mode 100644 index 000000000..77946824d --- /dev/null +++ b/libs/fst/00_PATCH_strict_alignment.patch @@ -0,0 +1,42 @@ +diff --git a/fastlz.cc b/fastlz.cc +index 3272ca7a8..41ea27a16 100644 +--- a/fastlz.cc ++++ b/fastlz.cc +@@ -60,24 +60,9 @@ + #endif + + /* +- * Prevent accessing more than 8-bit at once, except on x86 architectures. ++ * Yosys patch: do not do unaligned accesses on any platform + */ +-#if !defined(FASTLZ_STRICT_ALIGN) + #define FASTLZ_STRICT_ALIGN +-#if defined(__i386__) || defined(__386) /* GNU C, Sun Studio */ +-#undef FASTLZ_STRICT_ALIGN +-#elif defined(__i486__) || defined(__i586__) || defined(__i686__) || defined(__amd64) /* GNU C */ +-#undef FASTLZ_STRICT_ALIGN +-#elif defined(_M_IX86) /* Intel, MSVC */ +-#undef FASTLZ_STRICT_ALIGN +-#elif defined(__386) +-#undef FASTLZ_STRICT_ALIGN +-#elif defined(_X86_) /* MinGW */ +-#undef FASTLZ_STRICT_ALIGN +-#elif defined(__I86__) /* Digital Mars */ +-#undef FASTLZ_STRICT_ALIGN +-#endif +-#endif + + /* prototypes */ + int fastlz_compress(const void* input, int length, void* output); +@@ -88,11 +73,7 @@ int fastlz_decompress(const void* input, int length, void* output, int maxout); + #define MAX_LEN 264 /* 256 + 8 */ + #define MAX_DISTANCE 8192 + +-#if !defined(FASTLZ_STRICT_ALIGN) +-#define FASTLZ_READU16(p) *((const flzuint16*)(p)) +-#else + #define FASTLZ_READU16(p) ((p)[0] | (p)[1]<<8) +-#endif + + #define HASH_LOG 13 + #define HASH_SIZE (1<< HASH_LOG) diff --git a/libs/fst/00_UPDATE.sh b/libs/fst/00_UPDATE.sh index aef0e4fe8..7ab74d7cd 100755 --- a/libs/fst/00_UPDATE.sh +++ b/libs/fst/00_UPDATE.sh @@ -17,3 +17,4 @@ sed -i -e 's,"fastlz.c","fastlz.cc",' *.cc *.h patch -p0 < 00_PATCH_win_zlib.patch patch -p0 < 00_PATCH_win_io.patch +patch -p1 < 00_PATCH_strict_alignment.patch diff --git a/libs/fst/fastlz.cc b/libs/fst/fastlz.cc index 3272ca7a8..41ea27a16 100644 --- a/libs/fst/fastlz.cc +++ b/libs/fst/fastlz.cc @@ -60,24 +60,9 @@ #endif /* - * Prevent accessing more than 8-bit at once, except on x86 architectures. + * Yosys patch: do not do unaligned accesses on any platform */ -#if !defined(FASTLZ_STRICT_ALIGN) #define FASTLZ_STRICT_ALIGN -#if defined(__i386__) || defined(__386) /* GNU C, Sun Studio */ -#undef FASTLZ_STRICT_ALIGN -#elif defined(__i486__) || defined(__i586__) || defined(__i686__) || defined(__amd64) /* GNU C */ -#undef FASTLZ_STRICT_ALIGN -#elif defined(_M_IX86) /* Intel, MSVC */ -#undef FASTLZ_STRICT_ALIGN -#elif defined(__386) -#undef FASTLZ_STRICT_ALIGN -#elif defined(_X86_) /* MinGW */ -#undef FASTLZ_STRICT_ALIGN -#elif defined(__I86__) /* Digital Mars */ -#undef FASTLZ_STRICT_ALIGN -#endif -#endif /* prototypes */ int fastlz_compress(const void* input, int length, void* output); @@ -88,11 +73,7 @@ int fastlz_decompress(const void* input, int length, void* output, int maxout); #define MAX_LEN 264 /* 256 + 8 */ #define MAX_DISTANCE 8192 -#if !defined(FASTLZ_STRICT_ALIGN) -#define FASTLZ_READU16(p) *((const flzuint16*)(p)) -#else #define FASTLZ_READU16(p) ((p)[0] | (p)[1]<<8) -#endif #define HASH_LOG 13 #define HASH_SIZE (1<< HASH_LOG)