From cb4c035a9e349a993ccb6ec3d16c059793678d48 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sat, 6 Jun 2020 08:53:14 -0600 Subject: [PATCH] fix indirect unsigned return for arm32le original commit: 158ffeb1db8f425391193f2a205594e3f1a60e99 --- s/arm32.ss | 8 ++++++-- s/ftype.ss | 8 +++++++- s/primdata.ss | 1 + 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/s/arm32.ss b/s/arm32.ss index 4212869e5e..bcc73b4144 100644 --- a/s/arm32.ss +++ b/s/arm32.ss @@ -3239,8 +3239,12 @@ [else (values (lambda () (case ($ftd-size ftd) - [(1) `(set! ,%Cretval (inline ,(make-info-load 'integer-8 #f) ,%load ,%sp ,%zero (immediate ,return-stack-offset)))] - [(2) `(set! ,%Cretval (inline ,(make-info-load 'integer-16 #f) ,%load ,%sp ,%zero (immediate ,return-stack-offset)))] + [(1) + (let ([rep (if ($ftd-unsigned? ftd) 'unsigned-8 'integer-8)]) + `(set! ,%Cretval (inline ,(make-info-load rep #f) ,%load ,%sp ,%zero (immediate ,return-stack-offset))))] + [(2) + (let ([rep (if ($ftd-unsigned? ftd) 'unsigned-16 'integer-16)]) + `(set! ,%Cretval (inline ,(make-info-load rep #f) ,%load ,%sp ,%zero (immediate ,return-stack-offset))))] [else `(set! ,%Cretval ,(%mref ,%sp ,return-stack-offset))])) (list %Cretval) 4)])]))] diff --git a/s/ftype.ss b/s/ftype.ss index 3f4e3d0aa1..ce9ab7108b 100644 --- a/s/ftype.ss +++ b/s/ftype.ss @@ -122,7 +122,7 @@ notes: big-endian machines, the first field occupies the high-order bits, with each subsequent field just below the preceding field. - - ftype pointers are records encapsulating an ftype descriptor + - ftypmembers (lambda (x) ;; Currently used for x86_64 and arm32 ABI: Returns a list of diff --git a/s/primdata.ss b/s/primdata.ss index a0f61bebb4..dc0fe5148d 100644 --- a/s/primdata.ss +++ b/s/primdata.ss @@ -2098,6 +2098,7 @@ ($ftd-atomic-category [flags single-valued]) ($ftd-compound? [sig [(sub-ptr) -> (boolean)]] [flags discard]) ($ftd-size [flags single-valued]) + ($ftd-unsigned? [flags single-valued]) ($ftd->members [flags single-valued]) ($ftype-guardian-oops [flags]) ($ftype-pointer? [sig [(ptr) -> (boolean)]] [flags pure unrestricted mifoldable])