Skip to content

Instantly share code, notes, and snippets.

@jkominek
Created February 25, 2015 07:31
Show Gist options
  • Save jkominek/9b74b863e7e8da6c3f8c to your computer and use it in GitHub Desktop.
Save jkominek/9b74b863e7e8da6c3f8c to your computer and use it in GitHub Desktop.
turn a block of LLVM IR into a callable procedure
#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