如何使用属性¶
简介¶
LLVM 中的属性在一些根本方面发生了变化。这样做是为了支持扩展属性,使其能够包含更多的属性 — 例如,命令行选项。旧的属性处理方式是将它们表示为值的位掩码。这个位掩码存储在一个“列表”结构中,该结构是引用计数的。这样做的好处是可以使用“或”和“与”来操作属性。缺点是扩展空间有限,并且几乎不支持属性-值对,除了对齐之外。
在新方案中,Attribute
对象表示一个唯一的单个属性。您可以使用 Attribute::get
方法创建一个新的 Attribute
对象。一个属性可以是一个单独的“枚举”值(枚举是 Attribute::AttrKind
枚举),一个表示目标相关属性的字符串,或者一个属性-值对。一些例子:
目标无关:
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)
构造函数。这些是为了向后兼容性,并可能在未来的版本中被删除。
基本上就是这样!许多功能都隐藏在这些类后面,但接口非常直接。