syscalls: 'define-c-struct' supports cross-compilation.

Reported by Jan (janneke) Nieuwenhuizen <janneke@gnu.org>.

Before that, we'd always use the 'sizeof' and 'alignof' value obtained
from the host at macro-expansion time.

* guix/build/syscalls.scm (sizeof*, alignof*): When the target word size
differs from the host word size, emit a call to 'sizeof'/'alignof'.
This commit is contained in:
Ludovic Courtès 2020-05-05 12:13:43 +02:00
parent 751d1f01e4
commit 86f5decd20
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
1 changed files with 17 additions and 6 deletions

View File

@ -23,6 +23,7 @@
(define-module (guix build syscalls)
#:use-module (system foreign)
#:use-module (system base target)
#:use-module (rnrs bytevectors)
#:autoload (ice-9 binary-ports) (get-bytevector-n)
#:use-module (srfi srfi-1)
@ -194,9 +195,14 @@
(* (sizeof* type) n))
((_ type)
(let-syntax ((v (lambda (s)
(let ((val (sizeof type)))
(syntax-case s ()
(_ val))))))
;; When compiling natively, call 'sizeof' at expansion
;; time; otherwise, emit code to call it at run time.
(syntax-case s ()
(_
(if (= (target-word-size)
(with-target %host-type target-word-size))
(sizeof type)
#'(sizeof type)))))))
v))))
(define-syntax alignof*
@ -208,9 +214,14 @@
(alignof* type))
((_ type)
(let-syntax ((v (lambda (s)
(let ((val (alignof type)))
(syntax-case s ()
(_ val))))))
;; When compiling natively, call 'sizeof' at expansion
;; time; otherwise, emit code to call it at run time.
(syntax-case s ()
(_
(if (= (target-word-size)
(with-target %host-type target-word-size))
(alignof type)
#'(alignof type)))))))
v))))
(define-syntax align ;as found in (system foreign)