属性の使い方¶
はじめに¶
LLVMの属性は、いくつかの根本的な点で変更されました。これは、属性をいくつかの属性(例えば、コマンドラインオプション)以上を包含するように拡張するために必要でした。属性を処理する旧来の方法では、属性を値のビットマスクとして表現していました。このビットマスクは、参照カウントされる「リスト」構造に格納されていました。この利点は、属性を「or」や「and」で操作できたことです。この欠点は、拡張の余地が限られており、アラインメント以外に属性と値のペアをサポートする機能がほとんどなかったことです。
新しいスキームでは、Attribute
オブジェクトは、一意に扱われる単一の属性を表します。新しいAttribute
オブジェクトを作成するには、Attribute::get
メソッドを使用します。属性は、単一の「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
は、AttributeList::get
メソッドを使用して作成します。属性を追加および削除できます。これにより、新しいAttributeList
が作成されます。
AttributeList
オブジェクトは、値で渡されるように設計されています。
注:AttributeList
の「イントロスペクション」メソッド(例えば、Raw
、getRawPointer
など)を使用しないことをお勧めします。これらのメソッドはカプセル化を破り、将来のリリースで削除される可能性があります。
AttrBuilder
¶
最後に、いくつかの異なる中間の一意のAttributeList
オブジェクトを作成せずに、AttributeList
オブジェクトの作成を支援する「ビルダー」クラスがあります。AttrBuilder
クラスを使用すると、属性を自由に追加および削除できます。属性は、適切なAttributeList::get
メソッドを呼び出すまで一意にはなりません。
AttrBuilder
オブジェクトは、値で渡されるように設計されていません。参照で渡す必要があります。
注:AttrBuilder::addRawValue()
メソッドまたはAttrBuilder(uint64_t Val)
コンストラクターは使用しないことをお勧めします。これらは下位互換性のためのものであり、将来のリリースで削除される可能性があります。
そして、基本的にはそれだけです!多くの機能がこれらのクラスの背後に隠されていますが、インターフェースは非常に簡単です。