如何插入LLVM指令?

时间:2012-11-13 22:53:54

标签: c++ llvm llvm-ir

我一直在寻找几个小时,我找不到任何可以帮助我的东西。我正在开发一个涉及FunctionPass的项目。我已经实现了runOnFunction(Function& f)方法,并且工作正常。基本上它需要:

1)检测商店指令

2)将存储指令的存储器地址转换为整数

3)使用按位AND运算(0000FFFF)

更改整数

4)将整数转换回指针

到目前为止,我有以下内容:

 virtual bool runOnFunction(Function &F) {
  for (Function::iterator bb = F.begin(), bbe = F.end(); bb != bbe; ++bb) {
    BasicBlock& b = *bb;
    for (BasicBlock::iterator i = b.begin(), ie = b.end(); i != ie; ++i) {
      if(StoreInst *si = dyn_cast<StoreInst>(&*i)) {
        PtrToIntInst* ptrToInt = new PtrToIntInst(si->getPointerOperand(), IntegerType::get(si->getContext(), 32), "", si);
      }
    }
  }
  return true;
}

我不能为我的生活弄清楚如何实际插入指令,甚至找到创建AND指令的方法。如果有人能指出我正确的方向,那就太好了。

提前致谢。

3 个答案:

答案 0 :(得分:5)

我建议看一下Programmer's Manual - 它对基础知识的报道非常不错。

特别是a section about creating and inserting new instructions。最简单的方法是将现有指令作为新指令构造函数的最后一个参数,然后在现有指令之前插入该指令。

或者,如果您只想添加到其末尾,则可以传递封闭的基本块(但请记住您需要处理终止符!)。最后,您只需在封闭的基本块上调用getInstList(),然后insertpush_back在那里插入新的说明。

顺便说一下,你不必遍历所有块,然后遍历每个块中的所有指令,你可以直接迭代指令;见the section about the instruction iterator in the programmer's manual

答案 1 :(得分:4)

 virtual bool runOnFunction(Function &F) {
  for (Function::iterator bb = F.begin(), bbe = F.end(); bb != bbe; ++bb) {
    BasicBlock &b = *bb;
    for (BasicBlock::iterator i = b.begin(), ie = b.end(); i != ie; ++i) {
      if (StoreInst *si = dyn_cast<StoreInst>(&*i)) {
        IRBuilder Builder(si);
        Value *StoreAddr = Builder.CreatePtrToInt(si->getPointerOperand(), Builder.getInt32Ty());
        Value *Masked = Builder.CreateAnd(StoreAddr, 0xffff);
        Value *AlignedAddr = Builder.CreateIntToPtr(Masked, si->getPointerOperand()->getType());
        // ...
      }
    }
  }
  return true;
}

答案 2 :(得分:0)

您可以使用instruction list在其他指令之前或基本块结束时轻松插入新指令。

或者,如果您需要在之后插入指令,则需要在包含的基本块中使用BasicBlock *pb = ...; Instruction *pi = ...; Instruction *newInst = new Instruction(...); pb->getInstList().insertAfter(pi, newInst);

DESC

代码和解决方案取自here