2012-11-13 17 views
5

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

ありがとうございます。

答えて

4

私は​​を見てみることをお勧めします。これは基本的な考え方をかなり覆しています。

特に、a section about creating and inserting new instructionsがあります。最も簡単な方法は、新しい命令のコンストラクタの最後の引数として既存の命令を提供することです。命令のコンストラクタは、その命令を既存の命令の直前に挿入します。

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

脇に、すべてのブロックを繰り返し処理する必要はなく、各ブロックのすべての命令を繰り返し処理するだけで、命令を直接反復することができます。 the section about the instruction iterator in the programmer's manualを参照してください。

+0

封じ込める基本ブロックを通過する際にターミネーターをどう扱うのですか? – PatoBeltran

+1

@PatoBeltranこのように命令を追加しても基本ブロックの検証は行われないため、中間段階で不正な形式の基本ブロックを作成することができます。パス機能を終了する前に、ターミネータを最後に配置してください。 – Oak

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)) { 
     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; 
} 
0

IRBuilderを使用すると、別の命令の前に、または基本ブロックの最後に新しい命令を簡単に挿入できます。 hereから取ら

BasicBlock *pb = ...; 
Instruction *pi = ...; 
Instruction *newInst = new Instruction(...); 

pb->getInstList().insertAfter(pi, newInst); 

コードおよびソリューション:あなたは別のものの後の命令を挿入する必要がある場合

はまた、あなたが含む基本ブロックにinstruction listを使用する必要があります。

関連する問題