[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.

 

你可能感兴趣的:(call)