2012-11-13 151 views
5

我一直在寻找小时,我找不到任何可以帮助我的东西。我正在开发一个涉及FunctionPass的项目。我已经实现了runOnFunction(函数& f)方法,这工作正常。基本上它需要:如何插入LLVM指令?

1)检测存储指令

2)转换存储指令的存储器地址为Integer

3)使用按位与运算(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(),然后在insertpush_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轻松地在另一条指令之前或在基本块的末尾插入新指令。

替代地,如果需要后插入一个指令另一个,则需要在含有基本块使用instruction list

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

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

代码和从here采取溶液。