LLVM 词汇表

注意

此文档尚在编写中!

定义

A

ADCE

积极的死代码消除

AST

抽象语法树。

由于 Clang 的影响(主要是 C 和特别是 C++ 的解析和语义分析紧密结合),LLVM 社区中 AST 的典型工作定义大致为“编译器对输入程序的第一个完整的符号(而不是文本)表示”。因此,“AST”可能是一个更通用的图,而不是“树”(考虑典型“链表节点”类型的符号表示)。此工作定义更接近某些作者所说的“带注释的抽象语法树”。

请查阅您喜欢的编译器书籍或搜索引擎以获取更多详细信息。

B

BB 矢量化

基本块矢量化

BDCE

基于位的死代码消除。某些按位指令(移位、与、或等)会“杀死”某些输入位——也就是说,它们使得这些位可以为零或一,而不会影响程序的控制流或数据流。BDCE 过程会移除仅计算这些死位的指令。

BURS

自底向上重写系统——一种用于代码生成的指令选择方法。例如 BURG 工具。

C

CFI

此缩写有两个含义。或者:调用帧信息。用于 DWARF 调试信息和 C++ 解卷绕信息中,以显示函数序言如何布局堆栈帧。

或者:控制流完整性。用于防止各种恶意软件攻击重定向程序执行流(控制流)的计算机安全技术的总称。

CIE

通用信息条目。一种用于减小 FDE 大小的 CFI。编译器会创建一个包含所有 FDE 共有信息的 CIE。然后每个 FDE 都指向其 CIE。

CSE

公共子表达式消除。一种消除公共子表达式计算的优化。例如 (a+b)*(a+b) 有两个相同的子表达式:(a+b)。此优化将仅执行一次加法,然后执行乘法(但前提是计算上是正确/安全的)。

D

DAG

有向无环图

派生指针

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

DSA

数据结构分析

DSE

死存储消除

E

ento

此命名空间包含Clang 静态分析器。它是昆虫学的缩写。

“昆虫学是对昆虫进行科学研究。”

过去,此命名空间不仅包含名称GR(即图可达性),还包含entoSA

F

FCA

一等聚合体

FDE

帧描述条目。一种用于描述一个函数的堆栈帧的 CFI。

G

GC

垃圾回收。使用可达性分析而不是显式内存管理来回收未使用的内存的做法。

GEP

GetElementPtr。一种 LLVM IR 指令,用于获取聚合数据结构的子元素的地址。在此处详细介绍了它。

GVN

全局值编号。GVN 是一种将函数计算的值划分为同余类的过程。落在同一同余类中的值保证在程序的每次执行中都相同。在这方面,同余是编译时对运行时值等价性的近似。

H

在垃圾回收中,使用可达性分析管理的内存区域。

I

ICE

内部编译器错误。此缩写用于描述 LLVM 或 Clang 在编译源代码时发生的错误。例如,如果有效的 C++ 源程序在编译时触发 Clang 中的断言,则可以将其称为“ICE”。

ICF

相同代码折叠

ICP

间接调用提升

IPA

过程间分析。指在过程、函数或编译单元(模块)之间发生的各种代码分析。

IPO

过程间优化。指在过程、函数或编译单元(模块)之间发生的各种代码优化。

ISel

指令选择

L

LCSSA

循环封闭静态单赋值形式

LGTM

“看起来不错”。在审查线程中,这表示审阅者认为该补丁可以提交。

LICM

循环不变代码移动

LSDA

特定于语言的数据区域。C++“零成本”解卷绕构建在通用解卷绕机制之上。当解卷绕器遍历每个帧时,它会调用“个性”函数来执行特定于语言的分析。每个函数的 FDE 都指向一个可选的 LSDA,该 LSDA 会传递给个性函数。对于 C++,LSDA 包含有关该函数中捕获语句的类型和位置的信息。

Load-VN

加载值编号

LTO

链接时优化

M

MC

机器代码

N

NFC

“无功能更改”。在提交消息中使用,表示补丁是纯重构/清理。通常用于第一行,以便在不打开实际提交电子邮件的情况下可见。

O

对象指针

指向对象的指针,垃圾回收器能够跟踪对象中包含的引用。此术语与派生指针相对。

P

PGO

配置文件引导优化

PR

问题报告。在LLVM Bug Tracking System上提交的 Bug。

PRE

部分冗余消除

R

RAUW

用所有用法替换。函数User::replaceUsesOfWith()Value::replaceAllUsesWith()Constant::replaceUsesOfWithOnConstant()通过遍历其 def/use 链并修复所有指针以指向新值来实现用一个 Value 替换另一个 Value。另请参见def/use 链

重结合

重新排列关联表达式以促进更好的冗余消除和其他优化。例如,将(A+B-A)更改为(B+A-A),允许将其优化为(B+0),然后(B)

RFC

征求意见。发送到项目邮件列表的电子邮件,以征求对拟议更改的反馈。

在垃圾回收中,位于外部的指针变量,收集器从该变量开始其可达性分析。在代码生成上下文中,“根”几乎总是指“堆栈根”——正在执行的函数中的局部变量或临时变量。

RPO

逆后序遍历

RTTI

运行时类型信息

S

安全点

在垃圾回收中,有必要识别堆栈根,以便可达性分析可以继续进行。为每个指令提供此信息可能不可行,因此,信息仅在指定的安全点计算。对于复制收集器,派生指针不得跨安全点保留,并且必须从堆栈根重新加载对象指针

SDISel

选择 DAG 指令选择。

SCC

强连通分量

SCCP

稀疏条件常量传播

SLP

超字级并行,与基本块矢量化相同。

Splat

Splat 指的是具有相同标量元素的向量。

该术语基于 PowerPC Altivec 指令,这些指令在硬件中提供了此功能。例如,“vsplth”和相应的软件内联函数“vec_splat()”。此操作的其他硬件名称示例包括“复制”(ARM)和“广播”(x86)。

SRoA

聚合的标量替换

SSA

静态单赋值

堆栈映射

在垃圾回收中,由代码生成器发出的元数据,用于识别正在执行的函数的堆栈帧中的

T

TBAA

基于类型的别名分析

W

WPD

全程序去虚拟化