LLVM中基本块的拓扑排序

LLVM中基本块的拓扑排序,llvm,topological-sort,Llvm,Topological Sort,我希望能够以拓扑顺序得到函数中的基本块。有一个迭代器可以对函数中的基本块进行迭代,但是我不确定它是否按拓扑顺序进行。我无法获得特定基本块的下一个基本块,也无法自己进行拓扑排序 您可以假设CFG中没有循环。在一般情况下,这是不可能的,因为BBs不形成DAG。只定义了一个没有圈的DAG-A图的拓扑序;函数中的BB可以形成循环(循环等) 最好的近似IMHO是将BB图分解为SCC(强连通组件)。LLVM已经有了这样的工具:请参见include/LLVM/ADT/SCCIterator.h,以及tools

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


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

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

最好的近似IMHO是将BB图分解为SCC(强连通组件)。LLVM已经有了这样的工具:请参见
include/LLVM/ADT/SCCIterator.h
,以及
tools/opt/PrintSCC.cpp

事实上,后者已按相反的拓扑顺序打印函数的SCC,调用方式如下:

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

更新(2013年9月16日):另请参见。

在一般情况下,这是不可能的,因为BBs不构成DAG。只定义了一个没有圈的DAG-A图的拓扑序;函数中的BB可以形成循环(循环等)

最好的近似IMHO是将BB图分解为SCC(强连通组件)。LLVM已经有了这样的工具:请参见
include/LLVM/ADT/SCCIterator.h
,以及
tools/opt/PrintSCC.cpp

事实上,后者已按相反的拓扑顺序打印函数的SCC,调用方式如下:

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

更新(2013年9月16日):另请参见。

您可以假设没有找到块的后续块的循环,您可以查看终止指令(
block.getTerminatorInstruction()
)并查看CFG分支的位置。我更新了我的答案,并添加了一个关于此问题的博客帖子链接-您可以假设没有找到块的后续块的循环,您可以查看终止指令(
block.getTerminatorInstruction()
)看看CFG的分支在哪里。我更新了我的答案,并链接到了一篇关于这个问题的博客文章——谢谢你的博客文章!谢谢你的博客帖子!