LLVM后端怎么编写MachineFunction Pass

浅晨大大_9046

浅晨大大_9046

2026-10-01

158人浏览

原创

machinefunctionpass 是作用于 machinefunction(指令选择后、寄存器分配前的机器指令序列)的后端优化 pass,继承自 functionpass 但操作对象是 machineinstr 和虚拟寄存器;而 functionpass 仅作用于 llvm ir 层,无法触及目标相关指令与后端优化。

llvm后端怎么编写machinefunction pass

MachineFunctionPass 是什么,和 FunctionPass 有什么区别

它不是在 LLVM IR 层操作的 FunctionPass,而是在指令选择(Instruction Selection)之后、寄存器分配之前,对 MachineFunction(即已生成目标相关指令的函数表示)进行遍历和修改的 pass。此时 IR 已被翻译成 MachineInstr 序列,但还没做寄存器分配,变量还是虚拟寄存器(VirtualRegister),所以你能安全地插入/删除/重写机器指令,但不能假设物理寄存器已就绪。

关键区别在于:如果你要插桩、重排指令顺序、做后端特定优化(比如 ARM 的 predication 消除、RISC-V 的 load-store 合并),或者像 OLLVM 那样做控制流混淆(后端级),就必须用 MachineFunctionPass;用 FunctionPass 是改不到这些的——它看到的还是 %add = add i32 %0, %1 这种 IR,根本不知道最终会变成 add x0, x1, x2 还是 addw r0, r1, r2。

注册一个 MachineFunctionPass 的最小必要步骤

不依赖 TableGen、不碰 CMakeLists.txt 全局配置,只改你自己的文件,就能让 llc 或 opt 认出它:

  • 继承 MachineFunctionPass,实现 runOnMachineFunction(MachineFunction &MF)
  • 定义静态 ID 成员(必须是 char 类型,不能是 int 或 const char*)
  • 用 INITIALIZE_PASS 宏注册,参数顺序不能错:INITIALIZE_PASS(YourPassClass, "pass-name", "Pass description", false, false)
  • 在对应 Target 的头文件(如 ARM.h)里声明工厂函数:FunctionPass *createYourPass();
  • 在源文件末尾提供该工厂函数定义,返回 new YourPassClass()

漏掉任意一条,llc -load=yourpass.so -your-pass-name 就会报 Unknown pass: your-pass-name 或直接 segfault。

Facet
Facet

一款结合AI图像生成与编辑能力的视觉创作工具,支持对图片进行生成、修改和迭代,适合创意设计工作。

下载

runOnMachineFunction 里怎么安全访问和修改指令

别直接遍历 MF.instr_begin() 然后 erase() ——这会导致迭代器失效。正确做法是先收集要改的 MachineInstr*,再批量处理:

  • 遍历每个 MachineBasicBlock:for (auto &MBB : MF)
  • 遍历块内指令:for (auto &MI : MBB),注意 MI 是 MachineInstr&,不是指针
  • 用 MI.getOpcode() == ARM::ADDrr(或 TargetOpcode::COPY 等)判断指令类型,别用字符串比较
  • 插入新指令用 MBB.insert(MI, newMI),其中 newMI 由 BuildMI(MBB, MI, DebugLoc(), TII->get(ARM::SUBrr)) 构造
  • 删除用 MI.eraseFromParent(),不是 MBB.erase(MI)

常见坑:BuildMI 第二个参数必须是 MachineInstr*(定位插入点),传 MI 本身是错的——得传 &MI 或 MI.getIterator().getBase();另外,所有虚拟寄存器(Reg)必须通过 MRI.createVirtualRegister(&TRI) 创建,不能硬编码 ARM::R0 这类物理寄存器。

怎么编译、加载、验证你的 MachineFunctionPass

它不能像 IR pass 那样用 opt -load=xxx.so 直接跑,因为 opt 只处理 IR 层;你必须走 llc 流水线:

  • 编译成 so:clang++ -fPIC -shared -I$LLVM_BUILD/include -I$LLVM_SRC/include ... -o YourPass.so,链接 -lLLVMCodeGen -lLLVMCore
  • 触发方式:llc -load=YourPass.so -your-pass-name input.ll -o /dev/null -debug-only=your-pass-name
  • 加 -print-after-all 可以看到它执行前后 MachineInstr 的变化,输出在 stderr
  • 如果 pass 没生效,先检查 llc --help | grep your-pass-name 是否列出——没列说明注册失败;再确认 DEBUG_TYPE 和 -debug-only= 后缀是否完全一致(大小写敏感)

最容易被忽略的是:MachineFunctionPass 默认不会被 llc 自动启用,哪怕你注册了,也必须显式用 -your-pass-name 参数触发;而且它只在 -O0 或 -O1 下稳定工作,-O2 可能因流水线跳过某些阶段导致你的 pass 被绕过。

相关文章

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

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

下载

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

相关专题

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

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

2023.08.11

2203

5

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

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

2024.03.19

5850

13

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

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

2024.03.19

5146

10

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.04

2680

5

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

2023.10.07

454

5

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

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

2026.09.30

0

10

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

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

2026.09.30

0

14

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

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

2026.09.30

0

12

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

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

2026.09.30

0

26

热门下载

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

精品课程

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