v8学习笔记(六) 汇编过程
v8匯編過(guò)程
根據(jù)抽象語(yǔ)法樹(shù)FunctionLiteral創(chuàng)建Code對(duì)象(內(nèi)含機(jī)器指令),返回JSFunction對(duì)象.
MakeCode():???
1.增加返回語(yǔ)句:? Rewriter::Process(FunctionLiteral) 向抽象語(yǔ)法樹(shù)的語(yǔ)句數(shù)??????????????????????????????????????????????????????????????????????????????????????????? ???????? 組Body_添加ReturnStatement(返回語(yǔ)句)
2.優(yōu)化AST:????????????? Rewriter::Optimize(FunctionLiteral)優(yōu)化抽象語(yǔ)法樹(shù)
?
3.產(chǎn)生機(jī)器碼(機(jī)器指令)
1.創(chuàng)建代碼產(chǎn)生器FullCodeGenerator(AstVisitor的子類 ):
???????? ???????? 內(nèi)含匯編器MacroAssembler(根據(jù)硬件架構(gòu)宏來(lái)選擇相應(yīng)的匯編器對(duì)象).
???????? v8目前支持4個(gè)硬件架構(gòu):?? V8_TARGET_ARCH_IA32
???????????????????????????????????? ???????? ?????????????????? V8_TARGET_ARCH_X84
?????????????????????????????????????????????? ???????? ???????? V8_TARGET_ARCH_ARM
??????????????????????????????????????????????????????? ???????? V8_TARGET_ARCH_MIPS
2.調(diào)用FullCodeGenerator::Generate(CompilationInfo*,Mode)開(kāi)始匯編
???????? (1)代碼產(chǎn)生器訪問(wèn)AST ,根據(jù)語(yǔ)義調(diào)用匯編器(MacroAssembler)產(chǎn)生相應(yīng)的機(jī)器指令并放入?yún)R編器的緩沖區(qū).
???????? 共有5個(gè)步驟:
???????? ---- 若Mode為PRIMARY,則? Allocate locals
??????????????????????????? ???????? ??????????????????????????? Allocate local context
???????????????????????????????????? ???????? ?????????????????? Allocate arguments object
???????? ----Declarations:匯編抽象語(yǔ)法樹(shù)的Scope中變量和函數(shù)聲明對(duì)象(ZoneList<Declaration*>)
???????? ---- Stack check:匯編棧檢驗(yàn)語(yǔ)句
???????? ---- Body:匯編非聲明語(yǔ)句(語(yǔ)句數(shù)組的所有語(yǔ)句)
???????? ---- return:匯編返回語(yǔ)句
???????? (2)創(chuàng)建一個(gè)CodeDesc對(duì)象描述產(chǎn)生的機(jī)器指令,再創(chuàng)建Code對(duì)象Factory::NewCode(….)
???????? struct CodeDesc {? byte* buffer;????? //緩沖地址
? ???????????????????? int buffer_size;?? //緩沖大小
? ???????????????????? int instr_size;??? //指令總長(zhǎng)度
? ???????????????????? int reloc_size;??? //重定位信息長(zhǎng)度
? ???????????????????? Assembler* origin; //匯編器
?????????????????????? };
?????????????????? ???? |<--------------- buffer_size ---------------->|
?????????????????? ???? |<-- instr_size -->|??????? |<-- reloc_size -->|
?????????????????? ???? +==================+========+==================+
???? 機(jī)器指令緩沖?????? | ??instructions?? |? free? |??? reloc info??? |
?????????????????? ???? +==================+========+==================+
?
?
4.結(jié)尾操作
???????? 根據(jù) 抽象語(yǔ)法樹(shù)FunctionLiteral+Code+CompilationInfo創(chuàng)建SharedFunctionInfo ,
再創(chuàng)建JSFunction對(duì)象,Handle<JSFunction>轉(zhuǎn)化為API Handle<Script>,返回
總結(jié)
以上是生活随笔為你收集整理的v8学习笔记(六) 汇编过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: v8学习笔记(五) 编译过程
- 下一篇: v8学习笔记(七) 执行过程