我一直在寻找几个小时,我找不到任何可以帮助我的东西.我正在开发一个涉及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;
}
Run Code Online (Sandbox Code Playgroud)
我不能为我的生活弄清楚如何实际插入指令,甚至找到一种方法来创建AND指令.如果有人能指出我正确的方向,那将是伟大的.
提前致谢.
我建议你看看程序员手册 - 它有很好的基础知识.
特别是,有一节关于创建和插入新指令.最简单的方法是将现有指令作为新指令构造函数的最后一个参数,然后在现有指令之前插入该指令.
或者,如果您只想添加到它的末尾,则可以传递封闭的基本块(但请记住您需要处理终止符!).最后,你可以拨打getInstList()封闭基本块,然后insert或push_back插入新的指令存在.
顺便说一句,您不必遍历所有块,然后遍历每个块中的所有指令,您可以直接迭代指令; 请参阅程序员手册中有关指令迭代器的部分.
小智 5
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13207 次 |
| 最近记录: |