如何使用屬性

簡介

LLVM 中的屬性在一些基本方式上發生了變化。這是必要的,以便支援將屬性擴展到包含多個屬性,例如命令列選項。舊的處理屬性的方式是將它們表示為值的位元遮罩。這個位元遮罩儲存在一個引用計數的「列表」結構中。這樣做的優點是屬性可以使用「或」和「與」來操作。這樣做的缺點是擴展空間有限,而且除了對齊之外,幾乎不支援屬性值對。

在新方案中,屬性 物件表示單個唯一的屬性。您可以使用 Attribute::get 方法建立新的 屬性 物件。屬性可以是單個「列舉」值(列舉為 Attribute::AttrKind 列舉)、表示目標相依屬性的字串,或屬性值對。以下是一些範例

  • 目標獨立:noinlinezext

  • 目標相依:"no-sse""thumb2"

  • 屬性值對:"cpu" = "cortex-a8"align = 4

注意:對於屬性值對,我們預期目標相依屬性的值為字串。

屬性

屬性 物件設計為按值傳遞。

由於屬性不再表示為位元遮罩,因此您需要將任何將其視為位元遮罩的程式碼轉換為使用 Attribute 類別上的新查詢方法。

屬性列表

AttributeList 類別儲存了一組 Attribute 物件,用於每個可能與屬性相關聯的物件種類:函數整體、回傳類型或函數的參數。函數的屬性位於索引 AttributeList::FunctionIndex;回傳類型的屬性位於索引 AttributeList::ReturnIndex;而函數的參數屬性位於索引 1、…、n(其中「n」是參數的數量)。AttributeList 類別上的大多數方法都採用索引參數。

AttributeList 也是一個唯一且不可變的物件。您可以透過 AttributeList::get 方法建立 AttributeList。您可以新增和移除屬性,這會導致建立新的 AttributeList

AttributeList 物件設計為透過值傳遞。

注意:建議您**不要**使用 AttributeList 的「內省」方法(例如 RawgetRawPointer 等)。這些方法會破壞封裝,並且可能會在未來的版本中移除。

AttrBuilder

最後,我們有一個「建構器」類別,可以幫助建立 AttributeList 物件,而無需建立數個不同的中間唯一 AttributeList 物件。AttrBuilder 類別允許您任意新增和移除屬性。在您呼叫適當的 AttributeList::get 方法之前,屬性不會是唯一的。

AttrBuilder 物件**不**設計為透過值傳遞。它應該透過參考傳遞。

注意:建議您**不要**使用 AttrBuilder::addRawValue() 方法或 AttrBuilder(uint64_t Val) 建構函數。這些是為了向後相容性而保留,並且可能會在未來的版本中移除。

基本上就是這樣!許多功能隱藏在這些類別的背後,但介面相當簡單易懂。