Как создать указатель на функцию, указывающую на функцию и возвращающую ее в ИК-коде? - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть готовый код в Transforms / Instrumentation, который перехватит мой исходный код. Я хотел бы использовать указатель функции, указывающий на исходную функцию (рекурсия).Вместо того, чтобы возвращать исходную функцию непосредственно во время выполнения, я хотел бы использовать возвращаемую переменную указателя функции (часть указателя функции должна быть в коде IR LLVM).

Я не могу найти пример кода.Я попытался использовать функцию getOrInsertFunction для создания нового указателя на функцию, похоже, этот API используется для вставки новой функции, а не переменных.

//-----------------------------------------------------

//Original Function

int find_sum(int a)

{

  if (a!=0) {

     return a + find_sum(a-1);

   }

return 0;

}

int main() {

printf("Value of find_sum is %d\n", find_sum(5));

}

//-------------------------------------------------------------------------





//Expected Function at run time through Instrumentation pass
int find_sum(int a)

{

   int (*fn_ptr)(int) = &find_sum; //should be an IR code

   if (a!=0) {

       return a + (*fn_ptr)(a-1); //should be an IR code

   }

 return 0;

}

int main() {

printf("Value of find_sum is %d\n", find_sum(5));

}
//--------------------------------------------------------

1 Ответ

0 голосов
/ 27 сентября 2019

Указатель на функцию - это просто указатель на функцию;любая переменная (включая поля в структуре) может иметь такой тип.Если у вас есть функция f и вы хотите сохранить указатель на нее в GlobalVariable, тогда вы создадите GlobalVariable с типом f->getType(). инструкция загрузки , которая читает из такой глобальной переменной, будет иметь такой тип, что вы можете использовать ее в качестве аргумента для инструкции вызова

...