Вам нужно написать FunctionPass .
В функции runOnFunction
вы можете перебирать все инструкции и проверять, являются ли какие-либо из них косвенными вызовами функций, как -
for (Function::iterator BB = F.begin(); BB != F.end(); BB++) {
BasicBlock &bb = *BB;
for (BasicBlock::iterator I = bb.begin(); I != bb.end(); I++) {
if (CallInst *CI = dyn_cast<CallInst>(I)) { // Check if call instruction
if(CI->getCalledFunction() == NULL) { // Check if call instruction is indirect
//replace CI with new instruction
}
}
}
}
getCalledFunction
функция-член возвращает NULL
, если вызов является косвенным.