由于科研需要, 我今天试着编译了一份支持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
。
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
参数。我仍在研究这一问题。
./bin/clang++ xxx.cpp --gcc-toolchain=/opt/riscv
此外, 还可以根据需要加上参数-march=rv64imac
。LLVM其他组件使用方法类似。
参考资料:
发表评论