llvm libLLVMCore源码分析 14 – BasicBlock Class

  • Post author:
  • Post category:其他


源码路径

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 版权协议,转载请附上原文出处链接和本声明。