当前位置: 首页 > article >正文

AI 时代:祛魅、适应与重新定义宋

指令替换项目需求将加法指令替换为减法项目目录如下/MyProject├── CMakeLists.txt # CMake 配置文件├── build/ #构建目录│ └── test.c #测试编译代码└── mypass2.cpp # pass 项目代码一测试代码示例test.c// test.c#includeint my_add(int a, int b) {return a b;}int main() {int x 10;int y 20;printf(Result: %d\n, my_add(x, y));return 0;}二编写Pass其他的固定的模板之前文章注释有这里我只注释当前项目重要的部分代码流程 遍历指令并匹配ADD指令-替换为sub指令#include llvm/IR/PassManager.h#include llvm/Passes/PassBuilder.h#include llvm/Passes/PassPlugin.h#include llvm/Support/raw_ostream.h#include llvm/IR/Function.h#include llvm/IR/BasicBlock.h#include llvm/IR/Instruction.h#include llvm/IR/Instructions.h#include llvm/IR/IRBuilder.h // --- 【新增】必须包含这个头文件using namespace llvm;namespace {struct mypass3 : public PassInfoMixin {PreservedAnalyses run(Function F, FunctionAnalysisManager ) {errs() Analyzing Function: F.getName() \n;bool changed false;//这里的2个循环获取的是遍历函数的指令(函数-代码块-指令)for (BasicBlock BB : F) {for (Instruction Inst : BB) {]//判断当前的指令是ADD指令(加法)if (Inst.getOpcode() Instruction::Add) {errs() Found ADD, changing to SUB...\n Inst \n;//创建IR构建器//在修改IR时需要用到构建器IRBuilder builder(Inst);//这里时获取ADD的操作数//%add add nsw i32 %0, %1中的%0和%1Value *lhs Inst.getOperand(0); // 左操作数Value *rhs Inst.getOperand(1); // 右操作数//这里是构建新的指令sub//其中参数是//1左操作数//2操作数//3返回的变量名相当于%add add nsw i32 %0, %1中的%addValue *newSub builder.CreateSub(lhs, rhs, new_sub);//替换指令Inst.replaceAllUsesWith(newSub);errs() Replaced with SUB: \n *lhs \n *rhs \n *newSub \n;changed true;}}}if (changed) {return PreservedAnalyses::none();}return PreservedAnalyses::all();}};}extern C LLVM_ATTRIBUTE_WEAK ::llvm::PassPluginLibraryInfollvmGetPassPluginInfo() {return {LLVM_PLUGIN_API_VERSION,mypass3,v0.1,[](PassBuilder PB) {PB.registerPipelineParsingCallback([](StringRef Name, FunctionPassManager FPM,ArrayRef) {if (Name mypass3) {FPM.addPass(mypass3());return true;}return false;});}};}三Pass的构建下面引用的是之前文章的内容构建LLVM Pass需要写CMakeLists.txt构建声明1. 配置CMake配置文件CMakeLists.txt下面的cmake配置可以直接拿去用我已经标注好需要修改的位置#cmake 版本可通过 cmake --version 判断cmake_minimum_required(VERSION 4.1.1) #----修改 cmake版本号#项目名字project(mypass2) #----修改 项目名称#导入项目的 LLVM cmake 配置文件路径(如果根据我之前文章安装这里就相同)set(LLVM_DIR D:/LLVM/llvm-project/build/lib/cmake/llvm)#----修改 llvm cmake配置路径#寻找 LLVM 的包文件#REQUIRED 找不到 LLVM 则停止构建#强制使用 LLVM 安装时生成的配置文件进行定位find_package(LLVM REQUIRED CONFIG)#将 LLVM 的 CMake 模块路径添加到当前 CMake 搜索路径中以便后续使用 include(AddLLVM)。list(APPEND CMAKE_MODULE_PATH ${LLVM_CMAKE_DIR})#引入 LLVM 提供的专用 CMake 宏include(AddLLVM)#将 LLVM 的头文件目录如 llvm/IR/Function.h加入编译器的搜索路径include_directories(${LLVM_INCLUDE_DIRS})#导入 LLVM 编译时使用的宏定义add_definitions(${LLVM_DEFINITIONS})#设置 C 标准为 C17。(这里如果不用17编译会报错)set(CMAKE_CXX_STANDARD 17)#强制要求必须支持 C17如果编译器不支持则失败。set(CMAKE_CXX_STANDARD_REQUIRED ON)#创建一个模块化的库(.dll)add_library(mypass2 MODULE mypass2.cpp) #----修改 项目名称文件名#windows不用会报错导出符号#LLVM Pass 需要暴露一些特定的入口点如 getAnalysisUsage给 opt 工具调用。set_target_properties(mypass2 PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) #----修改 项目名称# 指定该 Pass 需要链接的 LLVM 核心组件。# LLVMCore: 提供 IR、Function、Module 等核心类。# LLVMSupport: 提供各种辅助工具类如 errs() 输出。target_link_libraries(mypass2 LLVMCore LLVMSupport) #----修改 项目名称文件名# 为该目标设置特定的编译器选项。# /utf-8: 告诉 MSVC 编译器使用 UTF-8 编码处理源代码防止中文注释引起的乱码或编译错误。target_compile_options(mypass2 PRIVATE /utf-8)#----修改 项目名称文件名2.编译并构建Pass打开visual studio的工作台我这里是x64 Native Tools Command Prompt for VS 2022进到build目录#构建项目#其中-DCMAKE_BUILD_TYPERelWithDebInfo不选会报错由于我之前编译的是带符号的relase版本cmake -G Ninja -DCMAKE_BUILD_TYPERelWithDebInfo ..#编译ninja最后出现下面提示即为编译成功[2/2] Linking CXX shared module mypass2.dll四使用当前的pass进到build目录#把.c文件编译为.ll#-O1 使用O1优化这里我尝试-O0不优化会导致我的pass无法应用#-Xclang -disable-llvm-passes 不使用默认的pass优化clang -S -emit-llvm -O1 -Xclang -disable-llvm-passes test.c -S -o test.ll#使用passopt -load-pass-pluginmypass2.dll -passesmypass2 test.ll -S -o test_opt.ll#编译使用pass后的execlang test_opt.ll -o test_opt.exe#编译使用pass前的execlang test.ll -o test.exe输出结果运行test.exe不使用pass输出结果如下Result: 30运行test_opt.exe使用pass后输出结果如下Result: -10焕拾既闹

