使用指令* llvm :: Instruction :: user_back()

时间:2016-08-05 21:14:02

标签: llvm

我现在正在学习llvm。我对Instruction :: user_back()感到困惑。

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

我无法找到有关它的更多信息。我想对于一个指令你,如果你在i-> users(),u-> user_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.

我的传球是这样的:

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)             
                }       
            }
        }       
    }
}

我的第一个问题是我是否误解了Instruction * llvm :: Instruction :: user_back()的用法,它的正确含义是什么?

我的第二个问题是指令U,如果U在指令I-&gt; users()中,有没有一种方法可以获得用户U?在这种情况下,有没有办法让我从U获得我? U-&gt; user_back()可以回来吗?

非常感谢提前:)

1 个答案:

答案 0 :(得分:1)

您对user_back的理解完全是落后的。

每个Value V都有一组用户 - 其他使用V的值。因此user_back是列表中最后一个这样的用户。你得到了断言,因为你的指示显然没有任何用户。首先检查user_empty。

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

简而言之,你的第二个问题的答案是,&#34;迭代U的操作数,其中一个将是我。&#34;