mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-11-07 07:26:13 -05:00
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:
parent
751d1f01e4
commit
86f5decd20
1 changed files with 17 additions and 6 deletions
|
@ -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 @@ (define-syntax sizeof*
|
|||
(* (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 @@ (define-syntax alignof*
|
|||
(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)
|
||||
|
|
Loading…
Reference in a new issue