![](/img/trans.png)
[英]How to insert machine instruction using BuildMI() correctly inside a MachineFunctionPass in LLVM?
[英]How to Insert a LLVM Instruction?
我一直在尋找幾個小時,我找不到任何可以幫助我的東西。 我正在開發一個涉及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指令。 如果有人能指出我正確的方向,那將是偉大的。
提前致謝。
我建議你看看程序員手冊 - 它有很好的基礎知識。
特別是,有一節關於創建和插入新指令 。 最簡單的方法是將現有指令作為新指令構造函數的最后一個參數,然后在現有指令之前插入該指令。
或者,如果您只想添加到它的末尾,則可以傳遞封閉的基本塊(但請記住您需要處理終止符!)。 最后,您可以在封閉的基本塊上調用getInstList()
,然后insert
或push_back
在那里插入新指令。
順便說一句,您不必遍歷所有塊,然后遍歷每個塊中的所有指令,您可以直接迭代指令; 請參閱程序員手冊中有關指令迭代器的部分 。
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;
}
您可以使用IRBuilder
在另一條指令之前或基本塊結束時輕松插入新指令。
或者,如果需要在另一個之后插入指令,則需要使用包含基本塊中的instruction list
:
BasicBlock *pb = ...;
Instruction *pi = ...;
Instruction *newInst = new Instruction(...);
pb->getInstList().insertAfter(pi, newInst);
代碼和解決方案取自此處 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.