由于科研需要, 我今天试着编译了一份支持RISC-V的LLVM。事实上, 目前LLVM官方已经支持了RISC-V, 因此难度不会很大。
首先, 需要参照这篇文章构建GNU编译器套件(GCC), 在编译和使用RISC-V LLVM时会用到它(???)。
然后, 下载和编译LLVM。假设之前编译好的GCC安装在/opt/riscv
(即编译GCC时参数包含--prefix=/opt/riscv
), 若安装在其他地方, 需要修改下方的DEFAULT_SYSROOT
以及GCC_INSTALL_PREFIX
, 以及之后的--gcc-toolchain
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | git clone https: //github .com /llvm/llvm-project .git cd llvm-project mkdir build cd build cmake -G "Unix Makefiles" \ -DLLVM_ENABLE_PROJECTS= "clang;libcxx;libcxxabi;libunwind;lld;compiler-rt" \ -DCMAKE_BUILD_TYPE=Release \ -DLLVM_TARGETS_TO_BUILD=RISCV \ -DDEFAULT_SYSROOT= "/opt/riscv/sysroot" \ -DGCC_INSTALL_PREFIX= "/opt/riscv" \ -DLLVM_DEFAULT_TARGET_TRIPLE= "riscv64-unknown-linux-gnu" \ -DLLVM_ENABLE_BINDINGS=OFF \ -DLLVM_USE_LINKER=gold \ -DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON \ .. /llvm make |
编译好后, 即可使用。由于clang的一个问题, 在指定了sysroot之后, 无论是通过命令行参数--sysroot
还是通过宏DEFAULT_SYSROOT
指定的, GCC_INSTALL_PREFIX
似乎都会被忽略掉, 因此在使用时仍需手动指定--gcc-toolchain
参数。我仍在研究这一问题。
1 | . /bin/clang ++ xxx.cpp -- gcc -toolchain= /opt/riscv |
此外, 还可以根据需要加上参数-march=rv64imac
。LLVM其他组件使用方法类似。
参考资料:
发表评论