[LLVMdev] Inserting a function call into bitcode
Nehal Gandhi
nbg2k7 at gmail.com
Thu Jun 3 21:43:54 PDT 2010
Hi All,
I am trying to write code for simple instrumentation. What I want to do is
to insert a call to an external function for result of each conditional
branch instruction. This external function simply print true or false based
on the result of condition. The modified code is then written into new file.
However when I try to link that file with another bitcode file (containing
external function), it results "llvm-link: error loading file 'newfile.bc'"
error. This error is inconsistent. It appears for some programs and not for
some other. If it links with other file, during execution it produces
following error - Assertion `Addr && "Code generation didn't add function
to GlobalAddress table!"' failed
Below is the code of my pass. It inherits ModulePass and does not have any
other method except runOnModule. Am I missing something during call
insertion or bitcode modification? I am using LLVM-2.6. The same code in
LLVM-2.5 works correctly. (except Type::getInt32Ty, llvm-2.5 has
Type::Int32Ty and no LLVMContext object)
Thanks,
Nehal
bool ConditionProfile::runOnModule(Module &M)
{
// Iterates through all functions of the module
for(Module::iterator mi = M.begin(), me = M.end(); mi!=me; mi++)
{
// Iterates through all basic blocks of the function
for(Function::iterator fi = mi->begin(), fe = mi->end(); fi!=fe;
fi++)
{
BasicBlock::iterator bi = fi->end();
bi--; // Getting the terminator/last
instruction of BasicBlock
if(isa<BranchInst>(bi))
{
BranchInst *brInst = cast<BranchInst>(bi);
// We are interested in conditional branch only
if(brInst->isUnconditional()) continue;
Value *condRes = brInst->getCondition();
errs()<<"Type:"<<condRes->getType()->getDescription()<<"\n";
// Looking for a function in Module Symbol table
Constant *PrintFn =
M.getOrInsertFunction("_Z12PrintCondResb", Type::getInt32Ty(context),
condRes->getType(), (Type *)0);
if(!PrintFn) {
errs()<<"GetOrInsertFailed\n";
continue;
}
std::vector<Value *> args(1);
args[0] = condRes;
// Creating a call instruction to above function.
CallInst *callInst =
CallInst::Create(PrintFn, args.begin(),
args.end(), "", bi);
callInst->setCallingConv(CallingConv::Fast);
}
}
}
// Writing modified module to new file.
std::ostream *os = new std::ofstream("newfile.bc");
WriteBitcodeToFile(&M, *os);
return true;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100604/4152c602/attachment.html>
More information about the llvm-dev
mailing list