llvm libLLVMCore源码分析 02 - Value Class

源码路径

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通常被用作用户自定义扩展类的基类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值