llvm MCJIT 的若干陷阱



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

时间: 2024-11-07 10:05:37

llvm MCJIT 的若干陷阱的相关文章

google objective-c coding style(4)COCOA 和 OBJECTIVE-C 特性

成员变量应该是 @private Tip 成员变量应该声明为 @private @interface MyClass : NSObject { @private id myInstanceVariable_; } // public accessors, setter takes ownership - (id)myInstanceVariable; - (void)setMyInstanceVariable:(id)theVar; @end 明确指定构造函数 Tip 注释并且明确指定你的类的构

我的《C陷阱与缺陷》读书笔记

第一章 词法"陷阱" 1. =不同于== if(x = y) break; 实际上是将y赋给x,再检查x是否为0. 如果真的是这样预期,那么应该改为: if((x = y) != 0) break; 2. &和| 不同于 && 和 ||   3.词法分析中的"贪心法" 编译器将程序分解成符号的方法是:从左到有一个一个字符的读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符床是否可能是一个符号的组成部分:如

《C陷阱与缺陷》读书笔记

<C陷阱与缺陷>读书笔记 1.编译器中的词法分析器负责将程序分解为一个个符号.C语言中,符号之间的空白 (包括Space ,Tab , Enter) 都将被忽略,但一个符号的中间不能有空白,否则可能被解释成为另一个或几个符号. 2.编译器将程序分解成符号的方法是从左到右逐个字符读入,如果该字符可能会组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分:如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已经不再可能组成一个有意义的

C陷阱与缺陷学习笔记

本书的介绍 作者以自己1985年在Bell实验室时发表的一篇论文为基础,结合自己的工作经验扩展成为这本对C程序员具有珍贵价值的经典著作.写作本书的出发点不是要批判C语言,而是要帮助C程序员绕过编程过程中的陷阱和障碍. 全书分为8章,分别从词法分析.语法语义.连接.库函数.预处理器.可移植性缺陷等几个方面分析了C编程中可能遇到的问题.最后,作者用一章的篇幅给出了若干具有实用价值的建议. 本书适合有一定经验的C程序员阅读学习,即便你是C编程高手,本书也应该成为你的案头必备书籍. 前言 N年读过这本书

LLVM 3.0类型系统重写

原文地址:http://blog.llvm.org/2011/11/llvm-30-type-system-rewrite.html LLVM 3.0中最为普遍的IR(因此编译器API)改变之一是完全重新实现LLVMIR类型.这个改变拖延了很久(最初的类型系统自LLVM1.0延续),它使得编译器更快,极大地简化VMCore的一个关键子系统,并消除了IR某些通常导致混淆与不方便的设计点.本文解释为什么要进行这些改变,以及新系统如何工作. 类型系统的目标 LLVMIR类型子系统是IR相当直接明了的部

构架编译器框架系统 LLVM 使用简介

LLVM 是什么LLVM 是 low level virtual machine(底层虚拟机)的简称,它是一个开源的编译器架构,已经被成功应用到多个应用领域.LLVM 的主要作用是它可以作为多种语言的后端,它可以提供可编程语言无关的优化和针对很多种CPU的代码生成功能.LLVM 核心库提供了与编译器相关的支持,可以作为多种语言编译器的后台来使用.能够进行程序语言的编译期优化.链接优化.在线编译优化.代码生成.LLVM的项目是一个模块化和可重复使用的编译器和工具技术的集合.LLVM是伊利诺伊大学的

java中DelayQueue的一个使用陷阱分析

最近工作中有接触到DelayQueue,网上搜索资料的时候发现一篇文章谈到DelayQueue的坑.点击打开链接 文中已经总结了遇到坑的地方,还有解决方案.不过我第一眼看一下没弄明白为什么,所以翻了翻源码深究了一下,下面把这个坑的原因以及原理分析一下. 首先是DelayQueue的take()方法: 1 public E take() throws InterruptedException { 2 final ReentrantLock lock = this.lock; 3 lock.lock

探讨 Git 代码托管平台的若干问题

关于 Git 版本控制软件种类繁多,维基百科收录的最早的版本控制系统是 1972 年贝尔实验室开发的 Source Code Control System.1986 年 Concurrent Versions System(CVS) 诞生,CVS 曾非常流行,但今时用之寥寥无几,不过 OpenBSD 仍在使用 CVS.2000 年 CollabNet 创建了 Subversion 项目,2009年,Subversion 被 Apache 基金会接受成为顶级项目并被命名为 Apache Subve

Bash 的若干基本问题

Bash 的若干基本问题 这里介绍一些bash启动前.后的问题,以及一些使用bash需要注意的基本问题. 1.Bash的介绍 Bash是一种Shell程序,它是一般的Linux系统中的默认的Shell程序,一般情况下Bash指的是/bin/bash这个软件. 一个Linux系统中有多少个可用的Shell程序,可以从/etc/shells文件中查出来. 当前登录用户的默认Shell是哪一个,可以从/etc/passwd文件中与此用户对应的那一行最后一个字段看出来.或者也可以通过echo $SHEL