首页 > 其他 > 详细

llvm MCJIT 的若干陷阱

时间:2015-06-14 09:27:20      阅读:810      评论:0      收藏:0      [点我收藏+]


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.


llvm MCJIT 的若干陷阱

原文:http://blog.csdn.net/myjisgreat/article/details/46487117

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!