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

有向无环图

派生指针

指向对象内部的指针,垃圾回收器无法使用该指针进行可达性分析。当派生指针处于活动状态时,相应的对象指针必须保留在根中,否则回收器可能会释放引用的对象。对于复制回收器,派生指针会带来额外的风险,它们可能在任何 安全点失效。此术语与 对象指针相对。

DSA

数据结构分析

DSE

死存储消除

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

全程序去虚化