控制流

我在之前汇编语言的教程中,是将跳转与函数放在同一篇文章里的,因为在汇编语言中这两个概念几乎没有太大的区别。然而,到了LLVM IR中,这两者就有了比较大的区别。因此,我将其分成了多篇文章单独介绍。

在程序分析领域,往往会强调一对概念:数据流与控制流。所谓数据流,就是指一个程序中的数据,从硬盘到内存,从内存到寄存器,等等一系列的数据搬运、处理的过程。这一过程,在之前的文章中已经详细地介绍了。

而控制流,则是指程序执行指令的顺序。最简单地,我们的程序在除了顺序执行指令,还可以通过if语句进行条件跳转,通过forwhile语句进行循环,还可以通过函数调用进入到别的函数。凡此种种,都是程序控制流的变化。

在使用LLVM作为编译器的时候,控制流往往就意味着更多的优化可能,如分支布局、函数内联。在使用LLVM作为静态分析工具的过程中,控制流也意味着更高的复杂度,如间接跳转、间接调用的识别和恢复。

因此,我们需要仔细了解LLVM中的控制流。