相关文章:

AI 时代:祛魅、适应与重新定义宋

指令替换 项目需求:将加法指令替换为减法 项目目录如下 /MyProject ├── CMakeLists.txt # CMake 配置文件 ├── build/ #构建目录 │ └── test.c #测试编译代码 └── mypass2.cpp # pass 项目代码 一,测试代码示例 test.c // test.c #includ…...

视觉问答(VQA)前沿进展:5大创新数据集与顶会论文精要解析

1. 视觉问答(VQA)技术现状与挑战 视觉问答(VQA)作为计算机视觉与自然语言处理的交叉领域,近年来发展迅猛。简单来说,VQA就是让计算机看懂图片内容后,回答人类提出的自然语言问题。比如给出一张…...

财税合规数字化建设与税务师事务所行业实践

随着企业监管趋严与数字化不断深入,财税合规已成为企业经营管理中的重要环节。无论是中小企业还是集团公司,都需要建立规范的财务流程,完善纳税申报机制,强化风险自查能力,以实现合法合规,稳定经营。财税合…...

VL1_四选一多路器:从RTL设计到覆盖率验证的全流程解析

1. 四选一多路器的基本概念与应用场景 四选一多路器(4-to-1 Multiplexer)是数字电路设计中最基础的组合逻辑电路之一。简单来说,它就像一个智能开关,能够根据控制信号从四个输入信号中选择一个输出。这种电路在实际项目中应用非常…...

实时行情系统设计:从协议选择到高可用架构,再到数据源选型蘸

一、核心问题及解决方案(按踩坑频率排序) 问题 1:误删他人持有锁——最基础也最易犯的漏洞 成因:释放锁时未做身份校验,直接执行 DEL 命令删除键。典型场景:服务 A 持有锁后,业务逻辑耗时超过锁…...

CET中电技术如何助光伏企业在“四可“时代抢占先机?

2026年,"十五五"规划开局之年,新能源行业正经历一场深刻的变革。从2025年5月30日136号文推动投资主体转变,到2026年1月30日114号文将"四可"能力从试点推广期正式升级为政策强制标准,分布式光伏的并网逻辑已被…...

无侵入式Allegro许可证使用数据采集方案

