webkit|webkit jit机器码生成流程
nativeForGenerator 为例, JSInterfaceJIT 的父类 MacroAssemblerX86Common 中有各种汇编指令生成入口,例如push。
但真正的汇编指令生成器是MacroAssemblerX86Common 的父类 AbstractMacroAssembler 中的 AssemblerType m_assembler------这正是push所使用的。AssemblerType是个模板,这里是X86Assembler。这里面可以找到push对应的push_r函数。
push_r调用了 X86Assembler 里内嵌类 X86InstructionFormatter-m_formatter的方法 oneByteOp 。
oneByteOp 终于将机器码写入了真正的存储区 m_buffer , m_buffer 是属于 m_formatter 的,m_buffer 是个 AssemblerBuffer 类
AssemblerBuffer 类如其名,将机器码存于自己下属的m_storage.m_buffer中。
除了push外,其余汇编指令也是类似流程,反复执行,生成完机器码后,再转换为LinkBuffer。
【webkit|webkit jit机器码生成流程】LinkBuffer 的 构造函数会调用 linkCode ,之前的JSInterfaceJIT实例将其基类MacroAssembler作为参数传入, 再调用performJITMemcpy 将刚才的机器码拷贝到 m_code 成员中
m_code 是个指针, 指向另外个RefPtr
最后,还要用typedef MacroAssemblerCodeRef CodeRef这个类把m_executableMemory包一下,m_executableMemory就成为了 m_executableMemory , 变成了 CodeRef的一员。
CodeRef 的 m_codePtr 里的指针 也被指向 m_executableMemory的m_start。
执行时,Interpreter 会获得一个 JITCode 的子类, JITCode基类里面有个纯虚函数 executableAddressAtOffset 已被子类实现, 例如 JITCodeWithCodeRef::executableAddressAtOffset,它会获得之前的机器码首地址。
之后这个地址被作为参数传入 vmEntryToJavaScript 中, vmEntryToJavaScript实现于 LowLevelInterpreter.asm里面会先后调用 doVMEntry makeJavaScriptCall 宏,最终call这个地址。
推荐阅读
- 机器学习|机器学习 Andrew Ng《Machine Learning》课程笔记1
- 《机器学习实战》高清中文版PDF英文版PDF+源代码下载
- 机器学习一些简单笔记
- 剑指|剑指 Offer 13. 机器人的运动范围(dfs,bfs)
- 历史上的今天|【历史上的今天】2 月 16 日(世界上第一个 BBS 诞生;中国计算机教育开端;IBM 机器人赢得智能竞赛)
- 基于stm32智能风扇|基于stm32智能风扇_一款基于STM32的智能灭火机器人设计
- 读书笔记|《白话大数据和机器学习》学习笔记1
- Python机器学习基础与进阶|Python机器学习--集成学习算法--XGBoost算法
- 机器学习-5|机器学习-5 朴素贝叶斯【附代码】
- 机器学习|机器学习Sklearn学习总结