我正在使用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后端?
答案 0 :(得分:11)
如Arrowd's message所述,LLVM一旦构建就不是很容易配置的。 如果您需要超出默认值的配置,您必须自己编译LLVM 。
LLVM有一些文章解释了如何编译它,但它没有完全描述 如何启用其他目标:
启用的目标由调用CMake时需要定义的两个变量控制
准备构建目录:LLVM_TARGETS_TO_BUILD
和LLVM_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)。
默认值包括:
AArch64
,AMDGPU
,ARM
,BPF
,Hexagon
,Mips
,MSP430
,NVPTX
,PowerPC
,Sparc
,SystemZ
,X86
,XCore
。
此列表在/lib/Target
中定义。
如您所见,Wasm不在此列表中。我们必须找到LLVM使用的名称,然后使用LLVM_EXPERIMENTAL_TARGETS_TO_BUILD
。
不幸的是,由于没有记录这个变量,我无法在他们的网站上找到所有目标的列表。
经过一些试验和错误后,似乎可用目标与CMake 中目录的名称相对应。
总结一下:要使用LLVM for them,您需要使用WebAssembly
启用LLVM_EXPERIMENTAL_TARGETS_TO_BUILD
目标
使用CMake准备构建目录时的变量。
以下是我用来编译LLVM版本的确切步骤。我使用的是Linux机器 但你应该能够适应你的环境。
要求:
的zlib
/opt/llvm
目录用于主目录
我的自定义版本的LLVM(这是该命令的最后一个参数,将其替换为您要使用的路径)。 svn co http://llvm.org/svn/llvm-project/llvm/trunk /opt/llvm
cd /opt/llvm
clang
是必需的,但其他是可选的。 {{3}} svn co http://llvm.org/svn/llvm-project/cfe/trunk tools/clang
mkdir build && cd build
LLVM_EXPERIMENTAL_TARGETS_TO_BUILD="WebAssembly"
和
将LLVM_TARGETS_TO_BUILD
保留为其默认值(所有稳定目标)。
我设置的另一个重要变量是CMAKE_BUILD_TYPE=Release
以获得优化的构建和
CMAKE_INSTALL_PREFIX=/opt/llvm/bin
将此版本的LLVM保留在其目录中并执行此操作
不要干扰我已经在我的系统上的版本(我只是将这个目录添加到$ PATH
我什么时候需要呢。 cmake -G "Unix Makefiles" -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD="WebAssembly" -DCMAKE_INSTALL_PREFIX=/opt/llvm/bin -DCMAKE_BUILD_TYPE=Release /opt/llvm
cmake --build .
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