news 2026/7/19 23:11:29

Whole Program LLVM核心代码解析:compilers.py与extraction.py工作原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Whole Program LLVM核心代码解析:compilers.py与extraction.py工作原理

Whole Program LLVM核心代码解析:compilers.py与extraction.py工作原理

【免费下载链接】whole-program-llvmA wrapper script to build whole-program LLVM bitcode files项目地址: https://gitcode.com/gh_mirrors/wh/whole-program-llvm

Whole Program LLVM是一个用于构建全程序LLVM位码文件的包装脚本工具,通过本文你将深入了解其核心代码compilers.py与extraction.py的工作原理,掌握LLVM位码生成与提取的关键技术。

一、compilers.py:LLVM位码生成的核心驱动

compilers.py是Whole Program LLVM实现位码生成的核心模块,主要负责将源代码编译为LLVM位码文件并附加到位目标文件中。

1.1 编译器构建器设计

该模块定义了两种主要的编译器构建器:ClangBuilderDragoneggBuilder,分别对应不同的LLVM编译方式:

class ClangBuilder(BuilderBase): def getBitcodeCompiler(self): cc = self.getCompiler() return cc + ['-emit-llvm'] + self.getBitcodeGenerationFlags() class DragoneggBuilder(BuilderBase): def getBitcodeCompiler(self): pth = os.getenv('LLVM_DRAGONEGG_PLUGIN') cc = self.getCompiler() cmd = cc + ['-B', asDir, f'-fplugin={pth}', '-fplugin-arg-dragonegg-emit-ir'] return cmd

ClangBuilder直接使用Clang编译器的-emit-llvm选项生成位码,而DragoneggBuilder则通过GCC插件Dragonegg实现位码生成。

1.2 位码生成与附加流程

位码生成的核心流程在buildAndAttachBitcode函数中实现,主要包括:

  1. 确定输入文件和输出文件
  2. 调用buildBitcodeFile生成位码文件
  3. 通过attachBitcodePathToObject将位码路径附加到目标文件
def buildAndAttachBitcode(builder, af): if len(af.inputFiles) == 1 and af.isCompileOnly: srcFile = af.inputFiles[0] (objFile, bcFile) = af.getArtifactNames(srcFile, hidden) buildBitcodeFile(builder, srcFile, bcFile) attachBitcodePathToObject(bcFile, objFile) else: # 处理多文件编译情况 ...

位码附加通过objcopyld命令将位码路径信息写入目标文件的特定节(ELF的.llvm_bc节或Mach-O的__WLLVM段)中。

二、extraction.py:位码提取的实现机制

extraction.py提供了从编译产物中提取LLVM位码的功能,是Whole Program LLVM工具链的重要组成部分。

2.1 位码路径提取

根据不同操作系统,位码路径提取实现有所不同:

  • Linux系统:通过objdump命令解析ELF文件,获取.llvm_bc节的大小和偏移量,然后读取该节内容得到位码路径
  • Darwin系统:使用otool命令提取__WLLVM段的内容,经过十六进制解码得到位码路径
def extract_section_linux(inputFile): val = getSectionSizeAndOffset(elfSectionName, inputFile) if val is None: return [] (sectionSize, sectionOffset) = val content = getSectionContent(sectionSize, sectionOffset, inputFile) return content.split('\n')

2.2 位码文件处理

提取到位码路径后,extraction.py提供了多种位码文件处理方式:

  1. 链接为单个位码模块:使用llvm-link将多个位码文件链接为一个完整模块
  2. 创建位码归档:使用llvm-ar将多个位码文件创建为归档文件
  3. 生成清单文件:记录所有提取到的位码文件路径
def linkFiles(pArgs, fileNames): linkCmd = [pArgs.llvmLinker] linkCmd.append(f'-o={pArgs.outputFile}') linkCmd.extend(fileNames) exitCode = executeLinker(linkCmd) return exitCode

2.3 归档文件处理

对于静态库等归档文件,extraction.py提供了专门的处理逻辑:

  1. 提取归档中的目标文件
  2. 从每个目标文件中提取位码路径
  3. 整合所有位码文件生成位码归档或模块

三、两个模块的协同工作流程

