ilocker:關注 Android 安全(新手) QQ: 2597294287
什么是 PHI node?
所有 LLVM 指令都使用 SSA (Static Single Assignment,靜態一次性賦值) 方式表示。意思是所有變量都只能被賦值一次,這樣做主要是便於后期的代碼優化。
1 a = 1; 2 if (v < 10) 3 a = 2; 4 b = a;
假設 v 的值小於 10,變量 a 就要被賦值為 2,但 a 已經被賦值了一次,由於 SSA 性質的約束,只能賦值另外一個“a”。最后在給 b 賦值時,通過添加一個 PHI node,由其來決定選擇哪個版本的 a 來給 b 賦值。
1 a1 = 1; 2 if (v < 10) 3 a2 = 2; 4 b = PHI(a1, a2);
PHI node 根據控制流是從哪一個 block (“a1 = 1” or “a2 = 2”) 到達,來決定使用 a1 還是 a2 來給 b 賦值。
這些 PHI node 必須在 IR 中顯示創建,llvm 指令集中有對應的 phi 指令。
參考:http://www.llvmpy.org/llvmpy-doc/dev/doc/llvm_concepts.html#ssa-form-and-phi-nodes