如何调用已知类型的 JITed LLVM 函数?

How to call a JITed LLVM function with known type?

我可以从 JITed LLVM 函数调用 C++ 函数:我使用 clang 将 C++ 函数编译成 LLVM IR,然后查看它的 LLVM 类型。例如,C++ 中的 std::array<uint64_t, 2>(*)() 类型在 LLVM IR 中变成 returning {i64, i64} 的函数。然后,我可以创建一个合适的函数类型,并调用我想要的函数。

但是在相反的方向上,如果我有一个 returns [i64 x 3] 的 LLVM 函数,我如何从 C++ 代码调用这个函数?我尝试将 returned 函数指针转换为 (std::array<uint64_t, 3>(*)()),然后调用它,但很明显这不起作用,因为当我尝试打印它们时 return 值没有显示.理想情况下,我希望我的 C++ 代码能够调用任何 returns [i64 x N] 的函数,对于任意 N >= 2.

/lib/ExecutionEngine/Orc/OrcMCJITReplacement.cpp 在处理函数 return 类型方面做了温和的尝试,但它放弃了我感兴趣的情况。(它说,"Full-featured argument passing not supported yet!")

纯 C++ 是不可能的。按照Returning structs in registers - ARM ABI in GCC的说法,ABI的事情离不开汇编是处理不了的。根据经验,我看到在 Linux x64 上,LLVM IR 惯例是最多三个 return 整数在 eax、edx、ecx 寄存器中被 returned,然后是 4-或-更多 return 已保存在内存中。在 C++ 中,只能 return 寄存器中的单个对象;较大的对象必须放在一个结构中,然后必须 returned 在内存中。