如何使用屬性¶
簡介¶
LLVM 中的屬性在一些基本方式上發生了變化。這是必要的,以便支援將屬性擴展到包含多個屬性,例如命令列選項。舊的處理屬性的方式是將它們表示為值的位元遮罩。這個位元遮罩儲存在一個引用計數的「列表」結構中。這樣做的優點是屬性可以使用「或」和「與」來操作。這樣做的缺點是擴展空間有限,而且除了對齊之外,幾乎不支援屬性值對。
在新方案中,屬性
物件表示單個唯一的屬性。您可以使用 Attribute::get
方法建立新的 屬性
物件。屬性可以是單個「列舉」值(列舉為 Attribute::AttrKind
列舉)、表示目標相依屬性的字串,或屬性值對。以下是一些範例
目標獨立:
noinline
、zext
目標相依:
"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
的「內省」方法(例如 Raw
、getRawPointer
等)。這些方法會破壞封裝,並且可能會在未來的版本中移除。
AttrBuilder
¶
最後,我們有一個「建構器」類別,可以幫助建立 AttributeList
物件,而無需建立數個不同的中間唯一 AttributeList
物件。AttrBuilder
類別允許您任意新增和移除屬性。在您呼叫適當的 AttributeList::get
方法之前,屬性不會是唯一的。
AttrBuilder
物件**不**設計為透過值傳遞。它應該透過參考傳遞。
注意:建議您**不要**使用 AttrBuilder::addRawValue()
方法或 AttrBuilder(uint64_t Val)
建構函數。這些是為了向後相容性而保留,並且可能會在未來的版本中移除。
基本上就是這樣!許多功能隱藏在這些類別的背後,但介面相當簡單易懂。