zstd is broken on sparc64 due to unaligned accesses resulting in bus
errors. Since __GNUC__ is defined and MEM_FORCE_MEMORY_ACCESS isn't
defined, it defaults to 1, and we run into these:

https://github.com/facebook/zstd/blob/1be95291a89160be121c987c2e385331a65a4a0e/lib/common/mem.h#L192-L199

One simple fix is to define MEM_FORCE_MEMORY_ACCESS to 0 via CPPFLAGS.
This forces all platforms to use memcpy, which may or may not result in
some slowdown. We can consider more elaborate platform-specific fixes if
that is desired, but then I need instructions.

With this diff, the cmake test for zstd doesn't abort with a bus error,
which allows me to build qt6/qtbase on sparc64, and in turn we should
get a sizable chunk of the tree back to building.

Index: Makefile
===================================================================
RCS file: /cvs/ports/archivers/zstd/Makefile,v
retrieving revision 1.43
diff -u -p -r1.43 Makefile
--- Makefile    11 Feb 2023 22:04:54 -0000      1.43
+++ Makefile    3 Mar 2023 00:06:05 -0000
@@ -2,6 +2,7 @@ COMMENT =               zstandard fast real-time comp
 
 V =                    1.5.4
 DISTNAME =             zstd-${V}
+REVISION =             0
 
 SHARED_LIBS =          zstd    6.2     # 1.5.4
 
@@ -23,12 +24,15 @@ LIB_DEPENDS =               archivers/lz4 \
 BUILD_DEPENDS =                sysutils/ggrep
 
 MAKE_ENV =             CC="${CC}" \
-                       CPPFLAGS="-I${LOCALBASE}/include" \
+                       CPPFLAGS="${CPPFLAGS} -I${LOCALBASE}/include" \
                        LDFLAGS="${LDFLAGS} -L${LOCALBASE}/lib"
 MAKE_FLAGS =           SHARED_EXT_VER="so.$(LIBzstd_VERSION)" \
                        SONAME_FLAGS= \
                        V=1
 FAKE_FLAGS =           PREFIX="${PREFIX}"
+
+# Avoid unaligned access; use memcpy.
+CPPFLAGS +=            -DMEM_FORCE_MEMORY_ACCESS=0
 
 USE_GMAKE =            Yes
 

Reply via email to