如何使用屬性¶
簡介¶
LLVM 中的屬性在某些基本方面已發生改變。 這是為了支援擴展屬性以涵蓋超出少數屬性(例如:命令列選項)而必要的做法。 舊的屬性處理方式是將它們表示為值的位元遮罩。 此位元遮罩儲存在參考計數的「列表」結構中。 這樣做的好處是可以使用「或」和「及」來操作屬性。 這樣做的缺點是擴展空間有限,並且除了對齊之外,幾乎不支援屬性-值對。
在新方案中,Attribute
物件代表一個單一且唯一化的屬性。 您可以使用 Attribute::get
方法來建立新的 Attribute
物件。 屬性可以是單一「enum」值(enum 是 Attribute::AttrKind
enum)、代表目標相關屬性的字串,或屬性-值對。 一些範例
目標獨立:
noinline
、zext
目標相關:
"no-sse"
、"thumb2"
屬性-值對:
"cpu" = "cortex-a8"
、align = 4
注意:對於屬性值對,我們期望目標相關屬性的值為字串。
Attribute
¶
Attribute
物件設計為以值傳遞。
由於屬性不再表示為位元遮罩,因此您需要轉換任何將屬性視為位元遮罩的代码,以使用 Attribute 類別上的新查詢方法。
AttributeList
¶
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)
建構子。 這些是為了向後相容性,並可能在未來的版本中移除。
基本上就是這樣! 許多功能都隱藏在這些類別的背後,但介面非常簡單明瞭。