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
選項(見上文)。