[llvm] Call the LLVM Jit from c program
stackoverflow: http://stackoverflow.com/questions/1838304/call-the-llvm-jit-from-c-program
Another trial under llvm 3.2;
In prepared IR "tst.ll", code:
; ModuleID = 'tst.bc' define i32 @add1(i32 %AnArg) { EntryBlock: %0 = add i32 1, %AnArg ret i32 %0 } define i32 @foo() { EntryBlock: %0 = tail call i32 @add1(i32 10) ret i32 %0 }
run " llvm-as tst.ll " to create the asm file tst.bc
then the caller programe:
#include <string> #include <memory> #include <iostream> #include <llvm/LLVMContext.h> #include <llvm/Support/TargetSelect.h> #include <llvm/Bitcode/ReaderWriter.h> #include <llvm/ExecutionEngine/ExecutionEngine.h> #include <llvm/Module.h> #include <llvm/Support/MemoryBuffer.h> #include <llvm/ExecutionEngine/JIT.h> #include <llvm/Support/system_error.h> using namespace std; using namespace llvm; int main() { InitializeNativeTarget(); llvm_start_multithreaded(); LLVMContext context; string error; OwningPtr<MemoryBuffer> file_buffer; MemoryBuffer::getFile("tst.bc", file_buffer); Module *m = ParseBitcodeFile(file_buffer.get(), context, &error); ExecutionEngine *ee = ExecutionEngine::create(m); Function* func = ee->FindFunctionNamed("foo"); typedef int (*PFN)(); PFN pfn = reinterpret_cast<PFN>(ee->getPointerToFunction(func)); int x = pfn(); cout << "~~~ " << x << "\n"; delete ee; }
In the above example, IR codes are load from a file. In more dymanic usage, we could construct the IR code as a string according to input "query" type. Then compile the IR to bitcode on the fly.