当前位置: 首页 > 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语言中{}括起来的最小代码。 指令层级:单…...

nlp_structbert_sentence-similarity_chinese-large部署教程:阿里云PAI-EAS一键部署全流程

nlp_structbert_sentence-similarity_chinese-large部署教程:阿里云PAI-EAS一键部署全流程 1. 工具简介 nlp_structbert_sentence-similarity_chinese-large是一个专门用于中文句子语义相似度计算的强大工具。它基于阿里达摩院开源的StructBERT大规模预训练模型&a…...

RedisDesktopManager-Windows核心功能详解:数据库连接、键值管理与数据可视化

RedisDesktopManager-Windows核心功能详解:数据库连接、键值管理与数据可视化 【免费下载链接】RedisDesktopManager-Windows RedisDesktopManager Windows版本 项目地址: https://gitcode.com/gh_mirrors/re/RedisDesktopManager-Windows RedisDesktopManag…...

Komikku与追踪器集成:如何实现与MyAnimeList、AniList的自动同步

Komikku与追踪器集成:如何实现与MyAnimeList、AniList的自动同步 【免费下载链接】komikku Free and open source manga reader for Android 项目地址: https://gitcode.com/gh_mirrors/ko/komikku Komikku是一款免费开源的Android漫画阅读应用,支…...

FigmaCN技术解析:本地化方案如何实现设计效率优化

FigmaCN技术解析:本地化方案如何实现设计效率优化 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 中文设计师在使用Figma时,常因界面语言障碍导致操作效率降低30…...

Python AOT编译正式落地2026:3步完成插件下载、5分钟完成生产级安装(附官方校验码)

第一章:Python AOT编译正式落地2026:里程碑意义与核心价值2026年3月,CPython官方宣布Python 3.14版本原生支持AOT(Ahead-of-Time)编译模式,标志着Python首次在标准发行版中实现无需第三方运行时干预的静态可…...

Windows Cleaner:终极免费的Windows系统清理工具让C盘重获新生

Windows Cleaner:终极免费的Windows系统清理工具让C盘重获新生 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否经常面对C盘爆红的警告而束手无策…...

智能合约安全审计:awesome-game-security 中的安全漏洞与防护方案

智能合约安全审计:awesome-game-security 中的安全漏洞与防护方案 【免费下载链接】awesome-game-security awesome game security [Welcome to PR] 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-game-security 在游戏开发领域,智能合约…...

PINCE代码注入实战:.so文件注入完全指南

PINCE代码注入实战:.so文件注入完全指南 【免费下载链接】PINCE Reverse engineering tool for linux games 项目地址: https://gitcode.com/gh_mirrors/pi/PINCE PINCE是一款强大的Linux游戏逆向工程工具,专注于动态链接库注入技术,为…...

深入详解PHP中的自动加载机制

什么是自动加载? 当使用 new ClassName() 时,PHP自动帮你找到并包含对应的文件。 1 2 3 4 5 6 7 // 传统写法 require_once User.php; require_once Product.php; $user new User(); // 自动加载:无需手动包含 $user new User(); // PHP…...

FreeRTOS任务跑飞别慌!教你用PSP和uxTaskGetStackHighWaterMark锁定罪魁祸首

FreeRTOS任务跑飞排查实战:从PSP追踪到栈溢出的全链路分析 当你在深夜调试一个复杂的FreeRTOS项目时,突然发现某个任务毫无征兆地崩溃进入HardFault_Handler——这种经历对嵌入式开发者来说简直如同噩梦。与裸机环境不同,RTOS的多任务特性让问…...

基于ECMS的混合动力汽车Simulink模型:可用于能量管理研究且模型无误

基于ECMS搭建的混合动力汽车simulink模型 可用于能量管理研究 模型运行无误 联系赠送模型搭建参考文献一份,赠送nedc、udds等常用工况数据表,可自行更改工况进行模型开发ECMS算法这玩意儿在混动能量管理圈子里挺能打,最近刚用Simulink搭了个模…...

Le Git Graph 终极指南:GitHub提交图谱可视化工具快速上手

Le Git Graph 终极指南:GitHub提交图谱可视化工具快速上手 【免费下载链接】le-git-graph Browser extension to add git graph to GitHub website. 项目地址: https://gitcode.com/gh_mirrors/le/le-git-graph Le Git Graph 是一款功能强大的浏览器扩展&…...

【ComfyUI】Qwen-Image-Edit-F2P 在Unity数字人中的应用:驱动3D角色面部表情生成

ComfyUI Qwen-Image-Edit-F2P 在Unity数字人中的应用:驱动3D角色面部表情生成 1. 引言:当AI绘画遇上3D表情动画 想象一下,你正在开发一款游戏或者制作一个虚拟偶像,角色需要做出成百上千种表情——开心的、悲伤的、惊讶的、愤怒…...

ARM架构和主要内核介绍-D

目录 概述 1 ARM架构的历史发展线 1.1 技术演进 1.2 关键阶段与技术里程碑 1.3 成功的核心:商业模式创新 2 Cortex-M内核 2.1 主要特性 2.2 系列通用核心优势 3 Cortex-R系列 3.1 内核介绍 3.2 核心技术特性 4 Cortex-A系列 4.1 主要特性 4.2 核心架构…...

Wan2.2-I2V-A14B快速上手:3步启动WebUI,5分钟生成首条AI视频

Wan2.2-I2V-A14B快速上手:3步启动WebUI,5分钟生成首条AI视频 1. 镜像介绍与环境准备 Wan2.2-I2V-A14B是一款强大的文生视频模型,能够根据文本描述生成高质量视频内容。这个私有部署镜像已经针对RTX 4090D 24GB显卡进行了深度优化&#xff0…...

