LLVM中基本块的拓扑排序

时间:2013-09-06 06:06:16

标签: llvm topological-sort

我希望能够以拓扑顺序获取函数中的基本块。有一个迭代器可以迭代函数中的基本块,但我不确定它是否按拓扑顺序执行。我无法获得特定基本块的下一个基本块,并且无法自行进行拓扑排序。

您可以假设CFG中没有循环。

1 个答案:

答案 0 :(得分:4)

在一般情况下,这是不可能的,因为BB不会形成DAG。拓扑顺序仅为DAG定义 - 没有循环的图形;函数中的BB可以形成循环(循环等)。

您的最佳近似IMHO是将BB图分解为SCC(强连接组件)。 LLVM已有工具可以执行此操作:请参阅include/llvm/ADT/SCCIterator.h以及tools/opt/PrintSCC.cpp

事实上,后者已经以 reverse 拓扑顺序打印函数的SCC,调用如下:

$ opt -print-cfg-sccs <bitcode file>

更新(2013年9月16日):另见this blog post