Refactoring FFI for Win64
parent
14246fde37
commit
20f5541d35
|
@ -164,7 +164,7 @@ GENERIC: stack-size ( type -- size ) foldable
|
||||||
|
|
||||||
M: string stack-size c-type stack-size ;
|
M: string stack-size c-type stack-size ;
|
||||||
|
|
||||||
M: c-type stack-size size>> ;
|
M: c-type stack-size size>> cell align ;
|
||||||
|
|
||||||
GENERIC: byte-length ( seq -- n ) flushable
|
GENERIC: byte-length ( seq -- n ) flushable
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,10 @@
|
||||||
! Copyright (C) 2004, 2008 Slava Pestov.
|
! Copyright (C) 2004, 2008 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors arrays generic hashtables kernel kernel.private
|
USING: accessors arrays generic hashtables kernel kernel.private
|
||||||
math namespaces parser sequences strings words libc
|
math namespaces parser sequences strings words libc fry
|
||||||
alien.c-types alien.structs.fields cpu.architecture ;
|
alien.c-types alien.structs.fields cpu.architecture ;
|
||||||
IN: alien.structs
|
IN: alien.structs
|
||||||
|
|
||||||
: if-value-structs? ( ctype true false -- )
|
|
||||||
value-structs?
|
|
||||||
[ drop call ] [ >r 2drop "void*" r> call ] if ; inline
|
|
||||||
|
|
||||||
TUPLE: struct-type size align fields ;
|
TUPLE: struct-type size align fields ;
|
||||||
|
|
||||||
M: struct-type heap-size size>> ;
|
M: struct-type heap-size size>> ;
|
||||||
|
@ -17,20 +13,26 @@ M: struct-type c-type-align align>> ;
|
||||||
|
|
||||||
M: struct-type c-type-stack-align? drop f ;
|
M: struct-type c-type-stack-align? drop f ;
|
||||||
|
|
||||||
M: struct-type unbox-parameter
|
: if-value-struct ( ctype true false -- )
|
||||||
[ %unbox-struct ] [ unbox-parameter ] if-value-structs? ;
|
[ dup value-struct? ] 2dip '[ drop "void*" @ ] if ; inline
|
||||||
|
|
||||||
M: struct-type unbox-return
|
M: struct-type unbox-parameter
|
||||||
f swap %unbox-struct ;
|
[ %unbox-large-struct ] [ unbox-parameter ] if-value-struct ;
|
||||||
|
|
||||||
M: struct-type box-parameter
|
M: struct-type box-parameter
|
||||||
[ %box-struct ] [ box-parameter ] if-value-structs? ;
|
[ %box-large-struct ] [ box-parameter ] if-value-struct ;
|
||||||
|
|
||||||
|
: if-small-struct ( c-type true false -- ? )
|
||||||
|
[ dup struct-small-enough? ] 2dip '[ f swap @ ] if ; inline
|
||||||
|
|
||||||
|
M: struct-type unbox-return
|
||||||
|
[ %unbox-small-struct ] [ %unbox-large-struct ] if-small-struct ;
|
||||||
|
|
||||||
M: struct-type box-return
|
M: struct-type box-return
|
||||||
f swap %box-struct ;
|
[ %box-small-struct ] [ %box-large-struct ] if-small-struct ;
|
||||||
|
|
||||||
M: struct-type stack-size
|
M: struct-type stack-size
|
||||||
[ heap-size ] [ stack-size ] if-value-structs? ;
|
[ heap-size ] [ stack-size ] if-value-struct ;
|
||||||
|
|
||||||
: c-struct? ( type -- ? ) (c-type) struct-type? ;
|
: c-struct? ( type -- ? ) (c-type) struct-type? ;
|
||||||
|
|
||||||
|
@ -40,7 +42,7 @@ M: struct-type stack-size
|
||||||
-rot define-c-type ;
|
-rot define-c-type ;
|
||||||
|
|
||||||
: define-struct-early ( name vocab fields -- fields )
|
: define-struct-early ( name vocab fields -- fields )
|
||||||
-rot [ rot first2 <field-spec> ] 2curry map ;
|
[ first2 <field-spec> ] with with map ;
|
||||||
|
|
||||||
: compute-struct-align ( types -- n )
|
: compute-struct-align ( types -- n )
|
||||||
[ c-type-align ] map supremum ;
|
[ c-type-align ] map supremum ;
|
||||||
|
|
|
@ -235,7 +235,7 @@ M: float-regs reg-class-variable drop float-regs ;
|
||||||
GENERIC: inc-reg-class ( register-class -- )
|
GENERIC: inc-reg-class ( register-class -- )
|
||||||
|
|
||||||
: ?dummy-stack-params ( reg-class -- )
|
: ?dummy-stack-params ( reg-class -- )
|
||||||
dummy-stack-params? [ reg-size stack-params +@ ] [ drop ] if ;
|
dummy-stack-params? [ reg-size cell align stack-params +@ ] [ drop ] if ;
|
||||||
|
|
||||||
: ?dummy-int-params ( reg-class -- )
|
: ?dummy-int-params ( reg-class -- )
|
||||||
dummy-int-params? [ reg-size cell /i 1 max int-regs +@ ] [ drop ] if ;
|
dummy-int-params? [ reg-size cell /i 1 max int-regs +@ ] [ drop ] if ;
|
||||||
|
@ -264,7 +264,7 @@ M: object reg-class-full?
|
||||||
|
|
||||||
: spill-param ( reg-class -- n reg-class )
|
: spill-param ( reg-class -- n reg-class )
|
||||||
stack-params get
|
stack-params get
|
||||||
>r reg-size stack-params +@ r>
|
>r reg-size cell align stack-params +@ r>
|
||||||
stack-params ;
|
stack-params ;
|
||||||
|
|
||||||
: fastcall-param ( reg-class -- n reg-class )
|
: fastcall-param ( reg-class -- n reg-class )
|
||||||
|
|
|
@ -141,10 +141,10 @@ HOOK: %loop-entry cpu ( -- )
|
||||||
HOOK: small-enough? cpu ( n -- ? )
|
HOOK: small-enough? cpu ( n -- ? )
|
||||||
|
|
||||||
! Is this structure small enough to be returned in registers?
|
! Is this structure small enough to be returned in registers?
|
||||||
HOOK: struct-small-enough? cpu ( heap-size -- ? )
|
HOOK: struct-small-enough? cpu ( c-type -- ? )
|
||||||
|
|
||||||
! Do we pass value structs by value or hidden reference?
|
! Do we pass this struct by value or hidden reference?
|
||||||
HOOK: value-structs? cpu ( -- ? )
|
HOOK: value-struct? cpu ( c-type -- ? )
|
||||||
|
|
||||||
! If t, all parameters are shadowed by dummy stack parameters
|
! If t, all parameters are shadowed by dummy stack parameters
|
||||||
HOOK: dummy-stack-params? cpu ( -- ? )
|
HOOK: dummy-stack-params? cpu ( -- ? )
|
||||||
|
@ -207,14 +207,3 @@ M: object %callback-return drop %return ;
|
||||||
M: stack-params param-reg drop ;
|
M: stack-params param-reg drop ;
|
||||||
|
|
||||||
M: stack-params param-regs drop f ;
|
M: stack-params param-regs drop f ;
|
||||||
|
|
||||||
: if-small-struct ( n size true false -- ? )
|
|
||||||
[ 2dup [ not ] [ struct-small-enough? ] bi* and ] 2dip
|
|
||||||
[ '[ nip @ ] ] dip if ;
|
|
||||||
inline
|
|
||||||
|
|
||||||
: %unbox-struct ( n c-type -- )
|
|
||||||
[ %unbox-small-struct ] [ %unbox-large-struct ] if-small-struct ;
|
|
||||||
|
|
||||||
: %box-struct ( n c-type -- )
|
|
||||||
[ %box-small-struct ] [ %box-large-struct ] if-small-struct ;
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ M: linux lr-save 1 cells ;
|
||||||
|
|
||||||
M: float-regs param-regs drop { 1 2 3 4 5 6 7 8 } ;
|
M: float-regs param-regs drop { 1 2 3 4 5 6 7 8 } ;
|
||||||
|
|
||||||
M: ppc value-structs? f ;
|
M: ppc value-struct? drop f ;
|
||||||
|
|
||||||
M: ppc dummy-stack-params? f ;
|
M: ppc dummy-stack-params? f ;
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ M: macosx lr-save 2 cells ;
|
||||||
|
|
||||||
M: float-regs param-regs drop { 1 2 3 4 5 6 7 8 9 10 11 12 13 } ;
|
M: float-regs param-regs drop { 1 2 3 4 5 6 7 8 9 10 11 12 13 } ;
|
||||||
|
|
||||||
M: ppc value-structs? t ;
|
M: ppc value-struct? drop t ;
|
||||||
|
|
||||||
M: ppc dummy-stack-params? t ;
|
M: ppc dummy-stack-params? t ;
|
||||||
|
|
||||||
|
|
|
@ -10,8 +10,9 @@ M: float-regs param-regs drop { XMM0 XMM1 XMM2 XMM3 } ;
|
||||||
|
|
||||||
M: x86.64 reserved-area-size 4 cells ;
|
M: x86.64 reserved-area-size 4 cells ;
|
||||||
|
|
||||||
M: x86.64 struct-small-enough? ( size -- ? )
|
M: x86.64 struct-small-enough? heap-size { 1 2 4 8 } member? ;
|
||||||
heap-size cell <= ;
|
|
||||||
|
M: x86.64 value-struct? heap-size { 1 2 4 8 } member? ;
|
||||||
|
|
||||||
M: x86.64 dummy-stack-params? f ;
|
M: x86.64 dummy-stack-params? f ;
|
||||||
|
|
||||||
|
|
|
@ -507,7 +507,7 @@ M: x86 %prepare-alien-invoke
|
||||||
temp-reg-1 2 cells [+] ds-reg MOV
|
temp-reg-1 2 cells [+] ds-reg MOV
|
||||||
temp-reg-1 3 cells [+] rs-reg MOV ;
|
temp-reg-1 3 cells [+] rs-reg MOV ;
|
||||||
|
|
||||||
M: x86 value-structs? t ;
|
M: x86 value-struct? drop t ;
|
||||||
|
|
||||||
M: x86 small-enough? ( n -- ? )
|
M: x86 small-enough? ( n -- ? )
|
||||||
HEX: -80000000 HEX: 7fffffff between? ;
|
HEX: -80000000 HEX: 7fffffff between? ;
|
||||||
|
|
Loading…
Reference in New Issue