我正在学习 llvm,想要对我的想法进行概念验证。
基本上,我想分割我的编译器和运行时。编译器将给出一个 .bc,运行时将通过 ParseBitcodeFile 加载它并使用 ExecutionEngine 来运行它。这部分正在发挥作用。
现在,为了轻松进行系统调用,我希望能够在运行时实现 C/C++ 函数来执行所有系统调用(文件 io、stdout 打印等)。我的问题是,我如何从我的玩具编译器的代码中调用这些函数(该编译器是由 llvm 在不同的步骤中编译的),并允许在执行时使用它。
好消息:使用 JIT 时ExecutionEngine
, 这会只是工作。当 JIT-er 发现 IR 使用的外部符号(在 IR 本身中未找到)时,它会在 JIT-ing 进程本身中查找,因此可以调用主机程序中可见的任何符号。
这直接解释在LLVM 教程的第 4 部分 http://llvm.org/docs/tutorial/LangImpl04.html:
哇,JIT 怎么知道 sin 和 cos 呢?答案是
出奇的简单:在这个例子中,JIT 开始执行一个
函数并进行函数调用。它意识到该函数是
尚未 JIT 编译并调用标准例程集
解析函数。在这种情况下,没有为
函数,因此 JIT 最终调用了“dlsym("sin")”
万花筒过程本身。由于“罪”是在 JIT 中定义的
地址空间,它只是修补模块中的调用以调用
直接使用 libm 版本的 sin。
对于血淋淋的细节请看lib/ExecutionEngine/JIT/JIT.cpp
- 特别是它的用法DynamicLibrary
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)