On Tue, Feb 22, 2022 at 11:58:49PM -0500, George Koehler wrote:
> On Wed, 23 Feb 2022 00:08:34 +0100
> Omar Polo <o...@openbsd.org> wrote:
> 
> > I think I've finally solved it.  The problem is that contrib/sb-capstone
> > hardcodes some values from capstone.h so lisp can call the C functions.
> > This "transcription" however is not accurate and worked until now by
> > pure chance on 64 bit arches due to how arguments are passed and struct
> > padding, pure luck!
> 
> I tried to patch capstone.lisp but didn't fix my build.  Your patch
> looks better, but I haven't built it.  I have comments below.
> 
> The build deletes every *.orig and breaks "make update-patches", so
> I started using "PATCHORIG= .orig.port".  Joshua Elsasser, as the
> maintainer, do you have an opinion about PATCHORIG?

I will try to find some time to take a look at it this week. For what
it's worth, 32-bit powerpc is usually a bit broken on non-openbsd
platforms as well. I have a couple g4 mac minis that I can test on,
assuming they haven't died.

Switching to ECL as the cross-build host is something what we probably
want to do, as it would also allow sbcl to be build on arm and
arm64. I had a version of the port which did this but as you saw, it
was rather slower than with clisp.

> Go down for patch comments.
> 
> > Index: Makefile
> > ===================================================================
> > RCS file: /cvs/ports/lang/sbcl/Makefile,v
> > retrieving revision 1.47
> > diff -u -p -r1.47 Makefile
> > --- Makefile        31 Dec 2021 09:53:11 -0000      1.47
> > +++ Makefile        22 Feb 2022 23:07:25 -0000
> > @@ -1,31 +1,12 @@
> >  # $OpenBSD: Makefile,v 1.47 2021/12/31 09:53:11 solene Exp $
> >  
> > -BROKEN-i386 =              build fails in "Compiling file 
> > [...]/src/compiler/generic/genesis.lisp"
> > -# ;; Compiling file 
> > /pobj/sbcl-2.0.1/sbcl-2.0.1/src/compiler/generic/genesis.lisp ...
> > -# ;; Wrote file 
> > /pobj/sbcl-2.0.1/sbcl-2.0.1/obj/from-host/src/compiler/generic/genesis.fas-tmp
> > -# 0 errors, 0 warnings
> > -# ;;  Loading file obj/from-host/src/compiler/generic/genesis.fas ...
> > -# ;;  Loaded file obj/from-host/src/compiler/generic/genesis.fas
> > -# *** - OPEN: File
> > -#       #P"/pobj/sbcl-2.0.1/sbcl-2.0.1/obj/from-xc/tls-init.lisp-expr" 
> > does not
> > -#       exist
> > -# The following restarts are available:
> > -# SKIP           :R1      skip (GENESIS OBJECT-FILE-NAMES # ...)
> > -# RETRY          :R2      retry (GENESIS OBJECT-FILE-NAMES # ...)
> > -# STOP           :R3      stop loading file 
> > /pobj/sbcl-2.0.1/sbcl-2.0.1/make-genesis-2.lisp
> > -# ABORT-BUILD    :R4      Abort building SBCL.
> > -# ABORT          :R5      Abort main loop
> > -# //testing for consistency of first and second GENESIS passes
> > -# diff: output/genesis-2: No such file or directory   
> > -# error: header files do not match between first and second GENESIS
> > -
> >  # not yet ported to other arches
> >  ONLY_FOR_ARCHS =   amd64 i386 powerpc
> >  USE_WXNEEDED =             Yes
> >  
> >  COMMENT=           compiler and runtime system for ANSI Common Lisp
> >  
> > -V =                        2.1.11
> > +V =                        2.2.1
> >  DISTNAME=          sbcl-${V}-source
> >  PKGNAME=           sbcl-${V}
> >  WRKDIST=           ${WRKDIR}/sbcl-${V}
> > @@ -58,10 +39,17 @@ WANTLIB+=               pthread
> >  MAKE_PARAMS +=             --with-sb-core-compression \
> >                     --with-sb-xref-for-internals
> >  
> > +# contrib/sb-capstone/test.lisp opens it at build-time if present
> > +BUILD_DEPENDS =            devel/capstone/main
> > +
> >  .if ${FLAVOR:Mnative_bootstrap}
> >  BUILD_DEPENDS+=            lang/sbcl
> >  BOOTSTRAP_CMD=             ${LOCALBASE}/bin/sbcl \
> >                     --disable-debugger --no-sysinit --no-userinit
> > +.elif ${MACHINE_ARCH:Mi386}
> > +# ecl is way slower but clips fails to build sbcl on i386
> > +BUILD_DEPENDS +=   lang/ecl
> > +BOOTSTRAP_CMD =            ${LOCALBASE}/bin/ecl -q --norc
> >  .else
> >  BUILD_DEPENDS +=   lang/clisp
> >  BOOTSTRAP_CMD =            ${LOCALBASE}/bin/clisp -q -norc
> > Index: distinfo
> > ===================================================================
> > RCS file: /cvs/ports/lang/sbcl/distinfo,v
> > retrieving revision 1.21
> > diff -u -p -r1.21 distinfo
> > --- distinfo        31 Dec 2021 09:53:11 -0000      1.21
> > +++ distinfo        22 Feb 2022 23:07:25 -0000
> > @@ -1,2 +1,2 @@
> > -SHA256 (sbcl-2.1.11-source.tar.bz2) = 
> > v8FIHef9vfru8qsPDo6E79NDQz3qjSHPvqiwFGy9/v0=
> > -SIZE (sbcl-2.1.11-source.tar.bz2) = 6687529
> > +SHA256 (sbcl-2.2.1-source.tar.bz2) = 
> > Xdbm4/CLfG7fJioOhEqfi15WLMoIFVA0wfLAFPyQh9o=
> > +SIZE (sbcl-2.2.1-source.tar.bz2) = 6701705
> > Index: patches/patch-contrib_sb-capstone_capstone_lisp
> > ===================================================================
> > RCS file: patches/patch-contrib_sb-capstone_capstone_lisp
> > diff -N patches/patch-contrib_sb-capstone_capstone_lisp
> > --- /dev/null       1 Jan 1970 00:00:00 -0000
> > +++ patches/patch-contrib_sb-capstone_capstone_lisp 22 Feb 2022 23:07:25 
> > -0000
> > @@ -0,0 +1,26 @@
> > +$OpenBSD$
> > +
> > +sync a couple of size mismatches with capstone.h; fixes the build on
> > +32bit arches (i386, powerpc.)
> > +
> > +Index: contrib/sb-capstone/capstone.lisp
> > +--- contrib/sb-capstone/capstone.lisp.orig
> > ++++ contrib/sb-capstone/capstone.lisp
> > +@@ -285,7 +285,7 @@
> > + (define-alien-type cs-insn
> > +     (struct nil
> > +             (insn-id int)
> > +-            (insn-addr unsigned)
> > ++            (insn-addr (integer 64))
> > +             (insn-size short)
> > +             (insn-bytes (array char 16))
> > +             (insn-mnemonic (array char 32))
> 
> I guess that it should be (insn-addr (unsigned 64)), to match the
> capstone.h's struct cs_insn's uint64_t address.
> 
> I have not called C from Lisp before now, so sb-alien confused me.
> I now believe that "integer" and "unsigned" have pointer size, but
> "int" and "unsigned-int" have 32 bits.  So "unsigned" had 64 bits
> on amd64, or 32 bits on i386|powerpc.
> 
> > +@@ -310,7 +310,7 @@
> > + 
> > + ;; The handle returned by cs-open will be represented as being of type 
> > unsigned
> > + 
> > +-(define-alien-routine cs-open int (arch int) (mode (integer 64)) (handle 
> > unsigned :out))
> > ++(define-alien-routine cs-open int (arch int) (mode unsigned) (handle 
> > unsigned :out))
> > + 
> > + (define-alien-routine cs-version unsigned (major int :out) (minor int 
> > :out))
> > + 
> 
> cs-open should have "(mode int)".  <capstone.h> has "cs_mode mode" and
> powerpc clang says that "(cs_mode)-1 > 0" is false, implying that
> cs_mode is a signed type.
> 
> I also think that cs-version should return "unsigned-int" (32 bits),
> not "unsigned" (64 bits on amd64), though I suspect that amd64
> tolerates the wrong size.
> 
> --George

Reply via email to