三三复制小公排小程序开发指南

了解三三复制模式三三复制是一种常见的分销或团队裂变模式,通常用于社交电商或会员制营销。该模式通过用户邀请新用户加入并形成层级关系,实现快速推广。在小程序中实现该功能需要设计合理的用户关系和奖励机制。开发前的准备工作注册微信小程序开发者账…...

推三返一小程序(源码部署)

推三返一小程序源码部署指南环境准备确保已安装Node.js(建议版本14)、微信开发者工具、MySQL数据库(或云数据库)。 克隆或下载推三返一小程序源码至本地,检查package.json确认依赖完整性。后端配置修改server/config.j…...

Phi-4-mini-reasoning实战案例:在线考试系统实时解题反馈模块开发

Phi-4-mini-reasoning实战案例:在线考试系统实时解题反馈模块开发 1. 项目背景与需求 在线教育平台面临一个共同挑战:如何为考生提供即时、准确的解题反馈。传统方案依赖人工批改或简单规则引擎,难以应对复杂数学题和编程题的自动评分需求。…...

FPGA新手必看:用Vivado在EGo1开发板上点亮七段数码管(附完整代码与约束文件)

FPGA实战:从零实现EGo1开发板的七段数码管驱动 第一次接触FPGA开发的朋友,往往会被硬件描述语言和开发工具链的复杂性吓退。但当你真正在开发板上点亮第一个LED或数码管时,那种成就感是无与伦比的。本文将带你用Vivado工具链,在EG…...

GTE-Pro语义引擎效果展示:跨年度文档语义关联(2023制度→2024执行细则)

GTE-Pro语义引擎效果展示:跨年度文档语义关联(2023制度→2024执行细则) 今天想和大家分享一个特别有意思的案例,也是我们团队最近用GTE-Pro语义引擎解决的一个实际问题。 想象一下这个场景:你是一家公司的员工&#…...

告别命令行:在ArkTS应用里优雅地读写OpenHarmony系统参数(systemParameterEnhance API详解)

告别命令行:在ArkTS应用里优雅地读写OpenHarmony系统参数 当我们需要在OpenHarmony应用中动态获取设备信息或调整系统配置时,传统的做法是调用命令行工具或者编写Native代码。但现在,ohos.systemParameterEnhance模块为ArkTS开发者提供了更优…...

基于Wi-Fi无损传输与I2S直驱:ESP32+PCM5102高保真音频播放方案详解

1. 为什么需要Wi-Fi无损音频方案 如果你是个对音质有追求的发烧友,肯定对蓝牙音频的局限性深有体会。常见的AAC、SBC编码会带来明显的音质损失,即便是高码率的LDAC和aptX HD,本质上还是有损压缩。更让人头疼的是,在Windows系统上播…...

从付费软件到自主开发:我用AI和FFmpeg实现了一个录屏工具侨

我为什么会发出这个疑问呢?是因为我研究Web开发中的一个问题时,HTTP请求体在 Filter(过滤器)处被读取了之后,在 Controller(控制层)就读不到值了,使用 RequestBody 的时候。 无论是字…...

Golang实战gin-swagger:自动生成API文档

一、概述 1.1 什么是gin-swagger? gin-swagger是Swaggo生态下适配Gin框架的API文档生成工具,基于Swagger/OpenAPI规范,可通过解析Go代码中的注释,自动生成可视化API文档,并提供接口调试功能。其核心价值在于&#xff1…...

从水平框到旋转框:一文读懂Oriented R-CNN如何革新文字与遥感目标检测(ICCV2021论文精讲)

旋转目标检测的范式革新:Oriented R-CNN技术解析与实战启示 当无人机拍摄的遥感图像中出现密集排列的斜向建筑群,或是自然场景中任意角度的文字标识时,传统水平矩形框检测器立刻暴露出其固有局限——要么用大矩形框覆盖多个目标导致定位不准&…...

Golang实战gRPC与Protobuf:从入门到进阶

一、概述 1.1 gRPC是什么? gRPC是Google开源的高性能RPC(远程过程调用)框架,基于HTTP/2协议传输,采用Protobuf作为数据序列化协议。其核心优势包括:高效序列化:Protobuf序列化后数据体积小、解析…...

【.NET 9低代码开发终极指南】:20年微软生态专家亲授——零前端经验如何3天交付生产级业务应用?

第一章:.NET 9低代码开发全景认知与核心价值定位.NET 9 将低代码能力深度融入平台原生架构,不再依赖第三方插件或独立运行时,而是通过统一的组件模型、声明式 UI 编程范式与智能元数据驱动机制,实现“写少做多”的开发体验。其核心…...

2026开发网站用什么软件?建设网站步骤有哪些?

2026年,企业建立专业网站的需求正在逐渐增加。根据中国互联网络信息中心(CNNIC)的报告,我国中小企业网站数量已突破1800万,其中超过76.3%选择了SaaS建站模式。这个数据表明,现在的消费者越来越倾向于运用智…...

像素幻梦效果展示:生成支持透明通道的PNG像素图实操演示

像素幻梦效果展示:生成支持透明通道的PNG像素图实操演示 1. 像素幻梦创意工坊简介 Pixel Dream Workshop(像素幻梦创意工坊)是一款基于FLUX.1-dev扩散模型的下一代像素艺术生成工具。与传统AI绘图工具不同,它采用了明亮的16-bit…...