diff options
author | Ludovic Courtès <ludo@gnu.org> | 2015-07-25 12:41:08 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2015-07-25 14:43:45 +0200 |
commit | 573b4c1ff3409fb4417ec676091f6bbc09219f19 (patch) | |
tree | eb4d7adfc12ff49c968e9c86fbfb10224cd8ecc3 | |
parent | 3ca337699a2feb2a42f3661b7321a5e7d5fec594 (diff) | |
download | guix-573b4c1ff3409fb4417ec676091f6bbc09219f19.tar.gz |
syscalls: 'define-c-struct' properly align reads.
* guix/build/syscalls.scm (alignof*, align): New macros. (write-types, read-types): Use 'align' to compute the actual offset to read/write a value of TYPE0.
-rw-r--r-- | guix/build/syscalls.scm | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm index 69abea1ef6..ca26824dc5 100644 --- a/guix/build/syscalls.scm +++ b/guix/build/syscalls.scm @@ -363,6 +363,26 @@ system to PUT-OLD." (_ val)))))) v)))) +(define-syntax alignof* + ;; XXX: This duplicates 'compile-time-value'. + (syntax-rules (int128) + ((_ int128) + 16) + ((_ type) + (let-syntax ((v (lambda (s) + (let ((val (alignof type))) + (syntax-case s () + (_ val)))))) + v)))) + +(define-syntax align ;as found in (system foreign) + (syntax-rules (~) + "Add to OFFSET whatever it takes to get proper alignment for TYPE." + ((_ offset (type ~ endianness)) + (align offset type)) + ((_ offset type) + (1+ (logior (1- offset) (1- (alignof* type))))))) + (define-syntax type-size (syntax-rules (~) ((_ (type ~ order)) @@ -385,8 +405,9 @@ system to PUT-OLD." #t) ((_ bv offset (type0 types ...) (field0 fields ...)) (begin - (write-type bv offset type0 field0) - (write-types bv (+ offset (type-size type0)) + (write-type bv (align offset type0) type0 field0) + (write-types bv + (+ (align offset type0) (type-size type0)) (types ...) (fields ...)))))) (define-syntax read-type @@ -408,8 +429,12 @@ system to PUT-OLD." (return values ...)) ((_ return bv offset (type0 types ...) (values ...)) (read-types return - bv (+ offset (type-size type0)) (types ...) - (values ... (read-type bv offset type0)))))) + bv + (+ (align offset type0) (type-size type0)) + (types ...) + (values ... (read-type bv + (align offset type0) + type0)))))) (define-syntax define-c-struct (syntax-rules () |