我一直在尋找小時,我找不到任何可以幫助我的東西。我正在開發一個涉及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