]> gitweb.factorcode.org Git - factor.git/blobdiff - extra/llvm/jit/jit.factor
install functions from llvm bytecode, with test
[factor.git] / extra / llvm / jit / jit.factor
index 5a8574261964e6e8eac3a1276f43c1713b80f067..9281b609e369f78eb6ae3a78b8f7ee5cb4e5b087 100644 (file)
@@ -8,11 +8,7 @@ SYMBOL: thejit
 TUPLE: jit ee mps ;
 
 : empty-engine ( -- engine )
-    "initial-module" <module> [
-        <provider>
-    ] with-disposal [
-        <engine>
-    ] with-disposal ;
+    "initial-module" <module> <provider> <engine> ;
 
 : <jit> ( -- jit )
     jit new empty-engine >>ee H{ } clone >>mps ;
@@ -25,21 +21,27 @@ TUPLE: jit ee mps ;
     ! free machine code for each function in module
     LLVMGetFirstFunction dup ALIEN: 0 = [ drop ] [ (remove-functions) ] if ;
 
-: (remove-provider) ( provider -- )
+: remove-provider ( provider -- )
     thejit get ee>> value>> swap value>> f <void*> f <void*>
     [ LLVMRemoveModuleProvider drop ] 2keep *void* [ llvm-throw ] when*
     *void* module new swap >>value
     [ value>> remove-functions ] with-disposal ;
 
-: remove-provider ( name -- )
+: remove-module ( name -- )
     dup thejit get mps>> at [
-        (remove-provider)
+        remove-provider
         thejit get mps>> delete-at
     ] [ drop ] if* ;
 
-: add-provider ( provider name -- )
-    dup remove-provider
-    thejit get ee>> value>>  pick value>> LLVMAddModuleProvider
-    [ t >>disposed ] dip thejit get mps>> set-at ;
+: add-module ( module name -- )
+    [ <provider> ] dip [ remove-module ] keep
+    thejit get ee>> value>> pick
+    [ [ value>> LLVMAddModuleProvider ] [ t >>disposed drop ] bi ] with-disposal
+    thejit get mps>> set-at ;
+
+: function-pointer ( name -- alien )
+    thejit get ee>> value>> dup
+    rot f <void*> [ LLVMFindFunction drop ] keep
+    *void* LLVMGetPointerToGlobal ;
 
 thejit [ <jit> ] initialize
\ No newline at end of file