On Wed, Jul 29, 2020 at 11:05:31PM -0400, George Koehler wrote:
> On Wed, 29 Jul 2020 01:25:00 -0400
> Kurt Mosiejczuk <k...@cranky.work> wrote:

> > I gave building it a try, it died early on with:

> > /usr/ports/pobj/ecl-20.4.24/ecl-20.4.24/build/ecl/ecl_atomics.h:39:4: 
> > error: #er
> > ror "ECL needs AO_fetch_compare_and_swap or an equivalent"
> >  #  error "ECL needs AO_fetch_compare_and_swap or an equivalent"

> Thank you for the speedy test.  libatomic_ops in devel/boehm-gc is
> missing AO_fetch_compare_and_swap for sparc.  It's still missing
> upstream:

> https://github.com/ivmai/libatomic_ops/blob/master/src/atomic_ops/sysdeps/gcc/sparc.h#L64

> In this diff to devel/boehm-gc, I have tried to provide the missing
> function (by copying AO_compare_and_swap_full, guessing, and referring
> to SPARCV9.pdf, A.9 Compare and Swap, page 129), but I don't know
> whether it compiles.  Even if it compiles, if sparc64 will have the
> ecl_symbol_value bug, we won't know if it works.  I left my other
> local changes (mmap and powerpc64) in the diff.

> I describe the 64-bit big-endian ecl_symbol_value bug at
> https://gitlab.com/embeddable-common-lisp/ecl/-/issues/604

Unfortunately, even with boehm-gc compiled with this, ecl fails to
build with the same message.

--Kurt

> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/devel/boehm-gc/Makefile,v
> retrieving revision 1.74
> diff -u -p -r1.74 Makefile
> --- Makefile  4 Apr 2020 20:59:41 -0000       1.74
> +++ Makefile  30 Jul 2020 02:37:28 -0000
> @@ -12,7 +12,7 @@ DISTNAME=   gc-${VERSION}
>  
>  PKGNAME-atomic=      libatomic_ops-${LIBAO_VERSION}
>  PKGNAME-main=        boehm-gc-${VERSION}
> -REVISION=    5
> +REVISION=    6
>  
>  DISTFILES=   ${DISTNAME}${EXTRACT_SUFX} \
>               libatomic_ops-${LIBAO_VERSION}${EXTRACT_SUFX}
> Index: patches/patch-include_private_gcconfig_h
> ===================================================================
> RCS file: /cvs/ports/devel/boehm-gc/patches/patch-include_private_gcconfig_h,v
> retrieving revision 1.22
> diff -u -p -r1.22 patch-include_private_gcconfig_h
> --- patches/patch-include_private_gcconfig_h  15 Apr 2017 14:02:46 -0000      
> 1.22
> +++ patches/patch-include_private_gcconfig_h  30 Jul 2020 02:37:28 -0000
> @@ -1,12 +1,25 @@
>  $OpenBSD: patch-include_private_gcconfig_h,v 1.22 2017/04/15 14:02:46 naddy 
> Exp $
>  
> +- use mmap, not sbrk, on OpenBSD
>  - All OpenBSD mips platforms are 64-bit, so correct the wordsize and 
> alignment
>  - use __data_start instead of _fdata on OpenBSD/mips64
> -- add support for OpenBSD/aarch64
> +- add support for OpenBSD/aarch64 and powerpc64
>  
> ---- include/private/gcconfig.h.orig  Tue Aug  2 21:36:14 2016
> -+++ include/private/gcconfig.h       Fri Apr 14 17:44:40 2017
> -@@ -102,7 +102,8 @@
> +Index: include/private/gcconfig.h
> +--- include/private/gcconfig.h.orig
> ++++ include/private/gcconfig.h
> +@@ -76,6 +76,10 @@
> + /* And one for OpenBSD: */
> + # if defined(__OpenBSD__)
> + #    define OPENBSD
> ++#    ifndef USE_MMAP
> ++#      define USE_MMAP
> ++#    endif
> ++#    define USE_MMAP_ANON
> + # endif
> + 
> + /* And one for FreeBSD: */
> +@@ -102,7 +106,8 @@
>   # endif
>   # if defined(__aarch64__)
>   #    define AARCH64
> @@ -16,7 +29,7 @@ $OpenBSD: patch-include_private_gcconfig
>   #      define NOSYS
>   #      define mach_type_known
>   #    endif
> -@@ -137,6 +138,10 @@
> +@@ -137,6 +142,10 @@
>   #    define ARM32
>   #    define mach_type_known
>   # endif
> @@ -27,7 +40,21 @@ $OpenBSD: patch-include_private_gcconfig
>   # if defined(OPENBSD) && defined(__sh__)
>   #    define SH
>   #    define mach_type_known
> -@@ -1712,14 +1717,15 @@
> +@@ -962,7 +971,12 @@
> + #   endif
> + #   ifdef OPENBSD
> + #     define OS_TYPE "OPENBSD"
> +-#     define ALIGNMENT 4
> ++#     if defined(__powerpc64__)
> ++#       define ALIGNMENT 8
> ++#       define CPP_WORDSZ 64
> ++#     else
> ++#       define ALIGNMENT 4
> ++#     endif
> + #     ifndef GC_OPENBSD_THREADS
> + #       include <sys/param.h>
> + #       include <uvm/uvm_extern.h>
> +@@ -1712,14 +1726,15 @@
>   #  endif
>   #  ifdef OPENBSD
>   #    define OS_TYPE "OPENBSD"
> @@ -46,7 +73,7 @@ $OpenBSD: patch-include_private_gcconfig
>        extern int _end[];
>   #    define DATAEND ((ptr_t)(&_end))
>   #    define DYNAMIC_LOADING
> -@@ -2165,6 +2171,19 @@
> +@@ -2165,6 +2180,19 @@
>         extern char etext[];
>   #     define DATASTART GC_FreeBSDGetDataStart(0x1000, (ptr_t)etext)
>   #     define DATASTART_USES_BSDGETDATASTART
> Index: patches/patch-libatomic_ops_src_atomic_ops_sysdeps_gcc_sparc_h
> ===================================================================
> RCS file: 
> /cvs/ports/devel/boehm-gc/patches/patch-libatomic_ops_src_atomic_ops_sysdeps_gcc_sparc_h,v
> retrieving revision 1.3
> diff -u -p -r1.3 patch-libatomic_ops_src_atomic_ops_sysdeps_gcc_sparc_h
> --- patches/patch-libatomic_ops_src_atomic_ops_sysdeps_gcc_sparc_h    4 Apr 
> 2020 20:59:41 -0000       1.3
> +++ patches/patch-libatomic_ops_src_atomic_ops_sysdeps_gcc_sparc_h    30 Jul 
> 2020 02:37:28 -0000
> @@ -2,6 +2,8 @@ $OpenBSD: patch-libatomic_ops_src_atomic
>  
>  Use the same type for input and output inline asm operands.
>  
> +Provide AO_fetch_compare_and_swap, needed by lang/ecl 20.4.24.
> +
>  Index: libatomic_ops/src/atomic_ops/sysdeps/gcc/sparc.h
>  --- libatomic_ops/src/atomic_ops/sysdeps/gcc/sparc.h.orig
>  +++ libatomic_ops/src/atomic_ops/sysdeps/gcc/sparc.h
> @@ -14,3 +16,26 @@ Index: libatomic_ops/src/atomic_ops/sysd
>     __asm__ __volatile__ ("membar #StoreLoad | #LoadLoad\n\t"
>   #                       if defined(__arch64__)
>                             "casx [%2],%0,%1\n\t"
> +@@ -61,7 +61,21 @@ AO_compare_and_swap_full(volatile AO_t *addr, AO_t old
> + }
> + #define AO_HAVE_compare_and_swap_full
> + 
> +-/* TODO: implement AO_fetch_compare_and_swap.   */
> ++AO_INLINE AO_t
> ++AO_fetch_compare_and_swap_full(volatile AO_t *addr, AO_t old, AO_t new_val) 
> {
> ++  __asm__ __volatile__ ("membar #StoreLoad | #LoadLoad\n\t"
> ++#                       if defined(__arch64__)
> ++                          "casx [%1],%2,%0\n\t"
> ++#                       else
> ++                          "cas [%1],%2,%0\n\t" /* 32-bit version */
> ++#                       endif
> ++                        "membar #StoreLoad | #StoreStore\n\t"
> ++                        : "+r" (new_val)
> ++                        : "r" (addr), "r" (old)
> ++                        : "memory");
> ++  return new_val;
> ++}
> ++#define AO_HAVE_fetch_compare_and_swap_full
> + #endif /* !AO_NO_SPARC_V9 */
> + 
> + /* TODO: Extend this for SPARC v8 and v9 (V8 also has swap, V9 has CAS, */
> 

Reply via email to