George Koehler <kern...@gmail.com> writes: > On Wed, 23 Feb 2022 09:12:34 +0100 > Omar Polo <o...@openbsd.org> wrote: > >> I've yet to find a list of types and their counterpart in C in the sbcl >> documentation, I'm only finding stuff for sb-groveler which uses >> sb-alien. Anyway, I *think* that `integer' and `unsigned' should mirror >> their C counterpart (int and unsigned int), so 32 bit on amd64, i386 and >> powerpc. > > src/compiler/x86-64/parms.lisp: > (in-package "SB-VM") ... > (defconstant n-word-bits 64) > > src/code/alieneval.lisp: > (define-alien-type-translator unsigned (&optional (bits sb-vm:n-word-bits)) > (make-alien-integer-type :bits bits :signed nil)) > > src/code/target-c-call.lisp > (define-alien-type unsigned-int (unsigned 32)) > > Looks like unsigned defaults to (unsigned 64) on amd64. Capstone > handles are size_t in C and unsigned in Lisp; size_t has 64 bits on > amd64, so handles are correct only if unsigned is (unsigned 64):
right, I should have looked the sources, it wasn't hidden after all, apologies. > [...] > >> That was my first thought as well, but the third test fails if `mode' is >> `int': >> >> Test SB-CAPSTONE-TESTS::PPC-BIG-ENDIAN failed >> Form: (SB-CAPSTONE-TESTS::CAPSTONE-CHECK '(124 8 2 166) '(:PPC64 :BIG-ENDIAN) >> '("MFLR R0")) >> Expected value: T >> Actual value: #<TYPE-ERROR expected-type: (SIGNED-BYTE 32) datum: >> 2147483656>. >> The value >> 2147483656 >> is not of type >> (SIGNED-BYTE 32) >> >> my reading is that capstone.lisp:get-cs-mode tries to set the most >> significant bit which is fine in C but sbcl begs to differ. (2147483656 >> is actually -2147483640 in base 2 complement if I'm doing the math >> right, or 0x80000008) > > Found it: <capstone.h> has CS_MODE_BIG_ENDIAN = 1 << 31 which > overflows to negative; clang says CS_MODE_BIG_ENDIAN < 0. > capstone.lisp has (defconstant cs-mode-big-endian (ash 1 31)) but Lisp > integers don't overflow. So you are correct: mode can't be signed. > > I believe that it should be (mode unsigned-int), not (mode unsigned). right Attaching an updated diff with the correct types (for cs-version too as you spotted in a previous mail.) With it I can successfully build sbcl and x11/stumpwm on i386. Since lang/ecl is significantly slower than lang/clisp I'm using ecl only on i386. I forgot to mention that running sbcl as normal user yields an error: chiaki$ uname -m i386 chiaki$ man sbcl chiaki$ /usr/local/bin/sbcl --noinform RUNTIME WARNING: data size resource limit may be too low, try decreasing the dynamic space size with --dynamic-space-size or raising the datasize or datasize-max limits in /etc/login.conf mmap: Cannot allocate memory fatal error encountered in SBCL pid 45001: Can't allocate 0x20000000 bytes for space 1 chiaki$ ulimit -m 2029792 but works with --dynamic-space-size 400 and when building stumpwm using the ports infrastructure and PORTS_PRIVSEP. 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 24 Feb 2022 10:22:51 -0000 @@ -1,35 +1,17 @@ # $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} EXTRACT_SUFX= .tar.bz2 +PATCHORIG = .orig.port CATEGORIES= lang HOMEPAGE= http://www.sbcl.org/ @@ -58,10 +40,17 @@ WANTLIB+= pthread MAKE_PARAMS += --with-sb-core-compression \ --with-sb-xref-for-internals +# contrib/sb-capstone/test.lisp uses 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 slower but lang/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 24 Feb 2022 10:22:51 -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 24 Feb 2022 10:22:51 -0000 @@ -0,0 +1,29 @@ +$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 (unsigned 64)) + (insn-size short) + (insn-bytes (array char 16)) + (insn-mnemonic (array char 32)) +@@ -310,9 +310,9 @@ + + ;; 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-int) (handle unsigned :out)) + +-(define-alien-routine cs-version unsigned (major int :out) (minor int :out)) ++(define-alien-routine cs-version unsigned-int (major int :out) (minor int :out)) + + (define-alien-routine cs-close int (handle unsigned :in-out)) +