如何使用LLVM / Clang编译为RISC-V目标?

时间:2019-02-13 13:03:10

标签: compilation clang llvm riscv

我想将一个简单的程序“ int main(){return 0;}”编译为RISC-V处理器。 LLVM / Clang版本是9.0,我想使用像https://github.com/riscv/riscv-tools

这样的RISC-V模拟器运行编译后的程序。

我的问题是我无法列出仅受LLC支持的clang目标,而这些命令如下:

llc --version
llc -march=xxARCHTYPExx -mattr=help

并且没有列出任何类型的riscv处理器。

因此,我尝试查找三元文件:llvm-project\llvm\include\llvm\ADT\Triple.h

并尝试以下命令:clang hello.c -target riscv32 -march=rv32imafd

但是出现以下错误:

  

错误:无法创建目标:'没有可用的目标兼容   带有三个“ riscv32””

有人可以帮助我如何获得有效的RISC-V目标吗?我只是简单地无法编译程序,但我知道LLVM具有RISC-V支持。

1 个答案:

答案 0 :(得分:4)

LLVM 9 release notes明确声明RISC-V支持已从试验性升级为正式。

实际上,在我的Fedora 31机器上,LLVM 9 Fedora软件包确实支持RISC-V:

$ llvm-objdump --version | grep riscv
    riscv32    - 32-bit RISC-V
    riscv64    - 64-bit RISC-V

此外,我可以使用LLVM工具链创建RISC-V二进制代码:

$ clang --target=riscv64 -march=rv64gc rotate.s -c -o rotate.o
$ file rotate.o
rotate.o: ELF 64-bit LSB relocatable, UCB RISC-V, version 1 (SYSV), not stripped

尽管它不包含针对RISC-V目标的libc:

$ clang --target=riscv64 -march=rv64gc hello-world.c -o hello-world
hello-world.c:1:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
         ^~~~~~~~~
1 error generated.

但是,您实际上并不需要一个-您可以直接为您好世界调用syscall,例如:

$ clang  --target=riscv64 -march=rv64gc  hello.s -c -o hello.o
$ ld.lld hello.o -o hello
$ spike --isa=RV64gc ~/local/riscv/pk/riscv64-unknown-elf/bin/pk ./hello
bbl loader
Hello World

我不使用clang进行链接,因为似乎我无法说服-fuse-ld使用clang来使用/usr/bin/ld以外的其他链接器。