LLVM 詞彙表¶
注意
本文檔仍在撰寫中!
定義¶
A¶
- ADCE
積極式死碼消除 (Aggressive Dead Code Elimination)
- AST
抽象語法樹 (Abstract Syntax Tree)。
由於 Clang 的影響(主要是因為對於 C 和尤其是 C++ 而言,解析和語義分析是如此緊密地交織在一起),LLVM 社群中 AST 的典型工作定義大致是「編譯器對輸入程式碼的第一個完整的符號(而非文字)表示」。因此,「AST」可能是一個更通用的圖,而不是「樹」(考慮典型「鏈結串列節點」型別的符號表示)。這種工作定義更接近某些作者所稱的「帶註解的抽象語法樹」。
請查閱您最喜歡的編譯器書籍或搜尋引擎以獲取更多詳細資訊。
B¶
- BB 向量化
基本區塊向量化 (Basic-Block Vectorization)
- BDCE
位元追蹤死碼消除 (Bit-tracking dead code elimination)。一些位元運算指令(位移、AND、OR 等)會「消滅」它們的一些輸入位元——也就是說,它們使得這些位元可以是零或一,而不會影響程式的控制或資料流程。BDCE 傳遞會移除僅計算這些死位元的指令。
- BURS
由下而上重寫系統 (Bottom Up Rewriting System) — 一種用於程式碼產生的指令選擇方法。一個例子是 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
有向無環圖 (Directed Acyclic Graph)
E¶
- ento
此命名空間包含 Clang 靜態分析器。它是 entomology(昆蟲學)的縮寫。
「昆蟲學是對昆蟲的科學研究。」
過去,此命名空間不僅有 GR(又名 Graph Reachability)的名稱,還有 entoSA。
F¶
- FCA
一級聚合 (First Class Aggregate)
- FDE
框架描述條目 (Frame Description Entry)。一種 CFI,用於描述一個函數的堆疊框架。
G¶
- GC
垃圾回收 (Garbage Collection)。使用可達性分析而不是顯式記憶體管理來回收未使用的記憶體的實踐。
- GEP
GetElementPtr
。GetElementPtr
。LLVM IR 指令,用於取得聚合資料結構的子元素的位址。在此處有詳細的文件說明。- GVN
全域數值編號 (Global Value Numbering)。GVN 是一個將函數計算的值劃分為同餘類的傳遞。最終位於同一個同餘類中的值保證在程式的每次執行中都相同。在這方面,同餘是執行時期值等價性的編譯時期近似值。
H¶
- 堆積 (Heap)
在垃圾回收中,使用可達性分析管理的記憶體區域。
I¶
- ICE
內部編譯器錯誤 (Internal Compiler Error)。此縮寫用於描述在 LLVM 或 Clang 編譯原始碼時發生的錯誤。例如,如果一個有效的 C++ 原始碼程式在編譯時觸發 Clang 中的斷言,則可以將其稱為「ICE」。
- ICF
相同程式碼摺疊 (Identical Code Folding)
- ICP
間接呼叫提升 (Indirect Call Promotion)
- IPA
跨程序分析 (Inter-Procedural Analysis)。指的是在程序、函數或編譯單元(模組)之間發生的各種程式碼分析。
- IPO
跨程序最佳化 (Inter-Procedural Optimization)。指的是在程序、函數或編譯單元(模組)之間發生的各種程式碼最佳化。
- ISel
指令選擇 (Instruction Selection)
L¶
- LCSSA
迴圈封閉靜態單賦值形式 (Loop-Closed Static Single Assignment Form)
- LGTM
「看起來不錯 (Looks Good To Me)」。在審閱線程中,這表示審閱者認為此修補程式可以提交。
- LICM
迴圈不變程式碼外提 (Loop Invariant Code Motion)
- LSDA
語言特定資料區域 (Language Specific Data Area)。C++ 「零成本」解除堆疊建立在通用解除堆疊機制之上。當解除堆疊器遍歷每個框架時,它會呼叫一個「personality」函數來執行語言特定的分析。每個函數的 FDE 都指向一個可選的 LSDA,該 LSDA 會傳遞給 personality 函數。對於 C++,LSDA 包含有關該函數中 catch 語句的型別和位置的資訊。
- Load-VN
載入數值編號 (Load Value Numbering)
- LTO
連結時最佳化 (Link-Time Optimization)
M¶
- MC
機器碼 (Machine Code)
N¶
- NFC
「無功能性變更 (No functional change)」。在提交訊息中使用,表示修補程式是純粹的重構/清理。通常在第一行使用,因此無需開啟實際的提交電子郵件即可看到。
O¶
- 物件指標
指向物件的指標,使得垃圾收集器能夠追蹤物件內包含的引用。此術語與衍生指標相對使用。
P¶
- PGO
設定檔導向最佳化 (Profile-Guided Optimization)
- PR
問題報告 (Problem report)。在 LLVM 錯誤追蹤系統上提交的錯誤。
- PRE
部分冗餘消除 (Partial Redundancy Elimination)
R¶
RAUW
以...取代所有使用 (Replace All Uses With)。函數
User::replaceUsesOfWith()
、Value::replaceAllUsesWith()
和Constant::replaceUsesOfWithOnConstant()
透過迭代其 def/use 鏈並修復所有指向新值的指標,來實作以另一個值取代一個值。另請參閱 def/use 鏈。
- 重新關聯 (Reassociation)
重新排列關聯表達式以促進更好的冗餘消除和其他最佳化。例如,將
(A+B-A)
變更為(B+A-A)
,使其可以最佳化為(B+0)
然後是(B)
。- RFC
意見徵求 (Request for Comment)。發送到專案郵件列表的電子郵件,以便徵求對擬議變更的回饋。
- 根 (Root)
在垃圾回收中,位於堆積之外的指標變數,收集器從該變數開始其可達性分析。在程式碼產生的上下文中,「根」幾乎總是指的是「堆疊根」——執行函數中的區域或暫時變數。
- RPO
反向後序 (Reverse postorder)
- RTTI
執行時期型別資訊 (Run-time Type Information)
S¶
- 安全點 (Safe Point)
在垃圾回收中,有必要識別堆疊根,以便可以進行可達性分析。為每個指令提供此資訊可能不可行,因此資訊僅在指定的安全點計算。使用複製收集器,衍生指標不得跨安全點保留,並且必須從堆疊根重新載入物件指標。
- SDISel
選擇 DAG 指令選擇 (Selection DAG Instruction Selection)。
- SCC
強連通元件 (Strongly Connected Component)
- SCCP
稀疏條件常數傳播 (Sparse Conditional Constant Propagation)
- SLP
超字級並行 (Superword-Level Parallelism),與基本區塊向量化相同。
- Splat
Splat 指的是由相同純量元素組成的向量。
此術語基於 PowerPC Altivec 指令,該指令在硬體中提供了此功能。例如,「vsplth」和相應的軟體內建函數「vec_splat()」。此動作的其他硬體名稱範例包括「duplicate」(ARM)和「broadcast」(x86)。
- SRoA
聚合的純量取代 (Scalar Replacement of Aggregates)
- SSA
靜態單賦值 (Static Single Assignment)
- 堆疊地圖 (Stack Map)
在垃圾回收中,由程式碼產生器發出的中繼資料,用於識別執行函數的堆疊框架內的根。
T¶
- TBAA
基於型別的別名分析 (Type-Based Alias Analysis)
W¶
- WPD
全程式去虛擬化 (Whole Program Devirtualization)