> https://marc.info/?l=openbsd-ports&m=156555554325765&w=2
As promised, here is the conversion from __sync_* to __atomic_* functions, allowing godot to build on macppc at least, and maybe hppa, on top of the ports-gcc/sparc64 fixes, that Thomas committed a few hours ago. The patch was originally written for godot-3.1.1, and has been upstreamed [0]. I backported it for godot-3.0.6, it builds successfully on amd64 and macppc. Due to relocations errors, i had to add address relaxing and long calls. Runtime cannot be tested with my video card (radeon 9700) with 3.0.6, because it requires OpenGL(ES) 3, even for opening the editor, unlike godot-3.1.1. Comments/feedback are welcome, Charlène. [0] https://github.com/godotengine/godot/pull/31321 Index: Makefile =================================================================== RCS file: /cvs/ports/games/godot/Makefile,v retrieving revision 1.8 diff -u -p -u -p -r1.8 Makefile --- Makefile 16 Aug 2019 15:38:15 -0000 1.8 +++ Makefile 16 Aug 2019 22:02:03 -0000 @@ -8,7 +8,7 @@ PKGNAME = godot-${V} CATEGORIES = games HOMEPAGE = https://godotengine.org/ MAINTAINER = Thomas Frohwein <t...@openbsd.org> -REVISION = 2 +REVISION = 3 # MIT PERMIT_PACKAGE = Yes @@ -68,6 +68,18 @@ LIB_DEPENDS = archivers/zstd \ net/enet NO_TEST = Yes + +.if ${MACHINE_ARCH:Mhppa} || ${MACHINE_ARCH:Mpowerpc} +LDFLAGS += -latomic +WANTLIB += atomic +.endif + +# Fix relocation overflows +.if ${MACHINE_ARCH:Mpowerpc} +CFLAGS += -mlongcall +CXXFLAGS += -mlongcall +LDFLAGS += -Wl,--relax +.endif pre-configure: ${SUBST_CMD} ${WRKSRC}/drivers/unix/os_unix.cpp Index: patches/patch-core_safe_refcount_h =================================================================== RCS file: patches/patch-core_safe_refcount_h diff -N patches/patch-core_safe_refcount_h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-core_safe_refcount_h 16 Aug 2019 22:02:03 -0000 @@ -0,0 +1,68 @@ +$OpenBSD$ + +hppa, ppc: use __atomic functions as 64-bit __sync operators +are not supported, from: +https://github.com/godotengine/godot/pull/31321 + +Index: core/safe_refcount.h +--- core/safe_refcount.h.orig ++++ core/safe_refcount.h +@@ -99,8 +99,8 @@ static _ALWAYS_INLINE_ T atomic_exchange_if_greater(re + + /* Implementation for GCC & Clang */ + +-// GCC guarantees atomic intrinsics for sizes of 1, 2, 4 and 8 bytes. +-// Clang states it supports GCC atomic builtins. ++#include <stdbool.h> ++#include <atomic> + + template <class T> + static _ALWAYS_INLINE_ T atomic_conditional_increment(register T *pw) { +@@ -109,7 +109,7 @@ static _ALWAYS_INLINE_ T atomic_conditional_increment( + T tmp = static_cast<T const volatile &>(*pw); + if (tmp == 0) + return 0; // if zero, can't add to it anymore +- if (__sync_val_compare_and_swap(pw, tmp, tmp + 1) == tmp) ++ if (__atomic_compare_exchange_n(pw, &tmp, tmp + 1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST) == true) + return tmp + 1; + } + } +@@ -117,25 +117,25 @@ static _ALWAYS_INLINE_ T atomic_conditional_increment( + template <class T> + static _ALWAYS_INLINE_ T atomic_decrement(register T *pw) { + +- return __sync_sub_and_fetch(pw, 1); ++ return __atomic_sub_fetch(pw, 1, __ATOMIC_SEQ_CST); + } + + template <class T> + static _ALWAYS_INLINE_ T atomic_increment(register T *pw) { + +- return __sync_add_and_fetch(pw, 1); ++ return __atomic_add_fetch(pw, 1, __ATOMIC_SEQ_CST); + } + + template <class T, class V> + static _ALWAYS_INLINE_ T atomic_sub(register T *pw, register V val) { + +- return __sync_sub_and_fetch(pw, val); ++ return __atomic_sub_fetch(pw, val, __ATOMIC_SEQ_CST); + } + + template <class T, class V> + static _ALWAYS_INLINE_ T atomic_add(register T *pw, register V val) { + +- return __sync_add_and_fetch(pw, val); ++ return __atomic_add_fetch(pw, val, __ATOMIC_SEQ_CST); + } + + template <class T, class V> +@@ -145,7 +145,7 @@ static _ALWAYS_INLINE_ T atomic_exchange_if_greater(re + T tmp = static_cast<T const volatile &>(*pw); + if (tmp >= val) + return tmp; // already greater, or equal +- if (__sync_val_compare_and_swap(pw, tmp, val) == tmp) ++ if (__atomic_compare_exchange_n(pw, &tmp, val, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST) == true) + return val; + } + }