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

IOFILE结构体的介绍与House of orange鸵

认识Pass层级结构Pass范围从上到下一共分为5个层级模块层级单个.ll或.bc文件调用图层级函数调用的关系。函数层级单个函数。基本块层级单个代码块。例如C语言中{}括起来的最小代码。指令层级单个IR指令。注意下面代码最好不要用中文使用起来非常麻烦控制台编译目标文件的编码不同会造成乱码。项目目录如下/MyProject├── CMakeLists.txt # CMake 配置文件├── build/ #构建目录│ └── test.c #测试编译代码└── mypass1.cpp # pass 项目代码一测试代码示例test.c#includevoid secret_function() {printf(I am secret\n);}int main() {secret_function();return 0;}二Pass编写项目描述通过解析下面代码的IR将下面代码中的函数名打印出来。mypass1.cpp#include llvm/IR/PassManager.h#include llvm/Passes/PassBuilder.h#include llvm/Passes/PassPlugin.h#include llvm/Support/raw_ostream.husing namespace llvm;// 这个结构体基本是固定模板namespace {struct mypass1 : public PassInfoMixin {//函数回调每次遇到函数时调用这里有重载存在多种入口方式可以以模块为入口PreservedAnalyses run(Function F, FunctionAnalysisManager ) {//这里是主要的逻辑代码我们主要学习的代码在这//打印出当前函数的名字errs() Found Function: F.getName() \n;//只读时返回PreservedAnalyses::all()//存在修改时PreservedAnalyses::none()return PreservedAnalyses::all();}};}//下面基本上是固定的模板每个pass没什么变化可以直接复制粘贴或者背熟。//直接使用需要修改的是下面的模块名称版本号调用参数和调用的pass结构体extern C LLVM_ATTRIBUTE_WEAK::llvm::PassPluginLibraryInfollvmGetPassPluginInfo() {return {LLVM_PLUGIN_API_VERSION,//版本信息mypass1,//模块信息自定义v0.1,//版本号自定义[](PassBuilder PB) {PB.registerPipelineParsingCallback([](StringRef Name, FunctionPassManager FPM,ArrayRef) {if (Name mypass1) {//调用参数FPM.addPass(mypass1());//上面pass结构体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(mypass1) #----修改 项目名称#导入项目的 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(mypass1 MODULE mypass1.cpp) #----修改 项目名称文件名#windows不用会报错导出符号#LLVM Pass 需要暴露一些特定的入口点如 getAnalysisUsage给 opt 工具调用。set_target_properties(mypass1 PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) #----修改 项目名称# 指定该 Pass 需要链接的 LLVM 核心组件。# LLVMCore: 提供 IR、Function、Module 等核心类。# LLVMSupport: 提供各种辅助工具类如 errs() 输出。target_link_libraries(mypass1 LLVMCore LLVMSupport) #----修改 项目名称文件名# 为该目标设置特定的编译器选项。# /utf-8: 告诉 MSVC 编译器使用 UTF-8 编码处理源代码防止中文注释引起的乱码或编译错误。target_compile_options(mypass1 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 mypass1.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-pluginmypass1.dll -passesmypass1 test.ll -S -o test_opt.ll输出结果Found Function: sprintfFound Function: vsprintfFound Function: _snprintfFound Function: _vsnprintfFound Function: secret_functionFound Function: printfFound Function: mainFound Function: _vsprintf_lFound Function: _vsnprintf_lFound Function: __local_stdio_printf_optionsFound Function: _vfprintf_l诶侔炒檀

相关文章:

IOFILE结构体的介绍与House of orange鸵

认识Pass层级结构 Pass范围从上到下一共分为5个层级: 模块层级:单个.ll或.bc文件 调用图层级:函数调用的关系。 函数层级:单个函数。 基本块层级:单个代码块。例如C语言中{}括起来的最小代码。 指令层级:单…...

AVP系统背后的技术拆解:车端、场端、云端到底谁在“开车”?

AVP系统技术全景:车端、场端与云端的协同博弈 当一辆特斯拉Model 3在商场停车场自动寻找车位时,它可能正经历着三种技术路线的激烈博弈。AVP(自主代客泊车)系统作为自动驾驶技术中最先商业化的场景,其背后的技术架构选…...

图论--最小生成树

prim算法(稠密图) 例题:https://www.acwing.com/problem/content/860/ 给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环,边权可能为负数。 求最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible。 给定一张边带权的…...

Photon Matrix激光灭蚊系统深度技术剖析:从理论到工程实现

引言:当反导技术遇上蚊虫防治 激光灭蚊的概念并非Photon Matrix首创。早在2007年,曾参与美国“星球大战”计划的物理学家Lowell Wood就曾在比尔及梅琳达盖茨基金会关于根除疟疾的研讨会上提出过类似设想。此后数年间,Intellectual Ventures等…...

C 语言从 0 入门(十三)|结构体:自定义数据类型与实战

