根据学习value类,可以夸张地一句话概括Value类:万般皆Value。虽然有点浮夸,但是LLVM架构中,几乎所有都可表示为value,同时从下面也不难看出value的地位。
从上图中,可以看到如下几项:
-
BasicBlock,Argument,User都继承Value类,BaickBlock是基本块类,Argument类表示函数形参。后续章节单独介绍User类。
-
Constant,Instruction继承了User类,Constant类表示代码中定义常量,Instruction类代表操作的指令语句。
-
另外,从代码中分析,Function类首先继承GlobalObject类,然后GlobalObject类继承GlobalValue类,接着GlobalValue类继承Constant类,结合上图,也不难得出Function类最后也继承Value类。
在LLVM中,一个特定Value可能被多次使用。例如,一个函数输入参数可能被函数中的每条指令引用,该参数被Argument类的实例所表示。为了便于管理这种引用关系,value类保留所有user类的列表,类中还有另外一个变量UsseList也是用来管理被引用关系。关于value,use与user的关系,后续章节会重点介绍哈。
LLVM是一个类型表示,每个LLVM的value都具有类型,通过getType()方法可以访问value的类型。另外,value也有名字的,用string表示。
Value类成员函数
定义Use-list的迭代器类型,获取use-list迭代器的开始元素等方法,代码如下:
using use_iterator = use_iterator_impl&