写在前面:
- hqemu用的是历史版本的qemu,目前看来hqemu和现今的qemu的框架是一样的,但是仍有不少不一样的地方。
- 2020.4.23 😱😱😱hqemu用的qemu还不支持64位的mips,对比hqemu和当今qemu的
tcg/mips/tcg-target.h
的定义,所以讲道理hqemu在目前的龙芯平台是用不了的咯。
从TCG到LLVM
我将TCG到LLVM的过程分为3个部分:翻译、执行、优化。翻译和执行完全是按照qemu的框架里来的,优化的部分就涉及到了hqemu自己创新的多线程协调。接下来主要是通过代码框图来展示TCG到LLVM的这3个部分。
翻译
翻译过程使用的是qemu的框架详细可以去看看qemu的代码框图。hqemu在qemu的tcg翻译框架上添加了自己的tcg指令hotpatch用于插桩相关代码。
2020.4.20
将guest代码翻译成tcg的代码框架,
将tcg翻译成本地码的代码框架,
执行
插桩函数helper_NET_predict
执行过程,
需要注意的是单优化线程(HYBRIDS)的模式直接在helper函数里调用GenTrace
,而多优化线程模式(HYBRIDM)是在优化线程中去调用的GenTrace
,GenTrace
的内容如下。
优化
2020.4.30
其中CreateSession(...)
中做了诸多变量的初始话,其中通过调用CreateJIT()
函数来初始化JIT。CreateJIT()
代码框图如下,
hqemu定义的EventListener
这个类的一些方法让人十分疑惑。EventListener
的继承了LLVM的JITEventListener
类,但是EventListener
出现了自己的定义的函数NotifyFunctionEmitted
,这个是在哪里会被用到LLVM的文档完全没写,但是LLVM的源码llvm/inllude/llvm/ExecutionEngine/JITEventListener.h
又提到了一句
NotifyObjectEmitted - Called after an object has been successfully emitted to memory. NotifyFunctionEmitted will not be called for individual functions in the object.
所以NotifyObjectEmitted
使用宏拼出来的吗???
大概是在网上找到了答案LLVM 2.7版的JIT类(现在已经被MCJIT类取代了)。所以这个NotifyObjectEmitted
大概是不再使用的历史版本的接口。
上面的CreateJIT
是创建JIT的过程,接下来是运行JIT的过程,即IRFactory::Compile
函数的工作,
hqemu移植到xqm的编译问题
- qemu版本不同头文件里的一些定义发生变化;
- xqm项目的一些语法和变量名在cpp编译器里会有问题;
目前的解决方案是参考并修改hqemu的多线程优化框架,原hqemu的多线程优化框架如下(注:一个矩形框表示一个线程),
新的修改的框架如下,