我想将一个简单的程序“ 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支持。
答案 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
以外的其他链接器。