一个方法的控制流图
ControlFlowGraph
01 Syntax
Microsoft.VisualBasic.ApplicationServices.Development.VisualStudio.IL.ControlFlowGraph
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| ReachableBlocks | 1 | 按 RPO 顺序返回全部可达块 |
| Build | 1 | 由已解析好的方法体构建控制流图 |
| SplitBlocks | 1 | 扫描全部跳转目标,把指令序列切成基本块 |
| LinkBlocks | 1 | 按块末指令连边,并标记条件分支的 true/false 后继 |
| ReversePostOrderIds | 1 | 按 RPO 升序返回可达块的编号 |
| ComputeDominators | 1 | 迭代式计算直接支配节点(Cooper-Harvey-Kennedy)。 同时填好 DominatorChildren 与 DominanceFrontier。 |
| ComputeDominanceFrontier | 1 | DF(X) = { Y | X 支配 Y 的某个前驱,但 X 并不严格支配 Y } |
| ComputePostDominators | 1 | 计算直接后支配节点。做法是把整张图反向,并额外挂一个"虚拟出口"节点 (所有没有后继的块都连到它),然后在反向图上跑一遍支配算法。 结果落在 BasicBlock.ImmediatePostDominator, 指向虚拟出口时记为 ControlFlowGraph.VirtualExit。 |
| ComputeIdomOn | 1 | 在给定邻接表上跑 Cooper-Harvey-Kennedy 支配算法。 |
| ComputeNaturalLoops | 1 | 识别回边(A -> B 且 B 支配 A)并由此算出自然循环: header = B,latch = A,body = 所有"不经过 B 就能到达 A"的块 ∪ {B}。 同时给每个循环头填 LoopFollow(header 的后继中不在循环体内的那个)。 |
| Dominates | 1 | a 是否支配 b(含 a = b) |
| BlockIdAtOffset | 1 |
03 Properties
| Name | Overloads | Summary |
|---|---|---|
| EntryBlock | 1 | 入口块(编号固定为 0) |
| Blocks | 1 |
04 Fields
| Name | Overloads | Summary |
|---|---|---|
| VirtualExit | 2 | 虚拟出口节点在后支配计算图中的编号;对外一律用 -1 表示"汇聚到出口" |
05 Members
ReachableBlocks
按 RPO 顺序返回全部可达块
Build(MethodBodyReader)
由已解析好的方法体构建控制流图
SplitBlocks(MethodBodyReader)
扫描全部跳转目标,把指令序列切成基本块
LinkBlocks
按块末指令连边,并标记条件分支的 true/false 后继
ReversePostOrderIds
按 RPO 升序返回可达块的编号
ComputeDominators
迭代式计算直接支配节点(Cooper-Harvey-Kennedy)。 同时填好 DominatorChildren 与 DominanceFrontier。
ComputeDominanceFrontier(
List(Of Int32))DF(X) = { Y | X 支配 Y 的某个前驱,但 X 并不严格支配 Y }
ComputePostDominators
计算直接后支配节点。做法是把整张图反向,并额外挂一个"虚拟出口"节点 (所有没有后继的块都连到它),然后在反向图上跑一遍支配算法。 结果落在 BasicBlock.ImmediatePostDominator, 指向虚拟出口时记为 ControlFlowGraph.VirtualExit。
ComputeIdomOn(
List(Of List(Of Int32)), Int32)在给定邻接表上跑 Cooper-Harvey-Kennedy 支配算法。
ComputeNaturalLoops
识别回边(A -> B 且 B 支配 A)并由此算出自然循环: header = B,latch = A,body = 所有"不经过 B 就能到达 A"的块 ∪ {B}。 同时给每个循环头填 LoopFollow(header 的后继中不在循环体内的那个)。
Dominates(
Int32, Int32)a 是否支配 b(含 a = b)
EntryBlock
入口块(编号固定为 0)
VirtualExit
虚拟出口节点在后支配计算图中的编号;对外一律用 -1 表示"汇聚到出口"
VirtualExit
Blocks
BlockIdAtOffset(
Int32)