]> gitweb.factorcode.org Git - factor.git/commitdiff
compiler.*: Backend implementation of varargs
authorBjörn Lindqvist <bjourne@gmail.com>
Mon, 8 Aug 2016 09:03:20 +0000 (11:03 +0200)
committerBjörn Lindqvist <bjourne@gmail.com>
Mon, 8 Aug 2016 10:02:19 +0000 (12:02 +0200)
It is turned off by default. Support for using it coming soon. :)

basis/compiler/cfg/alias-analysis/alias-analysis-tests.factor
basis/compiler/cfg/builder/alien/alien-tests.factor
basis/compiler/cfg/builder/alien/alien.factor
basis/compiler/cfg/instructions/instructions.factor
basis/compiler/cfg/liveness/liveness-tests.factor
basis/cpu/architecture/architecture.factor
basis/cpu/ppc/ppc.factor
basis/cpu/x86/x86-tests.factor
basis/cpu/x86/x86.factor
basis/stack-checker/alien/alien-tests.factor
basis/stack-checker/alien/alien.factor

index 901fa909b77513e279e54e988643c5f491eb64dd..e2481dc201dd403bc650f8d9ec51d1228a5f65ed 100644 (file)
@@ -436,13 +436,13 @@ IN: compiler.cfg.alias-analysis.tests
 {
     V{
         T{ ##allot f 0 }
-        T{ ##alien-indirect f { } { } { { 2 double-rep 0 } } { } 0 0 "free" }
+        T{ ##alien-indirect f { } { } { { 2 double-rep 0 } } { } 0 0 "free" }
         T{ ##set-slot-imm f 2 0 1 0 }
     }
 } [
     V{
         T{ ##allot f 0 }
-        T{ ##alien-indirect f { } { } { { 2 double-rep 0 } } { } 0 0 "free" }
+        T{ ##alien-indirect f { } { } { { 2 double-rep 0 } } { } 0 0 "free" }
         T{ ##set-slot-imm f 2 0 1 0 }
     } test-alias-analysis
 ] unit-test
index cdc80868a1740a1862fd3d0158dc4256a271b59d..df0517f864153f3d4c21dca6cd67aa66b2b691ea 100644 (file)
@@ -61,11 +61,20 @@ cpu x86.64? [
         ] if
         V{ }
     } [
-        void { int float double char } cdecl f "func"
+        void { int float double char } cdecl f "func"
         alien-invoke-params boa caller-parameters
     ] cfg-unit-test
 ] when
 
+! prepare-caller-return
+${
+    cpu x86.32? { { 1 int-rep EAX } } { { 1 int-rep RAX } } ?
+    cpu x86.32? { { 2 double-rep ST0 } } { { 2 double-rep XMM0 } } ?
+} [
+    T{ alien-invoke-params { return int } } prepare-caller-return
+    T{ alien-invoke-params { return double } } prepare-caller-return
+] cfg-unit-test
+
 ! unbox-parameters
 
 ! unboxing ints is only needed on 32bit archs
index 2f7a0f2664eb558496b0c59018bd1c08cb54a846..921cce3cbab78bdcf0eb24f0eaa96e6bab5edda1 100644 (file)
@@ -51,8 +51,8 @@ IN: compiler.cfg.builder.alien
         (caller-parameters)
     ] with-param-regs ;
 
-: prepare-caller-return ( params -- reg-outputs dead-outputs )
-    return>> [ { } ] [ base-type load-return ] if-void { } ;
+: prepare-caller-return ( params -- reg-outputs )
+    return>> [ { } ] [ base-type load-return ] if-void ;
 
 : caller-stack-frame ( params -- cleanup stack-size )
     [ stack-params get ] dip [ return>> ] [ abi>> ] bi stack-cleanup
@@ -83,15 +83,22 @@ IN: compiler.cfg.builder.alien
         base-type box-return ds-push
     ] if-void ;
 
+: params>alien-insn-params ( params --
+                             varargs? reg-inputs stack-inputs
+                             reg-outputs dead-outputs
+                             cleanup stack-size )
+    {
+        [ varargs?>> ]
+        [ caller-parameters ]
+        [ prepare-caller-return { } ]
+        [ caller-stack-frame ]
+    } cleave ;
+
 M: #alien-invoke emit-node ( block node -- block' )
     params>>
     [
-        {
-            [ caller-parameters ]
-            [ prepare-caller-return ]
-            [ caller-stack-frame ]
-            [ caller-linkage ]
-        } cleave
+        [ params>alien-insn-params ]
+        [ caller-linkage ] bi
         <gc-map> ##alien-invoke,
     ]
     [ caller-return ] bi ;
@@ -100,9 +107,7 @@ M: #alien-indirect emit-node ( block node -- block' )
     params>>
     [
         [ ds-pop ^^unbox-any-c-ptr ] dip
-        [ caller-parameters ]
-        [ prepare-caller-return ]
-        [ caller-stack-frame ] tri
+        params>alien-insn-params
         <gc-map> ##alien-indirect,
     ]
     [ caller-return ] bi ;
@@ -110,12 +115,9 @@ M: #alien-indirect emit-node ( block node -- block' )
 M: #alien-assembly emit-node ( block node -- block' )
     params>>
     [
-        {
-            [ caller-parameters ]
-            [ prepare-caller-return ]
-            [ caller-stack-frame ]
-            [ quot>> ]
-        } cleave ##alien-assembly,
+        [ params>alien-insn-params ]
+        [ quot>> ] bi
+        ##alien-assembly,
     ]
     [ caller-return ] bi ;
 
index b95d4953b0eda9fd50a4e4864cd9ed12d123a3b4..ff58ae0431e6c386a99a3983b00d0a70f95c8574 100644 (file)
@@ -669,14 +669,14 @@ literal: boxer gc-map ;
 ! { vreg rep stack#/reg }
 
 VREG-INSN: ##alien-invoke
-literal: reg-inputs stack-inputs reg-outputs dead-outputs cleanup stack-size symbols dll gc-map ;
+literal: varargs? reg-inputs stack-inputs reg-outputs dead-outputs cleanup stack-size symbols dll gc-map ;
 
 VREG-INSN: ##alien-indirect
 use: src/int-rep
-literal: reg-inputs stack-inputs reg-outputs dead-outputs cleanup stack-size gc-map ;
+literal: varargs? reg-inputs stack-inputs reg-outputs dead-outputs cleanup stack-size gc-map ;
 
 VREG-INSN: ##alien-assembly
-literal: reg-inputs stack-inputs reg-outputs dead-outputs cleanup stack-size quot ;
+literal: varargs? reg-inputs stack-inputs reg-outputs dead-outputs cleanup stack-size quot ;
 
 VREG-INSN: ##callback-inputs
 literal: reg-outputs stack-outputs ;
index 2385bd93a0b7a9a63a07ae1f37c1d0830775bcdf..70bd19d8a7c5ad601a11aeef72d754c52a8950f7 100644 (file)
@@ -278,7 +278,7 @@ V{
     T{ ##unbox f 37 29 "alien_offset" int-rep }
     T{ ##unbox f 38 28 "to_double" double-rep }
     T{ ##unbox f 39 36 "to_cell" int-rep }
-    T{ ##alien-invoke f V{ } V{ { 37 int-rep 0 } { 38 double-rep 4 } { 39 int-rep 12 } } { { 40 int-rep EAX } } { } 0 16 "CFRunLoopRunInMode" f T{ gc-map } }
+    T{ ##alien-invoke f V{ } V{ { 37 int-rep 0 } { 38 double-rep 4 } { 39 int-rep 12 } } { { 40 int-rep EAX } } { } 0 16 "CFRunLoopRunInMode" f T{ gc-map } }
     T{ ##box f 41 40 "from_signed_cell" int-rep T{ gc-map } }
     T{ ##replace f 41 D: 0 }
     T{ ##branch }
index e4409258206abe46c0126a5c66d951fe943a3199..66dddc453ab7a0864b2d538d7bdb7c980db838d3 100644 (file)
@@ -580,11 +580,21 @@ HOOK: %save-context cpu ( temp1 temp2 -- )
 
 HOOK: %c-invoke cpu ( symbols dll gc-map -- )
 
-HOOK: %alien-invoke cpu ( reg-inputs stack-inputs reg-outputs dead-outputs cleanup stack-size symbols dll gc-map -- )
-
-HOOK: %alien-indirect cpu ( src reg-inputs stack-inputs reg-outputs dead-outputs cleanup stack-size gc-map -- )
-
-HOOK: %alien-assembly cpu ( reg-inputs stack-inputs reg-outputs dead-outputs cleanup stack-size quot -- )
+HOOK: %alien-invoke cpu ( varargs? reg-inputs stack-inputs
+                          reg-outputs dead-outputs
+                          cleanup stack-size
+                          symbols dll gc-map -- )
+
+HOOK: %alien-indirect cpu ( src
+                            varargs? reg-inputs stack-inputs
+                            reg-outputs dead-outputs
+                            cleanup stack-size
+                            gc-map -- )
+
+HOOK: %alien-assembly cpu ( varargs? reg-inputs stack-inputs
+                            reg-outputs dead-outputs
+                            cleanup stack-size
+                            quot -- )
 
 HOOK: %callback-inputs cpu ( reg-outputs stack-outputs -- )
 
index 04a05897f2223f4a547e3332e3c086d2a2ac48e2..80e54f606dfd4dfd2c8381e0f8b4f5035dbc9eb1 100644 (file)
@@ -450,7 +450,10 @@ M:: ppc %c-invoke ( name dll gc-map -- )
     } case
     rep scratch-reg-class rep vreg %spill ;
 
-:: emit-alien-insn ( reg-inputs stack-inputs reg-outputs dead-outputs cleanup stack-size quot -- )
+:: emit-alien-insn ( varargs? reg-inputs stack-inputs
+                     reg-outputs dead-outputs
+                     cleanup stack-size
+                     quot -- )
     stack-inputs [ first3 store-stack-param ] each
     reg-inputs [ first3 store-reg-param ] each
     quot call
@@ -458,14 +461,17 @@ M:: ppc %c-invoke ( name dll gc-map -- )
     dead-outputs [ first2 discard-reg-param ] each
     ; inline
 
-M: ppc %alien-invoke ( reg-inputs stack-inputs reg-outputs
-                       dead-outputs cleanup stack-size
+M: ppc %alien-invoke ( varargs? reg-inputs stack-inputs
+                       reg-outputs dead-outputs
+                       cleanup stack-size
                        symbols dll gc-map -- )
     '[ _ _ _ %c-invoke ] emit-alien-insn ;
 
-M:: ppc %alien-indirect ( src reg-inputs stack-inputs
-                          reg-outputs dead-outputs cleanup
-                          stack-size gc-map -- )
+M:: ppc %alien-indirect ( src
+                          varargs? reg-inputs stack-inputs
+                          reg-outputs dead-outputs
+                          cleanup stack-size
+                          gc-map -- )
     reg-inputs stack-inputs reg-outputs dead-outputs cleanup stack-size [
         has-toc [
             11 src load-param
@@ -479,9 +485,10 @@ M:: ppc %alien-indirect ( src reg-inputs stack-inputs
         gc-map gc-map-here
     ] emit-alien-insn ;
 
-M: ppc %alien-assembly ( reg-inputs stack-inputs reg-outputs
-                         dead-outputs cleanup stack-size quot
-                         -- )
+M: ppc %alien-assembly ( varargs? reg-inputs stack-inputs
+                         reg-outputs dead-outputs
+                         cleanup stack-size
+                         quot -- )
     '[ _ call( -- ) ] emit-alien-insn ;
 
 M: ppc %callback-inputs ( reg-outputs stack-outputs -- )
index be9cecd2a723131fbc716bd6a449e35918f03ea8..7b5175d19fc45328536c423182cd037ec8b1d13c 100644 (file)
@@ -41,7 +41,7 @@ cpu x86.64? [
 ! %alien-invoke
 { 1 } [
     init-relocation init-gc-maps [
-        { } { } { } { } 0 0 { } "dll" T{ gc-map { scrub-d V{ 0 } } } %alien-invoke
+        { } { } { } { } 0 0 { } "dll" T{ gc-map { scrub-d V{ 0 } } } %alien-invoke
     ] B{ } make drop
     gc-maps get length
 ] unit-test
index a3fa51404956bc3ae67f292fe6e2714002804dac..54059236fef3e5798f0e93cabd011793917ba653 100644 (file)
@@ -649,32 +649,32 @@ HOOK: %prepare-var-args cpu ( reg-inputs -- )
 
 HOOK: %cleanup cpu ( n -- )
 
-M:: x86 %alien-assembly ( reg-inputs
-                          stack-inputs
-                          reg-outputs
-                          dead-outputs
-                          cleanup
-                          stack-size
+M:: x86 %alien-assembly ( varargs? reg-inputs stack-inputs
+                          reg-outputs dead-outputs
+                          cleanup stack-size
                           quot -- )
     stack-inputs [ first3 %store-stack-param ] each
-    reg-inputs [ [ first3 %store-reg-param ] each ] [ %prepare-var-args ] bi
+    reg-inputs [ first3 %store-reg-param ] each
+    varargs? [ reg-inputs %prepare-var-args ] when
     quot call( -- )
     cleanup %cleanup
     reg-outputs [ first3 %load-reg-param ] each
     dead-outputs [ first2 %discard-reg-param ] each ;
 
-M: x86 %alien-invoke ( reg-inputs stack-inputs
+M: x86 %alien-invoke ( varargs? reg-inputs stack-inputs
                        reg-outputs dead-outputs
-                       cleanup
-                       stack-size
+                       cleanup stack-size
                        symbols dll gc-map -- )
-                       '[ _ _ _ %c-invoke ] %alien-assembly ;
+    '[ _ _ _ %c-invoke ] %alien-assembly ;
 
 M:: x86 %alien-indirect ( src
-                          reg-inputs stack-inputs
+                          varargs? reg-inputs stack-inputs
                           reg-outputs dead-outputs
-                          cleanup stack-size gc-map -- )
-    reg-inputs stack-inputs reg-outputs dead-outputs cleanup stack-size [
+                          cleanup stack-size
+                          gc-map -- )
+    varargs? reg-inputs stack-inputs
+    reg-outputs dead-outputs
+    cleanup stack-size [
         src ?spill-slot CALL
         gc-map gc-map-here
     ] %alien-assembly ;
index 5116aad9a9ed83e424fc568dbc630af6dd6434b7..91234632d60457b60e80e3578f3c955ea65dbe30 100644 (file)
@@ -53,6 +53,6 @@ ${
         ] do-callback
     ] ?
 } [
-    int { int int } cdecl alien-node-params boa
+    int { int int } cdecl alien-node-params boa
     [ "hello" ] wrap-callback-quot
 ] unit-test
index 3588a0074a4edce35ea70a7033724c72674355cf..aa78632e0b6fa0014ae649f88ba184316c62b64d 100644 (file)
@@ -8,7 +8,9 @@ stack-checker.visitor strings words ;
 FROM: kernel.private => declare ;
 IN: stack-checker.alien
 
-TUPLE: alien-node-params return parameters { abi abi initial: cdecl } ;
+TUPLE: alien-node-params
+    return parameters
+    { abi abi initial: cdecl } varargs? ;
 
 TUPLE: alien-invoke-params < alien-node-params
     library