0

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

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

4

1 回答 1

5

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

恕我直言,您最好的近似值是将 BB 图分解为 SCC(强连通分量)。LLVM 已经有工具可以做到这一点:请参阅include/llvm/ADT/SCCIterator.htools/opt/PrintSCC.cpp.

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

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

更新(2013 年 9 月 16 日):另见此博客文章

于 2013-09-06T23:12:08.013 回答