On Wed, 23 Feb 2022 00:08:34 +0100
Omar Polo <[email protected]> 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?
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