我可以从JITed LLVM函数调用C ++函数:我使用clang将C ++函数编译成LLVM IR,然后我查看它的LLVM类型。例如,C ++中的std::array<uint64_t, 2>(*)()
类型成为在LLVM IR中返回{i64, i64}
的函数。然后,我可以创建一个合适的FunctionType,并调用我想要的函数。
但是在相反的方向,如果我有一个返回[i64 x 3]
的LLVM函数,我如何从C ++代码调用此函数?我尝试将返回的函数指针转换为(std::array<uint64_t, 3>(*)())
,然后调用它,但很明显这不起作用,因为当我尝试打印它们时,返回值不会显示。理想情况下,我希望我的C ++代码能够调用任何返回[i64 x N]
的函数,对于任意N&gt; = 2。
/lib/ExecutionEngine/Orc/OrcMCJITReplacement.cpp在处理函数返回类型方面有轻微的尝试,但它对我感兴趣的案例感到失望。(它说,“还没有支持全功能的参数传递!” )
答案 0 :(得分:1)
使用纯C ++是不可能的。根据{{3}},没有装配就无法处理ABI问题。根据经验,我看到在Linux x64上,LLVM IR约定是在eax,edx,ecx寄存器中返回最多三个返回整数,然后在内存中返回4或更多。在C ++中,只能在寄存器中返回单个对象;较大的对象必须放在一个结构中,然后必须在内存中返回。