llvm: more of the old api added, and some tests

modern-harvey2
Björn Lindqvist 2017-07-15 01:22:12 +02:00
parent 1478af9666
commit ed3e3ebb78
5 changed files with 89 additions and 15 deletions

View File

@ -4,6 +4,14 @@ IN: llvm.ffi.tests
{ } [ { } [
"my_module" LLVMModuleCreateWithName "my_module" LLVMModuleCreateWithName
dup LLVMDumpModule ! dup LLVMDumpModule
LLVMDisposeModule LLVMDisposeModule
] unit-test ] unit-test
{ 10 } [
LLVMInt32Type 10 LLVMVectorType LLVMGetVectorSize
] unit-test
{ 32 } [
LLVMInt32Type LLVMGetIntTypeWidth
] unit-test

View File

@ -24,7 +24,6 @@ TYPEDEF: void* LLVMModuleRef
TYPEDEF: void* LLVMPassManagerRef TYPEDEF: void* LLVMPassManagerRef
TYPEDEF: void* LLVMModuleProviderRef TYPEDEF: void* LLVMModuleProviderRef
TYPEDEF: void* LLVMTypeRef TYPEDEF: void* LLVMTypeRef
TYPEDEF: void* LLVMTypeHandleRef
TYPEDEF: void* LLVMValueRef TYPEDEF: void* LLVMValueRef
TYPEDEF: void* LLVMBasicBlockRef TYPEDEF: void* LLVMBasicBlockRef
TYPEDEF: void* LLVMBuilderRef TYPEDEF: void* LLVMBuilderRef
@ -60,19 +59,58 @@ FUNCTION: LLVMBool LLVMVerifyModule ( LLVMModuleRef M, int Action, char **OutMes
FUNCTION: c-string LLVMGetTarget ( LLVMModuleRef M ) FUNCTION: c-string LLVMGetTarget ( LLVMModuleRef M )
! Types ! Types
! ! Basic types
FUNCTION: LLVMTypeRef LLVMFloatType ( )
FUNCTION: LLVMTypeRef LLVMDoubleType ( )
FUNCTION: LLVMTypeRef LLVMX86FP80Type ( )
FUNCTION: LLVMTypeRef LLVMFP128Type ( )
FUNCTION: LLVMTypeRef LLVMPPCFP128Type ( )
FUNCTION: LLVMTypeRef LLVMVoidType ( )
FUNCTION: LLVMTypeRef LLVMLabelType ( )
FUNCTION: LLVMTypeRef LLVMOpaqueType ( )
! ! Integer type
FUNCTION: LLVMTypeRef LLVMInt1Type ( ) FUNCTION: LLVMTypeRef LLVMInt1Type ( )
FUNCTION: LLVMTypeRef LLVMInt8Type ( ) FUNCTION: LLVMTypeRef LLVMInt8Type ( )
FUNCTION: LLVMTypeRef LLVMInt16Type ( ) FUNCTION: LLVMTypeRef LLVMInt16Type ( )
FUNCTION: LLVMTypeRef LLVMInt32Type ( ) FUNCTION: LLVMTypeRef LLVMInt32Type ( )
FUNCTION: LLVMTypeRef LLVMInt64Type ( ) FUNCTION: LLVMTypeRef LLVMInt64Type ( )
FUNCTION: LLVMTypeRef LLVMIntType ( unsigned NumBits ) FUNCTION: LLVMTypeRef LLVMIntType ( unsigned NumBits )
FUNCTION: unsigned LLVMGetIntTypeWidth ( LLVMTypeRef IntegerTy )
! ! Array type
FUNCTION: LLVMTypeRef LLVMArrayType ( LLVMTypeRef ElementType, unsigned ElementCount )
FUNCTION: unsigned LLVMGetArrayLength ( LLVMTypeRef ArrayTy )
! ! Pointer type
FUNCTION: LLVMTypeRef LLVMPointerType ( LLVMTypeRef ElementType, unsigned AddressSpace )
! ! Vector type
FUNCTION: LLVMTypeRef LLVMVectorType ( LLVMTypeRef ElementType, unsigned ElementCount )
FUNCTION: unsigned LLVMGetVectorSize ( LLVMTypeRef VectorTy )
! ! Function type
FUNCTION: LLVMTypeRef LLVMFunctionType ( LLVMTypeRef ReturnType, FUNCTION: LLVMTypeRef LLVMFunctionType ( LLVMTypeRef ReturnType,
LLVMTypeRef* ParamTypes, LLVMTypeRef* ParamTypes,
unsigned ParamCount, int IsVarArg ) unsigned ParamCount, int IsVarArg )
FUNCTION: LLVMTypeKind LLVMGetTypeKind ( LLVMTypeRef Ty )
FUNCTION: LLVMTypeRef LLVMGetReturnType ( LLVMTypeRef FunctionTy ) FUNCTION: LLVMTypeRef LLVMGetReturnType ( LLVMTypeRef FunctionTy )
FUNCTION: int LLVMIsFunctionVarArg ( LLVMTypeRef FunctionTy )
FUNCTION: unsigned LLVMCountParamTypes ( LLVMTypeRef FunctionTy )
FUNCTION: void LLVMGetParamTypes ( LLVMTypeRef FunctionTy, LLVMTypeRef* Dest )
! ! Struct type
FUNCTION: LLVMTypeRef LLVMStructType ( LLVMTypeRef* ElementTypes,
unsigned ElementCount, int Packed )
FUNCTION: int LLVMIsPackedStruct ( LLVMTypeRef StructTy )
FUNCTION: unsigned LLVMCountStructElementTypes ( LLVMTypeRef StructTy )
FUNCTION: void LLVMGetStructElementTypes ( LLVMTypeRef StructTy, LLVMTypeRef* Dest )
! ! Type util
FUNCTION: LLVMTypeKind LLVMGetTypeKind ( LLVMTypeRef Ty )
FUNCTION: LLVMTypeRef LLVMGetElementType ( LLVMTypeRef Ty ) FUNCTION: LLVMTypeRef LLVMGetElementType ( LLVMTypeRef Ty )
FUNCTION: unsigned LLVMGetIntTypeWidth ( LLVMTypeRef IntegerTy )
! Values ! Values
FUNCTION: LLVMValueRef LLVMAddFunction ( LLVMModuleRef M, FUNCTION: LLVMValueRef LLVMAddFunction ( LLVMModuleRef M,
@ -155,4 +193,4 @@ FUNCTION: void LLVMInitializeX86TargetInfo ( )
FUNCTION: void LLVMInitializeX86Target ( ) FUNCTION: void LLVMInitializeX86Target ( )
FUNCTION: void LLVMInitializeX86TargetMC ( ) FUNCTION: void LLVMInitializeX86TargetMC ( )
! Removed symbols: LLVMCreateJITCompiler ! Removed symbols: LLVMCreateJITCompiler, LLVMCreateTypeHandle

View File

@ -6,3 +6,7 @@ IN: llvm.wrappers
HELP: <provider> HELP: <provider>
{ $values { "module" module } { "provider" provider } } { $values { "module" module } { "provider" provider } }
{ $description "Creates a module provider from a given module. The provider takes ownership of the module." } ; { $description "Creates a module provider from a given module. The provider takes ownership of the module." } ;
HELP: <engine>
{ $values { "module" module } { "engine" engine } }
{ $description "Creates a engine from a given module. The engine takes ownership of the module and disposes it." } ;

View File

@ -2,14 +2,22 @@ USING: accessors alien destructors io.pathnames kernel llvm.ffi
llvm.reader llvm.wrappers tools.test ; llvm.reader llvm.wrappers tools.test ;
IN: llvm.wrappers.tests IN: llvm.wrappers.tests
CONSTANT: ADD.BC "resource:extra/llvm/wrappers/add.bc" : add.bc ( -- path )
"resource:extra/llvm/wrappers/add.bc" absolute-path ;
{ 728 t } [ { 728 t } [
ADD.BC absolute-path <buffer> add.bc <buffer>
[ value>> [ LLVMGetBufferSize ] keep ] with-disposal alien? [ value>> [ LLVMGetBufferSize ] keep ] with-disposal alien?
] unit-test ] unit-test
{ "sum" 2 } [ { "sum" 2 32 LLVMIntegerTypeKind } [
ADD.BC absolute-path load-module <engine> add.bc load-module <engine>
"sum" find-function [ LLVMGetValueName ] [ LLVMCountParams ] bi "sum" find-function
[ LLVMGetValueName ]
[ LLVMCountParams ]
[
LLVMTypeOf LLVMGetElementType LLVMGetReturnType
[ LLVMGetIntTypeWidth ]
[ LLVMGetTypeKind ] bi
] tri
] unit-test ] unit-test

View File

@ -1,7 +1,7 @@
! Copyright (C) 2009 Matthew Willis, 2017 Björn Lindqvist. ! Copyright (C) 2009 Matthew Willis, 2017 Björn Lindqvist.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors alien.c-types alien.data alien.strings destructors io USING: accessors alien.c-types alien.data alien.strings destructors
io.encodings.utf8 kernel llvm.ffi prettyprint ; io.encodings.utf8 kernel llvm.ffi ;
IN: llvm.wrappers IN: llvm.wrappers
ERROR: llvm-error message ; ERROR: llvm-error message ;
@ -9,6 +9,9 @@ ERROR: llvm-error message ;
: llvm-throw ( void* -- ) : llvm-throw ( void* -- )
[ utf8 alien>string ] [ LLVMDisposeMessage ] bi llvm-error ; [ utf8 alien>string ] [ LLVMDisposeMessage ] bi llvm-error ;
: llvm-throw-on-error ( quot -- )
keep swap 0 = [ drop ] [ void* deref llvm-throw ] if ; inline
: <dispose> ( alien class -- disposable ) new swap >>value ; : <dispose> ( alien class -- disposable ) new swap >>value ;
TUPLE: module value disposed ; TUPLE: module value disposed ;
@ -17,6 +20,10 @@ M: module dispose* value>> LLVMDisposeModule ;
: <module> ( name -- module ) : <module> ( name -- module )
LLVMModuleCreateWithName module <dispose> ; LLVMModuleCreateWithName module <dispose> ;
: verify-module ( module -- )
value>> LLVMReturnStatusAction f void* <ref>
[ LLVMVerifyModule ] llvm-throw-on-error ;
TUPLE: provider value module disposed ; TUPLE: provider value module disposed ;
M: provider dispose* value>> LLVMDisposeModuleProvider ; M: provider dispose* value>> LLVMDisposeModuleProvider ;
@ -32,9 +39,8 @@ TUPLE: engine value disposed ;
M: engine dispose* value>> LLVMDisposeExecutionEngine ; M: engine dispose* value>> LLVMDisposeExecutionEngine ;
: (engine) ( LLVMModuleRef -- LLVMExecutionEngineRef ) : (engine) ( LLVMModuleRef -- LLVMExecutionEngineRef )
f void* <ref> f void* <ref> f void* <ref> swap dupd f void* <ref>
[ swapd LLVMCreateExecutionEngineForModule drop ] 2keep [ LLVMCreateExecutionEngineForModule ] llvm-throw-on-error
void* deref [ llvm-throw ] when*
void* deref ; void* deref ;
: <engine> ( module -- engine ) : <engine> ( module -- engine )
@ -57,3 +63,13 @@ M: buffer dispose* value>> LLVMDisposeMemoryBuffer ;
f void* <ref> f void* <ref> f void* <ref> f void* <ref>
[ LLVMCreateMemoryBufferWithContentsOfFile drop ] 2keep [ LLVMCreateMemoryBufferWithContentsOfFile drop ] 2keep
void* deref [ llvm-throw ] when* void* deref buffer <dispose> ; void* deref [ llvm-throw ] when* void* deref buffer <dispose> ;
: (add-block) ( value -- basic-block )
"entry" LLVMAppendBasicBlock ;
TUPLE: builder value disposed ;
M: builder dispose* value>> LLVMDisposeBuilder ;
: <builder> ( value -- builder )
(add-block) LLVMCreateBuilder [ swap LLVMPositionBuilderAtEnd ] keep
builder <dispose> ;