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
dup LLVMDumpModule
! dup LLVMDumpModule
LLVMDisposeModule
] 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* LLVMModuleProviderRef
TYPEDEF: void* LLVMTypeRef
TYPEDEF: void* LLVMTypeHandleRef
TYPEDEF: void* LLVMValueRef
TYPEDEF: void* LLVMBasicBlockRef
TYPEDEF: void* LLVMBuilderRef
@ -60,19 +59,58 @@ FUNCTION: LLVMBool LLVMVerifyModule ( LLVMModuleRef M, int Action, char **OutMes
FUNCTION: c-string LLVMGetTarget ( LLVMModuleRef M )
! 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 LLVMInt8Type ( )
FUNCTION: LLVMTypeRef LLVMInt16Type ( )
FUNCTION: LLVMTypeRef LLVMInt32Type ( )
FUNCTION: LLVMTypeRef LLVMInt64Type ( )
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,
LLVMTypeRef* ParamTypes,
unsigned ParamCount, int IsVarArg )
FUNCTION: LLVMTypeKind LLVMGetTypeKind ( LLVMTypeRef Ty )
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: unsigned LLVMGetIntTypeWidth ( LLVMTypeRef IntegerTy )
! Values
FUNCTION: LLVMValueRef LLVMAddFunction ( LLVMModuleRef M,
@ -155,4 +193,4 @@ FUNCTION: void LLVMInitializeX86TargetInfo ( )
FUNCTION: void LLVMInitializeX86Target ( )
FUNCTION: void LLVMInitializeX86TargetMC ( )
! Removed symbols: LLVMCreateJITCompiler
! Removed symbols: LLVMCreateJITCompiler, LLVMCreateTypeHandle

View File

@ -6,3 +6,7 @@ IN: llvm.wrappers
HELP: <provider>
{ $values { "module" module } { "provider" provider } }
{ $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 ;
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 } [
ADD.BC absolute-path <buffer>
add.bc <buffer>
[ value>> [ LLVMGetBufferSize ] keep ] with-disposal alien?
] unit-test
{ "sum" 2 } [
ADD.BC absolute-path load-module <engine>
"sum" find-function [ LLVMGetValueName ] [ LLVMCountParams ] bi
{ "sum" 2 32 LLVMIntegerTypeKind } [
add.bc load-module <engine>
"sum" find-function
[ LLVMGetValueName ]
[ LLVMCountParams ]
[
LLVMTypeOf LLVMGetElementType LLVMGetReturnType
[ LLVMGetIntTypeWidth ]
[ LLVMGetTypeKind ] bi
] tri
] unit-test

View File

@ -1,7 +1,7 @@
! 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
io.encodings.utf8 kernel llvm.ffi prettyprint ;
USING: accessors alien.c-types alien.data alien.strings destructors
io.encodings.utf8 kernel llvm.ffi ;
IN: llvm.wrappers
ERROR: llvm-error message ;
@ -9,6 +9,9 @@ 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
: <dispose> ( alien class -- disposable ) new swap >>value ;
TUPLE: module value disposed ;
@ -17,6 +20,10 @@ M: module dispose* value>> LLVMDisposeModule ;
: <module> ( name -- module )
LLVMModuleCreateWithName module <dispose> ;
: verify-module ( module -- )
value>> LLVMReturnStatusAction f void* <ref>
[ LLVMVerifyModule ] llvm-throw-on-error ;
TUPLE: provider value module disposed ;
M: provider dispose* value>> LLVMDisposeModuleProvider ;
@ -32,9 +39,8 @@ TUPLE: engine value disposed ;
M: engine dispose* value>> LLVMDisposeExecutionEngine ;
: (engine) ( LLVMModuleRef -- LLVMExecutionEngineRef )
f void* <ref> f void* <ref>
[ swapd LLVMCreateExecutionEngineForModule drop ] 2keep
void* deref [ llvm-throw ] when*
f void* <ref> swap dupd f void* <ref>
[ LLVMCreateExecutionEngineForModule ] llvm-throw-on-error
void* deref ;
: <engine> ( module -- engine )
@ -57,3 +63,13 @@ M: buffer dispose* value>> LLVMDisposeMemoryBuffer ;
f void* <ref> f void* <ref>
[ LLVMCreateMemoryBufferWithContentsOfFile drop ] 2keep
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> ;