llvm MCJIT 的若干陷阱
搬运自我的百度空间
最近把llvm的老版本JIT转型到MCJIT,遇到一些问题
首先是如何启动MCJIT,
原来调用InitializeNativeTarget();的地方,添加
InitializeNativeTargetAsmPrinter();
InitializeNativeTargetAsmParser();
否则会报错:Target does not support MC emission!?
创建execution engine时
EngineBuilder eb(M);
eb .setUseMCJIT(true);
(如果所在的是windows系统)找到llvm源码中的llvm::sys::getProcessTriple函数,
最后一句改为
#ifdef LLVM_ON_WIN32
return PT.str()+"-elf";
#else
return PT.str();
#endif
否则报错:Incompatible object format!
然后在加入module后必须要TheExecutionEngine->finalizeObject(); 否则地址重定向什么的都无法解决
最后坑爹之处在于,MCJIT的execution engine不管你有没有addGlobalMapping都会报找不到global符号的错误
需要在创建engine时,指定一个MemoryManager
eb.setMCJITMemoryManager(new HelpingMemoryManager(this));
HelpingMemoryManager类请参考
https://github.com/llvm-mirror/llvm/blob/master/examples/Kaleidoscope/MCJIT/cached/toy.cpp
关于mcjit的使用参考官方博客:
?http://project1439.rssing.com/chan-6400099/all_p2.html
HelpingMemoryManager类相当于提供符号与绝对地址的链接,代替了之前的addGlobalMapping
需要注意的是,在官方给出的HelpingMemoryManager代码中,需要重载的是getPointerToNamedFunction。可能是版本上的问题,我使用的llvm 3.4.2 需要重载的是getSymbolAddress,源代码中有注释:
//This function is deprecated for memory managers to be used with
/// MCJIT or RuntimeDyld. Use getSymbolAddress instead.
2015-03-05