From ed3e3ebb78e354d64932625cf1e89727bd787577 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Lindqvist?= Date: Sat, 15 Jul 2017 01:22:12 +0200 Subject: [PATCH] llvm: more of the old api added, and some tests --- extra/llvm/ffi/ffi-tests.factor | 10 ++++- extra/llvm/ffi/ffi.factor | 46 +++++++++++++++++++++-- extra/llvm/wrappers/wrappers-docs.factor | 4 ++ extra/llvm/wrappers/wrappers-tests.factor | 18 ++++++--- extra/llvm/wrappers/wrappers.factor | 26 ++++++++++--- 5 files changed, 89 insertions(+), 15 deletions(-) diff --git a/extra/llvm/ffi/ffi-tests.factor b/extra/llvm/ffi/ffi-tests.factor index 4836c219f1..51865760d9 100644 --- a/extra/llvm/ffi/ffi-tests.factor +++ b/extra/llvm/ffi/ffi-tests.factor @@ -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 diff --git a/extra/llvm/ffi/ffi.factor b/extra/llvm/ffi/ffi.factor index b5cc25f9ec..05495bb1e2 100644 --- a/extra/llvm/ffi/ffi.factor +++ b/extra/llvm/ffi/ffi.factor @@ -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 diff --git a/extra/llvm/wrappers/wrappers-docs.factor b/extra/llvm/wrappers/wrappers-docs.factor index eee657a5f7..59171181fa 100644 --- a/extra/llvm/wrappers/wrappers-docs.factor +++ b/extra/llvm/wrappers/wrappers-docs.factor @@ -6,3 +6,7 @@ IN: llvm.wrappers HELP: { $values { "module" module } { "provider" provider } } { $description "Creates a module provider from a given module. The provider takes ownership of the module." } ; + +HELP: +{ $values { "module" module } { "engine" engine } } +{ $description "Creates a engine from a given module. The engine takes ownership of the module and disposes it." } ; diff --git a/extra/llvm/wrappers/wrappers-tests.factor b/extra/llvm/wrappers/wrappers-tests.factor index 3a6956117a..acaaaadca4 100644 --- a/extra/llvm/wrappers/wrappers-tests.factor +++ b/extra/llvm/wrappers/wrappers-tests.factor @@ -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 + add.bc [ value>> [ LLVMGetBufferSize ] keep ] with-disposal alien? ] unit-test -{ "sum" 2 } [ - ADD.BC absolute-path load-module - "sum" find-function [ LLVMGetValueName ] [ LLVMCountParams ] bi +{ "sum" 2 32 LLVMIntegerTypeKind } [ + add.bc load-module + "sum" find-function + [ LLVMGetValueName ] + [ LLVMCountParams ] + [ + LLVMTypeOf LLVMGetElementType LLVMGetReturnType + [ LLVMGetIntTypeWidth ] + [ LLVMGetTypeKind ] bi + ] tri ] unit-test diff --git a/extra/llvm/wrappers/wrappers.factor b/extra/llvm/wrappers/wrappers.factor index 67aef49678..ce0a576e02 100644 --- a/extra/llvm/wrappers/wrappers.factor +++ b/extra/llvm/wrappers/wrappers.factor @@ -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 + : ( alien class -- disposable ) new swap >>value ; TUPLE: module value disposed ; @@ -17,6 +20,10 @@ 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 ; @@ -32,9 +39,8 @@ TUPLE: engine value disposed ; M: engine dispose* value>> LLVMDisposeExecutionEngine ; : (engine) ( LLVMModuleRef -- LLVMExecutionEngineRef ) - f void* f void* - [ swapd LLVMCreateExecutionEngineForModule drop ] 2keep - void* deref [ llvm-throw ] when* + f void* swap dupd f void* + [ LLVMCreateExecutionEngineForModule ] llvm-throw-on-error void* deref ; : ( module -- engine ) @@ -57,3 +63,13 @@ M: buffer dispose* value>> LLVMDisposeMemoryBuffer ; 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 ;