如何调用具有已知类型的JITed LLVM函数? 我可以从JLIDLVM函数调用C++函数:我使用CLAN将C++函数编译成LLVM IR,然后浏览它的LLVM类型。例如,在C++中,代码::数组(*)())(代码)>在LLVM IR中成为一个返回代码> {i64,i64 } /COD>的函数。然后,我可以创建一个合适的函数类型,并调用我想要的函数 但在相反的方向,如果我有一个LLVM函数返回 [i64 x 3 ] < />代码,我如何调用C++代码中的这个函数?我尝试将返回的函数指针强制转换为(std::array(*)(),然后调用它,但很明显,这不起作用,因为当我尝试打印返回值时,返回值不会显示出来。理想情况下,我希望我的C++代码能够调用返回 [i64 xN] < /C>的任何函数,任意n>=2。

如何调用具有已知类型的JITed LLVM函数? 我可以从JLIDLVM函数调用C++函数:我使用CLAN将C++函数编译成LLVM IR,然后浏览它的LLVM类型。例如,在C++中,代码::数组(*)())(代码)>在LLVM IR中成为一个返回代码> {i64,i64 } /COD>的函数。然后,我可以创建一个合适的函数类型,并调用我想要的函数 但在相反的方向,如果我有一个LLVM函数返回 [i64 x 3 ] < />代码,我如何调用C++代码中的这个函数?我尝试将返回的函数指针强制转换为(std::array(*)(),然后调用它,但很明显,这不起作用,因为当我尝试打印返回值时,返回值不会显示出来。理想情况下,我希望我的C++代码能够调用返回 [i64 xN] < /C>的任何函数,任意n>=2。,llvm,jit,llvm-ir,Llvm,Jit,Llvm Ir,/lib/ExecutionEngine/Orc/orcmcjitcreplacement.cpp在处理函数返回类型方面做了一些尝试,但在我感兴趣的情况下,它没有成功。(它说,“全称参数传递不支持!”)纯C++是不可能的。根据法律规定,ABI事务不能在没有集会的情况下处理。根据经验,我看到在Linux x64上,LLVM IR约定是在eax、edx、ecx寄存器中返回最多三个返回整数,然后在内存中返回4个或更多。在C++中,只有在寄存器中返回单个对象才是可能的;较大的对象必须放入结构中,然后必须

/lib/ExecutionEngine/Orc/orcmcjitcreplacement.cpp在处理函数返回类型方面做了一些尝试,但在我感兴趣的情况下,它没有成功。(它说,“全称参数传递不支持!”)

纯C++是不可能的。根据法律规定,ABI事务不能在没有集会的情况下处理。根据经验,我看到在Linux x64上,LLVM IR约定是在eax、edx、ecx寄存器中返回最多三个返回整数,然后在内存中返回4个或更多。在C++中,只有在寄存器中返回单个对象才是可能的;较大的对象必须放入结构中,然后必须在内存中返回

(我目前的解决方法是创建并JIT一个蹦床LLVM函数,该函数调用所需的LLVM函数。蹦床函数会占用内存,然后将值存储在内存中,然后返回指向该内存的指针。这是可行的,因为LLVM IR函数很容易调用其他LLVM IR函数。但是这种解决方法的开销很大,一个第二个可能的解决办法是改变原来的LLVM IR函数的函数类型,强迫它匹配相应的C++函数的ABI。这意味着LLVM IR函数接受一个指针作为第一个参数。