LLVM 词汇表¶
注意
本文档仍在完善中!
定义¶
A¶
- ADCE
激进的死代码消除
- AST
抽象语法树。
由于 Clang 的影响(主要是因为对于 C 和特别是 C++ 来说,解析和语义分析是如此紧密地交织在一起),LLVM 社区中 AST 的典型工作定义大致是“编译器对输入程序的第一个完整的符号(相对于文本)表示”。因此,“AST”可能是一个更通用的图,而不是“树”(考虑典型“链表节点”类型的符号表示)。这种工作定义更接近一些作者所称的“带注释的抽象语法树”。
查阅您喜欢的编译器书籍或搜索引擎以获取更多详细信息。
B¶
- BB 向量化
基本块向量化
- BDCE
位跟踪死代码消除。一些按位指令(移位、与、或等)“杀死”它们的某些输入位——也就是说,它们使这些位可以是零或一,而不会影响程序的控制或数据流。BDCE 过程会删除仅计算这些死位的指令。
- BURS
自底向上重写系统——一种用于代码生成的指令选择方法。一个例子是 BURG 工具。
C¶
- CFI
此缩写有两个含义。其一:调用帧信息(Call Frame Information)。用于 DWARF 调试信息和 C++ 展开信息中,以显示函数序言如何布局堆栈帧。
其二:控制流完整性(Control Flow Integrity)。一个计算机安全技术的通用术语,用于防止各种恶意软件攻击重定向程序的执行流程(控制流)。
- CIE
公共信息条目(Common Information Entry)。一种 CFI,用于减小 FDE 的大小。编译器创建一个 CIE,其中包含所有 FDE 共有的信息。然后,每个 FDE 都指向其 CIE。
- CSE
公共子表达式消除(Common Subexpression Elimination)。一种优化,用于删除公共子表达式的计算。例如,
(a+b)*(a+b)
有两个相同的子表达式:(a+b)
。这种优化将仅执行一次加法,然后再执行乘法(但前提是它在计算上是正确/安全的)。
D¶
- DAG
有向无环图
E¶
- ento
此命名空间包含 Clang 静态分析器。它是 entomology(昆虫学)的缩写。
“昆虫学是对昆虫的科学研究。”
过去,此命名空间不仅有名称 GR (又名图可达性),还有 entoSA。
F¶
- FCA
一等聚合体
- FDE
帧描述条目(Frame Description Entry)。一种 CFI,用于描述一个函数的堆栈帧。
G¶
- GC
垃圾回收(Garbage Collection)。使用可达性分析而不是显式内存管理来回收未使用的内存的做法。
- GEP
GetElementPtr
。一种 LLVM IR 指令,用于获取聚合数据结构的子元素的地址。详细文档请参阅此处。- GVN
全局值编号(Global Value Numbering)。GVN 是一种过程,它将函数计算的值划分为同余类。最终属于同一同余类的值保证在程序的每次执行中都是相同的。在这方面,同余性是对运行时值等价性的编译时近似。
H¶
- 堆
在垃圾回收中,使用可达性分析管理的内存区域。
I¶
- ICE
内部编译器错误(Internal Compiler Error)。此缩写用于描述在 LLVM 或 Clang 编译源代码时发生的错误。例如,如果一个有效的 C++ 源代码程序在编译时触发 Clang 中的断言,则可以将其称为“ICE”。
- ICF
相同代码折叠
- ICP
间接调用提升
- IPA
过程间分析(Inter-Procedural Analysis)。指发生在过程、函数或编译单元(模块)之间的任何类型的代码分析。
- IPO
过程间优化(Inter-Procedural Optimization)。指发生在过程、函数或编译单元(模块)之间的任何类型的代码优化。
- ISel
指令选择
L¶
- LCSSA
循环闭合静态单赋值形式
- LGTM
“看起来不错”。在审查线程中,这表示审查者认为该补丁可以提交。
- LICM
循环不变代码移动
- LSDA
语言特定数据区域(Language Specific Data Area)。C++ “零成本”展开构建在通用展开机制之上。当展开器遍历每个帧时,它会调用一个“个性”函数来执行特定于语言的分析。每个函数的 FDE 指向一个可选的 LSDA,该 LSDA 被传递给个性函数。对于 C++,LSDA 包含有关该函数中 catch 语句的类型和位置的信息。
- Load-VN
加载值编号
- LTO
链接时优化
M¶
- MC
机器码
N¶
- NFC
“无功能性更改”。在提交消息中使用,以指示补丁是纯粹的重构/清理。通常在第一行使用,因此无需打开实际的提交电子邮件即可看到。
O¶
- 对象指针
指向对象的指针,垃圾回收器能够跟踪对象内包含的引用。此术语与派生指针相对。
P¶
- PGO
配置文件引导优化
- PR
问题报告(Problem report)。在 LLVM Bug 跟踪系统上提交的错误。
- PRE
部分冗余消除
R¶
RAUW
替换所有用法为(Replace All Uses With)。函数
User::replaceUsesOfWith()
,Value::replaceAllUsesWith()
, 和Constant::replaceUsesOfWithOnConstant()
通过迭代其 def/use 链并修复所有指向新值的指针,来实现用一个 Value 替换另一个 Value。另请参阅 def/use 链。
- 重关联
重新排列关联表达式以促进更好的冗余消除和其他优化。例如,将
(A+B-A)
更改为(B+A-A)
,使其可以优化为(B+0)
,然后优化为(B)
。- RFC
征求意见(Request for Comment)。发送到项目邮件列表的电子邮件,以征求对拟议更改的反馈。
- 根
在垃圾回收中,一个指针变量,位于 堆之外,回收器从该变量开始其可达性分析。在代码生成的上下文中,“根”几乎总是指“堆栈根”——执行函数中的局部变量或临时变量。
- RPO
反向后序
- RTTI
运行时类型信息
S¶
- 安全点
在垃圾回收中,有必要识别 堆栈根,以便可以进行可达性分析。为每个指令提供此信息可能不可行,因此信息仅在指定的安全点计算。对于复制回收器,派生指针不得跨安全点保留,对象指针必须从堆栈根重新加载。
- SDISel
选择 DAG 指令选择。
- SCC
强连通分量
- SCCP
稀疏条件常量传播
- SLP
超字级并行(Superword-Level Parallelism),与 基本块向量化相同。
- Splat
Splat 指的是由相同标量元素组成的向量。
该术语基于 PowerPC Altivec 指令,这些指令在硬件中提供了此功能。例如,“vsplth”和相应的软件内在函数“vec_splat()”。此操作的其他硬件名称示例包括“duplicate”(ARM)和“broadcast”(x86)。
- SRoA
聚合体的标量替换
- SSA
静态单赋值
- 堆栈映射
在垃圾回收中,代码生成器发出的元数据,用于标识执行函数堆栈帧中的 根。
T¶
- TBAA
基于类型的别名分析
W¶
- WPD
全程序去虚化