! Copyright (C) 2009 Matthew Willis, 2017 Björn Lindqvist. ! See http://factorcode.org/license.txt for BSD license. USING: accessors alien.c-types alien.data alien.strings destructors io.encodings.utf8 kernel llvm.ffi ; IN: llvm.wrappers ERROR: llvm-error message ; : llvm-throw ( void* -- ) [ utf8 alien>string ] [ LLVMDisposeMessage ] bi llvm-error ; : llvm-throw-on-error ( quot -- ) keep swap 0 = [ drop ] [ void* deref llvm-throw ] if ; inline : ( alien class -- disposable ) new swap >>value ; TUPLE: module value disposed ; M: module dispose* value>> LLVMDisposeModule ; : ( name -- module ) LLVMModuleCreateWithName module ; : verify-module ( module -- ) value>> LLVMReturnStatusAction f void* [ LLVMVerifyModule ] llvm-throw-on-error ; TUPLE: provider value module disposed ; M: provider dispose* value>> LLVMDisposeModuleProvider ; : (provider) ( module -- provider ) [ value>> LLVMCreateModuleProviderForExistingModule provider ] [ t >>disposed value>> ] bi >>module ; : ( module -- provider ) [ (provider) ] with-disposal ; TUPLE: engine value disposed ; M: engine dispose* value>> LLVMDisposeExecutionEngine ; : (engine) ( LLVMModuleRef -- LLVMExecutionEngineRef ) f void* swap dupd f void* [ LLVMCreateExecutionEngineForModule ] llvm-throw-on-error void* deref ; : ( module -- engine ) [ [ value>> (engine) engine ] [ t >>disposed drop ] bi ] with-disposal ; : find-function ( engine name -- function/f ) [ value>> ] dip f void* [ LLVMFindFunction drop ] keep void* deref ; : function-pointer ( engine function -- alien ) [ value>> ] dip LLVMGetPointerToGlobal ; TUPLE: buffer value disposed ; M: buffer dispose* value>> LLVMDisposeMemoryBuffer ; : ( path -- buffer ) f void* f void* [ LLVMCreateMemoryBufferWithContentsOfFile drop ] 2keep void* deref [ llvm-throw ] when* void* deref buffer ; : (add-block) ( value -- basic-block ) "entry" LLVMAppendBasicBlock ; TUPLE: builder value disposed ; M: builder dispose* value>> LLVMDisposeBuilder ; : ( value -- builder ) (add-block) LLVMCreateBuilder [ swap LLVMPositionBuilderAtEnd ] keep builder ;