LLVM新增后端需要实现哪些核心类

夏雪同学_8195

夏雪同学_8195

2026-09-28

181人浏览

原创

targetmachine 类必须实现,否则 llc 无法识别目标架构;它负责注册子系统、控制 jit/mc 支持及调度/分配策略,缺之则运行时报 invalid target 错误。

llvm新增后端需要实现哪些核心类

TargetMachine 类必须实现,否则 llc 无法识别目标

LLVM 后端启动时,llc 依赖 TargetMachine 的全局注册来发现可用架构。没实现它,llc -march=yourtarget 会直接报错 error: invalid target 'yourtarget'。

这个类不只是“注册入口”,它还承担三件事:

  • 构造并返回 TargetLowering、TargetInstrInfo、TargetRegisterInfo 等子系统实例
  • 决定是否启用 JIT、是否支持 MC layer(影响 llc -filetype=obj 是否可用)
  • 控制默认的指令调度器(如 TargetSchedModel)和寄存器分配策略

常见错误是只注册了 Target 全局变量但没提供 TargetMachine 子类,导致编译通过但运行时报错。

TargetLowering 是 IR 到 SelectionDAG 转换的关键桥梁

TargetLowering 决定了你的架构如何理解 LLVM IR 中的基本操作——比如 add、load、call 是映射成一条原生指令,还是拆成多条,或者根本需要自定义 lowering 逻辑。

你必须重写 LowerOperation 来处理 IR 指令到 SDNode 的转换,尤其是:

  • ISD::ADD/ISD::MUL 等算术节点:是否支持 immediate operand?是否要拆成 ADDri + ADDrr?
  • ISD::LOAD/ISD::STORE:地址模式支持哪些?是否允许 post-increment?对齐要求是否严格?
  • ISD::CALL:调用约定怎么描述?参数怎么传?返回值放哪?栈帧怎么管理?

漏掉任意一个常用 ISD::* 节点的 lowering,llc 在 SelectionDAGISel::Select 阶段就会 abort 并提示 Do not know how to lower this operator!。

TargetInstrInfo 和 TargetRegisterInfo 是指令调度与寄存器分配的前提

没有 TargetInstrInfo,你就没法告诉 LLVM “我的 ADD 指令延迟是 1,有 2 个读操作数、1 个写操作数”;没有 TargetRegisterInfo,寄存器分配器连 “R0 是保留寄存器” 或 “R1–R10 是 caller-saved” 都不知道。

Hama
Hama

一款利用AI智能移除图片中不需要对象的在线修图工具,可快速清理人物、杂物和其他视觉干扰内容。

下载

这两个类不是可选的——只要你想生成可执行代码(哪怕只是 .s),就必须提供基础实现:

  • TargetInstrInfo 至少要实现 getRegClass、getOperandConstraint、isTriviallyReMaterializable
  • TargetRegisterInfo 必须提供寄存器枚举(enum { R0, R1, ... })、寄存器类定义(GR32)、以及 getCalleeSavedRegs

典型坑:寄存器编号从 0 开始但忘了把 R0 设为 Reserved,结果被分配器乱用,生成非法指令。

TableGen 描述文件比 C++ 代码更早生效,且容错极低

LLVM 构建时,.td 文件(如 YourTarget.td、YourTargetInstrInfo.td)会被 tblgen 编译成 C++ 头文件。这些头文件是 TargetInstrInfo、TargetRegisterInfo 等类的底层数据源。

一旦 .td 文件语法出错或语义矛盾(比如定义了两个同名指令,或寄存器类包含不存在的寄存器),tblgen 直接失败,整个构建中断,且错误信息极其简陋,常只显示 error: redefinition of 'XXX'。

实操建议:

  • 先用最小 YourTarget.td:只定义 Target、一个空 Instruction、一组寄存器,确保 tblgen 能过
  • 所有寄存器名、指令名、寄存器类名,在 .td 里定义一次,C++ 里只引用,不要手动重复枚举
  • 避免在 .td 中使用复杂 let 嵌套,调试困难;优先用 def + multiclass 组织

真正卡住新人的往往不是 C++ 逻辑,而是 tblgen 这一层无声崩溃——它不报行号,也不提示上下文,只留一个 exit code 1。

相关文章

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

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

下载

相关标签:

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

相关专题

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

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

2023.08.11

2143

5

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

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

2024.03.19

5730

13

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

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

2024.03.19

5026

10

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

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

2026.09.23

140

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

80

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

60

15

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

2026.09.22

40

12

Conan二进制包配置指南
Conan二进制包配置指南

本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

2026.09.22

60

13

Conan私有仓库搭建教程
Conan私有仓库搭建教程

本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

2026.09.22

40

19

热门下载

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

精品课程

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