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

capstone.h:
typedef size_t csh;
...
CAPSTONE_EXPORT
cs_err CAPSTONE_API cs_open(cs_arch arch, cs_mode mode, csh *handle);

capstone.lisp:
(define-alien-routine cs-open int (arch int) (mode unsigned) (handle unsigned 
:out))

> 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).
--George

> Index: Makefile
> ===================================================================
> RCS file: /home/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  23 Feb 2022 09:03:58 -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: /home/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:36 -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   23 Feb 2022 08:55:36 
> -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 (unsigned 64))
> +             (insn-size short)
> +             (insn-bytes (array char 16))
> +             (insn-mnemonic (array char 32))
> +@@ -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))
> + 

Reply via email to