From 48863ca17100a6a53eb1e5bc32f5fbf09dae88ae Mon Sep 17 00:00:00 2001 From: Matthew Willis Date: Sat, 27 Jun 2009 18:41:40 +0900 Subject: [PATCH] Added global jit, and convenience words for dealing with it --- extra/llvm/core/core.factor | 4 ++ extra/llvm/engine/engine.factor | 7 ++++ extra/llvm/jit/jit-tests.factor | 3 ++ extra/llvm/jit/jit.factor | 45 +++++++++++++++++++++ extra/llvm/wrappers/wrappers-tests.factor | 5 +++ extra/llvm/wrappers/wrappers.factor | 48 +++++++++++++++++++++++ 6 files changed, 112 insertions(+) create mode 100644 extra/llvm/jit/jit-tests.factor create mode 100644 extra/llvm/jit/jit.factor create mode 100644 extra/llvm/wrappers/wrappers-tests.factor create mode 100644 extra/llvm/wrappers/wrappers.factor diff --git a/extra/llvm/core/core.factor b/extra/llvm/core/core.factor index d4002d719a..292a25b80b 100644 --- a/extra/llvm/core/core.factor +++ b/extra/llvm/core/core.factor @@ -221,6 +221,10 @@ FUNCTION: void LLVMGetParams ( LLVMValueRef Fn, LLVMValueRef* Params ) ; FUNCTION: LLVMValueRef LLVMAddFunction ( LLVMModuleRef M, char* Name, LLVMTypeRef FunctionTy ) ; +FUNCTION: LLVMValueRef LLVMGetFirstFunction ( LLVMModuleRef M ) ; + +FUNCTION: LLVMValueRef LLVMGetNextFunction ( LLVMValueRef Fn ) ; + FUNCTION: unsigned LLVMGetFunctionCallConv ( LLVMValueRef Fn ) ; FUNCTION: void LLVMSetFunctionCallConv ( LLVMValueRef Fn, unsigned CC ) ; diff --git a/extra/llvm/engine/engine.factor b/extra/llvm/engine/engine.factor index db5c7014ef..ad51d02785 100644 --- a/extra/llvm/engine/engine.factor +++ b/extra/llvm/engine/engine.factor @@ -50,6 +50,13 @@ FUNCTION: int LLVMCreateJITCompiler FUNCTION: void LLVMDisposeExecutionEngine ( LLVMExecutionEngineRef EE ) ; +FUNCTION: void LLVMFreeMachineCodeForFunction ( LLVMExecutionEngineRef EE, LLVMValueRef F ) ; + +FUNCTION: void LLVMAddModuleProvider ( LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP ) ; + +FUNCTION: int LLVMRemoveModuleProvider +( LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP, LLVMModuleRef* OutMod, char** OutError ) ; + FUNCTION: int LLVMFindFunction ( LLVMExecutionEngineRef EE, char* Name, LLVMValueRef* OutFn ) ; diff --git a/extra/llvm/jit/jit-tests.factor b/extra/llvm/jit/jit-tests.factor new file mode 100644 index 0000000000..5a894e5a50 --- /dev/null +++ b/extra/llvm/jit/jit-tests.factor @@ -0,0 +1,3 @@ +USING: destructors llvm.jit llvm.wrappers tools.test ; + +[ ] [ "test" [ ] with-disposal [ "test" add-provider ] with-disposal "test" remove-provider ] unit-test \ No newline at end of file diff --git a/extra/llvm/jit/jit.factor b/extra/llvm/jit/jit.factor new file mode 100644 index 0000000000..5a85742619 --- /dev/null +++ b/extra/llvm/jit/jit.factor @@ -0,0 +1,45 @@ +USING: accessors alien.c-types alien.syntax assocs destructors +kernel llvm.core llvm.engine llvm.wrappers namespaces ; + +IN: llvm.jit + +SYMBOL: thejit + +TUPLE: jit ee mps ; + +: empty-engine ( -- engine ) + "initial-module" [ + + ] with-disposal [ + + ] with-disposal ; + +: ( -- jit ) + jit new empty-engine >>ee H{ } clone >>mps ; + +: (remove-functions) ( function -- ) + thejit get ee>> value>> over LLVMFreeMachineCodeForFunction + LLVMGetNextFunction dup ALIEN: 0 = [ drop ] [ (remove-functions) ] if ; + +: remove-functions ( module -- ) + ! free machine code for each function in module + LLVMGetFirstFunction dup ALIEN: 0 = [ drop ] [ (remove-functions) ] if ; + +: (remove-provider) ( provider -- ) + thejit get ee>> value>> swap value>> f f + [ LLVMRemoveModuleProvider drop ] 2keep *void* [ llvm-throw ] when* + *void* module new swap >>value + [ value>> remove-functions ] with-disposal ; + +: remove-provider ( name -- ) + dup thejit get mps>> at [ + (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 ; + +thejit [ ] initialize \ No newline at end of file diff --git a/extra/llvm/wrappers/wrappers-tests.factor b/extra/llvm/wrappers/wrappers-tests.factor new file mode 100644 index 0000000000..fe90184a5d --- /dev/null +++ b/extra/llvm/wrappers/wrappers-tests.factor @@ -0,0 +1,5 @@ +USING: destructors kernel llvm.wrappers sequences tools.test vocabs ; + +[ ] [ "test" dispose ] unit-test +[ ] [ "test" [ ] with-disposal dispose ] unit-test +[ ] [ "llvm.jit" vocabs member? [ "test" [ ] with-disposal [ ] with-disposal dispose ] unless ] unit-test \ No newline at end of file diff --git a/extra/llvm/wrappers/wrappers.factor b/extra/llvm/wrappers/wrappers.factor new file mode 100644 index 0000000000..2a3e696edc --- /dev/null +++ b/extra/llvm/wrappers/wrappers.factor @@ -0,0 +1,48 @@ +USING: accessors alien.c-types alien.strings destructors kernel +llvm.core llvm.engine ; + +IN: llvm.wrappers + +: llvm-throw ( char* -- ) + [ alien>string ] [ LLVMDisposeMessage ] bi throw ; + +: ( alien class -- disposable ) new swap >>value ; + +TUPLE: module value disposed ; +M: module dispose* value>> LLVMDisposeModule ; + +: ( name -- module ) + LLVMModuleCreateWithName module ; + +TUPLE: provider value disposed ; +M: provider dispose* value>> LLVMDisposeModuleProvider ; + +: ( module -- module-provider ) + ! we don't want to dispose when an error occurs + ! for example, retries with the same module wouldn't work + ! but we do want to mark the module as disposed on success + [ value>> LLVMCreateModuleProviderForExistingModule ] + [ t >>disposed drop ] bi + provider ; + +TUPLE: engine value disposed ; +M: engine dispose* value>> LLVMDisposeExecutionEngine ; + +: ( provider -- engine ) + [ + value>> f f + [ swapd 0 swap LLVMCreateJITCompiler drop ] 2keep + *void* [ llvm-throw ] when* *void* + ] + [ t >>disposed drop ] bi + engine ; + +: (add-block) ( name -- basic-block ) + "function" swap LLVMAppendBasicBlock ; + +TUPLE: builder value disposed ; +M: builder dispose* value>> LLVMDisposeBuilder ; + +: ( name -- builder ) + (add-block) LLVMCreateBuilder [ swap LLVMPositionBuilderAtEnd ] keep + builder ; \ No newline at end of file -- 2.34.1