私は何時間も探していて、助けになるものは何も見つかりません。私はFunctionPassを含むプロジェクトに取り組んでいます。私はrunOnFunction(Function & f)メソッドを実装しましたが、うまくいきます。基本的にそれがする必要がある:LLVM命令を挿入するには?
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命令を作成する方法を見つける方法がわかりません。もし誰かが正しい方向に私を指すことができれば、それは素晴らしいだろう。
ありがとうございます。
封じ込める基本ブロックを通過する際にターミネーターをどう扱うのですか? – PatoBeltran
@PatoBeltranこのように命令を追加しても基本ブロックの検証は行われないため、中間段階で不正な形式の基本ブロックを作成することができます。パス機能を終了する前に、ターミネータを最後に配置してください。 – Oak