cs-bootstrap: fix size and offsets for double fields

Although building with the wrong offsets is good enough to compile
the compiler to compile itself correctly, a broken intermediate
compilation can create confusion.
This commit is contained in:
Matthew Flatt 2020-06-29 06:39:41 -06:00
parent 5e9c6b31c0
commit 4f9c0779f8
2 changed files with 22 additions and 5 deletions

View File

@ -50,6 +50,7 @@
(define-constant
ptr-bytes
fixnum-bits
max-float-alignment
annotation-debug
annotation-profile
visit-tag

View File

@ -334,8 +334,15 @@
[(size)
(assert-accessor)
(lambda (rtd)
(* (add1 (length ((csv7:record-field-accessor base-rtd 'flds) rtd)))
ptr-bytes))]
(let loop ([flds ((csv7:record-field-accessor base-rtd 'flds) rtd)] [x ptr-bytes])
(cond
[(null? flds) x]
[(eq? (fld-type (car flds)) 'double)
(let ([x (if (zero? (modulo x max-float-alignment))
x
(+ x (- 8 (modulo x max-float-alignment))))])
(loop (cdr flds) (+ x 8)))]
[else (loop (cdr flds) (+ x ptr-bytes))])))]
[(pm)
(assert-accessor)
(lambda (rtd)
@ -537,12 +544,21 @@
(void))
(define (fix-offsets flds)
(let loop ([flds flds] [offset (+ record-ptr-offset ptr-bytes)])
(let loop ([flds flds] [offset ptr-bytes])
(unless (null? flds)
(set-fld-byte! (car flds) offset)
(loop (cdr flds) (+ offset ptr-bytes))))
(cond
[(eq? (fld-type (car flds)) 'double)
(let ([offset (if (zero? (modulo offset max-float-alignment))
offset
(+ offset (- 8 (modulo offset max-float-alignment))))])
(set-fld-byte! (car flds) (+ record-ptr-offset offset))
(loop (cdr flds) (+ offset 8)))]
[else
(set-fld-byte! (car flds) (+ record-ptr-offset offset))
(loop (cdr flds) (+ offset ptr-bytes))])))
flds)
;; assumes that `v` has only pointer-sized fields
(define ($object-ref type v offset)
(cond
[(flonum? v)