Utility pass是一些功能性的实用程序,既不属于Analysis pass,也不属于Transform pass。例如,extract-blocks pass将basic block从模块中提取出来供bugpoint使用,这个utility pass既不属于Analysis pass,也不属于Transform pass。参考文献[1]中列出了LLVM提供的所有pass。当调
bugpoint:自动案例测试减速器 llvm-extract:从 LLVM 字节代码文件中解压出一个函数 llvm-bcanalyzer:字节代码分析器 (分析二进制编码本身,而不是它代表的程序) FileCheck:灵活的文件验证器,广泛的被测试工具利用 tblgen:目标描述阅读器和生成器 lit:LLVM 集成测试器,用于运行测试 七、参考 LLVM TheLLVMCompiler Infr...
// 在解密函数中创建基本块bb6 和 bb14。 BasicBlock* bb6 = BasicBlock::Create(Ctx, "bb6", DecodeFunc); BasicBlock* bb14 = BasicBlock::Create(Ctx, "bb14", DecodeFunc); // 创建条件跳转指令,根据var5的结果跳转的bb6 或 bb14 Builder2->CreateCo...
每个部分都是一个基本块(BasicBlock)。 代码行覆盖率可以通过基本块(BasicBlock-Level)级别的代码插桩实现。 3、边界(Edge-Level) 边界(Edge)的概念比较难理解,我们仍然以上面的代码为例进行说明。 上面的代码包含3个基本块(BasicBlock):A、B、C。 即使代码行覆盖测试报告显示A、B、C三块都被执行过,我们仍然无...
llvm-extract - 从一个 LLVM 的模块里提取一个函数。 llvm-bcanalyzer - LLVM 字节码分析器。 开发工具 FileCheck - 灵活的模式匹配文件验证器。 tblgen - C++ 代码生成器。 lit - LLVM 集成测试器。 llvm-build - LLVM 构建工程时需要的工具。
本质上,上面提到的各类场景,都可以通过对代码进行基本块(BasicBlock-Level)级别插桩的方式解决。 为了方便读者能够继续将本文全部阅读下去,我们先看看一个给微信SDK插桩的实际效果。 基本块(BasicBlock-Level)的概念会在下一章节进行讲解 1、微信SDK 微信SDK(OpenSDK1.8.7.1)[1]提供了3个公开的头文件,其中WXApi.h...
Function *ExtractCodeRegion(ArrayRef<BasicBlock*> code); 1. // 是否符合条件 1. bool isEligible(ArrayRef<BasicBlock*> code); 1. private: 1. // 是否定义在区块里,当指定的值在被提取的区块里定义的时候返回true 1. bool definedInRegion(Value *V); ...
Function* llvm::ExtractLoop(DominatorTree &DT, Loop *L,boolAggregateArgs) { returnCodeExtractor(&DT, AggregateArgs).ExtractCodeRegion(L->getBlocks()); } //提取一个基础块到一个有标记的新函数里 Function* llvm::ExtractBasicBlock(ArrayRef<BasicBlock*> BBs,boolAggregateArgs){ ...
默认会按照 inline 的 path-sensitive 分析,构建 CallGraph,从顶层 caller 按照调用的关系来分析,具体是使用的 WorkList 算法,从 EntryBlock 开始一步步的模拟,这个过程叫做 intra-procedural analysis(IPA)。这个模拟过程还需要对内存进行模拟,clang static analyzer 的内存模型是基于《A Memory Model for Static ...
本pass被设计为运行在pipeline的靠后部分,即在其他向量化机会充分使用之后。所以这里假设的是:在新vector load之后,我们需要将该load的vector中的元素分别extract(提取),以此对每个元素分别进行处理。 对cpu而言,此transformation通常没什么收益,因为在大多数架构中提取vector register(向量寄存器)中元素的开销较大。因而更...