簡體   English   中英

如何插入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() ,然后insertpush_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM