]> gitweb.factorcode.org Git - factor.git/blob - extra/llvm/wrappers/wrappers.factor
2a3e696edc2c5594af91d406c9ba4ce84a60f16e
[factor.git] / extra / llvm / wrappers / wrappers.factor
1 USING: accessors alien.c-types alien.strings destructors kernel
2 llvm.core llvm.engine ;
3
4 IN: llvm.wrappers
5
6 : llvm-throw ( char* -- )
7     [ alien>string ] [ LLVMDisposeMessage ] bi throw ;
8
9 : <dispose> ( alien class -- disposable ) new swap >>value ;
10
11 TUPLE: module value disposed ;
12 M: module dispose* value>> LLVMDisposeModule ;
13
14 : <module> ( name -- module )
15     LLVMModuleCreateWithName module <dispose> ;
16
17 TUPLE: provider value disposed ;
18 M: provider dispose* value>> LLVMDisposeModuleProvider ;
19
20 : <provider> ( module -- module-provider )
21     ! we don't want to dispose when an error occurs
22     ! for example, retries with the same module wouldn't work
23     ! but we do want to mark the module as disposed on success
24     [ value>> LLVMCreateModuleProviderForExistingModule ]
25     [ t >>disposed drop ] bi
26     provider <dispose> ;
27
28 TUPLE: engine value disposed ;
29 M: engine dispose* value>> LLVMDisposeExecutionEngine ;
30
31 : <engine> ( provider -- engine )
32     [
33         value>> f <void*> f <void*>
34         [ swapd 0 swap LLVMCreateJITCompiler drop ] 2keep
35         *void* [ llvm-throw ] when* *void*
36     ]
37     [ t >>disposed drop ] bi
38     engine <dispose> ;
39
40 : (add-block) ( name -- basic-block )
41     "function" swap LLVMAppendBasicBlock ;
42
43 TUPLE: builder value disposed ;
44 M: builder dispose* value>> LLVMDisposeBuilder ;
45
46 : <builder> ( name -- builder )
47     (add-block) LLVMCreateBuilder [ swap LLVMPositionBuilderAtEnd ] keep
48     builder <dispose> ;