google / wuffs

Wrangling Untrusted File Formats Safely
Other
4.06k stars 129 forks source link

std/crc64 doesn't build for 32-bit x86 #145

Closed nigeltao closed 3 months ago

nigeltao commented 3 months ago

std/xz depends on std/crc64, which recently changed:

These new SSE4.2 intrinsics build fine on 64-bit x86 but not with the -m32 flag, because _mm_cvtsi64_si128 and _mm_extract_epi64 are apparently unsupported on 32-bit x86. Some GCC discussion:


$ gcc      -DWUFFS_CONFIG__FUZZLIB_MAIN fuzz/c/std/xz_fuzzer.c -o /dev/null

$ gcc -m32 -DWUFFS_CONFIG__FUZZLIB_MAIN fuzz/c/std/xz_fuzzer.c -o /dev/null
In file included from fuzz/c/std/xz_fuzzer.c:71:
fuzz/c/std/../../../release/c/wuffs-unsupported-snapshot.c: In function ‘wuffs_crc64__ecma_hasher__up_x86_sse42’:
fuzz/c/std/../../../release/c/wuffs-unsupported-snapshot.c:36935:10: warning: implicit declaration of function ‘_mm_cvtsi64_si128’; did you mean ‘_mm_cvtsi32_si128’? [-Wimplicit-function-declaration]
36935 |   v_s0 = _mm_cvtsi64_si128((int64_t)(v_s));
      |          ^~~~~~~~~~~~~~~~~
      |          _mm_cvtsi32_si128
fuzz/c/std/../../../release/c/wuffs-unsupported-snapshot.c:36935:10: error: incompatible types when assigning to type ‘__m128i’ from type ‘int’
fuzz/c/std/../../../release/c/wuffs-unsupported-snapshot.c:36964:21: warning: implicit declaration of function ‘_mm_extract_epi64’; did you mean ‘_mm_extract_si64’? [-Wimplicit-function-declaration]
36964 |   v_s = ((uint64_t)(_mm_extract_epi64(_mm_xor_si128(v_aa, _mm_xor_si128(v_w2, _mm_slli_si128(v_w1, (int32_t)(8u)))), (int32_t)(1u))));
      |                     ^~~~~~~~~~~~~~~~~
      |                     _mm_extract_si64

$ clang      -DWUFFS_CONFIG__FUZZLIB_MAIN fuzz/c/std/xz_fuzzer.c -o /dev/null

$ clang -m32 -DWUFFS_CONFIG__FUZZLIB_MAIN fuzz/c/std/xz_fuzzer.c -o /dev/null
In file included from fuzz/c/std/xz_fuzzer.c:71:
fuzz/c/std/../../../release/c/wuffs-unsupported-snapshot.c:36935:10: warning: implicit declaration of function '_mm_cvtsi64_si128' is invalid in C99 [-Wimplicit-function-declaration]
  v_s0 = _mm_cvtsi64_si128((int64_t)(v_s));
         ^
fuzz/c/std/../../../release/c/wuffs-unsupported-snapshot.c:36935:8: error: assigning to '__m128i' (vector of 2 'long long' values) from incompatible type 'int'
  v_s0 = _mm_cvtsi64_si128((int64_t)(v_s));
       ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fuzz/c/std/../../../release/c/wuffs-unsupported-snapshot.c:36964:21: warning: implicit declaration of function '_mm_extract_epi64' is invalid in C99 [-Wimplicit-function-declaration]
  v_s = ((uint64_t)(_mm_extract_epi64(_mm_xor_si128(v_aa, _mm_xor_si128(v_w2, _mm_slli_si128(v_w1, (int32_t)(8u)))), (int32_t)(1u))));
                    ^
2 warnings and 1 error generated.
nigeltao commented 3 months ago

Build failure was picked up by oss-fuzz:

https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=67858