]> gitweb.factorcode.org Git - factor.git/commitdiff
llvm: more of the unmaintained llvm bindings fixed
authorBjörn Lindqvist <bjourne@gmail.com>
Thu, 13 Jul 2017 02:00:23 +0000 (04:00 +0200)
committerBjörn Lindqvist <bjourne@gmail.com>
Thu, 13 Jul 2017 02:00:23 +0000 (04:00 +0200)
extra/llvm/ffi/ffi.factor
extra/llvm/llvm-tests.factor [new file with mode: 0644]
extra/llvm/llvm.factor
extra/llvm/reader/reader-docs.factor
extra/llvm/reader/reader-tests.factor [new file with mode: 0644]
extra/llvm/wrappers/wrappers-tests.factor
extra/llvm/wrappers/wrappers.factor

index c2ffec4e94eaa2b1f62417f5334118195b349359..af0f3f12d4690baf5c7234e788060f28114b0c93 100644 (file)
@@ -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 (file)
index 0000000..81ed23e
--- /dev/null
@@ -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
index aad9279d7ee9f4809d193c8f2f4f74f5666db592..73dd2e6fdb493b91e19473d736bf0ad939ce73bc 100644 (file)
@@ -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 ;
index fd578a872072c45521b42242cf33e7bd0ed3724d..5a34ba6a2eea9852e0e0b4b79823358c650f1c51 100644 (file)
@@ -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 (file)
index 0000000..c380254
--- /dev/null
@@ -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
index 16cdb50106ea9f6ceb962773df15c8db7c38e022..3a6956117a18ae7512d365de223a2134f418b9e2 100644 (file)
@@ -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
index 32b8c25f00b71c55989a0cef67dc5acd232341d9..67aef496787b0433be5a6a92b42e052130d79ef4 100644 (file)
@@ -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 ;