我目前正致力于使用LLVM实现JIT编译器。 我遇到的问题是编译器运行时的一部分是用C实现的。
从我的中间表示,我可以生成所有本机函数。但是,该语言中的某些操作需要调用这些外部C函数。
我遇到的问题是我没有从我的IR知道传递给这些函数的确切参数类型,它们可能需要一个int,或者它们可能需要浮点数。之前的代码生成基于C,并且C的弱类型允许调用这些函数而没有麻烦。但是,在生成LLVM-IR时我需要知道这些预编译函数的签名,有没有办法使用orc-API或其他方法来计算签名,或者只是硬编码配置会更好对于每个必要的功能?
答案 0 :(得分:0)
我针对此问题实施的解决方案遵循以下简单方案。
在对这些函数的编译调用期间,仅基于将哪些参数和返回值传递到所讨论的预编译函数中来生成签名。
这对我的示例来说效果很好,因为我在LLVM中使用了C调用约定。引用LLVM主页的C调用约定允许不匹配:
“此调用约定(如果未指定其他调用约定,则为默认值)与目标C调用约定匹配。此调用约定支持varargs函数调用,并允许函数的声明原型和实现的声明中存在某些不匹配(正常情况下一样) C)。” [1]:https://llvm.org/docs/LangRef.html#calling-conventions