如何使用屬性

簡介

LLVM 中的屬性在某些基本方面已發生改變。 這是為了支援擴展屬性以涵蓋超出少數屬性(例如:命令列選項)而必要的做法。 舊的屬性處理方式是將它們表示為值的位元遮罩。 此位元遮罩儲存在參考計數的「列表」結構中。 這樣做的好處是可以使用「或」和「及」來操作屬性。 這樣做的缺點是擴展空間有限,並且除了對齊之外,幾乎不支援屬性-值對。

在新方案中,Attribute 物件代表一個單一且唯一化的屬性。 您可以使用 Attribute::get 方法來建立新的 Attribute 物件。 屬性可以是單一「enum」值(enum 是 Attribute::AttrKind enum)、代表目標相關屬性的字串,或屬性-值對。 一些範例

  • 目標獨立: noinlinezext

  • 目標相關: "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 的「內省」方法(例如 RawgetRawPointer 等)。 這些方法會破壞封裝,並可能在未來的版本中移除。

AttrBuilder

最後,我們有一個「建構器」類別,可協助建立 AttributeList 物件,而無需建立多個不同的中介唯一化 AttributeList 物件。 AttrBuilder 類別可讓您隨意新增和移除屬性。 在您呼叫適當的 AttributeList::get 方法之前,屬性不會被唯一化。

AttrBuilder 物件並非設計為以值傳遞。 它應該以參考傳遞。

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

基本上就是這樣! 許多功能都隱藏在這些類別的背後,但介面非常簡單明瞭。