如何使用LLVM/Clang to RISC-V目标进行编译? [英] How can I compile with LLVM/Clang to RISC-V target?

查看:0
本文介绍了如何使用LLVM/Clang to RISC-V目标进行编译?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我的问题是,我无法使用以下命令仅列出clang支持的目标LLC-s:

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

并且未列出任何类型的Riscv处理器。

所以我尝试查看三元组文件:llvm-projectllvmincludellvmADTTriple.h

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

但我收到以下错误:

错误:无法创建目标:‘没有兼容的可用目标 带三重"riscv32"‘

有人能帮我找到有效的RISC-V目标吗?我只是不会编译程序,但我知道LLVM支持RISC-V。

推荐答案

LLVM9release notes明确声明RISC-V支持从试验性升级到正式。

事实上,在我的Fedora 31机器上,LLVM9 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来获取您的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

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

这篇关于如何使用LLVM/Clang to RISC-V目标进行编译?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