指令*llvm::指令::用户返回()的用法

指令*llvm::指令::用户返回()的用法,llvm,Llvm,我现在正在学习llvm。我对指令::user\u back()感到困惑 文档说“user_back-专门化Value中定义的方法,因为我们知道一条指令只能被其他指令使用。”但我仍然不知道它返回什么 我找不到更多关于它的信息。我猜对于指令u,如果u在I->users()中,u->user\u back()将返回I。当我尝试检查我的猜测时,遇到以下运行时错误: opt: /usr/local/include/llvm/IR/Value.h:144: UseT& llvm::Value::us

我现在正在学习llvm。我对指令::user\u back()感到困惑

文档说“user_back-专门化Value中定义的方法,因为我们知道一条指令只能被其他指令使用。”但我仍然不知道它返回什么

我找不到更多关于它的信息。我猜对于指令u,如果u在I->users()中,u->user\u back()将返回I。当我尝试检查我的猜测时,遇到以下运行时错误:

opt: /usr/local/include/llvm/IR/Value.h:144: UseT& llvm::Value::use_iterator_impl<UseT>::operator*() const [with UseT = llvm::Use]: Assertion `U && "Cannot dereference end iterator!"' failed.
opt:/usr/local/include/llvm/IR/Value.h:144:UseT&llvm::Value::use_iterator_impl::operator*()const[with UseT=llvm::use]:断言'U&&“无法取消引用结束迭代器!”,失败。
我的通行证是这样的:

for (auto &B : F) { 
    for (auto &I : B) {
         if (auto *target = dyn_cast<AllocaInst>(&I)) {         
            for(auto it : target->users()){
              if (Instruction *I = dyn_cast<Instruction>(it)){
                  Instruction *temp = I->user_back();
                  errs() << "user_back"<< *temp <<"\n";
                  //Aborted (core dumped)             
                }       
            }
        }       
    }
}
用于(自动&B:F){
用于(自动和仪表板:B){
如果(auto*target=dyn_cast(&I)){
对于(自动it:target->users()){
if(指令*I=dyn\U cast(it)){
指令*temp=I->user_back();

errs()您对user_back的理解是完全落后的

每个值V都有一组用户——其他使用V的值。因此user_back是列表中最后一个这样的用户。您之所以获得断言,是因为您的指令u显然没有任何用户。请先检查user_empty

您想要的是相反的关系:给定指令U,查找U使用的指令。要得到它,您必须迭代U的操作数。每个操作数O都是Use,O.get()将检索使用的值,该值可以是常量、指令或任何类型的值。由于LLVM IR在SSA中,因此每个操作数只有一个这样的值

简而言之,第二个问题的答案是,“迭代U的操作数,其中一个就是I。”