在LLVM中的JIT期间找出预编译功能的功能签名



我当前正在使用LLVM实施JIT编译器。我的问题是编译器运行时的一部分是在C中实现的。

从我的中间表示形式中,我可以生成所有本机函数。但是,语言中的某些操作需要呼叫这些外部C函数。

我遇到的问题是,我不知道这些功能传递给这些函数的确切类型的参数类型,它们可能会采用INT,或者可能会进行浮动。以前的代码生成基于C,C的弱键入允许无麻烦地调用这些功能。但是,当生成LLVM-ir时,我需要知道这些预编译功能的签名,是否有任何方法可以使用ORC-API或其他方法来弄清签名,或者最好只能硬代码配置。对于每个必要的功能?

我针对此问题实现的解决方案遵循以下简单方案。

在对这些函数的汇编调用期间,生成了签名,只是基于哪些参数和返回值传递给所讨论的预编译函数。

这对我的示例很好,因为我使用llvm使用C呼叫约定。引用LLVM主页的C呼叫约定可容忍不匹配:

"此调用惯例(如果未指定其他调用约定的默认约定(匹配目标c调用约定。此呼叫约定支持varargs函数调用呼叫,并容忍声明的原型中的某些不匹配并实现了该函数的声明(如正常情况一样C(。"[1]:https://llvm.org/docs/langref.html#calling-conventions

最新更新