records: Fix ABI check in cross-compilation context.

Fixes <https://issues.guix.gnu.org/74296>.

* guix/records.scm (define-record-type*)[compute-abi-cookie]: Use 32bit
hash value for abi check to prevent `record-abi-mismatch-error` in a
cross-compile context.

Change-Id: I889747b1a2837bee8bf9b4de5729fdcf1b165380
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
Christoph Buck 2024-11-10 19:23:01 +01:00 committed by Ludovic Courtès
parent 7c9fcc3e6e
commit 23cbbe6860
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5

View file

@ -415,11 +415,19 @@ (define (compute-abi-cookie field-specs)
;; list of symbols.
(syntax-case field-specs ()
(((field get properties ...) ...)
(string-hash (object->string
(syntax->datum #'((field properties ...) ...)))
(cond-expand
(guile-3 (target-most-positive-fixnum))
(else most-positive-fixnum))))))
;; Passing (target-most-positive-fixnum) as the second argument of
;; 'string-hash' won't have the intended effect when cross-compiling
;; because that second argument is used to compute a modulo after the
;; hash has been computed on an 'unsigned long'. Instead, only keep
;; the 32 most significant bits on 64-bit platforms, unconditionally.
;; See <https://issues.guix.gnu.org/74296>.
(let ((hash-value
(string-hash
(object->string (syntax->datum #'((field properties ...) ...))))))
(cond
((< most-positive-fixnum (ash 1 32)) hash-value)
((< most-positive-fixnum (ash 1 64)) (ash hash-value -32))
(else (error "unexpected!" most-positive-fixnum)))))))
(syntax-case s ()
((_ type syntactic-ctor ctor pred