Я реализую интерфейс для JIT-компилятора с использованием LLVM. Я начал с примера с калейдоскопом в учебнике по LLVM. Я знаю, как сгенерировать LLVM IR и JIT с помощью LLVM C ++ API. Я также знаю, как вызвать функцию JITed, используя метод getPointerToFunction из llvm :: ExecutionEngine.
getPointerToFunction возвращает void *, которое я затем должен привести к правильному типу функции. Например, в моем компиляторе есть модульный тест, который выглядит следующим образом:
void* compiled_func = compiler.get_function("f");
auto f = reinterpret_cast<int32_t(*)(int32_t)>(compiled_func);
int32_t result = f(10);
Проблема в том, что я должен заранее знать сигнатуру функции. В приведенном выше примере у меня есть функция «f», которая принимает 32-битное целое число и возвращает 32-битное целое число. Поскольку я сам создаю "f", я знаю, что это за функция, поэтому я могу вызвать функцию JIT. Однако в целом я не знаю, что такое сигнатура функции (или какие типы структур), которые вводятся пользователем. Пользователь может создавать произвольные функции с произвольными аргументами и возвращаемыми типами, поэтому я не знаю, какой тип указателя функции нужно преобразовать в void * из getPointerToFunction LLVM. Моя среда выполнения должна иметь возможность вызывать эти функции (например, для цикла Read-Evaluate-Print). Как я могу обрабатывать такие произвольные функции из моей среды выполнения JIT?
Спасибо