【问题标题】:How to enable a LLVM backend?如何启用 LLVM 后端?
【发布时间】:2017-10-24 08:19:40
【问题描述】:

我正在使用 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 后端?

【问题讨论】:

  • 编译您自己的副本并启用相应的后端?
  • @tambre 好的,我希望有一种更简单的方法来做到这一点。但是我的问题仍然存在:我怎样才能简单地使用自定义目标构建 LLVM?
  • 哦,拜托。对于一个相对简单的问题,几乎没有记录。搜索引擎在搜索如何编译 LLVM 时会返回噪音,因为它本身就是一个编译器。事实证明,除了基础知识之外,还缺少文档:要启用 wasm 目标,您需要使用一个甚至没有记录的变量 (LLVM_EXPERIMENTAL_TARGETS_TO_BUILD)。

标签: llvm


【解决方案1】:

编辑 (2021-07-23):此答案已更新为使用“Motorola 68000”而不是“WebAssembly”作为示例实验目标(因为 Wasm 现在稳定了)。

LLVM 在构建后就不是很容易配置。 如果您需要超出默认值的配置,您必须自己编译 LLVM

LLVM 有几篇文章解释了如何编译它,但没有准确描述 如何启用其他目标:

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

  • LLVM_TARGETS_TO_BUILD只控制稳定的目标。 您可以使用特殊值all 来启用所有稳定 目标,或者提供以分号分隔的目标列表,例如ARM;PowerPC;X86。有an old request 将特殊值重命名为stable 并将all 用于所有 目标。 它的默认值为all(目标列表见下文)。

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

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

现在,您需要找出目标的实际名称,以及它是稳定目标还是实验目标。 稳定目标列表可以在in the Getting Started article找到。

默认值包括:AArch64AMDGPUARMAVRBPFHexagonLanaiMipsMSP430、@9876543476NVPTX @、RISCVSparcSystemZWebAssemblyX86XCore

此列表在the main CMakeFile (permalink) 中定义。

如您所见,WebAssembly 现在(2021 年)在列表中,因此它应该已经默认启用。当这个问题第一次被问到时,它仍然是一个实验目标。

当第一次提出问题时,WebAssembly 仍然是一个实验性目标,因此其余答案将更一般地描述如何启用任何目标。例如,我们将使用“Motorola 68000”而不是 wasm。

“摩托罗拉68000”不在稳定目标列表中。我们必须找到 LLVM 使用的名称,然后使用 LLVM_EXPERIMENTAL_TARGETS_TO_BUILD。 不幸的是,由于没有记录此变量,我无法在他们的网站上找到所有目标的列表。 经过一些试验和错误,似乎可用的目标对应于/lib/Target中的目录名称。该目录包含一个名为 M68k 的子目录:这可能是目标的名称。

要将 LLVM 用于“Motorola 68000”,您需要使用 LLVM_EXPERIMENTAL_TARGETS_TO_BUILD 启用 M68k 目标 使用 CMake 准备构建目录时的变量。


以下是使用“Motorola 68000”支持编译 LLVM 的步骤(根据您自己的要求进行调整)。我用的是 Linux 机器 但您应该能够使其适应您的环境。

要求:

  • CMake
  • 吉特
  • GCC、CLang 或 Visual Studio,具体取决于您的平台
  • zlib
  1. 克隆 LLVM 存储库。我将使用/opt/llvm-project 目录作为主目录 我的 LLVM 自定义版本(这是命令的最后一个参数,将其替换为您要使用的路径)。

    git clone https://github.com/llvm/llvm-project.git /opt/llvm-project

  2. 导航到 LLVM 源:

    cd /opt/llvm-project/llvm

  3. 创建您的构建目录并导航到它。

    mkdir build && cd build

  4. 使用 CMake 准备您的构建目录。这是您需要注意的步骤 设置变量。就我而言,我将使用 LLVM_EXPERIMENTAL_TARGETS_TO_BUILD="M68k" 和 将LLVM_TARGETS_TO_BUILD 保留为其默认值(所有稳定目标)。 我将设置的另一个重要变量是 CMAKE_BUILD_TYPE=Release 以获得优化的构建和 CMAKE_INSTALL_PREFIX=/opt/llvm-project/llvm/bin 将此版本的 LLVM 保留在其目录中并执行 不干扰我系统上已有的版本(我只需将此目录添加到 $PATH 当我需要它时)。

    cmake -G "Unix Makefiles" -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD="M68k" -DCMAKE_INSTALL_PREFIX=/opt/llvm-project/llvm/bin -DCMAKE_BUILD_TYPE=Release /opt/llvm-project/llvm

  5. 构建 LLVM,这可能需要一段时间:

    cmake --build .

  6. 安装 LLVM:

    cmake --build . --target install

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复。我会投赞成票,但我将发布更长的帖子,详细说明如何启用目标:事实证明这并不那么明显。
    【解决方案3】:

    您的 llc --version 命令表明您安装了 LLVM 版本 5.0.0。 WASM 直到 LLVM 8.0.0 才集成到 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

    【讨论】:

    • 如果您需要专门使用WebAssembly目标,我同意没有什么可做的。但是,这个问题更笼统,询问如何启用任何目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2015-06-26
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    相关资源
    最近更新 更多