码迷,mamicode.com
首页 > 其他好文 > 详细

llvm MCJIT 的若干陷阱

时间:2015-06-14 09:30:18      阅读:686      评论:0      收藏:0      [点我收藏+]

标签:llvm



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 的若干陷阱

标签:llvm

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!