compilers.py与extraction.py通过位码路径信息实现协同工作,形成完整的LLVM位码处理流程:

  1. 编译阶段:compilers.py在编译时生成位码文件,并将位码路径附加到目标文件中
  2. 提取阶段:extraction.py从目标文件或归档中提取位码路径,找到并处理位码文件

这种设计使得Whole Program LLVM能够无缝集成到现有的构建流程中,同时提供灵活的位码提取功能。

四、核心功能配置与扩展

Whole Program LLVM提供了丰富的环境变量配置,可灵活定制位码生成与提取过程:

  • LLVM_COMPILER:指定编译器类型(clang或dragonegg)
  • LLVM_COMPILER_PATH:指定LLVM工具路径
  • LLVM_BITCODE_GENERATION_FLAGS:添加额外的位码生成标志
  • WLLVM_BC_STORE:指定位码文件存储目录

通过这些配置,开发者可以根据项目需求定制LLVM位码的生成与提取策略,实现全程序分析等高级应用。

五、总结

compilers.py和extraction.py作为Whole Program LLVM的核心模块,分别实现了LLVM位码的生成与提取功能。compilers.py通过封装Clang或GCC+Dragonegg编译器,在保持原有构建流程不变的情况下生成位码文件;extraction.py则提供了从编译产物中提取位码的能力,支持多种输出格式。两者协同工作,为全程序分析、静态分析等应用提供了强大的LLVM位码处理能力。

掌握这两个模块的工作原理,不仅有助于更好地使用Whole Program LLVM工具,也为理解LLVM位码生成与处理的底层机制提供了深入视角。无论是进行编译器开发还是程序分析,Whole Program LLVM都提供了一个灵活而强大的位码处理平台。

【免费下载链接】whole-program-llvmA wrapper script to build whole-program LLVM bitcode files项目地址: https://gitcode.com/gh_mirrors/wh/whole-program-llvm

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/19 23:02:05

STM32 CubeMX与Keil实现RS485通信的工业应用指南

1. STM32 CubeMX与Keil环境下的RS485通信实践指南在工业控制和自动化领域,RS485通信因其抗干扰能力强、传输距离远等优势被广泛应用。最近我在一个工业传感器网络项目中,需要使用STM32F103系列芯片通过RS485总线与多个设备通信。经过反复调试和优化&…

作者头像 李华
网站建设 2026/7/19 23:00:04

【无人机通信】基于卡尔曼滤波角度追踪的多普勒感知莱斯衰落信道,自适应MVDR波束成形与人工噪声的无人机链路运动感知物理层安全技术附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、算法改进、程序设计科研仿真。🍎完整代码获取 定制创新 论文复现私信🍊个人信条:做科研,博学之、审问之、慎思之、明辨之、…

作者头像 李华
网站建设 2026/7/19 22:59:17

2026桌面风扇怎么选不踩坑:从百元到三百元三个价位段全解析

2026桌面风扇怎么选不踩坑:从百元到三百元三个价位段全解析 又到了靠风扇续命的季节。但市面上产品太多,从几十到几百的都有,参数表看得人眼花缭乱。我换过好几台,踩过不少坑——有的用几个月摇头就卡了,有的电池鼓包把…

作者头像 李华
网站建设 2026/7/19 22:53:43

三协议兼容的QQ机器人开发框架:LuckyLilliaBot完全指南

三协议兼容的QQ机器人开发框架:LuckyLilliaBot完全指南 【免费下载链接】LuckyLilliaBot 支持 OneBot 11、Satori 和 Milky 协议 项目地址: https://gitcode.com/gh_mirrors/li/LuckyLilliaBot 你是否曾为QQ机器人开发中的协议兼容性而烦恼?是否在…

作者头像 李华
网站建设 2026/7/19 22:49:07

TI C2000 HRCAP高分辨率捕获模块:从原理到纳秒级时间测量实战

1. 项目概述:为什么我们需要HRCAP?在电机控制、数字电源或者超声波测距这类对时间精度有苛刻要求的嵌入式项目里,我们常常需要测量一个脉冲的宽度、一个信号的周期,或者两个边沿之间的时间间隔。你可能会说,这不就是通…

作者头像 李华