12

私は何時間も探していましたが、私を助けることができるものは何も見つかりません. 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 命令を作成する方法を見つけることさえできません。誰かが私を正しい方向に向けることができれば、それは素晴らしいことです.

前もって感謝します。

4

3 に答える 3

7

プログラマーマニュアルを参照することをお勧めします-それは基本をかなりまともな範囲でカバーしています。

特に、新しい命令の作成と挿入に関するセクションがあります。最も簡単な方法は、新しい命令のコンストラクターの最後の引数として既存の命令を提供することです。これにより、既存の命令の直前にその命令が挿入されます。

または、最後に追加したいだけの場合は、囲んでいる基本ブロックを渡すことができます(ただし、ターミネータの世話をする必要があることを忘れないでください!)。最後にgetInstList()、囲んでいる基本ブロックを呼び出すinsertか、push_backそこに新しい命令を挿入することができます。

余談ですが、すべてのブロックを反復処理する必要はなく、各ブロックのすべての命令を反復処理するだけで、命令を直接反復処理できます。プログラマーズマニュアルの命令イテレータに関するセクションを参照してください。

于 2012-11-14T13:01:57.590 に答える
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;
}
于 2012-12-09T09:36:23.183 に答える