如何启用LLVM后端?

时间:2017-10-24 08:19:41

标签: llvm

我正在使用Archlinux并使用官方软件包安装LLVM(使用pacman -S llvm)。 我希望将其与wasm-32后端(available according to the source code)一起使用。

但是,我的计算机上未启用此后端:

$ llc --version
LLVM (http://llvm.org/):
  LLVM version 5.0.0
  Optimized build.
  Default target: x86_64-unknown-linux-gnu
  Host CPU: skylake

  Registered Targets:
    aarch64    - AArch64 (little endian)
    aarch64_be - AArch64 (big endian)
    amdgcn     - AMD GCN GPUs
    arm        - ARM
    arm64      - ARM64 (little endian)
    armeb      - ARM (big endian)
    bpf        - BPF (host endian)
    bpfeb      - BPF (big endian)
    bpfel      - BPF (little endian)
    hexagon    - Hexagon
    lanai      - Lanai
    mips       - Mips
    mips64     - Mips64 [experimental]
    mips64el   - Mips64el [experimental]
    mipsel     - Mipsel
    msp430     - MSP430 [experimental]
    nvptx      - NVIDIA PTX 32-bit
    nvptx64    - NVIDIA PTX 64-bit
    ppc32      - PowerPC 32
    ppc64      - PowerPC 64
    ppc64le    - PowerPC 64 LE
    r600       - AMD GPUs HD2XXX-HD6XXX
    sparc      - Sparc
    sparcel    - Sparc LE
    sparcv9    - Sparc V9
    systemz    - SystemZ
    thumb      - Thumb
    thumbeb    - Thumb (big endian)
    x86        - 32-bit X86: Pentium-Pro and above
    x86-64     - 64-bit X86: EM64T and AMD64
    xcore      - XCore

如何启用LLVM后端?

3 个答案:

答案 0 :(得分:11)

Arrowd's message所述,LLVM一旦构建就不是很容易配置的。 如果您需要超出默认值的配置,您必须自己编译LLVM

LLVM有一些文章解释了如何编译它,但它没有完全描述 如何启用其他目标:

启用的目标由调用CMake时需要定义的两个变量控制 准备构建目录:LLVM_TARGETS_TO_BUILDLLVM_EXPERIMENTAL_TARGETS_TO_BUILD

  • LLVM_TARGETS_TO_BUILD仅控制稳定的目标。 您可以使用特殊值all启用所有稳定目标,也可以提供以分号分隔的目标列表,例如ARM;PowerPC;X86。有a pending request in the Getting Started article 将特殊值重命名为stable,并将all用于所有目标。 其默认值为all(请参阅下面的目标列表)。

  • LLVM_EXPERIMENTAL_TARGETS_TO_BUILD是一个未记录的(或隐藏的)变量,允许您使用 启用您想要的任何目标。这也是以分号分隔的目标列表。

启用的目标将对应于两个列表的并集。

现在,您需要找出目标的实际名称,以及它是否是稳定或实验目标。 可以找到稳定目标列表the main CMakeFile (permalink)

  

默认值包括:AArch64AMDGPUARMBPFHexagonMipsMSP430NVPTXPowerPCSparcSystemZX86XCore

此列表在/lib/Target中定义。

如您所见,Wasm不在此列表中。我们必须找到LLVM使用的名称,然后使用LLVM_EXPERIMENTAL_TARGETS_TO_BUILD。 不幸的是,由于没有记录这个变量,我无法在他们的网站上找到所有目标的列表。 经过一些试验和错误后,似乎可用目标与CMake 中目录的名称相对应。

总结一下:要使用LLVM for them,您需要使用WebAssembly启用LLVM_EXPERIMENTAL_TARGETS_TO_BUILD目标 使用CMake准备构建目录时的变量。

以下是我用来编译LLVM版本的确切步骤。我使用的是Linux机器 但你应该能够适应你的环境。

要求:

  • Subversion
  • See Getting Started
  • GCC,CLang或Visual Studio,具体取决于您的平台
  • 的zlib

    1. 使用subversion检出(克隆)LLVM仓库。我将/opt/llvm目录用于主目录 我的自定义版本的LLVM(这是该命令的最后一个参数,将其替换为您要使用的路径)。
    2. svn co http://llvm.org/svn/llvm-project/llvm/trunk /opt/llvm

      1. 导航到LLVM源:
      2. cd /opt/llvm

        1. 查看其他工具。 clang是必需的,但其他是可选的。 {{3}}
        2. svn co http://llvm.org/svn/llvm-project/cfe/trunk tools/clang

          1. 创建构建目录并导航到它。
          2. mkdir build && cd build

            1. 使用CMake准备构建目录。这是您需要照顾的步骤 设置变量。在我的情况下,我将使用LLVM_EXPERIMENTAL_TARGETS_TO_BUILD="WebAssembly"和 将LLVM_TARGETS_TO_BUILD保留为其默认值(所有稳定目标)。 我设置的另一个重要变量是CMAKE_BUILD_TYPE=Release以获得优化的构建和 CMAKE_INSTALL_PREFIX=/opt/llvm/bin将此版本的LLVM保留在其目录中并执行此操作 不要干扰我已经在我的系统上的版本(我只是将这个目录添加到$ PATH 我什么时候需要呢。
            2. cmake -G "Unix Makefiles" -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD="WebAssembly" -DCMAKE_INSTALL_PREFIX=/opt/llvm/bin -DCMAKE_BUILD_TYPE=Release /opt/llvm

              1. 构建LLVM,这可能需要一段时间:
              2. cmake --build .

                1. 安装LLVM:
                2. cmake --build . --target install

答案 1 :(得分:2)

您应该从源代码编译后端。 LLVM中唯一可插入的东西是当前的传递。

答案 2 :(得分:0)

您的 llc --version 命令说您安装了LLVM版本5.0.0。直到LLVM 8.0.0才将WASM集成到LLVM中。在那之前是实验性的。

更改为WebAssembly目标

WebAssembly目标不再是“实验性的”!现在由 默认,而不需要启用 LLVM_EXPERIMENTAL_TARGETS_TO_BUILD。

现在认为目标文件格式和核心C ABI是稳定的。那 说,目标文件格式具有ABI版本控制功能, 它的预期用途将是增加对小额退货的支持 一旦基础WebAssembly构造为多个返回值 平台本身支持它。此外,多线程支持是 尚未包含在稳定的ABI中。

https://releases.llvm.org/8.0.1/docs/ReleaseNotes.html#changes-to-the-webassembly-target