源码路径
llvm\include\llvm\IR\BasicBlock.h
llvm BasicBlock class
回顾一下llvm IR的组织结构。在llmv中,一个Module中可以有n个Function,Function内可以有n个BasicBlock,BasicBlock是单进单出的n条Instruction序列。因此,BasicBlock本质上是一个顺序执行的指令的容器。
在源代码中,BasicBlock的定义如下:
class BasicBlock final : public Value, // Basic blocks are data objects also
public ilist_node_with_parent<BasicBlock, Function> {
......
};
首先,BasicBlock继承Value,Value的类型是Label,是因为BasicBlock会被例如br等跳转指令Use。
其次,BasicBlock继承ilist_node_with_parent<BasicBlock, Function>,主要的作用是:
- 通过当前节点(BasicBlock),获取父节点(Function)。
- 通过当前节点(BasicBlock),遍历链表上其他节点(BasicBlock)。
这部分代码的实现在之前的
Instruction源码分析
中已分析过,不再赘述。遍历Function中的BasicBlock的代码如下:
Function &Func = ...
for (BasicBlock &BB : Func)
// Print out the name of the basic block if it has one, and then the
// number of instructions that it contains
errs() << "Basic block (name=" << BB.getName() << ") has "
<< BB.size() << " instructions.\n";
Well Formed BasicBlock
一个well formed的BasicBlock包含一条唯一的Terminator Instruction,并以这条Terminator Instruction作为最后一条指令。
在llvm中允许malformed BasicBlock存在,因为这样的BasicBlock在程序创建或者修改的中间过程中会有用处。
版权声明:本文为weixin_42654107原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。