【问题标题】:Usage of Instruction* llvm::Instruction::user_back ( )指令的使用* llvm::Instruction::user_back ( )
【发布时间】:2016-08-05 21:14:01
【问题描述】:

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

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

我找不到有关它的更多信息。我猜对于指令 u,如果 u 在 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->users()中,有没有办法获取U是谁的用户?在这种情况下,请问有什么方法可以让我从 U 获得 I 吗? U->user_back() 可以返回吗?

提前非常感谢:)

【问题讨论】:

    标签: llvm


    【解决方案1】:

    您对 user_back 的理解完全落后。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多