2013-1-17 14:02:03


2013-1-17 14:02:03

根据首地址进行判断,
这段地址是否进行了JIT编译
初始化pc重构链表
检查方法表,进行过滤
分配entry block
分配dalvik block
设置fallthrough
取一条指令,将指令加入到BB的MIR list中去,
获取当前指令的标志
如果当前指令为invoke指令
从后面的内容中获取callsite info。
一个新的JitTraceRun表示一个新的字节码BB
此处已经将BB和自己的MIR切割出来
接着要处理BB之间的关系
这个就是要检查每一个BB的最后一条指令
如果有向前的branch 分支 这个时候需要判断是否为loop
如果目标偏移恰好为另外一个bb的起始地址
设置taken和predecessor关系
设置fallthrough和predecessor关系
没有4种关系,那么必须要有fallthrough
如果是switch指令
packet switch 指令 0x2b 31t
目标处的格式为标志0100 长度 first key key[]
sparse switch 稀疏
0x2c 也就是31t 目标处的格式为 0200 长度 key数组 target数组
不管是哪一种类型的switch,找到其targets
每个分支就是一个kChainingCellNormal  注意不要少了default分支
如果一个BB必须要fallthrough,但是没有找到
1 如果在调用指令的后面或者不改变控制流,添加一个hot cell
2 否则添加一个normal cell
在什么情况下需要有taken
1 goto
2 调用
3 target 不为后续的地址的都需要
调用还需要单独进行描述
如果能找到调用方法,添加 kChainingCellInvokeSingleton
如果找不到调用方法 那就需要在运行的时候进行解析了
kChainingCellInvokePredicted
在这里插入了一些特别的块
如果CU中有内联设置,且有方法调用
那么在MIR 级进行内联优化
tryInlineSingletonCallsite
如果是native 方法就直接放弃了
inlineGetter
在什么情况下能够内联Getter方法
获取fallthrough的第一个指令 第一个指令就是move-result 指令
解析方法的第一个指令
invoke的指令格式 35C 的格式还算是简单的,参数最多有5个
3rc 只是指出第一个参数Reg
如果没有range,那么参数直接从arg数组中取就好了
convertRegId
现在找出参数reg
来一个get和set 方法

你可能感兴趣的:(2013-1-17 14:02:03)