Есть ли в LLVM какие-либо интерфейсы для компиляции встроенной функции во внутреннее представление?

Я разрабатываю что-то на основе llvm и хочу выполнять JIT при запуске кода, в коде JIT я использую некоторую функцию в коде, который не JIT (код программы, которая генерирует JIT-код). но я обнаружил, что это дорого, требует много времени при запуске кода. Есть ли какой-то способ скомпилировать функцию в исходном коде во внутреннее представление и вставить ее в код jated, что-то вроде встроенной функции. например: исходный код:

void f(){
//....
}

------------ перекодированный код

jitted_function(){
  f();
}

то, что я хочу, это: -------------------- jitted code

inline void f(){
//...
}

jitted_function(){
  f();
}

самое сложное, если я вставляю код c++ напрямую, то мне приходится парсить функции и классы, используемые f, и тоже их вставлять, я не хочу этого делать.


person WhatisThat    schedule 08.07.2013    source источник


Ответы (1)


Это просто код :-)

Вы хотите, чтобы код отображался как в основной программе, так и в JIT-программе, поэтому поместите его где-нибудь, доступном из обоих, и настройте свою сборку так, чтобы он включался в обоих местах. Это проблема?

Что касается первой части вашего вопроса, мне кажется странным, что вызов хост-кода из JIT-кода «очень медленный». Пока код хоста также построен с оптимизацией, он не должен быть значительно медленнее благодаря вызову функции из самого JIT-кода. Возможно, если это крошечная функция, которую вы хотите встроить, может быть разница. В этом случае просто включите его в обоих местах.

person Eli Bendersky    schedule 08.07.2013
comment
поскольку я вызываю исходную функцию во вложенном цикле, накладные расходы на вызов функции огромны. вот почему я хочу сделать его встроенным. - person WhatisThat; 09.07.2013