编写LLVM后端编译的代码时,架构是否重要?

时间:2015-12-16 07:19:54

标签: linux compiler-construction llvm

我的问题实际上比标题更通用:

在编写最终将编译为LLVM中间代码,然后从那里编写到机器语言的代码时,架构在什么时候才重要?

  1. 假设我正在编写Rust(它使用LLVM作为后端)。我是否能自动将Rust代码编译为LLVM可以定位的每个体系结构(假设该机器上有可以运行它的操作系统)?

  2. 或者可能是Rust标准库还没有“ARM兼容”,所以即使LLVM以它为目标我也无法编译到ARM?

  3. 如果我不使用任何标准库,我的整个程序只是一个立即返回的程序怎么办?可能是这样的情况,即使没有任何库,Rust(或你有什么)也无法编译到ARM(或者你有什么),即使LLVM以它为目标?

  4. 如果以上所有示例都编译得很好,我需要做些什么才能让我的代码打破一个架构而不能编译到某个架构?

  5. 同一品种的奖金问题:

    1. 假设标准库使用OS系统调用(肯定会这样)。在进行系统调用时,您是否需要关心架构?或者OS(例如Linux)是否也抽象了架构?
    2. 感谢。

1 个答案:

答案 0 :(得分:4)

TL; DR

根据我的理解,您可以 编译 到任何目标LLVM支持(此处可能仍有一些注意事项,前端使用inline assembler或{{3}但是,您无法保证它实际上会 执行 。前端负责将作品移植到作者支持的平台上。

另请注意,作为前端开发人员,您有责任提供module level inline assemblydata layout

另见:

您的问题:

  

我们说我正在写Rust(它使用LLVM作为后端)。我   自动能够将Rust代码编译到每个架构   LLVM可以定位(假设那台机器上的操作系统可以   跑吧)?

这取决于Rust前端的作者。

  

或者可能是没有制作Rust标准库" ARM   兼容"然而,即使LLVM的目标,我也无法编译到ARM   它?

我非常确定LLVM能够发出指令,但在寻址方面可能不正确。

我自己没有使用上面提到的内联汇编程序工具,但我认为如果它允许特定于平台的程序集,那么这也会打破平台无关的编译。

  

如果我没有使用任何标准库,我的整个程序是   只是一个立即返回的程序?甚至可能是这样的情况   没有任何库,Rust(或你有什么)无法编译到ARM   (或者你有什么)即使LLVM以它为目标?

这又取决于Rust前端发出的内容。甚至在它发出逻辑指令之前,它可能会发出一些样板设置逻辑。

我在LLVM中编写自己的语言,在一个名为" main"的特殊函数的情况下执行此操作。我的目标是C ABI,因此它将使用适当的C样式main来包装此main,并使用更严格的参数集调用它。

  

如果以上所有示例都编译得很好,我该怎么办呢   让我的代码打破一个架构而不是编译到某个架构   架构?

考虑使用Cross Compile with Clang中提到的Clang的C / C ++。 Clang是LLVM的前端,可能是最受欢迎的,并且编写C / C ++的用户负责#included - 具体的平台特定功能。

某些语言可能设计得更加独立于平台,而前端可以为您处理这项工作。

  

让我们说标准库使用OS系统调用(即   肯定会)。制作时你必须关心建筑吗?   系统调用?或者OS(例如Linux)抽象了   建筑也是如此?

我假设您正在讨论前端针对C标准库的情况,在这种情况下,LLVM具有llvm FAQ可供前端使用的情况。但是,这不是唯一的方法,因为如果在standard C library intrinsics中定位C ABI,您可以使用call instruction直接调用C函数。

最后,标准库可能是一个可移植性问题,必须由前端开发人员解决。