大家好,我是网域小星球。 前面我们学习了基本数据类型、数组、指针、函数,能够处理数字、字符等简单数据。但在实际开发中,我们经常需要描述一个复杂对象,比如学生、商品、员工、书籍等,它们包含多种不同类型的信息&a…...

科研进展 | JAG: 大光斑高光谱激光雷达遥感辐射传输模型从垂直视角解锁森林叶绿素分布密码

大光斑高光谱激光雷达辐射传输模型: 垂直视角解锁叶绿素分布密码当森林的 “健康密码” 藏在垂直分层的枝叶间,传统遥感技术难以触及森林冠层中下层的生化奥秘? 近日,电子科技大学定量遥感团队白杰副研究员(师资博士后&#xff09…...

SITS东南亚本地化失败案例复盘,37天重构AI模型适配流程——奇点大会唯一授权披露的应急响应SOP

第一章:奇点智能技术大会:SITS系列品牌的全球化布局 2026奇点智能技术大会(https://ml-summit.org) SITS(Singularity Intelligence Technology Series)作为奇点智能技术大会核心孵化的技术品牌矩阵,已形成覆盖算法研…...

思摩尔第一季营收38.6亿:同比增42% 全面收益总额1.3亿降39%

雷递网 乐天 4月10日思摩尔国际控股有限公司(简称:“思摩尔”,股票代码:“6969”)日前发布截至2026年3月31日的财报。财报显示,思摩尔2026年第一季度营收为38.56亿元,较上年同期的27.22亿元增长…...

AI原生微服务可观测性如何突破“黑盒困局”?SITS2026首发Trace-LLM双轨追踪框架(已落地支撑日均2.4亿次AI调用)

第一章:SITS2026分享:AI原生微服务架构设计 2026奇点智能技术大会(https://ml-summit.org) 核心设计范式演进 AI原生微服务架构不再将模型作为后端API的被动调用对象,而是将其建模为具备生命周期、可观测性、弹性扩缩与上下文感知能力的一等…...

HTML转EXE一键打包工具版【实测可用】支持本地网页文件与在线网址直接生成独立可执行程序

温馨提示:文末有联系方式一、的HTML转EXE专业工具 无需订阅、不设试用期、不强制付费——本工具为真正版本,所有功能完全开放,下载即用,彻底告别弹窗广告与隐藏项。二、零环境依赖,纯图形化一键操作 无需安装Node.js、…...

如何交换表分区_ALTER TABLE EXCHANGE PARTITION实现数据快速导入导出

EXCHANGE PARTITION能秒级导入导出数据,因其仅交换元数据而非移动实际数据文件;要求源表与目标分区结构完全一致,包括列定义、约束、索引等,否则直接报错。EXCHANGE PARTITION 为什么能“秒级”导入导出数据因为 exchange partiti…...

STM32H7 SPI4与W25Q128 Flash通信实战:50MHz时钟配置避坑指南

STM32H7 SPI4与W25Q128 Flash通信实战:50MHz时钟配置避坑指南 在嵌入式开发中,高速SPI通信一直是工程师们面临的挑战之一。特别是当我们需要在STM32H7系列微控制器上实现50MHz时钟频率的SPI4接口与W25Q128 Flash通信时,各种意想不到的问题往往…...

Python实现GCJ-02与CGCS2000坐标转换的GUI工具开发

1. 为什么需要坐标转换工具 第一次接触地图开发的朋友可能会疑惑:为什么坐标还需要转换?这得从国内地图服务的特殊性说起。国内主流地图服务如高德、腾讯地图使用的GCJ-02坐标系(俗称火星坐标系),与全球通用的WGS84坐标…...

.NET 新特性概览与相关文章索引竿

从 UI 工程师到 AI 应用架构者 13 年前,我的工作是让按钮在 IE6 上对齐; 13 年后,我用 fetch-event-source 订阅大模型的“思维流”,用 OCR 解锁图片中的文字——前端,正在成为 AI 产品的第一道体验防线。 最近&#x…...

作者介绍Java高级工程师

作者介绍Java高级工程师 廖万忠 编程比赛成绩 2023年CSDN基础用户1million Java开发者用户30万332个团长比赛成绩 102 rank美国创业公司 HackerRank 项目组 Java工程师 2022年 accepted深圳腾讯公司 腾讯云开发者社区 2022年年度进取作者 coderlwz 证书北京大学2010级计算机优秀…...

终极ARC-AGI测试功能扩展指南:从零开始自定义AI推理任务

终极ARC-AGI测试功能扩展指南:从零开始自定义AI推理任务 【免费下载链接】ARC-AGI The Abstraction and Reasoning Corpus 项目地址: https://gitcode.com/GitHub_Trending/ar/ARC-AGI 欢迎来到ARC-AGI(Abstraction and Reasoning Corpus for Art…...

终极指南:Ant Media Server视频转码技术与FFmpeg集成优化方案

终极指南:Ant Media Server视频转码技术与FFmpeg集成优化方案 【免费下载链接】Ant-Media-Server Ant Media Server — Ultra-low latency streaming engine with WebRTC (~0.5s), SRT, RTMP, HLS, CMAF, adaptive bitrate, transcoding & scaling 项目地址: …...

终极指南:如何用MixItUp实现动态内容的无缝插入与移除操作

终极指南:如何用MixItUp实现动态内容的无缝插入与移除操作 【免费下载链接】mixitup A high-performance, dependency-free library for animated filtering, sorting, insertion, removal and more 项目地址: https://gitcode.com/gh_mirrors/mi/mixitup Mi…...

如何高效参与PointNet_Pointnet2_pytorch开源项目:完整贡献指南

如何高效参与PointNet_Pointnet2_pytorch开源项目:完整贡献指南 【免费下载链接】Pointnet_Pointnet2_pytorch PointNet and PointNet implemented by pytorch (pure python) and on ModelNet, ShapeNet and S3DIS. 项目地址: https://gitcode.com/gh_mirrors/po/…...

阿姆智创15.6寸嵌入式工控一体机,赋能机器视觉与产线数字化生产

在工业自动化与工厂数字化深度融合的时代,嵌入式工控一体机已成为连接设备、数据与人机交互的核心硬件载体。阿姆智创15.6寸嵌入式工控一体机,凭借稳定可靠的工业级性能、丰富齐全的系统接口、紧凑灵活的嵌入式设计,适配机器视觉设备与MES/ES…...

超级千问语音设计世界应用案例:快速生成短视频配音与游戏角色语音

超级千问语音设计世界应用案例:快速生成短视频配音与游戏角色语音 1. 引言:当语音合成遇上像素冒险 在内容创作领域,声音设计往往是最容易被忽视却又至关重要的环节。无论是短视频创作者需要快速生成旁白,还是独立游戏开发者需要…...

掌握msdfgen形状描述语法:从基础几何到复杂路径的完整指南

掌握msdfgen形状描述语法:从基础几何到复杂路径的完整指南 【免费下载链接】msdfgen Multi-channel signed distance field generator 项目地址: https://gitcode.com/gh_mirrors/ms/msdfgen msdfgen是一款强大的多通道有向距离场生成工具,能够将…...

终极指南:Ant Media Server性能基准测试 - 不同硬件配置下的低延迟流媒体表现对比

终极指南:Ant Media Server性能基准测试 - 不同硬件配置下的低延迟流媒体表现对比 【免费下载链接】Ant-Media-Server Ant Media Server — Ultra-low latency streaming engine with WebRTC (~0.5s), SRT, RTMP, HLS, CMAF, adaptive bitrate, transcoding & s…...

C#批量生成带Logo的二维码?我写了个小工具解放双手(Free Spire.Barcode实战)

C#实战:批量生成带Logo的二维码自动化工具开发指南 每次需要为上百名员工生成工牌二维码时,手动操作不仅耗时还容易出错。作为技术负责人,我花了三个周末终于开发出一套稳定高效的解决方案。这套基于Free Spire.Barcode的自动化工具&#xff…...

Vue3 响应式系统是如何实现依赖收集的?通俗易懂的 Proxy 机制解析

Vue3响应式核心用Proxy替代Object.defineProperty,通过get/set拦截实现按需依赖收集与触发;读取时track记录effect,修改时trigger通知更新。Vue3 的响应式核心靠 Proxy 实现依赖收集,它不像 Vue2 那样遍历所有属性去 defineProper…...

九,附录 B:响应周期公式

九,附录 B:响应周期公式九,附录 B:响应周期公式九,附录 B:响应周期公式 A2B_RESPCYCS 寄存器用于设置从控制帧(SCF)开始到最后一个从节点用响应帧(SRF)进行响…...

深入解析 Chromium 中的 Mojo IPC 消息机制及其实现

1. Mojo IPC 消息机制概述 Chromium 浏览器采用多进程架构设计,渲染进程(Renderer Process)和浏览器主进程(Browser Process)之间需要高效可靠的通信机制。Mojo 作为 Chromium 的进程间通信(IPC&#xff09…...

【2026 】大模型选型与 API 接入全指南:主流模型技术解析与实战对比

文章目录2026 大模型选型与 API 接入全指南:主流模型技术解析与实战对比一、引言二、2026 主流大模型全景2.1 闭源旗舰模型2.2 开源 / 可私有化模型三、能力维度横评四、API 接入方式全景4.1 主要接入渠道对比4.2 统一接口标准五、定价结构与成本估算5.1 Token 成本…...

八,附录 A:其他发现流程示例

八,附录 A:其他发现流程示例八,附录 A:其他发现流程示例8.1 修改后的发现流程8.2 优化后的发现流程8.3 高级发现流程八,附录 A:其他发现流程示例 以下部分提供了关于修改后的、优化后的和高级的发现流程的…...

NR随机接入之MSG3:从信令解析到资源调度的关键一步

1. MSG3在NR随机接入中的核心作用 当你用手机刷视频时,有没有想过这个简单的动作背后,其实经历了一场精密的"握手仪式"?MSG3就是这个仪式中最关键的那句"自我介绍"。作为5G NR随机接入流程的第三步骤,它承担着…...