源码路径
llvm\include\llvm\IR\Value.h
llvm\include\llvm\IR\ValueHandle.h
llvm Value Class
在llvm中,Value类是所有程序计算出的值的类(如Arguments,Instructions, Functions等)的基类。Value类的继承树如下:
Value Type
Value都是有类型的,可以通过getType()方法获取Value的Type。
Value Name
Value可以有名字,如下所示的IR中,这个Instruction(Value的派生类)的名字为foo:
%foo = add i32 1, 2
这里要值得注意的是,并不是所有的Value都有名字,所以名字只能用于调试,不能用于标识Value,例如不能使用std::map<string>而要使用std::map<Value*>。
可以通过如下方法访问Value的名字:
bool hasName() const
std::string getName() const
void setName(const std::string &Name)
def-use chain
1个具体的值,在IR中可能会被多处引用,比如函数的入参会被函数中的多条指令引用。在Value类中保存了一个Users列表跟踪这种引用关系,这个被称为def-use chain。可以使用如下的方法获取Value的Uses:
Value::use_iterator - Typedef for iterator over the use-list
Value::const_use_iterator - Typedef for const_iterator over the use-list
unsigned use_size() - Returns the number of users of the value.
bool use_empty() - Returns true if there are no users.
use_iterator use_begin() - Get an iterator to the start of the use-list.
use_iterator use_end() - Get an iterator to the end of the use-list.
User *use_back() - Returns the last element in the list.
在对IR进行变换(transform)的时候,可能会将Value替换为另一个Value,比如一条指令的结果恒为常数,那么就可以用常数替换这条指令。同时还需要修改引用这个Value的Users,这时就可以使用如下接口替换所有使用到这条指令(Value)的地方为新的常量(Value)。
void replaceAllUsesWith(Value *V);
//使用示例
Inst->replaceAllUsesWith(ConstVal);
ValueHandle
ValueHandle可以看作一个指向Value的智能指针,可以在Value被delete或者调用ReplaceAllUsesWith(RAUW)时,触发特定的动作。ValueHandle类继承树如下所示:
WeakVH
引用Value,当引用的Value被delete或者RAUW之后,会被置为null。
WeakTrackingVH
引用Value,当引用的Value被delete之后,会被置为null。
CallbackVH
引用Value,当引用的Value被delete之后,会调用deleted方法,当引用的Value被RAUW之后,会调用allUsesReplacedWith方法。deleted和allUsesReplacedWith是virtual的,CallbackVH通常被用作用户自定义扩展类的基类。