讲师中心 微信公众号
AI工具推荐 视频效率加速

LLVM后端怎么编写MachineFunction Pass

浅晨大大_9046

浅晨大大_9046

发布时间:2026-10-01 15:16:00

|

158人浏览过

|

来源于php中文网

原创

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。

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 被绕过。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

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

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

2223

2023.08.11

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

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

5870

2024.03.19

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

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

5186

2024.03.19

function是什么
function是什么

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

2700

2023.08.04

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

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

454

2023.10.07

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

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

20

2026.09.30

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

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

0

2026.09.30

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

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

0

2026.09.30

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

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

20

2026.09.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn