v8学习笔记(六) 汇编过程

来源:互联网 发布:three.js开发指南摘要 编辑:程序博客网 时间:2024/09/21 09:08

v8汇编过程

根据抽象语法树FunctionLiteral创建Code对象(内含机器指令),返回JSFunction对象.

MakeCode():   

1.增加返回语句:  Rewriter::Process(FunctionLiteral) 向抽象语法树的语句数                                                                                                     Body_添加ReturnStatement(返回语句)

2.优化AST:              Rewriter::Optimize(FunctionLiteral)优化抽象语法树

 

3.产生机器码(机器指令)

1.创建代码产生器FullCodeGenerator(AstVisitor的子类 ):

                  内含汇编器MacroAssembler(根据硬件架构宏来选择相应的汇编器对象).

         v8目前支持4个硬件架构:   V8_TARGET_ARCH_IA32

                                                                 V8_TARGET_ARCH_X84

                                                                 V8_TARGET_ARCH_ARM

                                                                 V8_TARGET_ARCH_MIPS

2.调用FullCodeGenerator::Generate(CompilationInfo*,Mode)开始汇编

         (1)代码产生器访问AST ,根据语义调用汇编器(MacroAssembler)产生相应的机器指令并放入汇编器的缓冲区.

         共有5个步骤:

         ---- ModePRIMARY,  Allocate locals

                                                                 Allocate local context

                                                                 Allocate arguments object

         ----Declarations:汇编抽象语法树的Scope中变量和函数声明对象(ZoneList<Declaration*>)

         ---- Stack check:汇编栈检验语句

         ---- Body:汇编非声明语句(语句数组的所有语句)

         ---- return:汇编返回语句

         (2)创建一个CodeDesc对象描述产生的机器指令,再创建Code对象Factory::NewCode(….)

         struct CodeDesc {  byte* buffer;      //缓冲地址

                       int buffer_size;   //缓冲大小

                       int instr_size;    //指令总长度

                       int reloc_size;    //重定位信息长度

                       Assembler* origin; //汇编器

                       };

                        |<--------------- buffer_size ---------------->|

                        |<-- instr_size -->|        |<-- reloc_size -->|

                        +==================+========+==================+

     机器指令缓冲       |   instructions   |  free  |    reloc info    |

                        +==================+========+==================+

 

 

4.结尾操作

         根据 抽象语法树FunctionLiteral+Code+CompilationInfo创建SharedFunctionInfo ,

再创建JSFunction对象,Handle<JSFunction>转化为API Handle<Script>,返回

原创粉丝点击