mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-25 12:27:15 +00:00
70 lines
1.5 KiB
Markdown
70 lines
1.5 KiB
Markdown
# 去除无用代码
|
||
|
||
通用方案
|
||
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
|
||
|
||
|
||
|