> 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;
+       }
+ }

Reply via email to