Created
February 25, 2015 07:31
-
-
Save jkominek/9b74b863e7e8da6c3f8c to your computer and use it in GitHub Desktop.
turn a block of LLVM IR into a callable procedure
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#lang racket | |
(require ffi/unsafe) | |
(define llvm (ffi-lib "/usr/lib/x86_64-linux-gnu/libLLVM-3.7.so.1")) | |
(define get-global-context | |
(get-ffi-obj 'LLVMGetGlobalContext llvm | |
(_fun -> _pointer))) | |
(define get-context | |
(get-ffi-obj 'LLVMContextCreate llvm | |
(_fun -> _pointer))) | |
(define parse-ir-in-context | |
(get-ffi-obj 'LLVMParseIRInContext llvm | |
(_fun _pointer _pointer (module : (_ptr o _pointer)) (_ptr o _string) -> _bool -> (values module)))) | |
(define create-memory-buffer-with-memory-range | |
(get-ffi-obj 'LLVMCreateMemoryBufferWithMemoryRange llvm | |
(_fun _string _size _string _bool -> _pointer))) | |
(define link-in-mcjit | |
(get-ffi-obj 'LLVMLinkInMCJIT llvm | |
(_fun -> _void))) | |
(define initialize-x86-target | |
(get-ffi-obj 'LLVMInitializeX86Target llvm | |
(_fun -> _void))) | |
(define initial-x86-target-info | |
(get-ffi-obj 'LLVMInitializeX86TargetInfo llvm | |
(_fun -> _void))) | |
(define initialize-x86-targetmc | |
(get-ffi-obj 'LLVMInitializeX86TargetMC llvm | |
(_fun -> _void))) | |
(define initial-x86-asm-printer | |
(get-ffi-obj 'LLVMInitializeX86AsmPrinter llvm | |
(_fun -> _void))) | |
(define create-execution-engine-for-module | |
(get-ffi-obj 'LLVMCreateExecutionEngineForModule llvm | |
(_fun (engine : (_ptr o _pointer)) _pointer (_ptr o _string) -> _bool -> (values engine)))) | |
(define create-jit-compiler-for-module | |
(get-ffi-obj 'LLVMCreateJITCompilerForModule llvm | |
(_fun (engine : (_ptr o _pointer)) _pointer _uint32 (error : (_ptr o _string)) -> _bool -> (values engine)))) | |
(define get-named-function | |
(get-ffi-obj 'LLVMGetNamedFunction llvm | |
(_fun _pointer _string -> _pointer))) | |
(define get-function-address | |
(get-ffi-obj 'LLVMGetFunctionAddress llvm | |
(_fun _pointer _string -> _pointer))) | |
(define some-ir | |
"define i32 @mul_add(i32 %x, i32 %y, i32 %z) { | |
entry: | |
%tmp = mul i32 %x, %y | |
%tmp2 = add i32 %tmp, %z | |
ret i32 %tmp2 | |
}") | |
(define membuf (create-memory-buffer-with-memory-range some-ir (string-length some-ir) "bob" #f)) | |
(define ctxt (get-global-context)) | |
(define module (parse-ir-in-context ctxt membuf)) | |
(link-in-mcjit) | |
(initialize-x86-target) | |
(initial-x86-target-info) | |
(initialize-x86-targetmc) | |
(initial-x86-asm-printer) | |
(define engine | |
(create-jit-compiler-for-module module 0)) | |
(define mul_add | |
(cast | |
(get-function-address engine "mul_add") | |
_pointer | |
(_fun _int32 _int32 _int32 -> _int32))) | |
(mul_add 10 2 3) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment