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 m_executableMemory 成员的 m_start。这样 m_executableMemory 就被填充了机器码。
最后,还要用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这个地址。

    推荐阅读