1.5 KiB
去除无用代码
通用方案 Mach—O
__DATA , __objc_selrefs 标记方法被调用信息
otools -v -s _DATA _objc_selrefs Mach-O
linkmap - selfrefs = 无用方法
问题:不准(OC 语言,动态性)
clang plugin
重载 RecursiveASTVistor::visitDecl RecursiveASTVistor::visitStmt
上线前,通过静态方式去查找。不安全、不全面
运行时查找
Code Coverage clang -fprofile-instr-generate -fcoverafe-mapping a.m -o a swiftc -profile-generate -peofile-coverage-mapping a.swift
缺点:难以定制
Fuzzing 方案
Sanitizee Coverage
缺点: 编译慢、且无法进一步定制,包体积负向影响
自定义 llvm Pass
针对 LLVM IR 进行处理。
低级别编程语言,类似 RISC 指令集。和高级语言对应,LLVM 利用一些列 Pass 对 IR 进行优化。
LLVM 的优化是由 Pass 完成的,每个 Pass 完成特定的优化 自己开发 Pass 是独立的,不会影响 LLVM 的结构 Pass 之间可以有关联,也可分租
LLVM 有c/c++ 接口,还可以用 c/Swift 编写 Pass
c 接口较稳定,C++ 接口更新较新
LLVM 内置 Pass memcpyopt: memset 指令替换 memcpy always_inline: 总是内联用 alwaysinline 修饰的函数 dce:死代码消除 loop_deletion:删除未使用的循环
Pass 生成:
静态:在 LLVM 工程中设置 CMake,重新构建 opt
动态:opt 用 -load-pass-plugin 选项加载
怎么写 Pass? 对 IR 分析,继承 AnalysisInfoMixin 对 IR 转换,继承 PassInfoMixin