LLVM 的選用性豐富反組譯輸出¶
簡介¶
LLVM 的預設反組譯輸出為原始文字。為了讓使用者更能檢視指令的文字表示形式,或為了重新格式化以獲得更友善的使用者顯示方式,提供了一種選用性的豐富反組譯輸出。
此選用性輸出足以參考到指令文字的各個部分。這是為了像反組譯器、列表檔案產生器和美化列印器等客戶端,它們需要的不僅僅是原始指令和列印它們的能力。
為了提供此功能,組譯文字會以註解標記。此標記在語法上夠簡單,即使在消費者和生產者之間版本不符的情況下,也能保持穩健。也就是說,此語法通常不帶有超出「此文字具有註解」的語意,因此消費者可以簡單地忽略他們不理解或不在意的註解。
在呼叫 LLVMCreateDisasm()
建立反組譯器上下文之後,可以使用此呼叫啟用選用性輸出
LLVMSetDisasmOptions(DC, LLVMDisassembler_Option_UseMarkup);
然後,後續呼叫 LLVMDisasmInstruction()
將傳回帶有標記註解的輸出字串。
指令註解¶
上下文標記¶
帶註解的組譯顯示將提供上下文標記,以幫助客戶端更有效率地實作諸如美化列印器之類的功能。大多數標記將與目標無關,因此客戶端可以有效地提供良好的顯示效果,而無需任何特定於目標的知識。
帶註解的組譯會經過正常的指令列印器,但可選擇性地在指令字串的部分包含上下文標籤。註解是任何以 '<' 和 '>' 分隔的文字區段 (1)。
annotation: '<' tag-name tag-modifier-list ':' annotated-text '>'
tag-name: identifier
tag-modifier-list: comma delimited identifier list
標籤名稱是一個識別符,它給出了註解的類型。對於第一階段,這將非常簡單,記憶體參照、暫存器和立即值分別具有標籤名稱「mem」、「reg」和「imm」。
標籤修飾符列表通常是額外的特定於目標的上下文,例如暫存器類別。
客戶端應接受並忽略任何他們不理解的標籤名稱或標籤修飾符,允許註解在豐富性方面增長,而不會破壞舊的客戶端。
例如,ARM 堆疊相對位置載入的可能註解可以註解為
ldr <reg gpr:r0>, <mem regoffset:[<reg gpr:sp>, <imm:#4>]>
1: 對於 '<' 和/或 '>' 為合法符號的組譯方言,字面符號會透過立即重複該字元來跳脫。例如,字面 '<' 字元在帶註解的組譯字串中會輸出為 '<<'。
C API 詳細資訊¶
此資訊的目標使用者使用 C API,因此將新增用於反組譯器的新 C API 函式,以提供選項來產生帶有註解的反組譯指令,即 LLVMSetDisasmOptions()
和 LLVMDisassembler_Option_UseMarkup
選項(如上所示)。