diff --git a/extra/llvm/ffi/ffi.factor b/extra/llvm/ffi/ffi.factor index c2ffec4e94..af0f3f12d4 100644 --- a/extra/llvm/ffi/ffi.factor +++ b/extra/llvm/ffi/ffi.factor @@ -5,7 +5,7 @@ alien.syntax ldcache ; IN: llvm.ffi << -"llvm" "LLVM-3.8" find-so cdecl add-library +"llvm" "LLVM-3.9" find-so cdecl add-library >> LIBRARY: llvm @@ -29,6 +29,26 @@ TYPEDEF: void* LLVMValueRef TYPEDEF: void* LLVMBasicBlockRef TYPEDEF: void* LLVMBuilderRef TYPEDEF: void* LLVMMemoryBufferRef +TYPEDEF: void* LLVMTargetRef +TYPEDEF: void* LLVMPassRegistryRef + +! Type types +ENUM: LLVMTypeKind + LLVMVoidTypeKind + LLVMFloatTypeKind + LLVMDoubleTypeKind + LLVMX86_FP80TypeKind + LLVMFP128TypeKind + LLVMPPC_FP128TypeKind + LLVMLabelTypeKind + LLVMMetadataTypeKind + LLVMIntegerTypeKind + LLVMFunctionTypeKind + LLVMStructTypeKind + LLVMArrayTypeKind + LLVMPointerTypeKind + LLVMOpaqueTypeKind + LLVMVectorTypeKind ; ! Modules FUNCTION: LLVMModuleRef LLVMModuleCreateWithName ( c-string ModuleID ) @@ -36,7 +56,6 @@ FUNCTION: void LLVMDisposeModule ( LLVMModuleRef M ) FUNCTION: void LLVMDumpModule ( LLVMModuleRef M ) FUNCTION: LLVMBool LLVMVerifyModule ( LLVMModuleRef M, int Action, char **OutMessage ) FUNCTION: c-string LLVMGetTarget ( LLVMModuleRef M ) -DESTRUCTOR: LLVMDisposeModule ! Types FUNCTION: LLVMTypeRef LLVMInt1Type ( ) @@ -48,6 +67,7 @@ FUNCTION: LLVMTypeRef LLVMIntType ( unsigned NumBits ) FUNCTION: LLVMTypeRef LLVMFunctionType ( LLVMTypeRef ReturnType, LLVMTypeRef* ParamTypes, unsigned ParamCount, int IsVarArg ) +FUNCTION: LLVMTypeKind LLVMGetTypeKind ( LLVMTypeRef Ty ) ! Values FUNCTION: LLVMValueRef LLVMAddFunction ( LLVMModuleRef M, @@ -56,6 +76,8 @@ FUNCTION: LLVMValueRef LLVMAddFunction ( LLVMModuleRef M, FUNCTION: LLVMValueRef LLVMGetParam ( LLVMValueRef Fn, unsigned index ) FUNCTION: c-string LLVMGetValueName ( LLVMValueRef Val ) +FUNCTION: unsigned LLVMCountParams ( LLVMValueRef Fn ) +FUNCTION: LLVMTypeRef LLVMTypeOf ( LLVMValueRef Val ) ! Basic blocks FUNCTION: LLVMBasicBlockRef LLVMAppendBasicBlock ( LLVMValueRef Fn, @@ -79,15 +101,19 @@ FUNCTION: LLVMValueRef LLVMBuildSub ( LLVMBuilderRef Builder, c-string Name ) FUNCTION: LLVMValueRef LLVMBuildRet ( LLVMBuilderRef Builder, LLVMValueRef V ) -DESTRUCTOR: LLVMDisposeBuilder -! Engines +! Execution Engines FUNCTION: LLVMBool LLVMCreateExecutionEngineForModule ( LLVMExecutionEngineRef* OutEE, LLVMModuleRef M, char **OutMessage ) FUNCTION: void LLVMDisposeExecutionEngine ( LLVMExecutionEngineRef E ) -DESTRUCTOR: LLVMDisposeExecutionEngine +FUNCTION: uint64_t LLVMGetGlobalValueAddress ( LLVMExecutionEngineRef E, c-string name ) +FUNCTION: LLVMBool LLVMFindFunction ( LLVMExecutionEngineRef E, + c-string name, + LLVMValueRef OutFn ) +FUNCTION: void* LLVMGetPointerToGlobal ( LLVMExecutionEngineRef EE, + LLVMValueRef Global ) ! Memory buffers FUNCTION: LLVMBool LLVMCreateMemoryBufferWithContentsOfFile ( @@ -96,6 +122,7 @@ FUNCTION: LLVMBool LLVMCreateMemoryBufferWithContentsOfFile ( c-string* OutMessage ) FUNCTION: void LLVMDisposeMemoryBuffer ( LLVMMemoryBufferRef MemBuf ) FUNCTION: size_t LLVMGetBufferSize ( LLVMMemoryBufferRef MemBuf ) +! Deprecated and should be replaced with LLVMParseBitcode2. FUNCTION: int LLVMParseBitcode ( LLVMMemoryBufferRef MemBuf, LLVMModuleRef* OutModule, c-string* OutMessage ) @@ -104,5 +131,22 @@ FUNCTION: int LLVMParseBitcode ( LLVMMemoryBufferRef MemBuf, FUNCTION: LLVMModuleProviderRef LLVMCreateModuleProviderForExistingModule ( LLVMModuleRef M ) FUNCTION: void LLVMDisposeModuleProvider ( LLVMModuleProviderRef MP ) +! Targets +FUNCTION: LLVMTargetRef LLVMGetFirstTarget ( ) +FUNCTION: c-string LLVMGetTargetName ( LLVMTargetRef T ) + ! Messages FUNCTION: void LLVMDisposeMessage ( char *Message ) + +! Pass Registry +FUNCTION: LLVMPassRegistryRef LLVMGetGlobalPassRegistry ( ) + +! Initialization +FUNCTION: void LLVMInitializeCore ( LLVMPassRegistryRef PR ) +FUNCTION: void LLVMLinkInMCJIT ( ) +FUNCTION: void LLVMInitializeX86AsmPrinter ( ) +FUNCTION: void LLVMInitializeX86TargetInfo ( ) +FUNCTION: void LLVMInitializeX86Target ( ) +FUNCTION: void LLVMInitializeX86TargetMC ( ) + +! Removed symbols: LLVMCreateJITCompiler diff --git a/extra/llvm/llvm-tests.factor b/extra/llvm/llvm-tests.factor new file mode 100644 index 0000000000..81ed23ed89 --- /dev/null +++ b/extra/llvm/llvm-tests.factor @@ -0,0 +1,7 @@ +USING: kernel literals llvm llvm.ffi system tools.test ; +IN: llvm.tests + +${ cpu x86.64? "x86-64" "x86-32" ? } [ + initialize-native-target + LLVMGetFirstTarget LLVMGetTargetName +] unit-test diff --git a/extra/llvm/llvm.factor b/extra/llvm/llvm.factor index aad9279d7e..73dd2e6fdb 100644 --- a/extra/llvm/llvm.factor +++ b/extra/llvm/llvm.factor @@ -1,2 +1,14 @@ -USING: kernel ; +USING: llvm.ffi ; IN: llvm + +: initialize ( -- ) + LLVMGetGlobalPassRegistry LLVMInitializeCore ; + +! https://github.com/fsprojects/llvm-fs/blob/master/src/LLVM/Target.fs +: initialize-native-target ( -- ) + LLVMInitializeX86TargetInfo + LLVMInitializeX86Target + LLVMInitializeX86TargetMC ; + +: initialize-native-asm-printer ( -- ) + LLVMInitializeX86AsmPrinter ; diff --git a/extra/llvm/reader/reader-docs.factor b/extra/llvm/reader/reader-docs.factor index fd578a8720..5a34ba6a2e 100644 --- a/extra/llvm/reader/reader-docs.factor +++ b/extra/llvm/reader/reader-docs.factor @@ -4,6 +4,10 @@ USING: help.markup help.syntax llvm.wrappers strings ; IN: llvm.reader +HELP: buffer>module +{ $values { "buffer" buffer } { "module" module } } +{ $description "Creates a module from a buffer. The buffer is disposed of." } ; + HELP: load-module { $values { "path" string } { "module" module } } { $description "Parses a file containing llvm bitcode into an llvm module." } diff --git a/extra/llvm/reader/reader-tests.factor b/extra/llvm/reader/reader-tests.factor new file mode 100644 index 0000000000..c380254953 --- /dev/null +++ b/extra/llvm/reader/reader-tests.factor @@ -0,0 +1,7 @@ +USING: io.pathnames llvm.reader llvm.wrappers tools.test ; +IN: llvm.reader.tests + +{ t } [ + "resource:extra/llvm/wrappers/add.bc" absolute-path load-module + module? +] unit-test diff --git a/extra/llvm/wrappers/wrappers-tests.factor b/extra/llvm/wrappers/wrappers-tests.factor index 16cdb50106..3a6956117a 100644 --- a/extra/llvm/wrappers/wrappers-tests.factor +++ b/extra/llvm/wrappers/wrappers-tests.factor @@ -1,8 +1,15 @@ USING: accessors alien destructors io.pathnames kernel llvm.ffi -llvm.wrappers tools.test ; +llvm.reader llvm.wrappers tools.test ; IN: llvm.wrappers.tests +CONSTANT: ADD.BC "resource:extra/llvm/wrappers/add.bc" + { 728 t } [ - "resource:extra/llvm/wrappers/add.bc" absolute-path <buffer> + ADD.BC absolute-path <buffer> [ value>> [ LLVMGetBufferSize ] keep ] with-disposal alien? ] unit-test + +{ "sum" 2 } [ + ADD.BC absolute-path load-module <engine> + "sum" find-function [ LLVMGetValueName ] [ LLVMCountParams ] bi +] unit-test diff --git a/extra/llvm/wrappers/wrappers.factor b/extra/llvm/wrappers/wrappers.factor index 32b8c25f00..67aef49678 100644 --- a/extra/llvm/wrappers/wrappers.factor +++ b/extra/llvm/wrappers/wrappers.factor @@ -1,12 +1,12 @@ -! Copyright (C) 2009 Matthew Willis. +! 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 ; +io.encodings.utf8 kernel llvm.ffi prettyprint ; IN: llvm.wrappers ERROR: llvm-error message ; -: llvm-throw ( c-string -- ) +: llvm-throw ( void* -- ) [ utf8 alien>string ] [ LLVMDisposeMessage ] bi llvm-error ; : <dispose> ( alien class -- disposable ) new swap >>value ; @@ -28,6 +28,28 @@ M: provider dispose* value>> LLVMDisposeModuleProvider ; : <provider> ( module -- provider ) [ (provider) ] with-disposal ; +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* + void* deref ; + +: <engine> ( module -- engine ) + [ + [ value>> (engine) engine <dispose> ] + [ t >>disposed drop ] bi + ] with-disposal ; + +: find-function ( engine name -- function/f ) + [ value>> ] dip f void* <ref> + [ LLVMFindFunction drop ] keep void* deref ; + +: function-pointer ( engine function -- alien ) + [ value>> ] dip LLVMGetPointerToGlobal ; + TUPLE: buffer value disposed ; M: buffer dispose* value>> LLVMDisposeMemoryBuffer ;