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 ;
! 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