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()

一个MIRGraph对应着一个编译单元即一个方法,对一个方法进行控制流分析,划分出BasicBlock,并在BasicBlock中的fall_through和taken域中指向下一个BasicBlock(适用于分支出口)。每一个BasicBlock包含若干MIR语句,每一条dalvik指令对应一条MIR语句(有待考证),这些MIR结构体之间形成双向链表。每一个BasicBlock也指示了第一条和最后一条MIR语句。

InlineMethod函数主要是解析一个方法,并划分BasicBlock边界,但是只是简单地把BasicBlock连接成一个链表,利用fall_through指示。
在CodeLayout函数中具体地再次遍历BasicBlock链表,并根据每个BasicBlock出口的指令,再次调整taken域和fall_through域,形成完整的控制流图结构。
SSATransformation函数是对每条指令进行静态单赋值变换。先对控制流图进行深度优先遍历,并计算出BasicBlock之间的支配关系,插入Phi函数,并对变量进行命名更新。
其余的方法主要是一些代码优化过程,例如常量传播、消除空指针检查;并在BasicBlock组合之后再进行BasicBlock的优化,消除冗余指令。
这样基本上就完成了MIR的生成过程,在某种程度上,可以认为MIR即为对dalvik指令进行SSA变换之后的指令形态。

接着就调用cu.cg->Materialize()用来产生最终代码,其中重要的两个调用就是MethodMIR2LIR()和AssembleLIR()。
MethodMIR2LIR()将MIR转化为LIR,遍历每个BasicBlock,对每个基本块执行MethodBlockCodeGen,本质上最后是执行了CompileDalvikInstruction。CompileDalvikInstruction也就是通过解析指令,然后根据opcode进行分支判断,调用最终不同的指令生成函数。最后将LIR之间也形成一个双向链表。
AssembleLIR()最终调用的是AssembleInstructions函数。程序中维护了一个编码指令表MipsMir2Lir::EncodingMap,AssembleInstructions即是通过查找这个表来进行翻译,将LIR转化为了MIPS指令,并将所翻译的指令存储到CodeBufferMir2Lir::code_buffer_之中。
这样就完成了一次编译的完整流程。

本文参考:

Android的ART运行时: http://drops.wooyun.org/tips/10841

ART中 MIR -- LIR -- 机器码 的流程相关推荐

  1. 运动想象脑机接口中迁移学习的完整流程

    点击上面"脑机接口社区"关注我们 更多技术干货第一时间送达 脑机接口(Brain-Computer Interface, BCI)可以让用户使用脑电信号直接与计算机或其他外部设备进 ...

  2. 伍冬睿教授:脑机接口中迁移学习的完整流程

    大家好,今天Rose分享一篇关于脑机接口中的迁移学习的完整流程.本文由华中科技大学伍冬睿教授授权分享. 关于脑机接口中迁移学习方面的研究,伍教授团队做过大量的工作.之前社区分享过<脑机接口中的流 ...

  3. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )

    文章目录 一.Android 系统中调试器进程内存流程 二.编译内存调试动态库以及调试程序 三.博客资源 一.Android 系统中调试器进程内存流程 修改游戏运行中的内存 , 游戏运行之后 , 游戏 ...

  4. ios开发 mvp实践_实践中开发人员的工作流程-我们如何在30天内建立​​MVP

    ios开发 mvp实践 by Léna Faure 莱娜·福雷(LénaFaure) 实践中开发人员的工作流程-我们如何在30天内建立​​MVP (The developer's workflow i ...

  5. 【推荐实践】推荐系统中模型训练及使用流程的标准化

    文章作者:梁超 腾讯 高级工程师 编辑整理:Hoh Xil 内容来源:DataFun AI Talk 导读:本次分享的主题为推荐系统中模型训练及使用流程的标准化.在整个推荐系统中,点击率 ( CTR ...

  6. iPhone应用中APNS推送通知流程代码实现案例

    2019独角兽企业重金招聘Python工程师标准>>> iPhone应用中APNS推送通知流程代码实现案例是本文要介绍的内容,主要是如何来实现APNS的推送通知,具体内容来看本文详细 ...

  7. CDH中hue的oozie调度流程shell

    CDH中hue的oozie调度流程shell 1.将shell脚本上传到对应的hdfs的路径下 2.创建工作流 3.编辑工作流 4.上传脚本 5.添加文件 6.指定执行oozie的时候使用的Hadoo ...

  8. 提取LSV中的高程数据在CAD中进行道路的方案设计流程

    提取LSV中的高程数据在CAD中进行道路的方案设计流程 一.打开LSV下载影像数据 因为现在网络上不公开影像和高程数据,应在LSV中添加影像数据 二.在CAD中加载影像数据(不要移动影像,改变影像坐标 ...

  9. FLUENT中VOF模型的仿真流程

    FLUENT中VOF模型的仿真流程 (流体域划分以及网格划分不在这里描述,关注本人,本人其余发表的博客有介绍,或者私聊本人,有错误请求大佬赐教!!!) vof模型定义: VOF 模型(Volume F ...

  10. 19. OP-TEE中TA与CA执行流程详解-------软件架构篇

    历经一年多时间的系统整理合补充,<手机安全和可信应用开发指南:TrustZone与OP-TEE技术详解 >一书得以出版,书中详细介绍了TEE以及系统安全中的所有内容,全书按照从硬件到软件, ...

最新文章

  1. java虚拟机栈帧_Java虚拟机,运行时栈帧结构
  2. 用Leangoo Scrum看板工具做多团队大规模敏捷
  3. Java基础5:final
  4. sublime部署开发环境
  5. 4.Eclipse的安装和使用
  6. boost::hana::reverse_fold用法的测试程序
  7. 技术有温,代码有爱——1024技术公益信息无障碍
  8. .NET Core Love gRPC
  9. js图片转二进制流_V8是如何执行一段JS代码的?
  10. PHP去除BOM头的方法
  11. Atom 备份神器 —— Sync Settings
  12. php 图片裁剪保存,PHP图片裁剪与缩放示例(无损裁剪图片)
  13. Linux常用基本命令总结
  14. linux命名详解及其软件安装实例
  15. 反射的学习(参考尚硅谷视频)
  16. android webview 慢,Android Webview的性能问题
  17. “概率模型与计算机视觉” 林达华
  18. 事业单位工资计算机公积金计算,事业单位住房公积金基数怎么算?
  19. p6000 深度学习_英伟达推Quadro新显卡,支持VR、深度学习等技术
  20. 微信朋友圈,模仿微信朋友圈,朋友圈点赞评论

热门文章

  1. 阿里云企业邮箱标准版/集团版/尊享版区别对比
  2. 转轮密码机的加解密算法实现
  3. diskpart 删除磁盘OEM分区 及设置活动分区
  4. EAUML日拱一卒-活动图::活动分区
  5. CentOS7服务器安装GPU显卡驱动和CUDA简单方法
  6. Discriminative deep metric learning for face verification in the wild 度量学习(CVPR2014)
  7. Photoshop - 教您怎样对扫描文件去除底色?
  8. android里面的USB功能-----Accessory模式
  9. 那些简历造假拿 Offer 的程序员,后来都怎样了?
  10. 阿里巴巴四十大盗计算机病毒,泄密 阿里巴巴和四十大盗 全文 - 故事365