5

有什么影响

  • 可移植性(调用约定:仅调用 C 或 OS 库函数时,在 LLVM 级别上是否真的很重要)
  • 链接时间
  • 优化

我想用 LLVM 编译一种玩具语言,因为所有困难的部分都已经存在(优化、目标代码生成),但是如果值得的话,我想保留一个概念:库文件应该是可再发行,可用作静态和共享库(用于链接,在共享情况下,链接最终应用程序时将生成真实的 so 或 dll),可移植的 . 我相信这会减少部分编译时间(因为本机代码生成和优化可能只在最终二进制链接时间完成一次)。我设想链接器负责调用约定(如果可能)并在请求时转换为共享库。在一个牵强附会的补充中,也许可以利用 LLVM 来避免链接,并使用 LLVM JIT 直接运行生成的字节码,完全消除编写代码时的链接时间。

这听起来

  1. 可行吗?
  2. 值得?我知道 C/C++ 链接时间比较长,这在频繁重建时会出现问题。自由链接时间优化怎么样(cfr /GL-flto因为它本质上是将 LLVM 字节码链接在一起,然后将其转换为本机二进制文件)。

这可能是一个模糊的问题,如果我必须澄清一些事情,请询问。

4

1 回答 1

8

我过去做过类似的事情。您应该意识到的一件事是 LLVM 位码不是“可移植的”,因为它不是完全独立于机器的。位码文件了解特定于目标处理器的指针大小等信息。

话虽如此,过去我已经将程序及其支持库编译为位码,并将位码文件链接在一起,然后再为整个程序生成汇编文件。没错,调用约定对于内部调用并不重要,但在外部(或从外部)进行的调用仍然需要遵循 ABI。

您可以设计您的玩具语言,以避免依赖于处理器的位代码,但您必须非常小心。

我注意到将位码文件链接在一起需要很长时间,尤其是在高优化级别时。现在这可能已经加快了,我在 2 或 3 年前就使用 LLVM 做到了。

最后一点:根据目标处理器,如果处理器没有指令,您可能需要相当于 libgcc.a 或 compiler-rt 来处理处理器不喜欢浮点或 64 位整数的东西执行这些操作。

于 2012-02-18T17:24:52.190 回答