无侵入式Allegro许可证使用收数据方案拿这些个年我跟各种许可证打交道,从最开始的Named User整到并发许可、角色绑定,真是踩过不少坑。你要是想解决阿里云、Enovia、3DEXPERIENCE这伙软件的许可证管理问题,传统方法要么成本高,要么…...

_EMD-KPCA-LSTM 基于经验模态分解和核主成分分析的长短期记忆网络多维时间序列预测_matlab_实现基于EMD-KPCA-LSTM多维时间序列预测模型,与LSTM和EMD-LSTM进行对比

EMD-KPCA-LSTM 基于经验模态分解和核主成分分析的长短期记忆网络多维时间序列预测MATLAB代码(含LSTM、EMD-LSTM、EMD-KPCA-LSTM三个模型的对比) matlab 参考文档:基于EMD-PCA-LSTM的光伏功率预测模型 研究内容:本案例使用数据集是…...

2.76亿|国网浙江电力 2026 年第一次物资框架采购成交候选人名单出炉

4月3日,国网浙江电力2026年第一次物资类框架协议竞争性谈判采购推荐的成交候选人名单公示(采购编号:ZBGW26-003),涵盖线路防雷、通信配件、量子加密模组、带电作业机器人附件等 23 类细分品类。中标总金额27552.5万元&…...

VMD 1.9.4实战:如何高效查看蛋白质-配体分子动力学模拟轨迹(附帧数优化技巧)

