属性の使い方

はじめに

LLVMの属性は、いくつかの根本的な点で変更されました。これは、属性をいくつかの属性(例えば、コマンドラインオプション)以上を包含するように拡張するために必要でした。属性を処理する旧来の方法では、属性を値のビットマスクとして表現していました。このビットマスクは、参照カウントされる「リスト」構造に格納されていました。この利点は、属性を「or」や「and」で操作できたことです。この欠点は、拡張の余地が限られており、アラインメント以外に属性と値のペアをサポートする機能がほとんどなかったことです。

新しいスキームでは、Attributeオブジェクトは、一意に扱われる単一の属性を表します。新しいAttributeオブジェクトを作成するには、Attribute::getメソッドを使用します。属性は、単一の「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は、AttributeList::getメソッドを使用して作成します。属性を追加および削除できます。これにより、新しいAttributeListが作成されます。

AttributeListオブジェクトは、値で渡されるように設計されています。

注:AttributeListの「イントロスペクション」メソッド(例えば、RawgetRawPointerなど)を使用しないことをお勧めします。これらのメソッドはカプセル化を破り、将来のリリースで削除される可能性があります。

AttrBuilder

最後に、いくつかの異なる中間の一意のAttributeListオブジェクトを作成せずに、AttributeListオブジェクトの作成を支援する「ビルダー」クラスがあります。AttrBuilderクラスを使用すると、属性を自由に追加および削除できます。属性は、適切なAttributeList::getメソッドを呼び出すまで一意にはなりません。

AttrBuilderオブジェクトは、値で渡されるように設計されていません。参照で渡す必要があります。

注:AttrBuilder::addRawValue()メソッドまたはAttrBuilder(uint64_t Val)コンストラクターは使用しないことをお勧めします。これらは下位互換性のためのものであり、将来のリリースで削除される可能性があります。

そして、基本的にはそれだけです!多くの機能がこれらのクラスの背後に隠されていますが、インターフェースは非常に簡単です。