V8-0.2.5: JIT代码生成逻辑
23 Jan 2017 | categories notesJIT的执行入口在
v8::internal::Invoke(...) {
...
// Call the function through the right JS entry stub.
value = CALL_GENERATED_CODE(entry, func->code()->entry(), *func, *receiver, argc, args);
}
entry
为JSEntryStub
,即JS入口桩代码。
桩代码的生成逻辑在JSEntryStub::GenerateBody
桩代码中通过一个帮助函数跳转到JS的JIT代码,帮助函数通过Generate_JSEntryTrampolineHelper
生成
JS的JIT代码通过Ia32CodeGenerator::GenCode
生成
在JS的JIT代码中,如果要调用Runtime的函数(例如DOM函数,或者JS的builtin函数),则通过CEntryStub
实现,即C入口桩代码
在进入C入口桩代码前,通过MacroAssembler::TailCallRuntime
和MacroAssembler::JumpToBuiltin
生成跳转桥梁
整个逻辑如下见V8的JIT代码调用关系