llvm 无“一键列出所有支持扩展”命令,需通过 clang --target=riscv64 --target-help 查可用 -march 字符串、源码 riscv.td 中 def z/s 声明及 llc -mtriple=riscv64 -march=... --print-isas 交叉验证。

LLVM 本身不提供一个“一键列出所有支持扩展”的命令,但可以通过 llvm-config、clang --target-help 和源码级检查三者交叉验证,快速确认当前构建版本实际支持的 RISC-V 扩展。
用 clang --target=riscv64 --target-help 查可用 -march 字符串
这是最直接、面向用户的办法。Clang 会打印所有被启用(且未被禁用)的扩展名和 profile 名:
- 输出中以
rv32i、rv64i开头的是基础 ISA;后面跟的zifencei、zicsr、mafdcv等就是已注册的扩展名 - 带
rva20u64这类前缀的是官方 profile,说明该 build 启用了对应规范组合 - 若看到
zicond、zbkb等非标准扩展,说明编译 LLVM 时加了-menable-experimental-extensions或打了补丁 - 注意:即使某扩展出现在 help 列表里,也不代表后端能生成完整指令序列——比如
zihintpause可能只支持汇编,不支持 lowering
查 llvm/lib/Target/RISCV/RISCV.td 中的 def 声明
源码才是最终依据。打开该文件,搜索 def Z 或 def S 开头的记录(如 def Zicsr、def Svinval),每个 def 对应一个被 LLVM IR 层识别的扩展:
-
let ISAExt = "zicsr"表示该扩展在-march中可显式启用 - 若某扩展只有
let AssemblerPredicate = ...而无ISAExt,说明它仅被汇编器识别,IR 层不可见 -
let Unsupported = 1表示该扩展被声明但尚未实现 lowering 或 selection(常见于新提交的实验性扩展) - 别依赖 GitHub 上的 master 分支文档——本地构建的 LLVM 版本可能没合入最新
RISCV.td修改
运行时用 llc -mtriple=riscv64 -march=rv64imafdc_zba --print-isas
这个参数不会真生成代码,而是让后端打印当前 triple + march 组合下激活的全部子模块状态:
- 输出中出现
Zba、Zbb等大写缩写,表示该扩展已被解析并进入后端处理流程 - 若提示
error: unsupported architecture extension 'zxx',说明该字符串未在RISCVSubtarget.h的parseArchExt里注册 - 注意:某些扩展(如
zifencei)默认硬编码启用,即使没写进-march也会出现在输出里——这是历史兼容行为,不是你显式启用了它 - 该命令对自定义扩展无效,除非你已在
RISCVSubtarget.cpp中修改了扩展解析逻辑
真正容易被忽略的点是:LLVM 支持列表 ≠ 硬件支持列表。比如 zicbom 可能在 LLVM 里能 parse 和 emit,但目标芯片没实现 cache block ops,运行时就会 trap。验证扩展是否真正可用,必须结合 QEMU 模拟或真实硅片测试。











