George Koehler <[email protected]> writes:
> On Wed, 23 Feb 2022 09:12:34 +0100
> Omar Polo <[email protected]> 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))
+