llc -version 是最可靠的内置目标架构查询方式,输出中“available targets:”后所列即实际编译进二进制的目标(如 aarch64、riscv、x86),不依赖配置或环境变量,直接反映运行时真实支持能力。

llc -version 能直接列出所有已编译进当前 LLVM 的目标架构,这是最可靠、无需额外依赖的查法。
用 llc -version 查看内置目标列表
LLVM 的目标支持是在编译时由 LLVM_TARGETS_TO_BUILD 决定的,运行时不会动态加载。因此,llc(LLVM 的后端代码生成器)启动时会打印它所链接的所有目标模块名称。
- 执行
llc -version,输出中以Available targets:开头的那行就是完整列表 - 常见条目如
AArch64、ARM、RISCV、X86、WebAssembly等,注意首字母大写且无下划线 - 如果看到
Hexagon或Mips,说明构建时显式启用了它们;若没出现RISCV,哪怕你装了 riscv-toolchain,LLVM 本身也不支持 RISC-V 后端 - 该命令不依赖环境变量或配置文件,结果即实际可用能力,比查文档或源码更直接
为什么不用 llvm-config --targets-built?
llvm-config 确实提供 --targets-built 选项,但它返回的是构建时指定的 LLVM_TARGETS_TO_BUILD 值(比如 "all" 或 "X86;RISCV"),而非真实链接进二进制的目标集合。
- 当
LLVM_TARGETS_TO_BUILD=all时,llvm-config会显示all,但实际可能因缺失依赖(如 TableGen 未就绪)导致部分目标被静默跳过 -
llc -version是最终验证——只要它列出来了,你就一定能用-mtriple=riscv64-unknown-elf这类参数跑通 - 某些发行版打包时会裁剪目标(如 Ubuntu 的
llvm包默认不含WebAssembly),此时llvm-config可能误导,而llc不会
从源码目录结构快速判断(仅限本地构建)
如果你自己编译过 LLVM,llvm/lib/Target/ 下的子目录名基本对应目标名,但要注意:
- 目录存在 ≠ 目标已启用:必须在 CMake 配置阶段传入对应 target 才会编译进
libLLVM.so -
ARM/目录同时支撑ARM、AArch64、Thumb,但llc -version会分别列出三者 -
RISCV/存在不代表支持 Zba/Zbb 等扩展——那是-march控制的,和目标架构层级无关 - 别翻
llvm/include/llvm/Config/Targets.def:它只是生成用的模板,不是运行时状态
真正容易被忽略的是:目标架构支持和指令集扩展支持是两层事。llc -version 说有 RISCV,只代表你能生成 RISC-V 机器码;但能否用 -march=rv64gc_zba,还得看 clang --target=riscv64 --target-help 和 RISCV.td 里有没有注册 zba。两者不能混为一谈。











