Найти все указатели функций в LLVM IR - PullRequest
0 голосов
/ 08 июня 2018

Я хочу найти все вхождения указателей на функции в LLVM IR и заменить их реальными функциями.Как можно распознать вызовы указателей функций?

1 Ответ

0 голосов
/ 08 июня 2018

Вам нужно написать 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, если вызов является косвенным.

...