LLVM后端注册完成后为什么llc找不到目标

胖萱吖_7791

胖萱吖_7791

2026-10-06

654人浏览

原创

llc -march=xxx报unknown target,主因是llvm构建时未启用对应目标后端,需显式配置-dllvm_targets_to_build="riscv;aarch64"并重编译,且必须配合-mtriple指定正确三元组(如riscv64-unknown-elf)才能触发目标后端加载。

llvm后端注册完成后为什么llc找不到目标

llc -march=xxx 报错 unknown target

不是后端代码没编译进 llc,而是 LLVM 构建时没启用对应目标。LLVM 默认只编译 host target(比如你编译机器是 x86_64,就只开 X86),RISC-V、ARM 等需显式开启。

  • 检查构建命令是否含 -DLLVM_TARGETS_TO_BUILD="RISCV;AArch64"(多个用分号隔开);只写 RISCV 不行,必须大写且不带空格
  • 若用 Ninja 构建,确认 cmake -LH 输出里 LLVM_TARGETS_TO_BUILD 的值确实包含你的目标,而不是 all 或 host
  • llc --version 输出末尾会列出已启用的 targets,例如 Default Target: x86_64-unknown-linux-gnu (and 2 more) —— 这里的 “2 more” 就是额外启用的目标,没出现 RISCV 说明构建参数无效
  • 修改 CMake 参数后必须删掉整个 build 目录重来,cmake -G Ninja -B build -DLLVM_TARGETS_TO_BUILD=RISCV 不能增量生效

llc -march=riscv64 仍报 unknown target,但 RISCV 在 --version 里出现了

这是 target triple 不匹配导致的。LLVM 后端注册的是 target machine(如 RISCVTargetMachine),但 -march 只控制 ISA,不指定 triple;llc 实际靠 triple 推导 backend,而默认 triple 是 host 的(比如 x86_64-pc-linux-gnu)。

Viral Video
Viral Video

一款基于AI的文字转视频创作工具,可将文字创意快速转化为适合社交媒体传播的视频内容和短视频素材。

下载
  • 必须加 -mtriple:例如 llc -march=riscv64 -mtriple=riscv64-unknown-elf input.ll
  • 常见 triple 错误:riscv64-linux-gnu(需配套 glibc 支持)、riscv64-unknown-elf(裸机常用);用错会导致 backend 找不到或后续链接失败
  • 如果只注册了 RISCVAsmPrinter 但没实现 RISCVTargetMachine 的完整构造函数(比如漏掉 SubtargetFeatures 初始化),llc 可能静默跳过该 target,表现为“存在但不可用”

自定义后端编译进 llc 后,-march=xxx 被忽略,输出仍是 x86 汇编

根本原因是 TargetRegistry::lookupTarget 没返回你的 target,llc 回退到了默认 host target。这通常发生在注册时机或符号可见性问题上。

  • 确保 LLVMInitializeXXXTargetInfo()、LLVMInitializeXXXTarget()、LLVMInitializeXXXTargetMC() 三个初始化函数在 main() 前被调用;C++ 全局对象构造顺序不可靠,推荐显式调用
  • 如果你的后端代码在独立 .so 里,llc 默认不 dlopen 插件;必须静态链接进 llc,或改用 llc -load=libMyTarget.so(需构建时开启 LLVM_ENABLE_PLUGINS)
  • 检查函数名拼写:RISC-V 对应的是 LLVMInitializeRISCVTargetInfo,不是 LLVMInitializeRiscvTargetInfo(大小写敏感)
  • nm libLLVMRISCVCodeGen.a | grep Initialize 能确认符号是否存在;如果全是 U(undefined),说明链接时没拉进来

最容易被忽略的是 triple 和 target 初始化函数的绑定关系——-march 本身不触发任何 backend 加载,它只是给 IR 添加 target attribute;真正决定用哪个 backend 的,是 -mtriple 解析出的 target name,再经 TargetRegistry 查表。漏掉任一环,llc 都会安静地走错路。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2283

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6030

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5366

10

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

80

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

80

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

80

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

60

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

60

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

280

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程