我现在正在学习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()可以回来吗?
非常感谢提前:)
答案 0 :(得分:1)
您对user_back的理解完全是落后的。
每个Value V都有一组用户 - 其他使用V的值。因此user_back是列表中最后一个这样的用户。你得到了断言,因为你的指示显然没有任何用户。首先检查user_empty。
你想要相反的关系:给定指令U,找到U使用的指令。为此,你必须迭代U的操作数。每个操作数O是一个Use和O.get()将检索使用的值,它可以是常量,指令或任何类型的值。由于LLVM IR在SSA中,因此每个操作数只有一次这样的值。
简而言之,你的第二个问题的答案是,&#34;迭代U的操作数,其中一个将是我。&#34;