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

Zol*_*tán 6 compilation llvm clang riscv

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

我的问题是,我无法仅列出带有这些命令的 LLC-s 支持的 clang 目标:

llc --version
llc -march=xxARCHTYPExx -mattr=help
Run Code Online (Sandbox Code Playgroud)

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

所以我试图查看三重文件: llvm-project\llvm\include\llvm\ADT\Triple.h

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

但我收到以下错误:

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

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

max*_*zig 6

LLVM 9发行说明明确指出 RISC-V 支持已从实验性提升为正式版。

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

$ llvm-objdump --version | grep riscv
    riscv32    - 32-bit RISC-V
    riscv64    - 64-bit RISC-V
Run Code Online (Sandbox Code Playgroud)

此外,我可以使用 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
Run Code Online (Sandbox Code Playgroud)

虽然它不包括用于 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.
Run Code Online (Sandbox Code Playgroud)

但是,您实际上并不需要 - 您可以直接为您的 hello world 调用系统调用,例如:

$ 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
Run Code Online (Sandbox Code Playgroud)

我不使用 clang 进行链接,因为我似乎无法说服 clang-fuse-ld使用除/usr/bin/ld.