在basicblock llvm中插入指令

时间:2017-06-08 11:50:00

标签: llvm llvm-clang llvm-ir

在下面的代码中,我尝试使用Module Pass:

在.ll文件中插入新的全局变量
Module::FunctionListType &FList= M.getFunctionList();
LLVMContext &Ctx= M.getContext();
int x=0;
std::string Cbb="BB";
GlobalVariable *bbcounter;

for (Module::FunctionListType::iterator fit=FList.begin();fit!=FList.end();fit++){

   for (Function::iterator b = (*fit).begin(), be = (*fit).end(); b != be; ++b){

      Cbb= "BB"+std::to_string(x);
      const Twine &tw(Cbb);
      b->setName (tw);
      bbcounter=new GlobalVariable(M,Type::getInt64Ty(b->getContext()),false,GlobalValue::ExternalLinkage,0,Cbb);
      assert(bbcounter&&"Error: unable to get basicblock counter");
      x++;
}}

以下是用于插入新的全局变量的加载/存储:

for (Module::FunctionListType::iterator fit=FList.begin();fit!=FList.end();fit++)
{

Function::iterator b = (*fit).begin();
Function::iterator be = (*fit).end();

for ( ; b != be; ++b, git++){      //git is global variable

Instruction *InsertPos=b->getTerminator();
LoadInst* OldVal=new LoadInst( &(*git), Cbb);
OldVal->insertBefore (InsertPos);
Instruction * NewVal= BinaryOperator::Create(Instruction::Add, OldVal, ConstantInt::get(Type::getInt64Ty(b->getContext()), 1), Cbb);
NewVal->insertBefore (InsertPos);
StoreInst *SI=new StoreInst(NewVal, &*git);
SI->insertBefore (InsertPos);
}

make和call opt命令之后的此代码不会编辑.ll文件中的任何内容。我有问题吗?或者我应该写新文件?

注意:我尝试使用removeFromParent()函数编写一个新文件,但它给了我错误。此外,克隆并没有设置正确的前辈。

0 个答案:

没有答案