我一直在寻找小时,我找不到任何可以帮助我的东西。我正在开发一个涉及FunctionPass的项目。我已经实现了runOnFunction(函数& f)方法,这工作正常。基本上它需要:如何插入LLVM指令?
1)检测存储指令
2)转换存储指令的存储器地址为Integer
3)使用按位与运算(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指令。如果有人能指出我的方向正确,那会很棒。
在此先感谢。
在通过封闭基本块的情况下,你如何照顾终结者? – PatoBeltran
@PatoBeltran以这种方式添加指令不会触发对基本块的验证,因此您可以在这些中间阶段中使用格式不正确的基本块。在结束传球功能之前,请务必在最后放置一个终结器。 – Oak