我正在使用 LLVM 实现 JIT 编译器的前端。我从 LLVM 教程中的 Kaleidoscope 示例开始。我知道如何使用 LLVM C++ API 生成和 JIT LLVM IR。我也知道如何调用 JITed 函数,使用 llvm::ExecutionEngine 的“getPointerToFunction”方法。
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 函数。但是,一般来说,我不知道用户输入的函数签名是什么(或结构类型是什么)。用户可以创建具有任意参数和返回类型的任意函数,所以我不知道从 LLVM 的 getPointerToFunction 转换 void* 的函数指针类型。我的运行时需要能够调用这些函数(例如,对于 Read-Evaluate-Print 循环)。如何从我的 JIT 运行时处理这些任意函数?
谢谢