art/compiler/dex/quick/quick_compiler.cc中:
QuickCompiler::Compile(...)函数内:
Compiler::IsPathologicalCase(...) : 当前方法的指令条数和寄存器个数超过 UINT16_MAX / 4 时,编译器将不编译此方法,直接返回。
创建编译单元: CompilationUnit cu(...),对应一个方法
初始化编译单元:InitCompilationUnit(cu) ,根据指令集禁止一些优化选项
创建一个MIR Graph对象: cu.mir_graph.reset(new MIRGraph(&cu, &cu.arena))
生成Code Generator: cu.cg.reset(GetCodeGenerator(&cu, nullptr)) --> MipsCodeGenerator(...) --> MipsMir2Lir(...) (创建 Mir2Lir* 指针)
建立raw MIR graph: cu.mir_graph->InlineMethod(...)依次调用 ParseInsn(...)(解析一条dalvik字节码)、DumpCFG(...)、DumpMIRGraph(...)
关联SSA形式的寄存器和Dalvik寄存器:cu.mir_graph->RemapRegLocations()
生成最终代码:cu.cg->Materialize()依次调用SimpleRegAlloc()、MethodMIR2LIR()、AssembleLIR()
ART中 MIR --> LIR --> 机器码 的流程
最新推荐文章于 2019-10-21 09:37:53 发布