【问题标题】:LLVM replace operand with functionLLVM 用函数替换操作数
【发布时间】:2018-01-02 21:34:01
【问题描述】:

使用LLVM pass,我希望遍历if(a==b)形式的所有条件分支并将这些语句更改为if(func(a)==func(b)),从而将原始操作数ab替换为函数调用的结果@987654327 @ 和 func(b)。只要找到if(a==b) 形式的if 语句,就会出现这种情况。

这里a 是操作数。我可以在我的 LLVM 通行证中访问此操作数,但我无法将其更改为函数的结果。我应该使用什么方法来实现这一点。

可以假设ab总是同类型,func接受任意类型的参数,返回同类型的参数。为简单起见,还可以假设ab 是整数,func 也返回一个整数。

【问题讨论】:

  • 在哪里替换它们?您是在问是否可以使用函数作为参数?请澄清。
  • LLVM IR 在SSA form,你需要使用A-normal forms
  • 请不要评论您自己的问题,而是编辑您的问题来改进它(它需要很多改进,并且应该是更长)
  • 我已经更新了我的问题
  • ab 是什么类型?它们总是一样吗?您是否为每种类型提供func 函数?

标签: c++ llvm llvm-clang llvm-ir


【解决方案1】:

详细阐述我的评论(尽管有些方面仍不清楚)

采用以下简化:

  • 我们正在对整数进行运算
  • 要调用的函数已经定义

我们可以在llvm::Function pass 中做这样的事情:

bool runOnFunction(llvm::Function &CurFunc) override {
    bool hasChanged = false;

    // the llvm::Function to be called could be specified here
    auto *toCallFunc = [...];

    for (auto &bb : CurFunc) {
      auto *ti = bb.getTerminator();
      auto *bri = llvm::dyn_cast<llvm::BranchInst>(ti);
      if (!bri)
        continue;
      if (!bri->isConditional())
        continue;

      auto *cond = bri->getCondition();

      // please note that this cast is for integer comparisons
      // adjust according to your needs
      auto cmpi = llvm::dyn_cast<llvm::ICmpInst>(cond);
      if (!cmpi)
        continue;

      auto *opA = cmpi->getOperand(0);
      auto *opB = cmpi->getOperand(1);

      auto argsA = llvm::ArrayRef<llvm::Value *>(&opA, 1);
      auto argsB = llvm::ArrayRef<llvm::Value *>(&opB, 1);

      // note the insertion before the comparison operation
      auto *ciA = llvm::CallInst(toCallFunc, argsA, "funcA", cmpi);
      auto *ciB = llvm::CallInst(toCallFunc, argsB, "funcB", cmpi);

      cmpi->setOperand(1, opA);
      cmpi->setOperand(1, opB);
      hasChanged |= true;
    }

    return hasChanged;
  }

从那时起,您可以扩展和处理其他参数类型,具体取决于所需的处理方式。

【讨论】:

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