VMD 1.9.4实战:如何高效查看蛋白质-配体分子动力学模拟轨迹(附帧数优化技巧) 分子动力学模拟已成为研究蛋白质-配体相互作用的重要工具,而可视化分析则是理解模拟结果的关键环节。Visual Molecular Dynamics(VMD&#…...

实战复盘】游戏上市公司合同系统实施案例(六):被忽视的IT力量——为什么业务主导的项目更需要IT深度参与?

本文为《游戏上市公司合同系统实施案例》系列第六篇。 👉 (一)业务背景|(二)多维预算|(三)合同预警|(四)安全攻防|&#x…...

STM32 UART 通信详解

通用异步收发传输器(UART)是STM32微控制器中最基础、最常用的串行通信接口之一。它通过简单的两根信号线(TX和RX)实现全双工异步数据交换,广泛应用于与PC调试、传感器模块、蓝牙/Wi-Fi模块等的通信。一、UART协议基础1…...

Yii::$app->getAuthManager();的庖丁解牛

Yii::$app->getAuthManager() 是 Yii2 权限控制系统(RBAC)的唯一入口和核心代理。 它的本质是:通过服务定位器(Service Locator)模式,从全局应用容器中获取实现了 yii\rbac\ManagerInterface 接口的授权…...

革新性动物森友会存档编辑工具:NHSE全流程定制指南

革新性动物森友会存档编辑工具:NHSE全流程定制指南 【免费下载链接】NHSE Animal Crossing: New Horizons save editor 项目地址: https://gitcode.com/gh_mirrors/nh/NHSE NHSE(Animal Crossing: New Horizons save editor)是一款专业…...

别再乱删了!手把手教你用官方工具彻底卸载Autodesk全家桶(3ds Max/CAD)

彻底告别安装失败!Autodesk软件专业卸载与重装全指南 你是否曾经遇到过这样的困扰:明明已经卸载了3ds Max或AutoCAD,重新安装时却频频报错?那些隐藏在系统深处的残留文件就像顽固的污渍,无论你怎么擦洗都挥之不去。本…...

一网推百度爱采购代运营助力泰铖自动化斩获海量精准询盘

在工业制造数字化升级的当下,百度爱采购已然成为机械设备企业开拓线上客源的核心阵地,然而诸多中小厂商因缺乏专业运营手段,难以发挥平台价值。张家港市泰铖自动化设备有限公司主营半自动弯管机、缩管机、倒角机与切管机,曾面临线…...

每刻报销单到金蝶云星空:从API调用到数据写入全教程

每刻报销单集成至金蝶云星空的技术方案分享 在本次案例中,我们探讨的是如何通过轻易云数据集成平台实现每刻报销单的数据无缝对接到金蝶云星空系统。整个方案分为三个具体执行部分:付款申请、特殊付款申请单以及专项付款申请单。从获取数据,…...

从Stuxnet到S7CommPlus:一个C#程序员的工控协议安全入门笔记

从Stuxnet到S7CommPlus:一个C#程序员的工控协议安全入门笔记 工业控制系统(ICS)安全一直是个神秘而重要的领域。作为一名C#开发者,我曾以为这离我的日常开发很远,直到偶然接触到Stuxnet病毒的故事——这个专门针对西门…...

哪款头戴式蓝牙耳机性价比高?十大热门平价头戴式耳机品牌推荐!

2026年头戴耳机市场新老品牌争奇斗艳,从入门到高端让人目不暇接。作为一名经历过选择困难的音频爱好者,我完全理解这种幸福的烦恼:参数术语堆砌、营销话术包装,让人难辨虚实。在实测过多款产品后,我发现关键要避开这些…...

Windows 10/11 上保姆级安装AdGuard Home,并配置为开机自启服务(附NSSM详细步骤)

Windows 系统深度集成 AdGuard Home:从零构建企业级 DNS 过滤服务 在数字生活高度渗透的今天,网络隐私保护已成为现代计算机用户的刚需。作为 Windows 平台用户,我们常常面临一个两难选择:要么忍受各类广告追踪和恶意域名的侵扰&…...

Rust 时间处理神器:chrono 从入门到实战

Rust 时间处理神器:chrono 从入门到实战 在 Rust 生态中,chrono 凭借其遵循 ISO 8601 标准、支持时区、类型安全且性能优异的特性,成为了 Rust 开发者的首选工具。本文将从入门到进阶,并结合实际开发场景带你全面掌握 chrono 的使…...

归并排序力扣题(leetcode)何

1.概述在人工智能快速发展的今天,AI不再仅仅是回答问题的聊天机器人,而是正在演变为能够主动完成复杂任务的智能代理。OpenAI的Codex CLI就是这一趋势的典型代表——一个跨平台的本地软件代理,能够在用户的机器上安全高效地生成高质量的软件变…...

2026届学术党必备的AI写作工具推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 大语言模型DeepSeek,于论文写作中能予以多维度辅助。在文献检索阶段,…...

2025届必备的五大AI辅助论文平台解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 就毕业论文写作而言,人工智能技术的应用得遵循学术规范。其一,AI能够…...

旺店通与轻易云集成平台的无缝数据对接方案

数据源系统:旺店通企业奇门旺店通企业奇门是慧策旗下核心的智能零售解决方案,提供从订单管理到仓储物流的全链路服务。其特点包括:一体化智能零售平台,覆盖电商经营全流程打破数据孤岛,实现跨系统数据互通AI驱动的智能…...

DeerFlow智能客服应用:多轮对话系统实战

DeerFlow智能客服应用:多轮对话系统实战 1. 引言 想象一下这样的场景:一位顾客在电商平台咨询商品信息,客服机器人不仅能准确回答产品参数,还能根据对话历史推荐相关配件,甚至在用户表达不满时自动生成工单并转接人工…...

超越wx.uploadFile!小程序多图上传终极方案:自定义FormData+后端接收详解

小程序多图上传实战:从FormData封装到企业级解决方案 在小程序开发中,文件上传是常见的业务场景,但原生wx.uploadFile接口在复杂需求面前往往力不从心。当我们需要批量上传、进度监控、自定义请求头时,一套完整的自定义上传方案就…...

光伏电站全流程软件产品核心功能解析

随着光伏产业规模化发展,电站管理已进入全流程数字化管控时代,一款优质的光伏电站全流程软件,需覆盖项目开发、施工建设、智能运维、数据决策全链路,精准破解各环节痛点,为电站高效运营提供技术支撑。结合行业实践&…...

自动导引车(AGV)与自主移动机器人(AMR)控制系统的 C# 开源封装库瞧

为 HagiCode 添加 GitHub Pages 自动部署支持 本项目早期代号为 PCode,现已正式更名为 HagiCode。本文记录了如何为项目引入自动化静态站点部署能力,让内容发布像喝水一样简单。 背景/引言 在 HagiCode 的开发过程中,我们遇到了一个很现实的问…...

别再死记硬背了!用Tomcat 10 + IDEA手把手带你理解Servlet和JSP到底怎么工作

别再死记硬背了!用Tomcat 10 IDEA手把手带你理解Servlet和JSP到底怎么工作 刚接触JavaWeb开发时,很多人会被Servlet和JSP的各种概念搞得晕头转向。生命周期、九大内置对象、MVC模式...这些教科书式的术语堆砌,往往让人越看越迷糊。今天我们就…...