1 ! Copyright (C) 2009 Matthew Willis.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alien.c-types alien.strings
4 io.encodings.utf8 destructors kernel
5 llvm.core llvm.engine ;
9 : llvm-throw ( char* -- )
10 [ utf8 alien>string ] [ LLVMDisposeMessage ] bi throw ;
12 : <dispose> ( alien class -- disposable ) new swap >>value ;
14 TUPLE: module value disposed ;
15 M: module dispose* value>> LLVMDisposeModule ;
17 : <module> ( name -- module )
18 LLVMModuleCreateWithName module <dispose> ;
20 TUPLE: provider value module disposed ;
21 M: provider dispose* value>> LLVMDisposeModuleProvider ;
23 : (provider) ( module -- provider )
24 [ value>> LLVMCreateModuleProviderForExistingModule provider <dispose> ]
25 [ t >>disposed value>> ] bi
28 : <provider> ( module -- provider )
29 [ (provider) ] with-disposal ;
31 TUPLE: engine value disposed ;
32 M: engine dispose* value>> LLVMDisposeExecutionEngine ;
34 : (engine) ( provider -- engine )
36 value>> f <void*> f <void*>
37 [ swapd 0 swap LLVMCreateJITCompiler drop ] 2keep
38 *void* [ llvm-throw ] when* *void*
40 [ t >>disposed drop ] bi
43 : <engine> ( provider -- engine )
44 [ (engine) ] with-disposal ;
46 : (add-block) ( name -- basic-block )
47 "function" swap LLVMAppendBasicBlock ;
49 TUPLE: builder value disposed ;
50 M: builder dispose* value>> LLVMDisposeBuilder ;
52 : <builder> ( name -- builder )
53 (add-block) LLVMCreateBuilder [ swap LLVMPositionBuilderAtEnd ] keep
56 TUPLE: buffer value disposed ;
57 M: buffer dispose* value>> LLVMDisposeMemoryBuffer ;
59 : <buffer> ( path -- module )
61 [ LLVMCreateMemoryBufferWithContentsOfFile drop ] 2keep
62 *void* [ llvm-throw ] when* *void* buffer <dispose> ;