使用LLVM(低级虚拟机),我可以为哪些平台编译二进制文件?

7
我对使用LLVM的Clang编译器感兴趣。LLVM声称是跨平台的,但不清楚可以针对哪些平台。我已经在Google上搜索了很多,但似乎没有太多关于LLVM支持的平台的信息。我唯一找到的是"这个",有点令人困惑。我不确定它是否意味着我可以使用LLVM为这些平台编译二进制文件,还是只能在这些平台上运行(或两者都是)。了解更多关于LLVM / Clang编译器的人能告诉我可以使用Clang或其他LLVM前端针对哪些平台进行目标定位吗?我需要具体的信息(如“它支持Windows 32位,Windows 64位,Linux 32位,Linux 64位等”)。谢谢!

编辑:

好的,我认为我只是对LLVM是什么感到困惑。从我刚刚了解到的来看,LLVM只是一个字节码解释器。由于LLVM是解释型的,与可执行文件相比,LLVM二进制文件会慢多少?因此,如果性能很重要,LLVM不是正确的选择吗?"这里" 我发现它支持的架构,但它没有说它支持哪些操作系统。如果我避免平台相关代码,它是否在所有操作系统上运行?如果我能找到更多详细解释LLVM的文章,我会去寻找的。


你是在问“哪些平台有LLVM字节码解释器?”还是“clang有哪些平台的代码生成后端?” - Flexo
我更好奇LLVM而不是Clang。Clang只是我想使用的前端。 - apokaliptis
4个回答

9
安装了llvm之后,输入以下命令:
llc -version

你会看到类似于以下内容:

  Registered Targets:
    alpha   - Alpha [experimental]
    arm     - ARM
    bfin    - Analog Devices Blackfin [experimental]
    c       - C backend
    cellspu - STI CBEA Cell SPU [experimental]
    cpp     - C++ backend
    mblaze  - MBlaze
    mips    - Mips
    mipsel  - Mipsel
    msp430  - MSP430 [experimental]
    ppc32   - PowerPC 32
    ppc64   - PowerPC 64
    ptx32   - PTX (32-bit) [Experimental]
    ptx64   - PTX (64-bit) [Experimental]
    sparc   - Sparc
    sparcv9 - Sparc V9
    systemz - SystemZ
    thumb   - Thumb
    x86     - 32-bit X86: Pentium-Pro and above
    x86-64  - 64-bit X86: EM64T and AMD64
    xcore   - XCore

请前往github.com,搜索mbed_samples以查看如何使用llvm和clang进行ARM的交叉编译。大约在blinker03或04附近介绍了这个过程。LLVM在任何平台上都是相同的,llc步骤是您选择目标的地方,编译、合并、优化等都是平台无关的(例如,您可能会使用-m32来选择int大小),然后llc将您带到特定于平台的汇编程序中。


据我所知,从汇编到目标文件再到二进制文件的步骤仅取决于您运行的平台,如果您使用binutils,可以将任何目标转换为二进制文件。 - old_timer
请注意,自2011年以来,这些情况发生了很大变化。例如,在LLVM 3.1中,对bfin、alpha和systemz的支持已经被取消。 - Birkenstab
当然,这是关于如何做的说明。尽管我们知道LLVM的开发人员倾向于随着时间的推移更改命令行,并让您陷入无法使用的构建脚本/Makefile的困境。 - old_timer
因此,自2011年以来,为了生存,我开始使用自己构建的llvm/clang工具链,采用gnu风格,也就是为特定目标构建(从源代码),每个目标一个工具链。一个副作用是你可以使用llvm链接器而不依赖gnu工具。仍然需要弄清楚它们支持哪些目标,并且如何在构建中指定该目标。 - old_timer
我不知道那个编辑相对于我的原始答案是在什么时候发生的。LLVM/clang可能最初是设计/打算作为即时编译器(JIT),在运行时接收字节码并生成二进制代码。也许你可以试着弄清楚这一点,但我认为它的主要用途可能是作为一个常规工具链,与GNU binutils/gcc竞争,以便为多个目标生成可稍后运行的二进制文件。 - old_timer
你应该能够在x86架构的Linux上找到预先构建的本地工具,以及Windows上的诸如此类的工具,然后只需运行clang hello_world.c -o hello_world并执行它。 - old_timer

5
LLVM有许多可能的目标机器应用,包括:
- GPGPU(GPU)。有一些方法可以将LLVM重新定位到GPU,例如GPUOcelot,这里有一个例子:LLVM to PTX Backend。 - 根据2011年9月的OpenCL wikipedia:“苹果公司[22]、Nvidia[23]、RapidMind[24]和Gallium3D[25]的OpenCL实现都基于LLVM编译技术,并使用Clang编译器作为其前端。” - 将Javascript作为LLVM目标! - 是的,工具Emscripten可以做到 - Emscripten GitHub首页维基页面和演示关于Emscripten 1.0的博客笔记Emscripten文档论文

3
根据clang手册,clang可以定位X86、带有部分支持的PPC、SPARC和MSP430的Arm。
Clang也可以生成LLVM字节码。然而,LLVM可以在更多平台上运行
因此,如果您需要本机机器代码,则可用选择很少。如果您需要LLVM字节码,则可以选择更广泛的平台。

谢谢。现在我更好地理解LLVM的实际含义以及它所支持的体系结构。但是关于LLVM仍有一些模糊的地方(请参见编辑)。谢谢! - apokaliptis

1

我只回答编辑的问题(创建一个新问题可能更合适)。

是LLVM的良好架构概述。这个页面还包含有关LLVM所有方面的大量文档。

简而言之,LLVM是传统编译器的优化器和后端。它操作的是字节码,这实际上是代码的中间表示形式,并用于优化和生成最终二进制文件。 LLVM前端是独立的,并使用自己的内部AST最终生成字节码。

当你想要生成最终二进制文件时,LLVM实际上非常灵活。您可以立即执行此操作,也可以将其延迟到程序安装时。我相信您甚至可以在执行期间使用其JIT生成最终二进制文件(对此并不100%确定)。像这样延迟的主要优点是它可以应用特定于正在执行的环境的优化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接