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))
+ 

Reply via email to